diff --git a/.claude/settings.local.json b/.claude/settings.local.json
new file mode 100644
index 0000000..afac14a
--- /dev/null
+++ b/.claude/settings.local.json
@@ -0,0 +1,9 @@
+{
+ "permissions": {
+ "allow": [
+ "Bash(dotnet build:*)"
+ ],
+ "deny": [],
+ "ask": []
+ }
+}
diff --git a/.gitignore b/.gitignore
index 9491a2f..dfc3dbf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -194,6 +194,7 @@ PublishScripts/
# NuGet Packages
*.nupkg
+!LocalPackages/*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..57d77db
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,19 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Run Debug",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "Build Debug",
+ "program": "${workspaceFolder}/SOTFEdit/bin/Debug/net8.0-windows/SOTFEdit.exe",
+ "args": [],
+ "cwd": "${workspaceFolder}/SOTFEdit",
+ "stopAtEntry": false,
+ "console": "integratedTerminal"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..c175585
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,112 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "Clean Release",
+ "type": "process",
+ "command": "pwsh",
+ "args": [
+ "-Command",
+ "cls; dotnet clean SOTFEdit.sln --configuration Release --verbosity quiet"
+ ],
+ "problemMatcher": [],
+ "presentation": {
+ "reveal": "never",
+ "echo": false,
+ "focus": false,
+ "panel": "shared"
+ }
+ },
+ {
+ "label": "Build Release",
+ "type": "process",
+ "command": "dotnet",
+ "args": [
+ "build",
+ "SOTFEdit\\SOTFEdit.csproj",
+ "--configuration",
+ "Release"
+ ],
+ "problemMatcher": "$msCompile",
+ "dependsOn": [
+ "Clean Release"
+ ],
+ "group": "build"
+ },
+ {
+ "label": "Clean Debug",
+ "type": "process",
+ "command": "pwsh",
+ "args": [
+ "-Command",
+ "cls; dotnet clean SOTFEdit.sln --configuration Debug --verbosity quiet"
+ ],
+ "problemMatcher": [],
+ "presentation": {
+ "reveal": "never",
+ "echo": false,
+ "focus": false,
+ "panel": "shared"
+ }
+ },
+ {
+ "label": "Build Debug",
+ "type": "process",
+ "command": "dotnet",
+ "args": [
+ "build",
+ "SOTFEdit\\SOTFEdit.csproj",
+ "--configuration",
+ "Debug"
+ ],
+ "problemMatcher": "$msCompile",
+ "dependsOn": [
+ "Clean Debug"
+ ],
+ "group": {
+ "kind": "build",
+ "isDefault": false
+ }
+ },
+ {
+ "label": "Run Release",
+ "type": "process",
+ "command": "dotnet",
+ "args": [
+ "run",
+ "--project",
+ "SOTFEdit\\SOTFEdit.csproj",
+ "--configuration",
+ "Release"
+ ],
+ "group": {
+ "kind": "test",
+ "isDefault": false
+ },
+ "presentation": {
+ "reveal": "always",
+ "panel": "shared"
+ }
+ },
+ {
+ "label": "Run Debug",
+ "type": "process",
+ "command": "dotnet",
+ "args": [
+ "run",
+ "--project",
+ "SOTFEdit\\SOTFEdit.csproj",
+ "--configuration",
+ "Debug"
+ ],
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ },
+ "presentation": {
+ "reveal": "always"
+ },
+ "problemMatcher": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 031b97c..2993403 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,101 @@
# Changelog
+## v1.2.1 (2025-12-02)
+
+### Bug Fixes
+- **Map Window:**
+ - Fixed POI "done" status not refreshing when savegame auto-reloads
+ - Fixed "Hide Completed" filter not updating after auto-reload
+ - POI icons and visibility now correctly update when inventory changes are detected
+ - Fixed Area and Requirements filters not persisting between sessions
+ - Fixed Area filter values not updating when language is changed
+
+### Technical Changes
+- Added `SelectedSavegameChangedEvent` listener to `MapViewModel`
+- Implemented `RefreshAllPoiStatus()` method to refresh `IsDone` property and re-apply filters
+- Added `RefreshDoneStatus()` public method to `BasePoi` class
+- Added `ToString()` override to `AreaFilter` and `StaticAreaFilter` for proper serialization
+- Made `StaticAreaFilter.Name` dynamic by storing translation key instead of translated string
+- Added `LanguageChangedEvent` listener to `MapFilter` to refresh filter names
+
+## v1.2.0 (2025-11-05)
+
+### Features
+- **Hot-Swap Language Switching:**
+ - Language changes now apply immediately without requiring application restart
+ - All UI elements update in real-time when changing language in settings
+ - Menu items, buttons, labels, and other text automatically refresh
+
+### Improvements
+- **Translation System:**
+ - Migrated from JSON to YAML format for translation files (20% smaller file size)
+ - Implemented reactive translation bindings for dynamic language updates
+ - Added translation caching for improved performance (eliminated ~4000+ redundant YAML deserializations during map load)
+ - Fixed translation loading performance issue that caused application hang on map load
+
+### Technical Changes
+- Created `TranslationProxy` class with `INotifyPropertyChanged` for reactive bindings
+- Enhanced `TranslateExtension` to support both reactive bindings and static strings (FallbackValue compatibility)
+- Added `LanguageChangedEvent` messaging for ViewModel property refresh
+- Implemented `TranslationManager.ChangeCulture()` for centralized culture switching
+- Added smart context detection to `TranslateExtension` (DependencyProperty vs. non-bindable contexts)
+
+## v1.1.0 (2025-11-04)
+
+### Features
+- **Map Window Enhancements:**
+ - Added "Auto Reload" feature to automatically reload the savegame when it changes on disk
+ - Auto Reload now automatically loads the most recent savegame if none is selected
+ - Auto Reload triggers immediately when the map window opens (no 5-second delay)
+ - Added "Auto Connect" feature for companion app connectivity
+ - Map window now remembers which monitor it was on and opens maximized on the correct screen
+ - Fixed window restore behavior - properly restores to saved size when un-maximizing
+ - Added "Map -" / "Karte -" / "Mapa -" prefix to map window title for clarity
+
+### Improvements
+- **Translation System:**
+ - Fixed main window title to show connection status, savegame info, and modified date
+ - Modified date display now shows just the date without "Modified:" / "Zuletzt geändert:" / "Zmodyfikowano:" prefix
+
+### Technical Changes
+- Improved window position and state management using WPF RestoreBounds
+- Added System.IO using directive for directory modification detection
+- Enhanced multi-monitor support with proper window positioning
+
+## v1.0.2 (2025-11-02)
+
+### Changed
+- Migrated POI completion tracking from StringCollection to a comma-separated string in settings for improved compatibility and performance.
+- Refactored POI completion logic in BasePoi.cs to use the new string-based storage.
+- Removed all legacy StringCollection logic for POI completion.
+
+### Notes
+- All code referencing POI completion now uses `DonePoiIdListString`.
+- This is a breaking change for users with old settings files; migration will occur automatically on first use.
+
+## v1.0.1 (2025-11-01)
+
+### Features
+- Added ability to manually mark certain POIs as "done" (completed) on the map.
+- POIs marked as done now display a special overlay icon.
+- The "Hide completed" filter now hides both collected and manually completed POIs, including those in bunkers and caves.
+- Not all POIs can be marked as done—only those with a real in-game identifier support this feature.
+
+### Improvements
+- Updated translations and documentation to reflect the new filter and POI features.
+- Cleaned up VS Code debug tasks and launch configuration to remove duplicates and confusion.
+
+## v1.0.0
+
+### Major Changes
+- Migrated the entire project from .NET 6 to .NET 8 for improved performance, security, and long-term support.
+- Updated all dependencies and project files to be compatible with .NET 8.
+- Improved build and runtime stability on modern Windows systems.
+
+### Notes
+- This update may include further enhancements or fixes as part of the migration process.
+- Please ensure you have the .NET 8.0 Desktop Runtime installed to run this version.
+
## v0.12.10
Fix crash due to corrupt storages (caused by ingame bug)
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..26ab702
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/LocalPackages/.keep b/LocalPackages/.keep
new file mode 100644
index 0000000..5b97cde
--- /dev/null
+++ b/LocalPackages/.keep
@@ -0,0 +1,4 @@
+# Remove LocalPackages from .gitignore to allow it in git
+# (auto-generated by GitHub Copilot)
+
+# LocalPackages is often used for local NuGet packages. Remove or comment out any ignore rules for it.
diff --git a/LocalPackages/tqklibrary.autogrid.1.2.29.nupkg b/LocalPackages/tqklibrary.autogrid.1.2.29.nupkg
new file mode 100644
index 0000000..624008c
Binary files /dev/null and b/LocalPackages/tqklibrary.autogrid.1.2.29.nupkg differ
diff --git a/README.md b/README.md
index 9d6dbcf..4e40b00 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,17 @@
+
# SOTFEdit - Sons of The Forest Savegame Editor
+**Main reason for this fork:** Migration to .NET 8 for improved performance, security, and long-term support. This fork updates the project from .NET 6 to .NET 8 and may include further enhancements or fixes.
+
+

-[](https://github.com/codengine/SOTFEdit/actions/workflows/build.yaml)
-[](https://github.com/codengine/SOTFEdit/releases)
-[](https://github.com/codengine/SOTFEdit/releases)
-
+
+# Badges (may require workflow/release setup)
+[](https://github.com/Za-Pa-Al/SOTFEdit/actions/workflows/build.yaml)
+[](https://github.com/Za-Pa-Al/SOTFEdit/releases)
+[](https://github.com/Za-Pa-Al/SOTFEdit/releases)
+[](https://github.com/Za-Pa-Al/SOTFEdit/blob/master/LICENSE)
A savegame editor for "Sons of The Forest".
@@ -33,10 +39,18 @@ A savegame editor for "Sons of The Forest".
- [Attributions](#attributions)
- [Icons](#icons)
+nothing more, nothing less.
+
+## About This Fork
+
+This is a fork of [codengine/SOTFEdit](https://github.com/codengine/SOTFEdit) maintained by [Za-Pa-Al](https://github.com/Za-Pa-Al).
+It may include custom changes, fixes, or experimental features not present in the original project.
+
+**Original project credits and license apply.**
+
## Disclaimer
-This project is in no way or form associated with the developers of the game. It is just a non-commercial fan project,
-nothing more, nothing less.
+This project is in no way or form associated with the developers of the game. It is just a non-commercial fan project, nothing more, nothing less.
## Features
@@ -68,14 +82,16 @@ nothing more, nothing less.
- Backup changed files automatically
- ... more features are planned
+
## Download
-- You can find the newest version at the [Releases page](https://github.com/codengine/SOTFEdit/releases)
+- You can find the newest version at the [Releases page](https://github.com/Za-Pa-Al/SOTFEdit/releases)
+
## Requirements
-- Windows 8+
-- [.net 6.0 Desktop Runtime](https://dotnet.microsoft.com/en-us/download/dotnet/6.0)
+- Windows 10+
+- [.NET 8.0 Desktop Runtime](https://dotnet.microsoft.com/en-us/download/dotnet/8.0)
## Usage
@@ -145,17 +161,35 @@ Some positions are missing but they may be added in the future.
- Teleport the Player and Followers to Actors/NPCs, the player, Zip Lines, Structures, Caves, Bunkers, Helicopters
- Remove Zip Lines from the map
- Spawn Actors/NPCs at target areas
+- **Auto Reload**: Automatically reloads the savegame when changes are detected on disk, keeping the map synchronized with your game
+- **Auto Connect**: Automatically connects to the companion app when available
+- Multi-monitor support with window position memory
### Options
You can enable or disable icons using the "Options" button in the top left corner.
+**Auto Reload and Auto Connect** checkboxes are available at the top of the map window:
+- **Auto Reload**: When enabled, the map will automatically detect when your savegame is modified and reload the data. If no savegame is loaded, it will automatically load the most recent one.
+- **Auto Connect**: When enabled, the map will automatically attempt to connect to the companion app.
+
Some important notes regarding the filters:
-- "Show only uncollected items" will show/hide uncollected items including bunkers and caves where they can be found
+ - "Hide completed" will hide all items and POIs that are either collected or marked as done, including those in bunkers and caves
- Area - Mainly affects Actors or, in general terms, positions where we have the exact coordinates
- Requirements - Show/Hide caves, bunkers and items which are accessible/inaccessible
+### Marking POIs as Done
+
+Some points of interest (POIs) on the map can now be manually marked as "done" (completed) by the user. This allows you to keep track of which locations you have already visited or completed, even if the game does not automatically track this for you.
+
+- To mark a POI as done, use the context menu or the checkbox (where available) in the map interface.
+- POIs that are marked as done will display a special overlay icon on the map.
+- The "Hide completed" filter will hide all POIs that are either collected (for items) or manually marked as done.
+- Not all POIs can be marked as done—only those with a real in-game identifier support this feature.
+
+This feature helps you organize your exploration and avoid revisiting locations you have already completed.
+
### Teleportation
You can only teleport to locations where we have the exact coordinates either from the savegame itself or attached to
@@ -231,6 +265,7 @@ Be careful: This feature will most likely kill your performance and may corrupt
Make sure to enable backups!
```
+
## Troubleshooting
One of the items in inventory is listed as "Unknown"?
@@ -239,8 +274,7 @@ One of the items in inventory is listed as "Unknown"?
My game does not work anymore?
-- If you have selected to create backups before saving, you can just delete the old files and restore the files that are
- suffixed with ".bak*".
+- If you have selected to create backups before saving, you can just delete the old files and restore the files that are suffixed with ".bak*".
I get errors and the application does strange things
@@ -252,30 +286,43 @@ I can not change "IsRobbyDead" or "IsVirginiaDead"
The program does not start
-- Make sure that .net 6.0 Desktop Runtime is installed. Also make sure to extract all files from the archive if you
- downloaded the zip archive manually. Lastly, check if any antivirus is blocking the editor
+- Make sure that .NET 8.0 Desktop Runtime is installed. Also make sure to extract all files from the archive if you downloaded the zip archive manually. Lastly, check if any antivirus is blocking the editor
Antivirus (Windows Defender for example, Smartscreen) is complaining
-- This is due to the fact that it is a self-developed application which is not signed. It's safe to just ignore the
- warning. The code is all hosted on Github.
+- This is due to the fact that it is a self-developed application which is not signed. It's safe to just ignore the warning. The code is all hosted on Github.
"Could not load file or assembly"
-- Make sure to have .net 6.0 Desktop Runtime installed (either x86 or x64)
+- Make sure to have .NET 8.0 Desktop Runtime installed (either x86 or x64)
My changes are not applied or reverted
-- In some cases, the Cloud Saving Feature of Steam overwrites changes done by SOTFEdit. You can fix that if you start
- the Game (not a game session!), edit a savegame and THEN start the game session.
+- In some cases, the Cloud Saving Feature of Steam overwrites changes done by SOTFEdit. You can fix that if you start the Game (not a game session!), edit a savegame and THEN start the game session.
Lakes, rivers etc. are gone
- This happens after teleporting in and out of caves. This should be fixed when you teleport again in and out
+
## Contributing
-Feel free to report any unknown items or any feature requests. PRs are also welcome.
+Feel free to report any unknown items or feature requests. Pull requests are welcome!
+
+If you want to contribute, please fork this repository ([Za-Pa-Al/SOTFEdit](https://github.com/Za-Pa-Al/SOTFEdit)), make your changes, and open a pull request. To keep your fork up to date with the original, add the original repo as an upstream remote:
+
+```sh
+git remote add upstream https://github.com/codengine/SOTFEdit.git
+```
+
+Then fetch and merge as needed:
+
+```sh
+git fetch upstream
+git merge upstream/master
+```
+
+See the [GitHub documentation on forking](https://docs.github.com/en/get-started/quickstart/fork-a-repo) for more details.
## Final Words
diff --git a/SOTFEdit.Companion.Shared.Tests/SOTFEdit.Companion.Shared.Tests.csproj b/SOTFEdit.Companion.Shared.Tests/SOTFEdit.Companion.Shared.Tests.csproj
index 4b67eb1..e712069 100644
--- a/SOTFEdit.Companion.Shared.Tests/SOTFEdit.Companion.Shared.Tests.csproj
+++ b/SOTFEdit.Companion.Shared.Tests/SOTFEdit.Companion.Shared.Tests.csproj
@@ -3,7 +3,7 @@
enable
enable
- net6.0
+ net8.0
diff --git a/SOTFEdit.Companion.Shared/Messages/CompanionAddPoiMessage.cs b/SOTFEdit.Companion.Shared/Messages/CompanionAddPoiMessage.cs
index 63e785b..5e84adf 100644
--- a/SOTFEdit.Companion.Shared/Messages/CompanionAddPoiMessage.cs
+++ b/SOTFEdit.Companion.Shared/Messages/CompanionAddPoiMessage.cs
@@ -6,13 +6,13 @@ namespace SOTFEdit.Companion.Shared.Messages;
public class CompanionAddPoiMessage : ICompanionMessage
{
[Key(0)]
- public string Title { get; set; }
+ public string Title { get; set; } = string.Empty;
[Key(1)]
- public string Description { get; set; }
+ public string Description { get; set; } = string.Empty;
[Key(2)]
- public byte[] Screenshot { get; set; }
+ public byte[] Screenshot { get; set; } = Array.Empty();
[Key(3)]
public float X { get; set; }
diff --git a/SOTFEdit.Companion.Shared/Messages/CompanionPosCollectionMessage.cs b/SOTFEdit.Companion.Shared/Messages/CompanionPosCollectionMessage.cs
index d841518..0132904 100644
--- a/SOTFEdit.Companion.Shared/Messages/CompanionPosCollectionMessage.cs
+++ b/SOTFEdit.Companion.Shared/Messages/CompanionPosCollectionMessage.cs
@@ -7,4 +7,9 @@ public class CompanionPosCollectionMessage : ICompanionMessage
{
[Key(0)]
public List Positions { get; set; }
+
+ public CompanionPosCollectionMessage()
+ {
+ Positions = new List();
+ }
}
\ No newline at end of file
diff --git a/SOTFEdit.Companion.Shared/SOTFEdit.Companion.Shared.csproj b/SOTFEdit.Companion.Shared/SOTFEdit.Companion.Shared.csproj
index 980a1d5..d3841b1 100644
--- a/SOTFEdit.Companion.Shared/SOTFEdit.Companion.Shared.csproj
+++ b/SOTFEdit.Companion.Shared/SOTFEdit.Companion.Shared.csproj
@@ -3,13 +3,14 @@
enable
enable
- net6.0
+ net8.0
Release;Debug
AnyCPU
+ false
-
+
diff --git a/SOTFEdit.code-workspace b/SOTFEdit.code-workspace
new file mode 100644
index 0000000..9b8f614
--- /dev/null
+++ b/SOTFEdit.code-workspace
@@ -0,0 +1,11 @@
+{
+ "folders": [
+ {
+ "path": "."
+ },
+ {
+ "path": "../../../../Tech/Development/LLM Library"
+ }
+ ],
+ "settings": {}
+}
\ No newline at end of file
diff --git a/SOTFEdit/App.xaml.cs b/SOTFEdit/App.xaml.cs
index 76a2ad7..d44bb65 100644
--- a/SOTFEdit/App.xaml.cs
+++ b/SOTFEdit/App.xaml.cs
@@ -32,8 +32,8 @@ namespace SOTFEdit;
///
public partial class App
{
- public const string Version = "0.12.10";
- private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();
+ public const string Version = "1.2.1";
+ private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public App()
{
diff --git a/SOTFEdit/Infrastructure/Converters/CoordinateConverter.cs b/SOTFEdit/Infrastructure/Converters/CoordinateConverter.cs
index e63bf40..32cc214 100644
--- a/SOTFEdit/Infrastructure/Converters/CoordinateConverter.cs
+++ b/SOTFEdit/Infrastructure/Converters/CoordinateConverter.cs
@@ -13,19 +13,19 @@ public static class CoordinateConverter
static CoordinateConverter()
{
// Input data: pixel coordinates and corresponding in-game coordinates
- float[] pixelXs = { 1311, 1592.5f, 1426, 1037, 688, 772.3f, 709.0f, 786.2f, 789.8f, 899.5f, 1259.8f };
- float[] pixelYs = { 2064, 2155, 1494.5f, 1425, 1407, 1486.3f, 1713.7f, 1867.3f, 2020.1f, 2125.4f, 1822.8f };
+ float[] pixelXs = [1311, 1592.5f, 1426, 1037, 688, 772.3f, 709.0f, 786.2f, 789.8f, 899.5f, 1259.8f];
+ float[] pixelYs = [2064, 2155, 1494.5f, 1425, 1407, 1486.3f, 1713.7f, 1867.3f, 2020.1f, 2125.4f, 1822.8f];
float[] ingameXs =
- {
+ [
-719.0499f, -444.96793f, -604.09875f, -989.2298f, -1328.8882f, -1245.4705f, -1308.0143f, -1232.5912f,
-1226.8536f,
-1112.021f, -770.1515f
- };
+ ];
float[] ingameYs =
- {
+ [
-17.139717f, -103.88483f, 541.12946f, 611.64136f, 625.7892f, 549.34155f, 326.0083f, 176.03516f, 27.191362f,
-74.49177f, 219.75914f
- };
+ ];
// Calculate the inverse scale and offset for the x-axis
var inverseScaleXandOffsetX = CalculateScaleAndOffset(ingameXs, pixelXs);
diff --git a/SOTFEdit/Infrastructure/FlatExtractingYamlLocalizationSource.cs b/SOTFEdit/Infrastructure/FlatExtractingYamlLocalizationSource.cs
new file mode 100644
index 0000000..57dad77
--- /dev/null
+++ b/SOTFEdit/Infrastructure/FlatExtractingYamlLocalizationSource.cs
@@ -0,0 +1,154 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using libc.translation;
+using YamlDotNet.Serialization;
+
+namespace SOTFEdit.Infrastructure;
+
+///
+/// YAML-based localization source that flattens nested YAML structures into dot-notation keys.
+/// Compatible with the existing FlatExtractingJsonLocalizationSource behavior.
+///
+public class FlatExtractingYamlLocalizationSource : ILocalizationSource
+{
+ private readonly string _basePath;
+ private readonly PropertyCaseSensitivity _caseSensitivity;
+ private readonly IDeserializer _yamlDeserializer;
+ private readonly Dictionary> _translationCache;
+
+ public FlatExtractingYamlLocalizationSource(string basePath, PropertyCaseSensitivity caseSensitivity)
+ {
+ _basePath = basePath ?? throw new ArgumentNullException(nameof(basePath));
+ _caseSensitivity = caseSensitivity;
+ _translationCache = new Dictionary>();
+
+ _yamlDeserializer = new DeserializerBuilder()
+ .Build();
+ }
+
+ public Dictionary GetTranslations(CultureInfo culture)
+ {
+ // Check cache first
+ var cultureName = culture.Name;
+ if (_translationCache.TryGetValue(cultureName, out var cachedTranslations))
+ {
+ return cachedTranslations;
+ }
+
+ var yamlFilePath = Path.Combine(_basePath, $"{cultureName}.yaml");
+
+ if (!File.Exists(yamlFilePath))
+ {
+ return new Dictionary();
+ }
+
+ try
+ {
+ var yamlContent = File.ReadAllText(yamlFilePath);
+ var data = _yamlDeserializer.Deserialize>(yamlContent);
+
+ if (data == null)
+ {
+ return new Dictionary();
+ }
+
+ var flatTranslations = new Dictionary(
+ _caseSensitivity == PropertyCaseSensitivity.CaseInsensitive
+ ? StringComparer.OrdinalIgnoreCase
+ : StringComparer.Ordinal
+ );
+
+ FlattenDictionary(data, string.Empty, flatTranslations);
+
+ // Cache the translations
+ _translationCache[cultureName] = flatTranslations;
+
+ return flatTranslations;
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException(
+ $"Failed to load YAML translations from '{yamlFilePath}'", ex);
+ }
+ }
+
+ private void FlattenDictionary(Dictionary source, string prefix, Dictionary target)
+ {
+ foreach (var kvp in source)
+ {
+ var key = kvp.Key?.ToString();
+ if (key == null) continue;
+
+ var fullKey = string.IsNullOrEmpty(prefix) ? key : $"{prefix}.{key}";
+
+ if (kvp.Value is Dictionary nestedDict)
+ {
+ FlattenDictionary(nestedDict, fullKey, target);
+ }
+ else if (kvp.Value != null)
+ {
+ var value = kvp.Value.ToString();
+ if (value != null)
+ {
+ target[fullKey] = value;
+ }
+ }
+ }
+ }
+
+ public IEnumerable GetAvailableCultures()
+ {
+ if (!Directory.Exists(_basePath))
+ {
+ return Enumerable.Empty();
+ }
+
+ return Directory.GetFiles(_basePath, "*.yaml")
+ .Select(file => Path.GetFileNameWithoutExtension(file))
+ .Where(cultureName => !string.IsNullOrEmpty(cultureName))
+ .Select(cultureName =>
+ {
+ try
+ {
+ return new CultureInfo(cultureName);
+ }
+ catch
+ {
+ return null;
+ }
+ })
+ .Where(culture => culture != null)
+ .Cast()
+ .ToList();
+ }
+
+ public string Get(string culture, string key)
+ {
+ try
+ {
+ var cultureInfo = new CultureInfo(culture);
+ var translations = GetTranslations(cultureInfo);
+ return translations.TryGetValue(key, out var value) ? value : key;
+ }
+ catch
+ {
+ return key;
+ }
+ }
+
+ public IDictionary GetAll(string culture)
+ {
+ try
+ {
+ var cultureInfo = new CultureInfo(culture);
+ return GetTranslations(cultureInfo);
+ }
+ catch
+ {
+ return new Dictionary();
+ }
+ }
+}
diff --git a/SOTFEdit/Infrastructure/LanguageManager.cs b/SOTFEdit/Infrastructure/LanguageManager.cs
index 975d549..b31b036 100644
--- a/SOTFEdit/Infrastructure/LanguageManager.cs
+++ b/SOTFEdit/Infrastructure/LanguageManager.cs
@@ -12,7 +12,7 @@ public static class LanguageManager
public static IEnumerable GetAvailableCultures()
{
- return new DirectoryInfo(LangPath).GetFiles("*.json")
+ return new DirectoryInfo(LangPath).GetFiles("*.yaml")
.Select(fileInfo => Path.GetFileNameWithoutExtension(fileInfo.FullName))
.ToList();
}
@@ -20,7 +20,7 @@ public static IEnumerable GetAvailableCultures()
public static ILocalizer BuildLocalizer()
{
ILocalizationSource source =
- new FlatExtractingJsonLocalizationSource(LangPath, PropertyCaseSensitivity.CaseSensitive);
+ new FlatExtractingYamlLocalizationSource(LangPath, PropertyCaseSensitivity.CaseSensitive);
return new Localizer(source);
}
}
\ No newline at end of file
diff --git a/SOTFEdit/Infrastructure/NaturalStringComparator.cs b/SOTFEdit/Infrastructure/NaturalStringComparator.cs
index e1bac35..61b2e36 100644
--- a/SOTFEdit/Infrastructure/NaturalStringComparator.cs
+++ b/SOTFEdit/Infrastructure/NaturalStringComparator.cs
@@ -22,8 +22,11 @@ public sealed class NaturalStringComparer : IComparer
/// Zero: x equals y.
/// Greater than zero: x is greater than y.
///
- public int Compare(string x, string y)
+ public int Compare(string? x, string? y)
{
+ if (ReferenceEquals(x, y)) return 0;
+ if (x is null) return y is null ? 0 : -1;
+ if (y is null) return 1;
var indexX = 0;
var indexY = 0;
while (true)
diff --git a/SOTFEdit/Infrastructure/TranslateExtension.cs b/SOTFEdit/Infrastructure/TranslateExtension.cs
index 0968284..6afc870 100644
--- a/SOTFEdit/Infrastructure/TranslateExtension.cs
+++ b/SOTFEdit/Infrastructure/TranslateExtension.cs
@@ -1,5 +1,10 @@
using System;
+using System.ComponentModel;
+using System.Windows;
+using System.Windows.Data;
using System.Windows.Markup;
+using CommunityToolkit.Mvvm.Messaging;
+using SOTFEdit.Model.Events;
namespace SOTFEdit.Infrastructure;
@@ -14,6 +19,48 @@ public TranslateExtension(string key)
public override object ProvideValue(IServiceProvider serviceProvider)
{
+ // Check if we're being used in a context that supports bindings
+ if (serviceProvider.GetService(typeof(IProvideValueTarget)) is IProvideValueTarget target)
+ {
+ // If the target property is not a DependencyProperty, return the static string
+ // This handles cases like FallbackValue, TargetNullValue, etc.
+ if (target.TargetProperty is not System.Windows.DependencyProperty)
+ {
+ return TranslationManager.Get(_key);
+ }
+
+ // Create a binding to a TranslationProxy that will update when language changes
+ var proxy = new TranslationProxy(_key);
+ var binding = new Binding(nameof(TranslationProxy.Value))
+ {
+ Source = proxy,
+ Mode = BindingMode.OneWay
+ };
+
+ return binding.ProvideValue(serviceProvider);
+ }
+
return TranslationManager.Get(_key);
}
+
+ private class TranslationProxy : INotifyPropertyChanged
+ {
+ private readonly string _key;
+
+ public TranslationProxy(string key)
+ {
+ _key = key;
+ WeakReferenceMessenger.Default.Register(this, (_, _) =>
+ {
+ Application.Current?.Dispatcher.Invoke(() =>
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value)));
+ });
+ });
+ }
+
+ public string Value => TranslationManager.Get(_key);
+
+ public event PropertyChangedEventHandler? PropertyChanged;
+ }
}
\ No newline at end of file
diff --git a/SOTFEdit/Infrastructure/TranslationManager.cs b/SOTFEdit/Infrastructure/TranslationManager.cs
index 98a7848..d851137 100644
--- a/SOTFEdit/Infrastructure/TranslationManager.cs
+++ b/SOTFEdit/Infrastructure/TranslationManager.cs
@@ -1,6 +1,10 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using CommunityToolkit.Mvvm.Messaging;
using JetBrains.Annotations;
using libc.translation;
+using SOTFEdit.Model.Events;
namespace SOTFEdit.Infrastructure;
@@ -8,6 +12,8 @@ public static class TranslationManager
{
private static readonly ILocalizer Localizer = LanguageManager.BuildLocalizer();
+ public static event EventHandler? LanguageChanged;
+
[ContractAnnotation("fallback:null => null")]
public static string Get(string key, string? fallback = null, bool fallbackIsTranslationKey = true)
{
@@ -39,4 +45,16 @@ public static IDictionary GetAll(string culture)
{
return Localizer.GetAll(culture);
}
+
+ public static void ChangeCulture(string culture)
+ {
+ var cultureInfo = new CultureInfo(culture);
+ CultureInfo.CurrentCulture = cultureInfo;
+ CultureInfo.CurrentUICulture = cultureInfo;
+ CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
+ CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
+
+ LanguageChanged?.Invoke(null, EventArgs.Empty);
+ WeakReferenceMessenger.Default.Send(new LanguageChangedEvent());
+ }
}
\ No newline at end of file
diff --git a/SOTFEdit/Model/Actors/ActorModifier.cs b/SOTFEdit/Model/Actors/ActorModifier.cs
index 6336bd8..e8613b4 100644
--- a/SOTFEdit/Model/Actors/ActorModifier.cs
+++ b/SOTFEdit/Model/Actors/ActorModifier.cs
@@ -172,8 +172,9 @@ private void Modify(JToken vailWorldSim, List matchedActors, UpdateActor
if (data.ModifyOptions.TeleportMode == "PlayerToNpc")
{
- var actorPos = data.Actor.Position;
- var playerPos = _playerPageViewModel.PlayerState.Pos;
+
+ var actorPos = data.Actor.Position!;
+ var playerPos = _playerPageViewModel.PlayerState.Pos!;
Teleporter.MovePlayerToPos(ref playerPos, ref actorPos);
if (actorTokenForActorInData != null)
diff --git a/SOTFEdit/Model/Actors/FollowerModifier.cs b/SOTFEdit/Model/Actors/FollowerModifier.cs
index 5cc3fec..665c75f 100644
--- a/SOTFEdit/Model/Actors/FollowerModifier.cs
+++ b/SOTFEdit/Model/Actors/FollowerModifier.cs
@@ -451,7 +451,8 @@ private static bool HasDifferencesInMemories(JArray existingInfluences,
return true;
}
- var newInfluencesByType = newInfluences.DistinctBy(influence => influence.TypeId)
+ var newInfluencesByType = newInfluences
+ .DistinctBy(influence => influence.TypeId)
.ToDictionary(influence => influence.TypeId);
foreach (var existingInfluence in existingInfluences)
diff --git a/SOTFEdit/Model/Events/InventoryReloadedEvent.cs b/SOTFEdit/Model/Events/InventoryReloadedEvent.cs
new file mode 100644
index 0000000..0c8c5d3
--- /dev/null
+++ b/SOTFEdit/Model/Events/InventoryReloadedEvent.cs
@@ -0,0 +1,5 @@
+namespace SOTFEdit.Model.Events;
+
+public class InventoryReloadedEvent
+{
+}
diff --git a/SOTFEdit/Model/Events/LanguageChangedEvent.cs b/SOTFEdit/Model/Events/LanguageChangedEvent.cs
new file mode 100644
index 0000000..38aacbf
--- /dev/null
+++ b/SOTFEdit/Model/Events/LanguageChangedEvent.cs
@@ -0,0 +1,5 @@
+namespace SOTFEdit.Model.Events;
+
+public class LanguageChangedEvent
+{
+}
diff --git a/SOTFEdit/Model/Events/StructuresReloadedEvent.cs b/SOTFEdit/Model/Events/StructuresReloadedEvent.cs
new file mode 100644
index 0000000..19558be
--- /dev/null
+++ b/SOTFEdit/Model/Events/StructuresReloadedEvent.cs
@@ -0,0 +1,5 @@
+namespace SOTFEdit.Model.Events;
+
+public class StructuresReloadedEvent
+{
+}
diff --git a/SOTFEdit/Model/Item.cs b/SOTFEdit/Model/Item.cs
index fd10cbf..81b0744 100644
--- a/SOTFEdit/Model/Item.cs
+++ b/SOTFEdit/Model/Item.cs
@@ -13,7 +13,7 @@ public class Item : ICloneable
private string? _normalizedLowercaseType;
public int Id { get; init; }
public string Name => TranslationManager.Get("items." + Id);
- public string Type { get; init; }
+ public string Type { get; init; } = string.Empty;
public FoodSpoilModuleDefinition? FoodSpoilModuleDefinition { get; init; }
public SourceActorModuleDefinition? SourceActorModuleDefinition { get; init; }
public bool IsInventoryItem { get; init; } = true;
@@ -37,7 +37,7 @@ public string NormalizedLowercaseName
private string NormalizedLowercaseType
{
- get { return _normalizedLowercaseType ??= TranslationHelper.Normalize(Type).ToLower(); }
+ get { return _normalizedLowercaseType ??= TranslationHelper.Normalize(Type).ToLower(); }
}
public object Clone()
diff --git a/SOTFEdit/Model/Map/ActorPoi.cs b/SOTFEdit/Model/Map/ActorPoi.cs
index 7c495eb..1a2d31a 100644
--- a/SOTFEdit/Model/Map/ActorPoi.cs
+++ b/SOTFEdit/Model/Map/ActorPoi.cs
@@ -11,7 +11,7 @@ public partial class ActorPoi : BasePoi
{
private readonly bool _isFollower;
- public ActorPoi(Actor actor) : base(actor.Position)
+ public ActorPoi(Actor actor) : base(actor.Position!)
{
Actor = actor;
if (actor.TypeId is not (Constants.Actors.KelvinTypeId or Constants.Actors.VirginiaTypeId))
diff --git a/SOTFEdit/Model/Map/AreaFilter.cs b/SOTFEdit/Model/Map/AreaFilter.cs
index 4e8f716..4551796 100644
--- a/SOTFEdit/Model/Map/AreaFilter.cs
+++ b/SOTFEdit/Model/Map/AreaFilter.cs
@@ -5,13 +5,13 @@ namespace SOTFEdit.Model.Map;
public class AreaFilter : IAreaFilter
{
public static readonly IAreaFilter All =
- new StaticAreaFilter(TranslationManager.Get("map.areaFilter.types.all"), _ => true);
+ new StaticAreaFilter("map.areaFilter.types.all", _ => true);
public static readonly IAreaFilter Surface =
- new StaticAreaFilter(TranslationManager.Get("map.areaFilter.types.surfaceOnly"), poi => !poi.IsUnderground);
+ new StaticAreaFilter("map.areaFilter.types.surfaceOnly", poi => !poi.IsUnderground);
public static readonly IAreaFilter CavesOrBunkers =
- new StaticAreaFilter(TranslationManager.Get("map.areaFilter.types.undergroundOnly"), poi => poi.IsUnderground);
+ new StaticAreaFilter("map.areaFilter.types.undergroundOnly", poi => poi.IsUnderground);
private readonly Area _area;
@@ -31,4 +31,9 @@ public bool ShouldInclude(IPoi poi)
}
public string Name => _area.Name;
+
+ public override string ToString()
+ {
+ return Name;
+ }
}
\ No newline at end of file
diff --git a/SOTFEdit/Model/Map/BasePoi.cs b/SOTFEdit/Model/Map/BasePoi.cs
index 3922c60..86faa54 100644
--- a/SOTFEdit/Model/Map/BasePoi.cs
+++ b/SOTFEdit/Model/Map/BasePoi.cs
@@ -1,4 +1,6 @@
-using System.Windows.Media.Imaging;
+using System;
+using System.Windows.Media.Imaging;
+using System.Linq;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
@@ -11,6 +13,76 @@ namespace SOTFEdit.Model.Map;
public abstract partial class BasePoi : ObservableObject, IPoi
{
+ public virtual int Id { get; init; } = -1;
+ public bool HasValidId => Id != -1;
+
+ private static readonly char[] DonePoiSeparator = [','];
+
+ public bool IsDone
+ {
+ get
+ {
+ var ids = (Settings.Default.DonePoiIdListString ?? "")
+ .Split(DonePoiSeparator, StringSplitOptions.RemoveEmptyEntries)
+ .Select(s => int.TryParse(s, out var id) ? (int?)id : null)
+ .Where(id => id.HasValue)
+ .Select(id => id.GetValueOrDefault())
+ .ToList();
+ return ids.Contains(Id);
+ }
+ set
+ {
+ var idList = (Settings.Default.DonePoiIdListString ?? "")
+ .Split(DonePoiSeparator, StringSplitOptions.RemoveEmptyEntries)
+ .Select(s => int.TryParse(s, out var id) ? (int?)id : null)
+ .Where(id => id.HasValue)
+ .Select(id => id.GetValueOrDefault())
+ .ToList();
+
+ if (value)
+ {
+ if (!idList.Contains(Id))
+ {
+ idList.Add(Id);
+ Settings.Default.DonePoiIdListString = string.Join(",", idList);
+ Settings.Default.Save();
+ }
+ }
+ else
+ {
+ if (idList.Contains(Id))
+ {
+ idList.Remove(Id);
+ Settings.Default.DonePoiIdListString = string.Join(",", idList);
+ Settings.Default.Save();
+ }
+ }
+
+ OnPropertyChanged(nameof(IsDone));
+ OnPropertyChanged(nameof(DoneButtonText));
+
+ // Re-apply filter if hiding should be triggered by setting done
+ var mainWindow = System.Windows.Application.Current?.MainWindow;
+ if (mainWindow?.DataContext is SOTFEdit.ViewModel.MapViewModel mapViewModel && mapViewModel.MapFilter != null)
+ {
+ ApplyFilter(mapViewModel.MapFilter);
+ }
+ }
+ }
+
+ public string DoneButtonText => IsDone ? "Mark as Undone" : "Mark as Done";
+
+ [RelayCommand]
+ private void ToggleDone()
+ {
+ IsDone = !IsDone;
+ }
+
+ public void RefreshDoneStatus()
+ {
+ OnPropertyChanged(nameof(IsDone));
+ OnPropertyChanged(nameof(DoneButtonText));
+ }
[NotifyPropertyChangedFor(nameof(Visible))]
[ObservableProperty]
private bool _enabled;
diff --git a/SOTFEdit/Model/Map/CaveOrBunkerPoi.cs b/SOTFEdit/Model/Map/CaveOrBunkerPoi.cs
index 0fe9315..ba9f52d 100644
--- a/SOTFEdit/Model/Map/CaveOrBunkerPoi.cs
+++ b/SOTFEdit/Model/Map/CaveOrBunkerPoi.cs
@@ -6,17 +6,17 @@ namespace SOTFEdit.Model.Map;
public class CaveOrBunkerPoi : DefaultGenericInformationalPoi, IPoiWithItems
{
- private readonly HashSet _inventoryItems;
+ private HashSet _inventoryItems;
private readonly IEnumerable- ? _items;
private readonly IEnumerable
? _objects;
- private CaveOrBunkerPoi(float x, float y, Position? teleport, string title, string? description,
+ private CaveOrBunkerPoi(int id, float x, float y, Position? teleport, string title, string? description,
string? screenshot, string icon,
IEnumerable- ? requirements, IEnumerable
- ? items, HashSet
inventoryItems,
IEnumerable? objects,
bool isUnderground = false,
string? wikiLink = null) :
- base(x, y, teleport, title, description, screenshot, icon, requirements, isUnderground, wikiLink)
+ base(id, x, y, teleport, title, description, screenshot, icon, requirements, isUnderground, wikiLink)
{
_items = items;
_objects = objects;
@@ -43,7 +43,11 @@ public override void ApplyFilter(MapFilter mapFilter)
protected override bool ShouldFilter(MapFilter mapFilter)
{
- return (mapFilter.ShowOnlyUncollectedItems && HasAllItemsInInventory()) || base.ShouldFilter(mapFilter);
+ if (mapFilter.HideCompleted && (HasAllItemsInInventory() || IsDone))
+ {
+ return true;
+ }
+ return base.ShouldFilter(mapFilter);
}
protected override bool FullTextFilter(string normalizedLowercaseFullText)
@@ -61,10 +65,17 @@ private bool HasAllItemsInInventory()
return _items?.All(HasItemInInventory) ?? true;
}
+ public void RefreshInventory(HashSet inventoryItems)
+ {
+ _inventoryItems = inventoryItems;
+ OnPropertyChanged(nameof(Items));
+ }
+
public new static CaveOrBunkerPoi Of(RawPoi rawPoi, ItemList itemList, string icon, HashSet inventoryItems,
AreaMaskManager areaMaskManager, bool enabled)
{
var poi = new CaveOrBunkerPoi(
+ rawPoi.Id,
rawPoi.X,
rawPoi.Y,
rawPoi.Teleport?.ToPosition(areaMaskManager),
diff --git a/SOTFEdit/Model/Map/CustomMapPoi.cs b/SOTFEdit/Model/Map/CustomMapPoi.cs
index 716d9e7..904b782 100644
--- a/SOTFEdit/Model/Map/CustomMapPoi.cs
+++ b/SOTFEdit/Model/Map/CustomMapPoi.cs
@@ -14,14 +14,14 @@ public partial class CustomMapPoi : DefaultGenericInformationalPoi
private readonly string _screenshotDirectory;
private CustomMapPoi(int id, Position teleport, string title, string? description, string screenshotDirectory,
- string? screenshot) : base(teleport.X, teleport.Z, teleport, title, description, screenshot, IconFile, null,
+ string? screenshot) : base(id, teleport.X, teleport.Z, teleport, title, description, screenshot, IconFile, null,
teleport.Area.IsUnderground())
{
_screenshotDirectory = screenshotDirectory;
Id = id;
}
- public int Id { get; }
+ public override int Id { get; init; }
public static BitmapImage CategoryIcon => LoadBaseIcon(IconFile, 24, 24);
diff --git a/SOTFEdit/Model/Map/DefaultGenericInformationalPoi.cs b/SOTFEdit/Model/Map/DefaultGenericInformationalPoi.cs
index faf71de..f1ad443 100644
--- a/SOTFEdit/Model/Map/DefaultGenericInformationalPoi.cs
+++ b/SOTFEdit/Model/Map/DefaultGenericInformationalPoi.cs
@@ -6,9 +6,10 @@ namespace SOTFEdit.Model.Map;
public class DefaultGenericInformationalPoi : InformationalPoi
{
+ public override int Id { get; init; }
private readonly string _icon;
- protected DefaultGenericInformationalPoi(float x, float y, Position? teleport, string title, string? description,
+ protected DefaultGenericInformationalPoi(int id, float x, float y, Position? teleport, string title, string? description,
string? screenshot,
string icon,
IEnumerable- ? requirements, bool isUnderground = false, string? wikiLink = null) : base(x, y, teleport,
@@ -17,6 +18,7 @@ protected DefaultGenericInformationalPoi(float x, float y, Position? teleport, s
requirements, screenshot,
isUnderground, wikiLink)
{
+ Id = id;
_icon = icon;
}
@@ -27,6 +29,7 @@ public static DefaultGenericInformationalPoi Of(RawPoi rawPoi, ItemList itemList
HashSet
inventoryItems, AreaMaskManager areaMaskManager, bool enabled)
{
var poi = new DefaultGenericInformationalPoi(
+ rawPoi.Id,
rawPoi.X,
rawPoi.Y,
rawPoi.Teleport?.ToPosition(areaMaskManager),
@@ -45,4 +48,13 @@ public static DefaultGenericInformationalPoi Of(RawPoi rawPoi, ItemList itemList
return poi;
}
+
+ protected override bool ShouldFilter(MapFilter mapFilter)
+ {
+ if (mapFilter.HideCompleted && IsDone)
+ {
+ return true;
+ }
+ return base.ShouldFilter(mapFilter);
+ }
}
\ No newline at end of file
diff --git a/SOTFEdit/Model/Map/ItemPoi.cs b/SOTFEdit/Model/Map/ItemPoi.cs
index 88d341b..978af17 100644
--- a/SOTFEdit/Model/Map/ItemPoi.cs
+++ b/SOTFEdit/Model/Map/ItemPoi.cs
@@ -8,6 +8,7 @@ namespace SOTFEdit.Model.Map;
public class ItemPoi : InformationalPoi
{
+ public override int Id { get; init; }
private readonly IEnumerable- ? _altItems;
private readonly HashSet
_inventoryItems;
@@ -73,7 +74,12 @@ public override void ApplyFilter(MapFilter mapFilter)
protected override bool ShouldFilter(MapFilter mapFilter)
{
- return (mapFilter.ShowOnlyUncollectedItems && HasAllItemsInInventory()) || base.ShouldFilter(mapFilter);
+ // Hide if done and HideCompleted is set
+ if (mapFilter.HideCompleted && (HasAllItemsInInventory() || IsDone))
+ {
+ return true;
+ }
+ return base.ShouldFilter(mapFilter);
}
protected override bool FullTextFilter(string normalizedLowercaseFullText)
@@ -90,7 +96,20 @@ private bool AnyAltItemContains(string normalizedLowercaseFullText)
private bool HasAllItemsInInventory()
{
- return HasItemInInventory(_item) && (_altItems?.All(HasItemInInventory) ?? true);
+ // Check if the main item is in inventory
+ if (!HasItemInInventory(_item))
+ {
+ return false;
+ }
+
+ // If there are no alternative items, return true
+ if (_altItems == null)
+ {
+ return true;
+ }
+
+ // All alternative items must be in inventory
+ return _altItems.All(HasItemInInventory);
}
private bool HasItemInInventory(Item item)
diff --git a/SOTFEdit/Model/Map/MapFilter.cs b/SOTFEdit/Model/Map/MapFilter.cs
index 81ccba3..9c4d04e 100644
--- a/SOTFEdit/Model/Map/MapFilter.cs
+++ b/SOTFEdit/Model/Map/MapFilter.cs
@@ -2,7 +2,9 @@
using System.Collections.Generic;
using System.Linq;
using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.Messaging;
using SOTFEdit.Infrastructure;
+using SOTFEdit.Model.Events;
namespace SOTFEdit.Model.Map;
@@ -25,32 +27,74 @@ public enum RequirementsFilterType
private RequirementsFilterType _requirementsFilter = RequirementsFilterType.All;
[ObservableProperty]
- private bool _showOnlyUncollectedItems;
+ private bool _hideCompleted = Settings.Default.MapFilterHideCompleted;
public string? NormalizedLowercaseFullText;
public MapFilter(AreaMaskManager areaManager)
{
var allAreas = areaManager.GetAllAreas();
- AreaFilterTypeValues = new List
- {
- Map.AreaFilter.All, Map.AreaFilter.Surface, Map.AreaFilter.CavesOrBunkers
- };
-
- AreaFilterTypeValues.AddRange(allAreas.Where(area => !area.IsSurface()).OrderBy(area => area.Name)
- .Select(area => new AreaFilter(area)));
+ AreaFilterTypeValues =
+ [
+ Map.AreaFilter.All, Map.AreaFilter.Surface, Map.AreaFilter.CavesOrBunkers,
+ .. allAreas.Where(area => !area.IsSurface()).OrderBy(area => area.Name)
+ .Select(area => new AreaFilter(area)),
+ ];
RequirementsFilterTypeValues = Enum.GetValues(typeof(RequirementsFilterType)).Cast()
.Select(v =>
new ComboBoxItemAndValue(
TranslationManager.Get($"map.requirementsFilter.types.{v}"), v));
+
+ // Load persisted filter values
+ var areaFilterSetting = Settings.Default.MapFilterAreaFilter;
+ if (!string.IsNullOrWhiteSpace(areaFilterSetting))
+ {
+ var match = AreaFilterTypeValues.FirstOrDefault(a => a.ToString() == areaFilterSetting);
+ if (match != null)
+ _areaFilter = match;
+ }
+ _fullText = Settings.Default.MapFilterFullText;
+ if (Enum.TryParse(
+ Settings.Default.MapFilterRequirementsFilter, out RequirementsFilterType req))
+ _requirementsFilter = req;
+ _hideCompleted = Settings.Default.MapFilterHideCompleted;
+
+ // Listen for language changes to refresh filter names
+ WeakReferenceMessenger.Default.Register(this, (_, _) => OnLanguageChanged());
+ }
+
+ private void OnLanguageChanged()
+ {
+ // Notify that AreaFilterTypeValues may have changed (StaticAreaFilter.Name is now dynamic)
+ OnPropertyChanged(nameof(AreaFilterTypeValues));
}
public List AreaFilterTypeValues { get; }
public IEnumerable> RequirementsFilterTypeValues { get; }
+ partial void OnAreaFilterChanged(IAreaFilter value)
+ {
+ Settings.Default.MapFilterAreaFilter = value?.ToString();
+ Settings.Default.Save();
+ }
+
partial void OnFullTextChanged(string? value)
{
NormalizedLowercaseFullText = value != null ? TranslationHelper.Normalize(value).ToLower() : null;
+ Settings.Default.MapFilterFullText = value;
+ Settings.Default.Save();
+ }
+
+ partial void OnRequirementsFilterChanged(RequirementsFilterType value)
+ {
+ Settings.Default.MapFilterRequirementsFilter = value.ToString();
+ Settings.Default.Save();
+ }
+
+ partial void OnHideCompletedChanged(bool value)
+ {
+ Settings.Default.MapFilterHideCompleted = value;
+ Settings.Default.Save();
}
}
\ No newline at end of file
diff --git a/SOTFEdit/Model/Map/Static/PoiLoader.cs b/SOTFEdit/Model/Map/Static/PoiLoader.cs
index a168ebc..894747f 100644
--- a/SOTFEdit/Model/Map/Static/PoiLoader.cs
+++ b/SOTFEdit/Model/Map/Static/PoiLoader.cs
@@ -4,6 +4,7 @@
using System.IO;
using System.Linq;
using Newtonsoft.Json.Linq;
+using NLog;
using SOTFEdit.Companion.Shared;
using SOTFEdit.Infrastructure;
using SOTFEdit.Infrastructure.Companion;
@@ -13,6 +14,8 @@ namespace SOTFEdit.Model.Map.Static;
public class PoiLoader
{
+ private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();
+
private readonly AreaMaskManager _areaMaskManager;
private readonly CompanionPoiStorage _companionPoiStorage;
private readonly InventoryPageViewModel _inventoryPageViewModel;
@@ -54,10 +57,18 @@ public IEnumerable Load()
};
}
+ public HashSet GetInventoryItemsPublic()
+ {
+ return GetInventoryItems();
+ }
+
private HashSet GetInventoryItems()
{
var itemsWithHashes = _items.GetItemsWithHashes();
+ var collectionCount = _inventoryPageViewModel.InventoryCollectionView.Cast().Count();
+ Logger.Debug($"PoiLoader: GetInventoryItems - InventoryCollectionView has {collectionCount} items");
+
var inventoryItems = _inventoryPageViewModel.InventoryCollectionView.OfType()
.SelectMany(item =>
{
@@ -73,6 +84,7 @@ private HashSet GetInventoryItems()
inventoryItems.Add(selectedCloth.Id);
}
+ Logger.Debug($"PoiLoader: GetInventoryItems - Returning {inventoryItems.Count} inventory item IDs");
return inventoryItems;
}
@@ -149,11 +161,11 @@ private IPoiGrouper LoadItemPois(HashSet inventoryItems, bool filterForComp
var poisByType = rawPoiCollection.Items.SelectMany(kvp => kvp.Value.Pois.Select(poi =>
ItemPoi.Of(kvp.Key, kvp.Value, poi, _items, inventoryItems, _areaMaskManager, false)))
- .Where(poi => poi != null)
+ .Where(poi => poi != null && !string.IsNullOrEmpty(poi.Item.Item.Type))
.Select(poi => poi!)
.Where(poi =>
- !filterForCompanion || rawPoiCollection.AllowedGroupsForCompanion.Contains(poi.Item.Item.Type))
- .GroupBy(poi => poi.Item.Item.Type)
+ !filterForCompanion || rawPoiCollection.AllowedGroupsForCompanion.Contains(poi.Item.Item.Type!))
+ .GroupBy(poi => poi.Item.Item.Type!)
.OrderBy(g => g.Key)
.ToDictionary(g => g.Key, g => g.ToList());
diff --git a/SOTFEdit/Model/Map/Static/RawPoi.cs b/SOTFEdit/Model/Map/Static/RawPoi.cs
index c9c595e..e9baa80 100644
--- a/SOTFEdit/Model/Map/Static/RawPoi.cs
+++ b/SOTFEdit/Model/Map/Static/RawPoi.cs
@@ -4,7 +4,7 @@
namespace SOTFEdit.Model.Map.Static;
// ReSharper disable once ClassNeverInstantiated.Global
-public record RawPoi(string? Title, string? Description, float X, float Y, int[]? Requirements,
+public record RawPoi(int Id, string? Title, string? Description, float X, float Y, int[]? Requirements,
int[]? Items, string[]? Objects, string? Screenshot, bool IsUnderground = false,
string? Wiki = null, Teleport? Teleport = null)
{
diff --git a/SOTFEdit/Model/Map/StaticAreaFilter.cs b/SOTFEdit/Model/Map/StaticAreaFilter.cs
index 312d7dc..29864b7 100644
--- a/SOTFEdit/Model/Map/StaticAreaFilter.cs
+++ b/SOTFEdit/Model/Map/StaticAreaFilter.cs
@@ -1,21 +1,28 @@
using System;
+using SOTFEdit.Infrastructure;
namespace SOTFEdit.Model.Map;
public class StaticAreaFilter : IAreaFilter
{
private readonly Predicate _predicate;
+ private readonly string _translationKey;
- public StaticAreaFilter(string name, Predicate predicate)
+ public StaticAreaFilter(string translationKey, Predicate predicate)
{
_predicate = predicate;
- Name = name;
+ _translationKey = translationKey;
}
- public string Name { get; }
+ public string Name => TranslationManager.Get(_translationKey);
public bool ShouldInclude(IPoi poi)
{
return _predicate.Invoke(poi);
}
+
+ public override string ToString()
+ {
+ return Name;
+ }
}
\ No newline at end of file
diff --git a/SOTFEdit/Model/Map/StructurePoi.cs b/SOTFEdit/Model/Map/StructurePoi.cs
index 3715715..72c0a26 100644
--- a/SOTFEdit/Model/Map/StructurePoi.cs
+++ b/SOTFEdit/Model/Map/StructurePoi.cs
@@ -29,6 +29,20 @@ public override void ApplyFilter(MapFilter mapFilter)
protected override bool ShouldFilter(MapFilter mapFilter)
{
+ var hideCompleted = mapFilter.HideCompleted;
+ var isDone = IsDone;
+
+ if (hideCompleted && isDone)
+ {
+ NLog.LogManager.GetCurrentClassLogger().Debug($"StructurePoi.ShouldFilter: Hiding {Title} (ID={Id}), HideCompleted={hideCompleted}, IsDone={isDone}");
+ return true;
+ }
+
+ if (hideCompleted && !isDone)
+ {
+ NLog.LogManager.GetCurrentClassLogger().Trace($"StructurePoi.ShouldFilter: NOT hiding {Title} (ID={Id}), HideCompleted={hideCompleted}, IsDone={isDone}");
+ }
+
return mapFilter.RequirementsFilter == MapFilter.RequirementsFilterType.InaccessibleOnly ||
base.ShouldFilter(mapFilter);
}
diff --git a/SOTFEdit/Model/Map/WorldItemPoi.cs b/SOTFEdit/Model/Map/WorldItemPoi.cs
index 6977280..85b83a2 100644
--- a/SOTFEdit/Model/Map/WorldItemPoi.cs
+++ b/SOTFEdit/Model/Map/WorldItemPoi.cs
@@ -37,6 +37,10 @@ public override void ApplyFilter(MapFilter mapFilter)
protected override bool ShouldFilter(MapFilter mapFilter)
{
+ if (mapFilter.HideCompleted && IsDone)
+ {
+ return true;
+ }
return mapFilter.RequirementsFilter == MapFilter.RequirementsFilterType.InaccessibleOnly ||
base.ShouldFilter(mapFilter);
}
diff --git a/SOTFEdit/Model/Position.cs b/SOTFEdit/Model/Position.cs
index cc6ff9c..7199a3e 100644
--- a/SOTFEdit/Model/Position.cs
+++ b/SOTFEdit/Model/Position.cs
@@ -119,8 +119,8 @@ private List> DistributeCoordinatesInGrid(int count, int spa
var currentLevel = 0;
var currentDirection = 0;
- float[] directionX = { 1, 0, -1, 0 };
- float[] directionY = { 0, -1, 0, 1 };
+ float[] directionX = [1, 0, -1, 0];
+ float[] directionY = [0, -1, 0, 1];
var curX = X;
var curZ = Z;
diff --git a/SOTFEdit/Model/SaveData/Actor/Influence.cs b/SOTFEdit/Model/SaveData/Actor/Influence.cs
index 3fe3de9..2b30a05 100644
--- a/SOTFEdit/Model/SaveData/Actor/Influence.cs
+++ b/SOTFEdit/Model/SaveData/Actor/Influence.cs
@@ -16,7 +16,7 @@ public partial class Influence : ObservableObject
[ObservableProperty]
private float _sentiment;
- public string TypeId { get; init; }
+ public string TypeId { get; init; } = string.Empty;
[JsonIgnore]
public static IEnumerable AllTypes => new[] { Type.Player, Type.Cannibal, Type.Creepy };
diff --git a/SOTFEdit/Model/SaveData/Armour/PlayerArmourDataModel.cs b/SOTFEdit/Model/SaveData/Armour/PlayerArmourDataModel.cs
index 48a5a99..30e6449 100644
--- a/SOTFEdit/Model/SaveData/Armour/PlayerArmourDataModel.cs
+++ b/SOTFEdit/Model/SaveData/Armour/PlayerArmourDataModel.cs
@@ -5,12 +5,12 @@ namespace SOTFEdit.Model.SaveData.Armour;
// ReSharper disable once ClassNeverInstantiated.Global
public record PlayerArmourDataModel : SotfBaseModel
{
- public DataModel Data { get; init; }
+ public DataModel? Data { get; init; }
// ReSharper disable once ClassNeverInstantiated.Global
public record DataModel
{
[JsonConverter(typeof(StringTypeConverter))]
- public PlayerArmourSystemModel PlayerArmourSystem { get; init; }
+ public PlayerArmourSystemModel? PlayerArmourSystem { get; init; }
}
}
\ No newline at end of file
diff --git a/SOTFEdit/Model/SaveData/Armour/PlayerArmourSystemModel.cs b/SOTFEdit/Model/SaveData/Armour/PlayerArmourSystemModel.cs
index 913a67f..875a8c8 100644
--- a/SOTFEdit/Model/SaveData/Armour/PlayerArmourSystemModel.cs
+++ b/SOTFEdit/Model/SaveData/Armour/PlayerArmourSystemModel.cs
@@ -6,7 +6,7 @@ namespace SOTFEdit.Model.SaveData.Armour;
// ReSharper disable once ClassNeverInstantiated.Global
public record PlayerArmourSystemModel : SotfBaseModel
{
- private static readonly int[] ArmorSlots = { 6, 7, 10, 11, 4, 5, 8, 9, 1, 0 };
+ private static readonly int[] ArmorSlots = [6, 7, 10, 11, 4, 5, 8, 9, 1, 0];
public List ArmourPieces { get; private set; } = new();
public static bool Merge(PlayerArmourSystemModel armourSystemModel,
diff --git a/SOTFEdit/Model/SaveData/Inventory/ItemInstanceManagerDataModel.cs b/SOTFEdit/Model/SaveData/Inventory/ItemInstanceManagerDataModel.cs
index 3242744..2ef4b5f 100644
--- a/SOTFEdit/Model/SaveData/Inventory/ItemInstanceManagerDataModel.cs
+++ b/SOTFEdit/Model/SaveData/Inventory/ItemInstanceManagerDataModel.cs
@@ -5,5 +5,5 @@ namespace SOTFEdit.Model.SaveData.Inventory;
// ReSharper disable once ClassNeverInstantiated.Global
public record ItemInstanceManagerDataModel : SotfBaseModel
{
- public List ItemBlocks { get; set; }
+ public List? ItemBlocks { get; set; }
}
\ No newline at end of file
diff --git a/SOTFEdit/Model/SaveData/Inventory/PlayerInventoryDataModel.cs b/SOTFEdit/Model/SaveData/Inventory/PlayerInventoryDataModel.cs
index 9630126..ebd5981 100644
--- a/SOTFEdit/Model/SaveData/Inventory/PlayerInventoryDataModel.cs
+++ b/SOTFEdit/Model/SaveData/Inventory/PlayerInventoryDataModel.cs
@@ -8,7 +8,7 @@ namespace SOTFEdit.Model.SaveData.Inventory;
// ReSharper disable once ClassNeverInstantiated.Global
public record PlayerInventoryDataModel
{
- public DataModel Data { get; set; }
+ public DataModel? Data { get; set; }
public static bool Merge(SaveDataWrapper saveDataWrapper, List selectedItems)
{
@@ -30,6 +30,6 @@ public static bool Merge(SaveDataWrapper saveDataWrapper, List se
public class DataModel
{
[JsonConverter(typeof(StringTypeConverter))]
- public PlayerInventoryModel PlayerInventory { get; set; }
+ public PlayerInventoryModel? PlayerInventory { get; set; }
}
}
\ No newline at end of file
diff --git a/SOTFEdit/Model/SaveData/Inventory/PlayerInventoryModel.cs b/SOTFEdit/Model/SaveData/Inventory/PlayerInventoryModel.cs
index 1551014..432e0ec 100644
--- a/SOTFEdit/Model/SaveData/Inventory/PlayerInventoryModel.cs
+++ b/SOTFEdit/Model/SaveData/Inventory/PlayerInventoryModel.cs
@@ -11,7 +11,7 @@ namespace SOTFEdit.Model.SaveData.Inventory;
public record PlayerInventoryModel
{
public List? EquippedItems { get; set; }
- public ItemInstanceManagerDataModel ItemInstanceManagerData { get; set; }
+ public ItemInstanceManagerDataModel? ItemInstanceManagerData { get; set; }
public static bool Merge(JToken playerInventory, List selectedItems)
{
diff --git a/SOTFEdit/Model/Savegame/Savegame.cs b/SOTFEdit/Model/Savegame/Savegame.cs
index 4f860ff..21bd119 100644
--- a/SOTFEdit/Model/Savegame/Savegame.cs
+++ b/SOTFEdit/Model/Savegame/Savegame.cs
@@ -193,7 +193,7 @@ private void ReadSaveData()
var patternMatch = _nameFilePattern.Match(Path.GetFileName(nameFile));
if (!patternMatch.Success || patternMatch.Groups.Count < 2)
{
- Logger.Warn($"Name pattern does not match on {nameFile}, will return raw filename");
+ Logger.Trace($"Name pattern does not match on {nameFile}, will return raw filename");
return Path.GetFileNameWithoutExtension(nameFile).Replace("_", " ");
}
diff --git a/SOTFEdit/SOTFEdit.csproj b/SOTFEdit/SOTFEdit.csproj
index 647b3a1..4a1804c 100644
--- a/SOTFEdit/SOTFEdit.csproj
+++ b/SOTFEdit/SOTFEdit.csproj
@@ -1,152 +1,160 @@
+
+ WinExe
+ net8.0-windows
+ enable
+ true
+ False
+ false
+ icons8-kleine-axt-doodle-96.ico
+ 1.2.1
+
+
- WinExe
- net6.0-windows
- enable
- true
- False
- false
- icons8-kleine-axt-doodle-96.ico
-
+
-
-
- Always
-
-
- Always
-
-
+
+
+ Always
+
+
+ Always
+
+
+
+ true
+
-
-
-
-
-
-
-
-
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
+
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
- True
- True
- Settings.settings
-
-
- Code
- AdvancedItemStorageUserControl.xaml
-
-
+
+
+ True
+ True
+ Settings.settings
+
+
+ Code
+ AdvancedItemStorageUserControl.xaml
+
+
-
-
- PreserveNewest
-
-
- SettingsSingleFileGenerator
- Settings.Designer.cs
-
-
+
+
+ PreserveNewest
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
-
-
- MSBuild:Compile
- Wpf
- Designer
-
-
- MSBuild:Compile
- Wpf
- Designer
-
-
- MSBuild:Compile
- Wpf
- Designer
-
-
- MSBuild:Compile
- Wpf
- Designer
-
-
- MSBuild:Compile
- Wpf
- Designer
-
-
- MSBuild:Compile
- Wpf
- Designer
-
-
- MSBuild:Compile
-
-
- MSBuild:Compile
-
-
- MSBuild:Compile
-
-
- MSBuild:Compile
-
-
- MSBuild:Compile
-
-
- MSBuild:Compile
-
-
- MSBuild:Compile
-
-
- MSBuild:Compile
-
-
- MSBuild:Compile
- Wpf
- Designer
-
-
- MSBuild:Compile
- Wpf
- Designer
-
-
+
+
+ MSBuild:Compile
+ Wpf
+ Designer
+
+
+ MSBuild:Compile
+ Wpf
+ Designer
+
+
+ MSBuild:Compile
+ Wpf
+ Designer
+
+
+ MSBuild:Compile
+ Wpf
+ Designer
+
+
+ MSBuild:Compile
+ Wpf
+ Designer
+
+
+ MSBuild:Compile
+ Wpf
+ Designer
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+ Wpf
+ Designer
+
+
+ MSBuild:Compile
+ Wpf
+ Designer
+
+
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/SOTFEdit/Settings.Designer.cs b/SOTFEdit/Settings.Designer.cs
index 86c4fd8..523939a 100644
--- a/SOTFEdit/Settings.Designer.cs
+++ b/SOTFEdit/Settings.Designer.cs
@@ -7,247 +7,464 @@
//
//------------------------------------------------------------------------------
-namespace SOTFEdit {
-
-
+namespace SOTFEdit
+{
+
+
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")]
- internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
-
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
-
- public static Settings Default {
- get {
+
+ public static Settings Default
+ {
+ get
+ {
return defaultInstance;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
- public string SavegamePath {
- get {
+ public string SavegamePath
+ {
+ get
+ {
return ((string)(this["SavegamePath"]));
}
- set {
+ set
+ {
this["SavegamePath"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
- public bool UpgradeRequired {
- get {
+ public bool UpgradeRequired
+ {
+ get
+ {
return ((bool)(this["UpgradeRequired"]));
}
- set {
+ set
+ {
this["UpgradeRequired"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
- public bool CheckForUpdates {
- get {
+ public bool CheckForUpdates
+ {
+ get
+ {
return ((bool)(this["CheckForUpdates"]));
}
- set {
+ set
+ {
this["CheckForUpdates"] = value;
}
}
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Normal")]
+ public string MapWindowState
+ {
+ get
+ {
+ return ((string)(this["MapWindowState"]));
+ }
+ set
+ {
+ this["MapWindowState"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public int MapWindowScreenIndex
+ {
+ get
+ {
+ return ((int)(this["MapWindowScreenIndex"]));
+ }
+ set
+ {
+ this["MapWindowScreenIndex"] = value;
+ }
+ }
[global::System.Configuration.DefaultSettingValueAttribute("")]
- public string LastFoundVersion {
- get {
+ public string LastFoundVersion
+ {
+ get
+ {
return ((string)(this["LastFoundVersion"]));
}
- set {
+ set
+ {
this["LastFoundVersion"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("Dark")]
- public string Theme {
- get {
+ public string Theme
+ {
+ get
+ {
return ((string)(this["Theme"]));
}
- set {
+ set
+ {
this["Theme"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("Blue")]
- public string ThemeAccent {
- get {
+ public string ThemeAccent
+ {
+ get
+ {
return ((string)(this["ThemeAccent"]));
}
- set {
+ set
+ {
this["ThemeAccent"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("InitialAndOne")]
- public global::SOTFEdit.ApplicationSettings.BackupMode BackupMode {
- get {
+ public global::SOTFEdit.ApplicationSettings.BackupMode BackupMode
+ {
+ get
+ {
return ((global::SOTFEdit.ApplicationSettings.BackupMode)(this["BackupMode"]));
}
- set {
+ set
+ {
this["BackupMode"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
- public string LastSavegame {
- get {
+ public string LastSavegame
+ {
+ get
+ {
return ((string)(this["LastSavegame"]));
}
- set {
+ set
+ {
this["LastSavegame"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
- public string Language {
- get {
+ public string Language
+ {
+ get
+ {
return ((string)(this["Language"]));
}
- set {
+ set
+ {
this["Language"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
- public string LastSavegameName {
- get {
+ public string LastSavegameName
+ {
+ get
+ {
return ((string)(this["LastSavegameName"]));
}
- set {
+ set
+ {
this["LastSavegameName"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
- public bool FirstRun {
- get {
+ public bool FirstRun
+ {
+ get
+ {
return ((bool)(this["FirstRun"]));
}
- set {
+ set
+ {
this["FirstRun"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("_null_")]
- public string SelectedMapGroups {
- get {
+ public string SelectedMapGroups
+ {
+ get
+ {
return ((string)(this["SelectedMapGroups"]));
}
- set {
+ set
+ {
this["SelectedMapGroups"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("127.0.0.1")]
- public string CompanionAddress {
- get {
+ public string CompanionAddress
+ {
+ get
+ {
return ((string)(this["CompanionAddress"]));
}
- set {
+ set
+ {
this["CompanionAddress"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("35321")]
- public int CompanionPort {
- get {
+ public int CompanionPort
+ {
+ get
+ {
return ((int)(this["CompanionPort"]));
}
- set {
+ set
+ {
this["CompanionPort"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("15")]
- public short CompanionConnectTimeout {
- get {
+ public short CompanionConnectTimeout
+ {
+ get
+ {
return ((short)(this["CompanionConnectTimeout"]));
}
- set {
+ set
+ {
this["CompanionConnectTimeout"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("Dark")]
- public global::SOTFEdit.ViewModel.MapType MapType {
- get {
+ public global::SOTFEdit.ViewModel.MapType MapType
+ {
+ get
+ {
return ((global::SOTFEdit.ViewModel.MapType)(this["MapType"]));
}
- set {
+ set
+ {
this["MapType"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("30")]
- public short CompanionKeepAliveInterval {
- get {
+ public short CompanionKeepAliveInterval
+ {
+ get
+ {
return ((short)(this["CompanionKeepAliveInterval"]));
}
- set {
+ set
+ {
this["CompanionKeepAliveInterval"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0.1")]
- public decimal CompanionMapPositionUpdateInterval {
- get {
+ public decimal CompanionMapPositionUpdateInterval
+ {
+ get
+ {
return ((decimal)(this["CompanionMapPositionUpdateInterval"]));
}
- set {
+ set
+ {
this["CompanionMapPositionUpdateInterval"] = value;
}
}
-
+
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
- public bool AskForBackups {
- get {
+ public bool AskForBackups
+ {
+ get
+ {
return ((bool)(this["AskForBackups"]));
}
- set {
+ set
+ {
this["AskForBackups"] = value;
}
}
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool MapFilterHideCompleted
+ {
+ get
+ {
+ return ((bool)(this["MapFilterHideCompleted"]));
+ }
+ set
+ {
+ this["MapFilterHideCompleted"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("All")]
+ public string MapFilterAreaFilter
+ {
+ get
+ {
+ return ((string)(this["MapFilterAreaFilter"]));
+ }
+ set
+ {
+ this["MapFilterAreaFilter"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("All")]
+ public string MapFilterRequirementsFilter
+ {
+ get
+ {
+ return ((string)(this["MapFilterRequirementsFilter"]));
+ }
+ set
+ {
+ this["MapFilterRequirementsFilter"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string MapFilterFullText
+ {
+ get
+ {
+ return ((string)(this["MapFilterFullText"]));
+ }
+ set
+ {
+ this["MapFilterFullText"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string DonePoiIdListString
+ {
+ get
+ {
+ return ((string)(this["DonePoiIdListString"]));
+ }
+ set
+ {
+ this["DonePoiIdListString"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public double MapWindowLeft
+ {
+ get { return ((double)(this["MapWindowLeft"])); }
+ set { this["MapWindowLeft"] = value; }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public double MapWindowTop
+ {
+ get { return ((double)(this["MapWindowTop"])); }
+ set { this["MapWindowTop"] = value; }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("800")]
+ public double MapWindowWidth
+ {
+ get { return ((double)(this["MapWindowWidth"])); }
+ set { this["MapWindowWidth"] = value; }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("600")]
+ public double MapWindowHeight
+ {
+ get { return ((double)(this["MapWindowHeight"])); }
+ set { this["MapWindowHeight"] = value; }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool AutoConnect
+ {
+ get { return ((bool)(this["AutoConnect"])); }
+ set { this["AutoConnect"] = value; }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool AutoReload
+ {
+ get { return ((bool)(this["AutoReload"])); }
+ set { this["AutoReload"] = value; }
+ }
}
}
diff --git a/SOTFEdit/Settings.settings b/SOTFEdit/Settings.settings
index 97440c0..71ba7ea 100644
--- a/SOTFEdit/Settings.settings
+++ b/SOTFEdit/Settings.settings
@@ -1,65 +1,169 @@
-
-
+
+
-
-
-
-
+
+
+
+
True
-
+
True
-
-
+
+ Normal
+
+
+ 0
+
+
+
-
+
Dark
-
+
Blue
-
+
InitialAndOne
-
-
+
+
-
-
+
+
-
-
+
+
-
+
True
-
+
_null_
-
+
127.0.0.1
-
+
35321
-
+
15
-
+
Dark
-
+
30
-
+
0.1
-
+
+ False
+
+
+ True
+
+
+ All
+
+
+ All
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 800
+
+
+ 600
+
+
+ False
+
+
False
-
-
+
\ No newline at end of file
diff --git a/SOTFEdit/View/MainWindow.xaml b/SOTFEdit/View/MainWindow.xaml
index eba49e9..e5f5476 100644
--- a/SOTFEdit/View/MainWindow.xaml
+++ b/SOTFEdit/View/MainWindow.xaml
@@ -71,7 +71,7 @@
-
+
diff --git a/SOTFEdit/View/MainWindow.xaml.cs b/SOTFEdit/View/MainWindow.xaml.cs
index e9fd53f..0cc9512 100644
--- a/SOTFEdit/View/MainWindow.xaml.cs
+++ b/SOTFEdit/View/MainWindow.xaml.cs
@@ -25,7 +25,7 @@ namespace SOTFEdit.View;
/// Interaction logic for MainWindow.xaml
///
// ReSharper disable once UnusedMember.Global
-public partial class MainWindow
+public partial class MainWindow : MahApps.Metro.Controls.MetroWindow
{
private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();
@@ -39,20 +39,65 @@ public partial class MainWindow
public MainWindow()
{
- SetupListeners();
- DataContext = _dataContext = Ioc.Default.GetRequiredService();
- InitializeComponent();
+ SetupListeners();
+ DataContext = _dataContext = Ioc.Default.GetRequiredService();
+ InitializeComponent();
- App.GetAssemblyVersion(out var assemblyName, out var assemblyVersion);
+ App.GetAssemblyVersion(out var assemblyName, out var assemblyVersion);
+ _baseTitle = $"{assemblyName} v{assemblyVersion}";
+ Title = _baseTitle;
+ UpdateWindowTitle();
+ Loaded += OnLoaded;
+ }
+
+ private void UpdateWindowTitle()
+ {
+ var companionManager = Ioc.Default.GetRequiredService();
+ var isConnected = companionManager.IsConnected();
+ var status = companionManager.Status;
+ string connectionPart;
+ if (isConnected)
+ {
+ var ip = SOTFEdit.Settings.Default.CompanionAddress;
+ var port = SOTFEdit.Settings.Default.CompanionPort;
+ connectionPart = TranslationManager.GetFormatted("windows.main.connection.connected", ip, port);
+ }
+ else if (status == Infrastructure.Companion.CompanionConnectionManager.ConnectionStatus.Connecting)
+ {
+ connectionPart = TranslationManager.Get("windows.main.connection.connecting");
+ }
+ else
+ {
+ connectionPart = TranslationManager.Get("windows.main.connection.disconnected");
+ }
- _baseTitle = $"{assemblyName} v{assemblyVersion}";
- Title = _baseTitle;
+ var savegame = SavegameManager.SelectedSavegame;
+ string savegamePart;
+ string modifiedPart = string.Empty;
+ if (savegame != null)
+ {
+ string type = savegame.PrintableType;
+ var fileName = savegame.FullPath.Split(System.IO.Path.DirectorySeparatorChar).LastOrDefault();
+ savegamePart = TranslationManager.GetFormatted("windows.main.savegame.loaded", type!, fileName!);
+ var modified = savegame.SavegameStore.LastWriteTime;
+ modifiedPart = TranslationManager.GetFormatted("windows.main.modified", modified.ToString("yyyy-MM-dd HH:mm")!);
+ }
+ else
+ {
+ savegamePart = TranslationManager.Get("windows.main.savegame.none");
+ }
- Loaded += OnLoaded;
+ string assemblyName;
+ Semver.SemVersion assemblyVersion;
+ App.GetAssemblyVersion(out assemblyName, out assemblyVersion);
+ Title = TranslationManager.GetFormatted("windows.main.title", assemblyName, assemblyVersion.ToString(), connectionPart, savegamePart, modifiedPart);
}
private void SetupListeners()
{
+ // Subscribe to language changes for hot-swap support
+ TranslationManager.LanguageChanged += OnLanguageChanged;
+
WeakReferenceMessenger.Default.Register(this,
(_, message) => OnSavegameStored(message));
WeakReferenceMessenger.Default.Register(this,
@@ -107,6 +152,23 @@ private void SetupListeners()
(_, _) => OnOpenCompanionSetupWindowEvent());
}
+ private void OnLanguageChanged(object? sender, EventArgs e)
+ {
+ // The TranslateExtension now uses reactive bindings that auto-update
+ // We just need to refresh DataContext-bound properties and window title
+
+ // 1. Re-bind DataContext to refresh ViewModel properties
+ var currentContext = DataContext;
+ DataContext = null;
+ DataContext = currentContext;
+
+ // 2. Invalidate all commands
+ CommandManager.InvalidateRequerySuggested();
+
+ // 3. Update window title
+ UpdateWindowTitle();
+ }
+
private void OnOpenCompanionSetupWindowEvent()
{
var window = new CompanionSetupWindow(this);
@@ -445,11 +507,7 @@ private void OnSelectedSavegameChangedEvent(Savegame? selectedSavegame)
{
Application.Current.Dispatcher.Invoke(() =>
{
- Title = _baseTitle + (selectedSavegame != null
- ? TranslationManager.GetFormatted("windows.main.title", selectedSavegame.Title,
- selectedSavegame.PrintableType, selectedSavegame.LastSaveTime,
- selectedSavegame.SavegameStore.LastWriteTime)
- : "");
+ UpdateWindowTitle();
});
}
diff --git a/SOTFEdit/View/Map/Details/CaveOrBunkerDetailsTemplate.xaml b/SOTFEdit/View/Map/Details/CaveOrBunkerDetailsTemplate.xaml
index 7e84967..2570387 100644
--- a/SOTFEdit/View/Map/Details/CaveOrBunkerDetailsTemplate.xaml
+++ b/SOTFEdit/View/Map/Details/CaveOrBunkerDetailsTemplate.xaml
@@ -10,7 +10,7 @@
-
+
@@ -52,6 +52,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SOTFEdit/View/Map/Details/DefaultPoiDetailsTemplate.xaml b/SOTFEdit/View/Map/Details/DefaultPoiDetailsTemplate.xaml
index 7e099aa..4fb94c0 100644
--- a/SOTFEdit/View/Map/Details/DefaultPoiDetailsTemplate.xaml
+++ b/SOTFEdit/View/Map/Details/DefaultPoiDetailsTemplate.xaml
@@ -27,6 +27,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SOTFEdit/View/Map/Details/GenericInformationalPoiDetailTemplate.xaml b/SOTFEdit/View/Map/Details/GenericInformationalPoiDetailTemplate.xaml
index 9c8651c..91447b2 100644
--- a/SOTFEdit/View/Map/Details/GenericInformationalPoiDetailTemplate.xaml
+++ b/SOTFEdit/View/Map/Details/GenericInformationalPoiDetailTemplate.xaml
@@ -49,6 +49,11 @@
+
+
+
\ No newline at end of file
diff --git a/SOTFEdit/View/MapSpawnActorsWindow.xaml.cs b/SOTFEdit/View/MapSpawnActorsWindow.xaml.cs
index 4f86292..b398d02 100644
--- a/SOTFEdit/View/MapSpawnActorsWindow.xaml.cs
+++ b/SOTFEdit/View/MapSpawnActorsWindow.xaml.cs
@@ -9,7 +9,7 @@
namespace SOTFEdit.View;
-public partial class MapSpawnActorsWindow : ICloseable
+public partial class MapSpawnActorsWindow : MahApps.Metro.Controls.MetroWindow, ICloseable
{
public MapSpawnActorsWindow(Window owner, BasePoi destination)
{
diff --git a/SOTFEdit/View/MapTeleportWindow.xaml.cs b/SOTFEdit/View/MapTeleportWindow.xaml.cs
index 281878d..51edf0d 100644
--- a/SOTFEdit/View/MapTeleportWindow.xaml.cs
+++ b/SOTFEdit/View/MapTeleportWindow.xaml.cs
@@ -9,7 +9,7 @@
namespace SOTFEdit.View;
-public partial class MapTeleportWindow : ICloseable
+public partial class MapTeleportWindow : MahApps.Metro.Controls.MetroWindow, ICloseable
{
public MapTeleportWindow(Window owner, BasePoi destination,
MapTeleportWindowViewModel.TeleportationMode teleportationMode)
diff --git a/SOTFEdit/View/MapWindow.xaml b/SOTFEdit/View/MapWindow.xaml
index d067bcf..41e2ec9 100644
--- a/SOTFEdit/View/MapWindow.xaml
+++ b/SOTFEdit/View/MapWindow.xaml
@@ -1,68 +1,106 @@
-
+
-
+
-
+
-
-
-
+
+
+
+
+
@@ -84,24 +122,37 @@
-
+
-
+
-
+
+
+
+
@@ -109,9 +160,7 @@
-
+
@@ -122,118 +171,158 @@
-
-
+
+
-
+
-
-
+
+
-
+
+ PoiTemplate="{StaticResource PoiTemplate}"
+ ZipPoiTemplate="{StaticResource ZipPoiTemplate}"
+ ZiplineTemplate="{StaticResource ZiplineTemplate}" />
+ WorldItemPoiDetailsTemplate="{StaticResource WorldItemPoiDetailsTemplate}"
+ ZipPointPoiDetailsTemplate="{StaticResource ZipPointPoiDetailsTemplate}" />
-
+
-
-
-
+
+
+
-
-
+ SelectedValue="{Binding MapFilter.AreaFilter}" />
+
+
-
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
@@ -246,24 +335,31 @@
-
+
-
-
+
+
-
- Static information provided by
-
-
+
+ Static information provided by
+
@@ -271,10 +367,14 @@
-
+
@@ -297,20 +397,22 @@
Background="#88C0C0C0"
CornerRadius="5">
-
+
-
-
-
+ IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Mode, Converter={StaticResource EqualityConverter}, ConverterParameter={x:Static zoomControl:ZoomControlModes.Fill}}" />
+
+
+
@@ -318,9 +420,12 @@
-
+
-
+
@@ -337,26 +442,29 @@
+ Margin="0,0,0,10"
+ HorizontalAlignment="Center"
+ VerticalAlignment="Bottom">
-
+
-
+
-
\ No newline at end of file
+
diff --git a/SOTFEdit/View/MapWindow.xaml.cs b/SOTFEdit/View/MapWindow.xaml.cs
index 2c9f675..a3bf642 100644
--- a/SOTFEdit/View/MapWindow.xaml.cs
+++ b/SOTFEdit/View/MapWindow.xaml.cs
@@ -1,8 +1,13 @@
-using System.ComponentModel;
+using System;
+using System.ComponentModel;
+using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
+using MahApps.Metro.Controls;
+using System.Windows.Forms;
using CommunityToolkit.Mvvm.DependencyInjection;
+using System.Linq;
using CommunityToolkit.Mvvm.Messaging;
using SOTFEdit.Infrastructure.Companion;
using SOTFEdit.Infrastructure.Converters;
@@ -11,172 +16,439 @@
using SOTFEdit.Model.Events;
using SOTFEdit.Model.Map;
using SOTFEdit.ViewModel;
+using System.Windows.Threading;
-namespace SOTFEdit.View;
-
-public partial class MapWindow
+namespace SOTFEdit.View
{
- private readonly MapViewModel _dataContext;
- private IPoi? _clickedPoi;
-
- public MapWindow(RequestOpenMapEvent message)
+ public partial class MapWindow : MetroWindow
{
- DataContext = _dataContext = new MapViewModel(message.PoiGroups, Ioc.Default.GetRequiredService(),
- Ioc.Default.GetRequiredService());
- _dataContext.IsNotConnected = !Ioc.Default.GetRequiredService().IsConnected();
- SetupListeners();
- InitializeComponent();
- }
+ private readonly MapViewModel _dataContext;
+ private IPoi? _clickedPoi;
+ private readonly DispatcherTimer _autoActionTimer;
- private void SetupListeners()
- {
- WeakReferenceMessenger.Default.Register(this,
- (_, _) => OnOpenCategorySelectorEvent());
- WeakReferenceMessenger.Default.Register(this,
- (_, message) => OnShowMapImageEvent(message));
- PoiMessenger.Instance.Register(this,
- (_, message) => OnShowTeleportWindowEvent(message));
- PoiMessenger.Instance.Register(this,
- (_, message) => OnShowSpawnActorsWindowEvent(message));
- PoiMessenger.Instance.Register(this,
- (_, message) => OnSpawnActorsEvent(message));
- PoiMessenger.Instance.Register(this,
- (_, message) => OnSelectedPoiChangedEvent(message.IsSelected));
- PoiMessenger.Instance.Register(this,
- (_, message) => OnPlayerPosChangedEvent(message));
- }
+ public MapWindow(RequestOpenMapEvent message)
+ {
+ InitializeComponent();
+ DataContext = _dataContext = new MapViewModel(message.PoiGroups, Ioc.Default.GetRequiredService(),
+ Ioc.Default.GetRequiredService());
+ _dataContext.IsNotConnected = !Ioc.Default.GetRequiredService().IsConnected();
+ SetupListeners();
+ // Listen for connection and savegame changes to update title
+ CommunityToolkit.Mvvm.Messaging.WeakReferenceMessenger.Default.Register(this, (_, __) => UpdateWindowTitle());
+ CommunityToolkit.Mvvm.Messaging.WeakReferenceMessenger.Default.Register(this, (_, __) => UpdateWindowTitle());
+ UpdateWindowTitle();
- private void OnPlayerPosChangedEvent(PlayerPosChangedEvent message)
- {
- if (!_dataContext.FollowPlayer)
+ // Restore window position, size, and screen robustly
+ int screenIndex = SOTFEdit.Settings.Default.MapWindowScreenIndex;
+ double left = SOTFEdit.Settings.Default.MapWindowLeft;
+ double top = SOTFEdit.Settings.Default.MapWindowTop;
+ double width = SOTFEdit.Settings.Default.MapWindowWidth;
+ double height = SOTFEdit.Settings.Default.MapWindowHeight;
+ string lastState = SOTFEdit.Settings.Default.MapWindowState;
+
+ Screen? targetScreen = (screenIndex >= 0 && screenIndex < Screen.AllScreens.Length)
+ ? Screen.AllScreens[screenIndex]
+ : Screen.PrimaryScreen ?? Screen.AllScreens.FirstOrDefault();
+ var workingArea = (targetScreen ?? Screen.AllScreens[0]).WorkingArea;
+
+ // If last state was maximized, restore to Normal, move to correct screen, then maximize
+ if (lastState == WindowState.Maximized.ToString())
+ {
+ WindowStartupLocation = WindowStartupLocation.Manual;
+ WindowState = WindowState.Normal;
+ // Clamp to working area
+ double safeWidth = Math.Min(Math.Max(width, 400), workingArea.Width - 20);
+ double safeHeight = Math.Min(Math.Max(height, 300), workingArea.Height - 20);
+ double safeLeft = Math.Min(Math.Max(left, workingArea.Left), workingArea.Right - safeWidth);
+ double safeTop = Math.Min(Math.Max(top, workingArea.Top), workingArea.Bottom - safeHeight);
+
+ // If out of bounds, center
+ if (safeLeft < workingArea.Left || safeLeft > workingArea.Right - 100 || safeTop < workingArea.Top || safeTop > workingArea.Bottom - 100)
+ {
+ safeLeft = workingArea.Left + (workingArea.Width - safeWidth) / 2;
+ safeTop = workingArea.Top + (workingArea.Height - safeHeight) / 2;
+ }
+
+ Width = safeWidth;
+ Height = safeHeight;
+ Left = safeLeft;
+ Top = safeTop;
+
+ // Maximize after the window is loaded to ensure it's on the correct screen
+ Loaded += (s, e) =>
+ {
+ if (targetScreen != null)
+ {
+ MoveWindowToScreen(this, targetScreen);
+ }
+ WindowState = WindowState.Maximized;
+ };
+ }
+ else
+ {
+ // Normal state: just restore position/size
+ if (left >= workingArea.Left && top >= workingArea.Top && width > 0 && height > 0)
+ {
+ Width = width;
+ Height = height;
+ Left = left;
+ Top = top;
+ }
+ else
+ {
+ Left = workingArea.Left + (workingArea.Width - Width) / 2;
+ Top = workingArea.Top + (workingArea.Height - Height) / 2;
+ }
+ if (Enum.TryParse(lastState, out var state))
+ {
+ WindowState = state;
+ }
+ }
+
+ // Setup periodic timer for AutoConnect/AutoReload
+ _autoActionTimer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(5) };
+ _autoActionTimer.Tick += AutoActionTimer_Tick;
+ _autoActionTimer.Start();
+ _dataContext.PropertyChanged += DataContextOnPropertyChanged;
+
+ // Handle state changes to restore proper size when un-maximizing
+ StateChanged += OnStateChanged;
+
+ // Trigger initial auto-actions immediately (don't wait 5 seconds)
+ AutoActionTimer_Tick(null, EventArgs.Empty);
+ }
+
+ private void OnStateChanged(object? sender, EventArgs e)
{
- return;
+ // When restoring from maximized, ensure we use the saved size
+ if (WindowState == WindowState.Normal)
+ {
+ double savedWidth = SOTFEdit.Settings.Default.MapWindowWidth;
+ double savedHeight = SOTFEdit.Settings.Default.MapWindowHeight;
+ double savedLeft = SOTFEdit.Settings.Default.MapWindowLeft;
+ double savedTop = SOTFEdit.Settings.Default.MapWindowTop;
+
+ if (savedWidth > 0 && savedHeight > 0)
+ {
+ Width = savedWidth;
+ Height = savedHeight;
+ Left = savedLeft;
+ Top = savedTop;
+ }
+ }
}
- var ingameToPixel = CoordinateConverter.IngameToPixel(message.NewPosition.X, message.NewPosition.Z);
- MapZoomControl.ZoomToPos(ingameToPixel.Item1, ingameToPixel.Item2, -16);
- }
+ private void UpdateWindowTitle()
+ {
+ var companionManager = CommunityToolkit.Mvvm.DependencyInjection.Ioc.Default.GetRequiredService();
+ var isConnected = companionManager.IsConnected();
+ var status = companionManager.Status;
+ string connectionPart;
+ if (isConnected)
+ {
+ var ip = SOTFEdit.Settings.Default.CompanionAddress;
+ var port = SOTFEdit.Settings.Default.CompanionPort;
+ connectionPart = SOTFEdit.Infrastructure.TranslationManager.GetFormatted("windows.main.connection.connected", ip, port);
+ }
+ else if (status == SOTFEdit.Infrastructure.Companion.CompanionConnectionManager.ConnectionStatus.Connecting)
+ {
+ connectionPart = SOTFEdit.Infrastructure.TranslationManager.Get("windows.main.connection.connecting");
+ }
+ else
+ {
+ connectionPart = SOTFEdit.Infrastructure.TranslationManager.Get("windows.main.connection.disconnected");
+ }
- private void OnSelectedPoiChangedEvent(bool isSelected)
- {
- PoiDetailsFlyout.IsOpen = isSelected;
- }
+ var savegame = SOTFEdit.SavegameManager.SelectedSavegame;
+ string savegamePart;
+ string modifiedPart = string.Empty;
+ if (savegame != null)
+ {
+ string type = savegame.PrintableType;
+ var fileName = savegame.FullPath.Split(System.IO.Path.DirectorySeparatorChar).LastOrDefault();
+ savegamePart = SOTFEdit.Infrastructure.TranslationManager.GetFormatted("windows.main.savegame.loaded", type!, fileName!);
+ var modified = savegame.SavegameStore.LastWriteTime;
+ modifiedPart = SOTFEdit.Infrastructure.TranslationManager.GetFormatted("windows.main.modified", modified.ToString("yyyy-MM-dd HH:mm")!);
+ }
+ else
+ {
+ savegamePart = SOTFEdit.Infrastructure.TranslationManager.Get("windows.main.savegame.none");
+ }
- private static void OnSpawnActorsEvent(SpawnActorsEvent message)
- {
- if (SavegameManager.SelectedSavegame is { } selectedSavegame)
+ Dispatcher.Invoke(() =>
+ {
+ Title = SOTFEdit.Infrastructure.TranslationManager.GetFormatted("windows.map.title", connectionPart, savegamePart, modifiedPart);
+ });
+ }
+
+ private void DataContextOnPropertyChanged(object? sender, PropertyChangedEventArgs e)
{
- ActorModifier.Spawn(selectedSavegame, message.Position, message.ActorType, message.SpawnCount,
- message.FamilyId, message.Influences, message.SpaceBetween, message.SpawnPattern);
+ if (e.PropertyName == nameof(MapViewModel.AutoConnect) || e.PropertyName == nameof(MapViewModel.AutoReload))
+ {
+ // Optionally, could pause timer if both are false
+ if (!_dataContext.AutoConnect && !_dataContext.AutoReload)
+ {
+ _autoActionTimer.Stop();
+ }
+ else if (!_autoActionTimer.IsEnabled)
+ {
+ _autoActionTimer.Start();
+ }
+ }
}
- }
- private void OnShowSpawnActorsWindowEvent(ShowSpawnActorsWindowEvent message)
- {
- var window = new MapSpawnActorsWindow(this, message.Poi);
- window.ShowDialog();
- }
+ private void AutoActionTimer_Tick(object? sender, EventArgs e)
+ {
+ if (_dataContext.AutoConnect)
+ {
+ var companionManager = Ioc.Default.GetRequiredService();
+ if (!companionManager.IsConnected())
+ {
+ // Fire and forget
+ _ = companionManager.ConnectAsync();
+ }
+ }
+ if (_dataContext.AutoReload)
+ {
+ if (SavegameManager.SelectedSavegame is { } selectedSavegame)
+ {
+ // Reload the current loaded savegame if it has been modified
+ var currentLastWriteTime = Directory.GetLastWriteTime(selectedSavegame.FullPath);
+ if (currentLastWriteTime > selectedSavegame.SavegameStore.LastWriteTime)
+ {
+ var reloaded = SavegameManager.ReloadSavegame(selectedSavegame);
+ if (reloaded != null)
+ {
+ SavegameManager.SelectedSavegame = reloaded;
+ }
+ }
+ }
+ else
+ {
+ // No savegame loaded yet - load the most recent one
+ var savegames = SavegameManager.GetSavegames();
+ var mostRecent = savegames.Values.OrderByDescending(s => s.LastSaveTime).FirstOrDefault();
+ if (mostRecent != null)
+ {
+ SavegameManager.SelectedSavegame = mostRecent;
+ }
+ }
+ }
+ }
- private void OnShowTeleportWindowEvent(ShowTeleportWindowEvent message)
- {
- var window = new MapTeleportWindow(this, message.Destination, message.TeleportationMode);
- window.ShowDialog();
- }
+ private void SetupListeners()
+ {
+ WeakReferenceMessenger.Default.Register(this,
+ (_, _) => OnOpenCategorySelectorEvent());
+ WeakReferenceMessenger.Default.Register(this,
+ (_, message) => OnShowMapImageEvent(message));
+ PoiMessenger.Instance.Register(this,
+ (_, message) => OnShowTeleportWindowEvent(message));
+ PoiMessenger.Instance.Register(this,
+ (_, message) => OnShowSpawnActorsWindowEvent(message));
+ PoiMessenger.Instance.Register(this,
+ (_, message) => OnSpawnActorsEvent(message));
+ PoiMessenger.Instance.Register(this,
+ (_, message) => OnSelectedPoiChangedEvent(message.IsSelected));
+ PoiMessenger.Instance.Register(this,
+ (_, message) => OnPlayerPosChangedEvent(message));
+ }
- protected override void OnClosing(CancelEventArgs e)
- {
- WeakReferenceMessenger.Default.UnregisterAll(this);
- WeakReferenceMessenger.Default.UnregisterAll(DataContext);
- PoiMessenger.Instance.Reset();
- _dataContext.SaveSettings();
- }
+ private void OnPlayerPosChangedEvent(PlayerPosChangedEvent message)
+ {
+ if (!_dataContext.FollowPlayer)
+ {
+ return;
+ }
- private void OnShowMapImageEvent(ShowMapImageEvent message)
- {
- var window = new ShowImageWindow(this, message.Url, message.Title);
- window.ShowDialog();
- }
+ var ingameToPixel = CoordinateConverter.IngameToPixel(message.NewPosition.X, message.NewPosition.Z);
+ var zoomControl = MapZoomControl;
+ if (zoomControl != null)
+ {
+ zoomControl.ZoomToPos(ingameToPixel.Item1, ingameToPixel.Item2, -16);
+ }
+ }
- private void OnOpenCategorySelectorEvent()
- {
- MapOptionsFlyout.IsOpen = !MapOptionsFlyout.IsOpen;
- }
+ private void OnSelectedPoiChangedEvent(bool isSelected)
+ {
+ var flyout = PoiDetailsFlyout;
+ if (flyout != null)
+ {
+ flyout.IsOpen = isSelected;
+ }
+ }
- private void PoiSelector_OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
- {
- var scv = (ScrollViewer)sender;
- scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta);
- e.Handled = true;
- }
+ private static void OnSpawnActorsEvent(SpawnActorsEvent message)
+ {
+ if (SavegameManager.SelectedSavegame is { } selectedSavegame)
+ {
+ ActorModifier.Spawn(selectedSavegame, message.Position, message.ActorType, message.SpawnCount,
+ message.FamilyId, message.Influences, message.SpaceBetween, message.SpawnPattern);
+ }
+ }
- private void ZoomControl_OnMouseUp(object sender, MouseButtonEventArgs e)
- {
- if (sender is not ZoomControl.ZoomControl zoomControl)
+ private void OnShowSpawnActorsWindowEvent(ShowSpawnActorsWindowEvent message)
+ {
+ var window = new MapSpawnActorsWindow(this, message.Poi);
+ window.Show();
+ }
+
+ private void OnShowTeleportWindowEvent(ShowTeleportWindowEvent message)
+ {
+ var window = new MapTeleportWindow(this, message.Destination, message.TeleportationMode);
+ window.Show();
+ }
+
+ protected override void OnClosing(CancelEventArgs e)
+ {
+ // Save window state, position, and screen
+ SOTFEdit.Settings.Default.MapWindowState = WindowState.ToString();
+
+ // Get window interop for screen detection
+ var windowInterop = new System.Windows.Interop.WindowInteropHelper(this);
+ var screen = Screen.FromHandle(windowInterop.Handle);
+ var wa = screen.WorkingArea;
+
+ if (WindowState == WindowState.Normal)
+ {
+ // Save current position and size
+ double clampedLeft = Math.Min(Math.Max(Left, wa.Left), wa.Right - Math.Max(Width, 100));
+ double clampedTop = Math.Min(Math.Max(Top, wa.Top), wa.Bottom - Math.Max(Height, 100));
+ double clampedWidth = Math.Min(Math.Max(Width, 400), wa.Width - 20);
+ double clampedHeight = Math.Min(Math.Max(Height, 300), wa.Height - 20);
+ SOTFEdit.Settings.Default.MapWindowLeft = clampedLeft;
+ SOTFEdit.Settings.Default.MapWindowTop = clampedTop;
+ SOTFEdit.Settings.Default.MapWindowWidth = clampedWidth;
+ SOTFEdit.Settings.Default.MapWindowHeight = clampedHeight;
+ }
+ else if (WindowState == WindowState.Maximized)
+ {
+ // Save RestoreBounds so we know what size to restore to
+ double clampedLeft = Math.Min(Math.Max(RestoreBounds.Left, wa.Left), wa.Right - Math.Max(RestoreBounds.Width, 100));
+ double clampedTop = Math.Min(Math.Max(RestoreBounds.Top, wa.Top), wa.Bottom - Math.Max(RestoreBounds.Height, 100));
+ double clampedWidth = Math.Min(Math.Max(RestoreBounds.Width, 400), wa.Width - 20);
+ double clampedHeight = Math.Min(Math.Max(RestoreBounds.Height, 300), wa.Height - 20);
+ SOTFEdit.Settings.Default.MapWindowLeft = clampedLeft;
+ SOTFEdit.Settings.Default.MapWindowTop = clampedTop;
+ SOTFEdit.Settings.Default.MapWindowWidth = clampedWidth;
+ SOTFEdit.Settings.Default.MapWindowHeight = clampedHeight;
+ }
+
+ SOTFEdit.Settings.Default.MapWindowScreenIndex = Array.IndexOf(Screen.AllScreens, screen);
+ SOTFEdit.Settings.Default.Save();
+
+ WeakReferenceMessenger.Default.UnregisterAll(this);
+ WeakReferenceMessenger.Default.UnregisterAll(DataContext);
+ PoiMessenger.Instance.Reset();
+ _dataContext.SaveSettings();
+ base.OnClosing(e);
+ }
+
+ private void OnShowMapImageEvent(ShowMapImageEvent message)
{
- return;
+ var window = new ShowImageWindow(this, message.Url, message.Title);
+ window.Show();
+ }
+
+ private void OnOpenCategorySelectorEvent()
+ {
+ var flyout = MapOptionsFlyout;
+ if (flyout != null)
+ {
+ flyout.IsOpen = !flyout.IsOpen;
+ }
}
- if (zoomControl.IsPanning)
+ private void PoiSelector_OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
- _dataContext.FollowPlayer = false;
- return;
+ var scv = (ScrollViewer)sender;
+ scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta);
+ e.Handled = true;
}
- if (_clickedPoi is { } clickedPoi)
+ private void ZoomControl_OnMouseUp(object sender, MouseButtonEventArgs e)
{
- if (_dataContext.SelectedPoi is IClickToMovePoi { IsMoveRequested: true } clickToMovePoi)
+ if (sender is not ZoomControl.ZoomControl zoomControl)
{
- if (clickedPoi.Position is { } position)
+ return;
+ }
+
+ if (zoomControl.IsPanning)
+ {
+ _dataContext.FollowPlayer = false;
+ return;
+ }
+
+ if (_clickedPoi is { } clickedPoi)
+ {
+ if (_dataContext.SelectedPoi is IClickToMovePoi { IsMoveRequested: true } clickToMovePoi)
{
- clickToMovePoi.AcceptNewPos(position);
+ if (clickedPoi.Position is { } position)
+ {
+ clickToMovePoi.AcceptNewPos(position);
+ }
}
+ else
+ {
+ _dataContext.SelectedPoi = clickedPoi;
+ }
+
+ _clickedPoi = null;
}
else
{
- _dataContext.SelectedPoi = clickedPoi;
+ if (_dataContext.SelectedPoi is IClickToMovePoi clickToMovePoi)
+ {
+ clickToMovePoi.IsMoveRequested = false;
+ }
+
+ _dataContext.SelectedPoi = null;
}
+ }
- _clickedPoi = null;
+ private void sotfLink_Click(object sender, MouseButtonEventArgs e)
+ {
+ WeakReferenceMessenger.Default.Send(RequestStartProcessEvent.ForUrl("https://sotf.th.gl/"));
}
- else
+
+ private void MapWindow_OnPreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
- if (_dataContext.SelectedPoi is IClickToMovePoi clickToMovePoi)
+ if (e.Key != Key.Escape)
{
- clickToMovePoi.IsMoveRequested = false;
+ return;
}
- _dataContext.SelectedPoi = null;
+ e.Handled = true;
+ Close();
}
- }
-
- private void sotfLink_Click(object sender, MouseButtonEventArgs e)
- {
- WeakReferenceMessenger.Default.Send(RequestStartProcessEvent.ForUrl("https://sotf.th.gl/"));
- }
- private void MapWindow_OnPreviewKeyDown(object sender, KeyEventArgs e)
- {
- if (e.Key != Key.Escape)
+ private void ZoomControl_OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
- return;
+ _clickedPoi = e.OriginalSource is Image { Tag: IPoi ipoi } ? ipoi : null;
}
- e.Handled = true;
- Close();
- }
+ private void AlwaysOnTop_OnChecked(object sender, RoutedEventArgs e)
+ {
+ Topmost = true;
+ }
- private void ZoomControl_OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
- {
- _clickedPoi = e.OriginalSource is Image { Tag: IPoi ipoi } ? ipoi : null;
- }
+ private void AlwaysOnTop_OnUnchecked(object sender, RoutedEventArgs e)
+ {
+ Topmost = false;
+ }
- private void AlwaysOnTop_OnChecked(object sender, RoutedEventArgs e)
- {
- Topmost = true;
- }
+ // P/Invoke to move window to correct monitor
+ private static void MoveWindowToScreen(Window window, Screen screen)
+ {
+ var interop = new System.Windows.Interop.WindowInteropHelper(window);
+ if (interop.Handle == IntPtr.Zero) return;
+ var wa = screen.WorkingArea;
+ SetWindowPos(interop.Handle, IntPtr.Zero, wa.Left, wa.Top, wa.Width, wa.Height, SWP_NOZORDER | SWP_NOACTIVATE);
+ }
- private void AlwaysOnTop_OnUnchecked(object sender, RoutedEventArgs e)
- {
- Topmost = false;
+ private const int SWP_NOZORDER = 0x0004;
+ private const int SWP_NOACTIVATE = 0x0010;
+ [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
+ private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
}
}
\ No newline at end of file
diff --git a/SOTFEdit/View/ShowImageWindow.xaml.cs b/SOTFEdit/View/ShowImageWindow.xaml.cs
index cc55130..7908c49 100644
--- a/SOTFEdit/View/ShowImageWindow.xaml.cs
+++ b/SOTFEdit/View/ShowImageWindow.xaml.cs
@@ -4,7 +4,7 @@
namespace SOTFEdit.View;
-public partial class ShowImageWindow
+public partial class ShowImageWindow : MahApps.Metro.Controls.MetroWindow
{
public ShowImageWindow(Window owner, string imageSource, string title)
{
diff --git a/SOTFEdit/ViewModel/ArmorPageViewModel.cs b/SOTFEdit/ViewModel/ArmorPageViewModel.cs
index 113f821..792d6f6 100644
--- a/SOTFEdit/ViewModel/ArmorPageViewModel.cs
+++ b/SOTFEdit/ViewModel/ArmorPageViewModel.cs
@@ -66,9 +66,9 @@ private void OnSelectedSavegameChanged(SelectedSavegameChangedEvent m)
m.SelectedSavegame?.SavegameStore.LoadJsonRaw(SavegameStore.FileType
.PlayerArmourSystemSaveData)?.Parent.ToObject();
- if (armour != null)
+ if (armour?.Data?.PlayerArmourSystem?.ArmourPieces != null)
{
- foreach (var armourPiece in armour.Data.PlayerArmourSystem.ArmourPieces)
+ foreach (var armourPiece in armour.Data!.PlayerArmourSystem!.ArmourPieces!)
{
_armour.Add(new ArmourData(armourPiece, _itemList.GetItem(armourPiece.ItemId)));
}
@@ -88,7 +88,9 @@ public bool Update(Savegame savegame)
}
var selectedArmorPieces = _armour.Select(a => a.ArmourPiece).ToList();
- var hasChanges = PlayerArmourSystemModel.Merge(playerArmourData.Data.PlayerArmourSystem, selectedArmorPieces);
+ var hasChanges = playerArmourData.Data?.PlayerArmourSystem != null
+ ? PlayerArmourSystemModel.Merge(playerArmourData.Data!.PlayerArmourSystem!, selectedArmorPieces)
+ : false;
if (!hasChanges)
{
@@ -96,7 +98,7 @@ public bool Update(Savegame savegame)
}
saveDataWrapper.GetJsonBasedToken(Constants.JsonKeys.PlayerArmourSystem)?["ArmourPieces"]?
- .Replace(JToken.FromObject(playerArmourData.Data.PlayerArmourSystem.ArmourPieces));
+ .Replace(JToken.FromObject(playerArmourData.Data!.PlayerArmourSystem!.ArmourPieces!));
saveDataWrapper.MarkAsModified(Constants.JsonKeys.PlayerArmourSystem);
return hasChanges;
diff --git a/SOTFEdit/ViewModel/GameStatePageViewModel.cs b/SOTFEdit/ViewModel/GameStatePageViewModel.cs
index c293a6f..ba2fd80 100644
--- a/SOTFEdit/ViewModel/GameStatePageViewModel.cs
+++ b/SOTFEdit/ViewModel/GameStatePageViewModel.cs
@@ -251,7 +251,7 @@ private void LoadNamedIntDatas(JToken gameState)
{
if (!namedIntDatasByName.ContainsKey(storedNamedIntSetting.Name))
{
- Logger.Info($"New NamedIntData found: {storedNamedIntSetting.Name}");
+ Logger.Trace($"New NamedIntData found: {storedNamedIntSetting.Name}");
NamedIntDatas.Add(storedNamedIntSetting);
}
else
diff --git a/SOTFEdit/ViewModel/InventoryPageViewModel.cs b/SOTFEdit/ViewModel/InventoryPageViewModel.cs
index cbf059b..f716475 100644
--- a/SOTFEdit/ViewModel/InventoryPageViewModel.cs
+++ b/SOTFEdit/ViewModel/InventoryPageViewModel.cs
@@ -85,7 +85,7 @@ public InventoryPageViewModel(GameData gameData)
_itemList = gameData.Items;
var categories = gameData.Items
- .Where(item => item.Value.IsInventoryItem)
+ .Where(item => item.Value.IsInventoryItem && !string.IsNullOrEmpty(item.Value.Type))
.Select(item => item.Value.Type)
.Distinct()
.OrderBy(type => type)
@@ -201,22 +201,27 @@ private void SetupListeners()
private void OnSelectedSavegameChanged(SelectedSavegameChangedEvent m)
{
+ Logger.Debug("InventoryPageViewModel: OnSelectedSavegameChanged - START loading inventory");
if (m.SelectedSavegame == null)
{
+ Logger.Debug("InventoryPageViewModel: OnSelectedSavegameChanged - No savegame, clearing inventory");
_inventory.Clear();
_unassignedItems.Clear();
return;
}
- HashSet assignedItems = new();
+ // assignedItems is already declared above, remove duplicate
var saveData =
m.SelectedSavegame.SavegameStore.LoadJsonRaw(SavegameStore.FileType
.PlayerInventorySaveData)?.Parent.ToObject();
- if (saveData != null)
+ HashSet assignedItems = new();
+ List inventoryItems = new();
+ List equippedItems = new();
+ if (saveData?.Data?.PlayerInventory?.ItemInstanceManagerData?.ItemBlocks != null)
{
var playerInventoryModel = saveData.Data.PlayerInventory;
- var inventoryItems = playerInventoryModel.ItemInstanceManagerData.ItemBlocks
+ inventoryItems = playerInventoryModel.ItemInstanceManagerData.ItemBlocks
.Select(itemBlock =>
{
var item = _itemList.GetItem(itemBlock.ItemId);
@@ -225,7 +230,7 @@ private void OnSelectedSavegameChanged(SelectedSavegameChangedEvent m)
item = (Item)item.Clone();
item.StorageMax = new StorageMax(itemBlock.TotalCount, item.StorageMax?.Shelf ?? 0,
item.StorageMax?.Holder);
- Logger.Info(
+ Logger.Trace(
$"Defined max in inventory for {item.Id} is lower ({maxInInventory}) than in savedata ({itemBlock.TotalCount})");
}
@@ -233,32 +238,35 @@ private void OnSelectedSavegameChanged(SelectedSavegameChangedEvent m)
})
.ToList();
- var equippedItems = playerInventoryModel.EquippedItems?.Select(itemBlock =>
- {
- var item = _itemList.GetItem(itemBlock.ItemId);
- if (item?.StorageMax?.Inventory is { } maxInInventory && maxInInventory < itemBlock.TotalCount)
- {
- Logger.Info(
- $"Defined max in inventory for {item.Id} is lower ({maxInInventory}) than in savedata ({itemBlock.TotalCount})");
- }
-
- itemBlock.TotalCount = 1;
-
- return new InventoryItem(itemBlock, item, true);
- })
- .ToList();
-
- if (equippedItems != null)
+ if (playerInventoryModel.EquippedItems != null)
{
- inventoryItems.AddRange(equippedItems);
+ equippedItems = playerInventoryModel.EquippedItems.Select(itemBlock =>
+ {
+ var item = _itemList.GetItem(itemBlock.ItemId);
+ if (item?.StorageMax?.Inventory is { } maxInInventory && maxInInventory < itemBlock.TotalCount)
+ {
+ Logger.Trace(
+ $"Defined max in inventory for {item.Id} is lower ({maxInInventory}) than in savedata ({itemBlock.TotalCount})");
+ }
+
+ itemBlock.TotalCount = 1;
+
+ return new InventoryItem(itemBlock, item, true);
+ })
+ .ToList();
}
+ }
- _inventory.ReplaceRange(inventoryItems);
+ inventoryItems.AddRange(equippedItems);
- foreach (var inventoryItem in inventoryItems)
- {
- assignedItems.Add(inventoryItem.Id);
- }
+ Logger.Debug($"InventoryPageViewModel: OnSelectedSavegameChanged - Replacing inventory with {inventoryItems.Count} items");
+ _inventory.ReplaceRange(inventoryItems);
+ Logger.Debug($"InventoryPageViewModel: OnSelectedSavegameChanged - COMPLETED loading inventory, _inventory.Count = {_inventory.Count}");
+ WeakReferenceMessenger.Default.Send(new InventoryReloadedEvent());
+
+ foreach (var inventoryItem in inventoryItems)
+ {
+ assignedItems.Add(inventoryItem.Id);
}
var unassignedItems = _itemList.Where(item => !assignedItems.Contains(item.Value.Id))
diff --git a/SOTFEdit/ViewModel/MainViewModel.cs b/SOTFEdit/ViewModel/MainViewModel.cs
index 21c46b7..e4873a7 100644
--- a/SOTFEdit/ViewModel/MainViewModel.cs
+++ b/SOTFEdit/ViewModel/MainViewModel.cs
@@ -148,6 +148,17 @@ private void SetupListeners()
OnPropertyChanged(nameof(CompanionConnectMenuText));
});
});
+
+ WeakReferenceMessenger.Default.Register(this, (_, _) =>
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ // Refresh all properties that use TranslationManager.Get()
+ OnPropertyChanged(nameof(CompanionConnectMenuText));
+ OnPropertyChanged(nameof(LastSaveGameMenuItem));
+ UpdateLastSaveGameMenuItem();
+ });
+ });
}
private void OnSelectedSavegameChanged(SelectedSavegameChangedEvent message)
@@ -599,7 +610,9 @@ private void TeleportWorldItem()
[RelayCommand]
private void OpenMap()
{
+ Logger.Debug("MainViewModel: OpenMap - Loading POI groups");
var actorPoiGroups = _mapManager.GetActorPois();
+ Logger.Debug($"MainViewModel: OpenMap - Loaded {actorPoiGroups.Count} actor POI groups");
var structurePoiGroups = _mapManager.GetStructurePois()
.Select(kvp => new PoiGroup(false, kvp.Value, kvp.Key,
@@ -607,6 +620,7 @@ private void OpenMap()
(kvp.Value.FirstOrDefault()?.ScrewStructureWrapper.ScrewStructure?.Id.ToString() ?? ""),
PoiGroupType.Structures, kvp.Value.First().Icon))
.ToList();
+ Logger.Debug($"MainViewModel: OpenMap - Loaded {structurePoiGroups.Count} structure POI groups");
var poiGroups = new List
{
diff --git a/SOTFEdit/ViewModel/MapViewModel.cs b/SOTFEdit/ViewModel/MapViewModel.cs
index 89f4762..384c677 100644
--- a/SOTFEdit/ViewModel/MapViewModel.cs
+++ b/SOTFEdit/ViewModel/MapViewModel.cs
@@ -7,8 +7,10 @@
using System.Windows.Media;
using System.Windows.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.DependencyInjection;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
+using NLog;
using SOTFEdit.Companion.Shared;
using SOTFEdit.Companion.Shared.Messages;
using SOTFEdit.Infrastructure;
@@ -17,16 +19,22 @@
using SOTFEdit.Model.Actors;
using SOTFEdit.Model.Events;
using SOTFEdit.Model.Map;
+using SOTFEdit.Model.Map.Static;
namespace SOTFEdit.ViewModel;
-
public partial class MapViewModel : ObservableObject
{
+ private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();
+
+ [ObservableProperty]
+ private bool _autoConnect = Settings.Default.AutoConnect;
+
+ [ObservableProperty]
+ private bool _autoReload = Settings.Default.AutoReload;
private const char SaveSelectedPoiGroupSeparator = '|';
private static readonly SolidColorBrush DarkMapColorBrush;
private static readonly SolidColorBrush BrightMapColorBrush;
-
private static readonly Brush DarkMapNetworkPlayerForeground = Brushes.White;
private static readonly Brush BrightMapNetworkPlayerForeground = Brushes.Black;
@@ -34,6 +42,20 @@ public partial class MapViewModel : ObservableObject
{
Interval = TimeSpan.FromMilliseconds(1000)
};
+ // ...existing code...
+
+ [RelayCommand]
+ private void ResetAllDone()
+ {
+ foreach (var poi in Pois)
+ {
+ if (poi is BasePoi basePoi && basePoi.IsDone)
+ {
+ basePoi.IsDone = false;
+ }
+ }
+ }
+// ...existing code...
private readonly GameData _gameData;
private readonly MapManager _mapManager;
@@ -90,12 +112,27 @@ public MapViewModel(IEnumerable poiGroupers, MapManager mapManager,
Pois = new ObservableCollectionEx(enabled.Where(poi => _poisAdded.Add(poi)));
- MapFilter = new MapFilter(gameData.AreaManager);
- MapFilter.PropertyChanged += MapFilterOnPropertyChanged;
+ MapFilter = new MapFilter(gameData.AreaManager);
+ MapFilter.PropertyChanged += MapFilterOnPropertyChanged;
- _fullTextFilterDispatcherTimer.Tick += OnFullTextFilter;
+ // Ensure filter is applied immediately on load (e.g., MapFilterHideCompleted)
+ ApplyFilterToAllPois();
- SetupListeners();
+ _fullTextFilterDispatcherTimer.Tick += OnFullTextFilter;
+
+ SetupListeners();
+
+ // If a savegame is already loaded, immediately refresh all POIs
+ // This handles the case where the map opens after ViewModels have loaded but we missed their events
+ if (SavegameManager.SelectedSavegame != null)
+ {
+ Logger.Debug($"MapViewModel: Constructor - savegame loaded, refreshing all POI done status. Total POIs: {Pois.Count}");
+ RefreshAllPoiDoneStatus();
+ }
+ else
+ {
+ Logger.Debug("MapViewModel: Constructor - no savegame loaded");
+ }
}
public Brush NetworkPlayerForeground => GetNetworkPlayerBrushForMapMode();
@@ -265,6 +302,10 @@ private void SetupListeners()
(_, message) => RefreshPois(message));
PoiMessenger.Instance.Register(this,
(_, _) => OnNpcsReloaded());
+ PoiMessenger.Instance.Register(this,
+ (_, _) => OnStructuresChanged());
+ WeakReferenceMessenger.Default.Register(this,
+ (_, _) => OnInventoryReloaded());
PoiMessenger.Instance.Register(this,
(_, message) => OnRemovePoiEvent(message));
PoiMessenger.Instance.Register(this, (_, message) => OnReapplyPoiFilterEvent(message));
@@ -277,6 +318,166 @@ private void SetupListeners()
Application.Current.Dispatcher.Invoke(() => OnCompanionNetworkPlayerUpdateMessage(message)));
WeakReferenceMessenger.Default.Register(this,
(_, message) => OnCompanionConnectionStatusEvent(message.Status));
+ WeakReferenceMessenger.Default.Register(this,
+ (_, _) => OnSelectedSavegameChanged());
+ }
+
+ private void OnSelectedSavegameChanged()
+ {
+ Logger.Debug("MapViewModel: OnSelectedSavegameChanged - SelectedSavegameChangedEvent received");
+ // Use BeginInvoke instead of Invoke to allow other ViewModels to finish reloading first
+ // This avoids race conditions where we try to read data that's still being reloaded
+ Application.Current.Dispatcher.BeginInvoke(new Action(() =>
+ {
+ // When savegame reloads:
+ // - NPCs are automatically handled via NpcsReloadedEvent from NpcsPageViewModel
+ // - Structures are automatically handled via StructuresReloadedEvent from StructuresPageViewModel
+ // - WorldItems need to be manually reloaded since they're loaded directly from savegame
+ // - Static POIs (caves/bunkers) need inventory and done status refreshed
+
+ Logger.Debug("MapViewModel: OnSelectedSavegameChanged - BeginInvoke callback executing");
+
+ // Reload WorldItems with fresh data from the savegame
+ if (SavegameManager.SelectedSavegame != null)
+ {
+ Logger.Debug("MapViewModel: OnSelectedSavegameChanged - Reloading world items");
+ OnWorldItemsChangedEvent();
+ }
+
+ // Refresh done status and inventory for all POIs
+ // This handles static POIs and ensures UI reflects current state
+ Logger.Debug($"MapViewModel: OnSelectedSavegameChanged - Refreshing all POI done status, Total POIs: {Pois.Count}");
+ RefreshAllPoiDoneStatus();
+ }));
+ }
+
+ private void OnStructuresChanged()
+ {
+ Logger.Debug("MapViewModel: OnStructuresChanged - StructuresReloadedEvent received");
+ // Recreate structure POIs from fresh structure data
+ var newStructureGroups = _mapManager.GetStructurePois()
+ .Select(kvp =>
+ new PoiGroup(false, kvp.Value, kvp.Key, PoiGroupKeys.Structures + kvp.Key, PoiGroupType.Structures,
+ kvp.Value.First().Icon))
+ .ToList();
+
+ Logger.Debug($"MapViewModel: OnStructuresChanged - Loaded {newStructureGroups.Count} new structure groups");
+
+ var oldStructureGroups = _poiGroups.Where(group => group.GroupType == PoiGroupType.Structures).ToList();
+ Logger.Debug($"MapViewModel: OnStructuresChanged - Found {oldStructureGroups.Count} old structure groups: [{string.Join(", ", oldStructureGroups.Select(g => g.BaseTitle))}]");
+
+ if (oldStructureGroups.Count == 0)
+ {
+ Logger.Debug("MapViewModel: OnStructuresChanged - Taking EARLY RETURN path (first load)");
+ foreach (var newStructureGroup in newStructureGroups)
+ {
+ _poiGroups.Add(newStructureGroup);
+ }
+ // Refresh done status for newly-added structures on first load
+ Logger.Debug("MapViewModel: OnStructuresChanged - Calling RefreshAllPoiDoneStatus before return");
+ RefreshAllPoiDoneStatus();
+ return;
+ }
+
+ Logger.Debug("MapViewModel: OnStructuresChanged - Taking NORMAL path (reload existing structures)");
+
+ // Remove old structure groups
+ foreach (var group in oldStructureGroups)
+ {
+ _poiGroups.Remove(group);
+ }
+
+ // Remove old structure POIs from tracking
+ _poisAdded.RemoveWhere(poi => poi is StructurePoi);
+
+ var oldPoiGroupsByTitle = oldStructureGroups.ToDictionary(group => group.BaseTitle);
+
+ // Add new structure groups with preserved enabled state
+ foreach (var poiGroup in newStructureGroups)
+ {
+ if (oldPoiGroupsByTitle.GetValueOrDefault(poiGroup.BaseTitle) is { } existingOldGroupByTitle)
+ {
+ poiGroup.SetEnabledNoRefresh(existingOldGroupByTitle.Enabled);
+ }
+
+ foreach (var poi in poiGroup.Pois)
+ {
+ poi.ApplyFilter(MapFilter);
+ }
+
+ _poiGroups.Add(poiGroup);
+ }
+
+ // Clear selected POI if it's a structure
+ if (SelectedPoi is StructurePoi)
+ {
+ SelectedPoi = null;
+ }
+
+ // Update the Pois collection
+ var newPois = newStructureGroups.SelectMany(group => group.Pois).ToList();
+ var addedPois = newPois.Where(poi => poi.Enabled && _poisAdded.Add(poi)).ToList();
+
+ if (addedPois.Count > 0)
+ {
+ Pois.RemoveAndAdd(poi => poi is StructurePoi, addedPois);
+ }
+
+ Logger.Debug($"MapViewModel: OnStructuresChanged - NORMAL path completed, added {addedPois.Count} POIs. NOT calling refresh (inventory not loaded yet - OnSelectedSavegameChanged will handle it)");
+ }
+
+ private void RefreshAllPoiDoneStatus()
+ {
+ Logger.Debug($"MapViewModel: RefreshAllPoiDoneStatus - Starting refresh for {Pois.Count} POIs");
+ // Get fresh inventory items for cave/bunker completion check
+ var inventoryItems = GetInventoryItems();
+ Logger.Debug($"MapViewModel: RefreshAllPoiDoneStatus - Got {inventoryItems.Count} inventory items");
+
+ lock (Pois)
+ {
+ var caveCount = 0;
+ var basePoiCount = 0;
+ var visibleBeforeCount = Pois.Count(p => p.Visible);
+
+ foreach (var poi in Pois)
+ {
+ // Refresh inventory for caves/bunkers to check if all items were collected
+ if (poi is CaveOrBunkerPoi caveOrBunkerPoi)
+ {
+ caveOrBunkerPoi.RefreshInventory(inventoryItems);
+ caveCount++;
+ }
+
+ // Refresh IsDone status for all POIs
+ if (poi is BasePoi basePoi)
+ {
+ basePoi.RefreshDoneStatus();
+ basePoiCount++;
+ }
+
+ // Re-apply filter to update visibility based on completion status
+ poi.ApplyFilter(MapFilter);
+ }
+
+ var visibleAfterCount = Pois.Count(p => p.Visible);
+ Logger.Debug($"MapViewModel: RefreshAllPoiDoneStatus - Refreshed {caveCount} caves/bunkers, {basePoiCount} base POIs. Filter HideCompleted: {MapFilter.HideCompleted}. Visible POIs: {visibleBeforeCount} -> {visibleAfterCount}");
+ }
+
+ // Force UI to refresh by triggering collection reset
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ // ReplaceRange triggers CollectionChanged with Reset action, forcing WPF to re-render all items
+ var currentPois = Pois.ToList();
+ Pois.ReplaceRange(currentPois);
+ Logger.Debug("MapViewModel: RefreshAllPoiDoneStatus - Forced Pois.ReplaceRange() to trigger UI refresh");
+ });
+ }
+
+ private HashSet GetInventoryItems()
+ {
+ // Use PoiLoader to get fresh inventory items with all weapon mods included
+ var poiLoader = Ioc.Default.GetRequiredService();
+ return poiLoader.GetInventoryItemsPublic();
}
private void OnCompanionConnectionStatusEvent(CompanionConnectionManager.ConnectionStatus status)
@@ -519,10 +720,15 @@ private void OnRemovePoiEvent(RemovePoiEvent message)
private void OnNpcsReloaded()
{
+ Logger.Debug("MapViewModel: OnNpcsReloaded - NpcsReloadedEvent received");
+
var oldActorGroup = _poiGroups.OfType()
.FirstOrDefault(group => group.GroupType == PoiGroupType.Actors);
var newActorPoiGroups = _mapManager.GetActorPois();
+ Logger.Debug($"MapViewModel: OnNpcsReloaded - Loaded {newActorPoiGroups.Count} new actor POI groups");
+ Logger.Debug($"MapViewModel: OnNpcsReloaded - Old actor group exists: {oldActorGroup != null}, POI count: {oldActorGroup?.PoiGroups.Sum(g => g.Pois.Count) ?? 0}");
+
var newActorGroupCollection = PoiGroupCollection.ForActors(newActorPoiGroups, oldActorGroup?.Enabled ?? false);
AddFollowersIfMissing(new List
{
@@ -531,10 +737,16 @@ private void OnNpcsReloaded()
if (oldActorGroup == null)
{
+ Logger.Debug("MapViewModel: OnNpcsReloaded - Taking EARLY RETURN path (first load)");
_poiGroups.Add(newActorGroupCollection);
+ // Refresh done status for newly-added actors on first load
+ Logger.Debug("MapViewModel: OnNpcsReloaded - Calling RefreshAllPoiDoneStatus before return");
+ RefreshAllPoiDoneStatus();
return;
}
+ Logger.Debug("MapViewModel: OnNpcsReloaded - Taking NORMAL path (reload existing actors)");
+
var oldPoiGroupsByTitle = oldActorGroup.PoiGroups
.ToDictionary(group => group.BaseTitle);
@@ -566,6 +778,14 @@ private void OnNpcsReloaded()
{
Pois.RemoveAndAdd(poi => poi is ActorPoi, addedPois);
}
+
+ Logger.Debug($"MapViewModel: OnNpcsReloaded - NORMAL path completed, added {addedPois.Count} POIs");
+ }
+
+ private void OnInventoryReloaded()
+ {
+ Logger.Debug("MapViewModel: OnInventoryReloaded - InventoryReloadedEvent received, calling RefreshAllPoiDoneStatus");
+ RefreshAllPoiDoneStatus();
}
private void RefreshPois(PoiRefreshEvent message)
@@ -623,7 +843,9 @@ private void DeselectAll()
public void SaveSettings()
{
- Settings.Default.MapType = MapSelection;
+ Settings.Default.MapType = MapSelection;
+ Settings.Default.AutoConnect = AutoConnect;
+ Settings.Default.AutoReload = AutoReload;
GetSeletedPoiGroupsFromSettings(out var selected);
@@ -672,6 +894,8 @@ public void SaveSettings()
var selectedString = string.Join(SaveSelectedPoiGroupSeparator, selected);
Settings.Default.SelectedMapGroups = selectedString;
+ // Ensure MapFilterHideCompleted is always saved
+ Settings.Default.MapFilterHideCompleted = MapFilter.HideCompleted;
Settings.Default.Save();
}
diff --git a/SOTFEdit/ViewModel/SettingsDialogViewModel.cs b/SOTFEdit/ViewModel/SettingsDialogViewModel.cs
index 33d1488..51d41d3 100644
--- a/SOTFEdit/ViewModel/SettingsDialogViewModel.cs
+++ b/SOTFEdit/ViewModel/SettingsDialogViewModel.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Windows;
@@ -43,6 +44,15 @@ public SettingsDialogViewModel(ApplicationSettings applicationSettings)
new ComboBoxItemAndValue(TranslationManager.Get("languages." + culture), culture))
.ToList();
_selectedLanguage = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
+
+ // Subscribe to language changes to refresh BackupMode names
+ WeakReferenceMessenger.Default.Register(this, (_, _) =>
+ {
+ foreach (var mode in BackupModes)
+ {
+ mode.RefreshName();
+ }
+ });
}
public List> Languages { get; }
@@ -56,9 +66,20 @@ private void Save()
{
_applicationSettings.CurrentThemeAccent = CurrentThemeAccent;
_applicationSettings.CurrentBackupMode = CurrentBackupMode.BackupMode;
- Settings.Default.Language = SelectedLanguage;
+
+ var currentCulture = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
+ var newLanguage = SelectedLanguage;
+
+ Settings.Default.Language = newLanguage;
Settings.Default.AskForBackups = AskForBackups;
_applicationSettings.Save();
+
+ // Apply language change immediately if it changed
+ if (currentCulture != newLanguage)
+ {
+ TranslationManager.ChangeCulture(newLanguage);
+ }
+
WeakReferenceMessenger.Default.Send(new SettingsSavedEvent());
}
@@ -67,7 +88,7 @@ partial void OnCurrentThemeAccentChanged(ThemeData value)
ThemeManager.Current.ChangeThemeColorScheme(Application.Current, value.Name);
}
- public class BackupModeWrapper
+ public class BackupModeWrapper : INotifyPropertyChanged
{
public BackupModeWrapper(ApplicationSettings.BackupMode backupMode)
{
@@ -79,6 +100,13 @@ public BackupModeWrapper(ApplicationSettings.BackupMode backupMode)
// ReSharper disable once UnusedMember.Global
public string Name => TranslationManager.Get("backup.mode." + BackupMode);
+ public event PropertyChangedEventHandler? PropertyChanged;
+
+ public void RefreshName()
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));
+ }
+
private bool Equals(BackupModeWrapper other)
{
return BackupMode == other.BackupMode;
diff --git a/SOTFEdit/ViewModel/StructuresPageViewModel.cs b/SOTFEdit/ViewModel/StructuresPageViewModel.cs
index fca73dc..d518383 100644
--- a/SOTFEdit/ViewModel/StructuresPageViewModel.cs
+++ b/SOTFEdit/ViewModel/StructuresPageViewModel.cs
@@ -11,6 +11,7 @@
using SOTFEdit.Infrastructure;
using SOTFEdit.Model;
using SOTFEdit.Model.Events;
+using SOTFEdit.Model.Map;
using SOTFEdit.Model.SaveData.Storage;
using SOTFEdit.Model.Savegame;
@@ -66,15 +67,22 @@ private void OnChangeScrewStructureResult(ChangeScrewStructureResult message)
private void OnSelectedSavegameChangedEvent(SelectedSavegameChangedEvent message)
{
+ Logger.Debug("StructuresPageViewModel: SelectedSavegameChangedEvent received, clearing structures");
Structures.Clear();
if (message.SelectedSavegame is { } selectedSavegame)
{
- Structures.AddRange(LoadStructures(selectedSavegame).OrderBy(wrapper => wrapper.Category)
- .ThenBy(wrapper => wrapper.Name));
+ var loadedStructures = LoadStructures(selectedSavegame).OrderBy(wrapper => wrapper.Category)
+ .ThenBy(wrapper => wrapper.Name).ToList();
+ Logger.Debug($"StructuresPageViewModel: Loaded {loadedStructures.Count} structures");
+ Structures.AddRange(loadedStructures);
}
StructureView.Refresh();
SetModificationModeCommand.NotifyCanExecuteChanged();
+
+ // Notify map that structures have been reloaded
+ Logger.Debug($"StructuresPageViewModel: Sending StructuresReloadedEvent, total structures: {Structures.Count}");
+ PoiMessenger.Instance.Send(new StructuresReloadedEvent());
}
private IEnumerable LoadStructures(Savegame selectedSavegame)
diff --git a/SOTFEdit/ViewModel/TranslationViewModel.cs b/SOTFEdit/ViewModel/TranslationViewModel.cs
index b5e7f62..81ba059 100644
--- a/SOTFEdit/ViewModel/TranslationViewModel.cs
+++ b/SOTFEdit/ViewModel/TranslationViewModel.cs
@@ -102,12 +102,11 @@ private static void AddToDictionary(Dictionary dict, IReadOnlyLi
}
else
{
- if (!dict.ContainsKey(keys[i]))
+ if (!dict.ContainsKey(keys[i]) || dict[keys[i]] is not Dictionary)
{
dict[keys[i]] = new Dictionary();
}
-
- dict = dict[keys[i]] as Dictionary;
+ dict = dict[keys[i]] as Dictionary ?? throw new InvalidOperationException("Dictionary structure corrupted");
}
}
}
diff --git a/SOTFEdit/data/lang/de.json b/SOTFEdit/data/lang/de.json
deleted file mode 100644
index 9743446..0000000
--- a/SOTFEdit/data/lang/de.json
+++ /dev/null
@@ -1,1626 +0,0 @@
-{
- "actors": {
- "classification": {
- "animal": "Tier",
- "cannibal": "Kannibale",
- "creep": "Gruselwesen",
- "human": "Mensch",
- "misc": "Sonstige",
- "muddyCannibal": "Schlammiger Kannibale"
- },
- "details": {
- "area": "Bereich",
- "classification": "Klassifikation",
- "family": "Familie",
- "gender": "Geschlecht",
- "killedByPlayer": "Getötet von Spieler",
- "lastSpawnTime": "Letzter Spawn",
- "lastVisitedTime": "Letzter Besuch",
- "spawnedCount": "Anzahl Spawns",
- "state": "Status",
- "uniqueId": "UniqueID"
- },
- "gender": {
- "female": "Weiblich",
- "male": "Männlich"
- },
- "grouping": {
- "animals": "Tiere",
- "creeps": "Gruselwesen",
- "femaleCannibals": "Weibliche Kannibalen",
- "femaleMuddyCannibals": "Weibliche Schlammige Kannibalen",
- "maleCannibals": "Männliche Kannibalen",
- "maleMuddyCannibals": "Männliche Schlammige Kannibalen",
- "misc": "Verschiedenes",
- "mixed": "Gemischt",
- "mixedCannibals": "Gemischte Kannibalen",
- "mixedMuddyCannibals": "Gemischte Schlammige Kannibalen",
- "noFamily": "Keine Familie"
- },
- "headers": {
- "influences": "Einflüsse",
- "info": "Information",
- "killStatistics": "Tötungsstatistik",
- "modificationOptions": "Änderungsoptionen",
- "modifications": "Änderungen",
- "selection": "Auswahl",
- "stats": "Statistiken"
- },
- "influenceType": {
- "Cannibal": "Kannibale",
- "Creepy": "Gruselige",
- "Player": "Spieler"
- },
- "modificationMode": {
- "Modify": "Ändern",
- "Remove": "Entfernen"
- },
- "modificationOptions": {
- "allActorSelections": {
- "allActors": "Alle NPCs",
- "allActorsOfSameFamily": "Alle NPCs derselben Familie",
- "allActorsOfSameType": "Alle NPCs desselben Typs",
- "thisActor": "Dieser NPC"
- },
- "onlyInSameAreaAsActor": "Nur in derselben Zone wie dieser NPC",
- "removeSpawner": {
- "text": "Spawn-Punkt entfernen",
- "tooltip": "Wenn ausgewählt, wird der NPC nicht erneut spawnen"
- },
- "replaceType": "Typ ersetzen",
- "skipKelvin": "Kelvin überspringen",
- "skipVirginia": "Virginia überspringen",
- "teleport": {
- "disclaimer": "Sei vorsichtig, wenn du mehrere NPCs zum selben Ort teleportierst. Dies könnte dein Spiel abstürzen lassen!",
- "none": "Keiner",
- "npcToPlayer": "NPC zum Spieler",
- "playerToNpc": "Spieler zum NPC",
- "teleportLabel": "Teleportieren:"
- },
- "updateInfluences": "Einflüsse aktualisieren"
- },
- "state": {
- "-1": "Keine",
- "0": "Beliebig",
- "1": "Kampf",
- "2": "Welt",
- "3": "Schlafend",
- "4": "Sterbend",
- "5": "Verletzt",
- "6": "Tot",
- "7": "Fliegend",
- "8": "Anschleichen",
- "20": "Brennend",
- "21": "Elektrisiert",
- "22": "Schwimmend",
- "23": "Benommen/Getroffen",
- "24": "Ertrinkend",
- "25": "Golfmobil",
- "40": "Auf Felsen",
- "41": "Auf Baum",
- "42": "Unter Blättern",
- "43": "Wandlaufen",
- "44": "Gefangen",
- "45": "Boss Intro",
- "46": "Spawn Intro",
- "47": "Decke",
- "48": "Untergrund Höhle",
- "50": "Kampf verlassen",
- "51": "Verschwunden"
- },
- "stats": {
- "affection": "Zuneigung",
- "anger": "Wut",
- "energy": "Energie",
- "fear": "Angst",
- "fullness": "Sättigung",
- "fullnessBuff": "Sättigungsbonus",
- "health": "Gesundheit",
- "hydration": "Hydration",
- "hydrationBuff": "Hydrationsbonus",
- "rest": "Erholung",
- "restBuff": "Erholungsbonus",
- "stamina": "Ausdauer"
- },
- "types": {
- "1": "Kaninchen",
- "2": "Eichhörnchen",
- "3": "Schildkröte",
- "4": "Hai",
- "5": "Möwe",
- "6": "Adler",
- "7": "Ente",
- "8": "Timmy",
- "9": "Kelvin",
- "10": "Virginia",
- "11": "Fingers",
- "12": "Carl",
- "13": "Andy",
- "14": "Danny",
- "15": "Billy",
- "16": "GoldMaske",
- "17": "Elch",
- "18": "Baby",
- "19": "Zwillinge",
- "20": "Mr. Puffy",
- "21": "Mrs. Puffy",
- "22": "Slug",
- "23": "Angel",
- "24": "Lachs",
- "25": "Brandy",
- "26": "Crystal",
- "27": "Destiny",
- "28": "Verschlammte Frau",
- "29": "Verschlammter Mann",
- "30": "Starker Mann",
- "31": "Sponge Test",
- "32": "Fledermaus",
- "33": "Hirsch",
- "34": "Blaumeise",
- "35": "Kolibri",
- "36": "Killerwal",
- "37": "Land-Schildkröte",
- "38": "Dicker Mann",
- "39": "Dicke Frau",
- "40": "John2",
- "41": "Gesichtsloser Mann",
- "42": "Dämon",
- "43": "Bemalter Mann",
- "44": "Bemalte Frau",
- "45": "Dämon Boss",
- "46": "Mr. Puffton",
- "47": "Mrs. Puffton",
- "48": "Boss Mutant",
- "49": "Mutanten-Virginia",
- "50": "Armsy",
- "51": "Frank",
- "52": "Eddy",
- "53": "Greg",
- "54": "Henry",
- "55": "Igor",
- "56": "Elise",
- "57": "Waschbär",
- "58": "Legsy",
- "59": "Holey",
- "60": "Stinktier",
- "90": "Helikopter",
- "100": "PlayerRobby"
- }
- },
- "armor": {
- "buttons": {
- "default": "Standard",
- "max": "Max",
- "remove": "Entfernen",
- "setAllToDefault": {
- "text": "Alle auf Standard",
- "tooltip": "Setzt die Haltbarkeit aller Rüstungsteile auf den Standardwert"
- },
- "setAllToMax": {
- "text": "Alle auf Max",
- "tooltip": "Setzt die Haltbarkeit aller Rüstungsteile auf das Maximum"
- },
- "setToDefault": {
- "text": "Standard",
- "tooltip": "Setzt die Haltbarkeit der Rüstung auf den Standardwert"
- },
- "setToMax": {
- "text": "Max",
- "tooltip": "Setzt die Haltbarkeit der Rüstung auf eine sehr hohe Zahl"
- }
- },
- "durabilityInput": {
- "tooltip": "Die Haltbarkeit der Rüstung. Wenn sie 0 beträgt, bricht die Rüstung. Kann sehr hoch sein",
- "watermark": "Haltbarkeit"
- },
- "header": "Ausgerüstete Rüstung (Max. 10)",
- "headers": {
- "actions": "Aktionen",
- "durability": "Haltbarkeit",
- "id": "ID",
- "name": "Name",
- "slot": "Slot"
- },
- "unknownItem": "??? Unbekanntes Objekt"
- },
- "backup": {
- "messages": {
- "backupsRestored": {
- "text": "{0} Backups wurden wiederhergestellt. Gelöschte Dateien wurden in den Papierkorb verschoben",
- "title": "Backups wiederhergestellt"
- }
- },
- "mode": {
- "Default": "Immer sichern",
- "InitialAndOne": "Original behalten, ein zusätzliches Backup",
- "None": "Keine Backups",
- "One": "Ein Backup behalten und überschreiben"
- }
- },
- "companion": {
- "address": "IP/Addresse",
- "connect": "Verbinden",
- "connectionFailed": {
- "text": "Der Verbindungsversuch mit dem Companion-Plugin ist fehlgeschlagen",
- "textException": "Der Verbindungsversuch mit dem Companion-Plugin ist fehlgeschlagen. Fehler: {0}",
- "title": "Companion Verbindung fehlgeschlagen"
- },
- "connectionSuccessful": {
- "text": "Verbindung zum Companion wurde erfolgreich hergestellt.\nDu kannst jetzt die Ingame-Hotkeys, Live-Teleportation über die Karte und Positions-Tracking nutzen.",
- "title": "Companion verbunden"
- },
- "connectTimeout": "Verbindungs-Timeout",
- "disconnect": "Verbindung trennen",
- "disconnectFailed": {
- "text": "Der Versuch die Verbindung zum Companion-Plugin zu trennen ist fehlgeschlagen.",
- "textException": "Der Versuch die Verbindung zum Companion-Plugin zu trennen ist fehlgeschlagen. Fehler: {0}",
- "title": "Companion Disconnect fehlgeschlagen"
- },
- "keepAliveInterval": "Keep-Alive Intervall",
- "mapPositionUpdateInterval": "Aktualisiere Spieler-Positionen alle",
- "port": "Port",
- "portHint": "Für Ports > 1024 müssen Anwendung und Spiel als Admin gestartet werden!",
- "readme": "Readme",
- "readme1": "Der \"Companion\" bietet Extra-Funktionalität für das Spiel, wie Ingame-Teleportation, Positions-Verfolgung und einiges mehr.\n\nBevor der Companion genutzt werden kann muss dieser erst eingerichtet werden. Hierfür müssen die folgenden Dinge installiert werden:\n\n- BepInExPack\n- SOTFEdit Companion Plugin\n\nDiese können entweder manuell anhand der README oder einen Mod-Manager eingerichtet werden:",
- "readme2": "Nachdem beides eingerichtet und das Spiel gestartet wurde, musst du über das Menü eine Verbindung zum Companion herstellen.\n\nDanach stehen im Spiel zwei neue Hotkeys zur Verfügung:\n- Ingame Teleportation zu den meisten Ingame-Orten (Standard: F8)\n- Benutzerdefinierte Location erstellen (F9)\n\nAußerdem wird die Position auf der Karte live aktualisiert.",
- "settings": "Einstellungen",
- "status": {
- "connected": "Verbunden",
- "connecting": "Verbinde...",
- "disconnected": "Verbindung getrennt"
- }
- },
- "dialogs": {
- "changeScrewStructureType": {
- "disclaimer": "Du kannst hier einen anderen Strukturtyp auswählen. Bitte beachte, dass die Rotation und Position der Struktur gleich bleiben, was zu Fehlern und Abstürzen führen kann."
- },
- "spawnFollower": {
- "disclaimer": "Wenn du Begleiter spawnen möchtest, musst du sicherstellen, dass du dich an einem freien Ort befindest. Die Begleiter werden an der Position des Spielers über der aktuellen Höhe des Spielers und mit einem leichten Offset gespawnt.\n\nIch habe viele Dinge für Virginia ausprobiert, aber konnte nur maximal 4 spawnen lassen. Es hat mit Kelvin besser geklappt. \n\nDies kann deine FPS töten und die langfristigen Auswirkungen sind derzeit auch nicht bekannt.\n\nWenn du mehr möchtest, solltest du das Spiel laden, alles spawnen lassen, das Spiel speichern, Begleiter spawnen lassen usw.",
- "title": "Begleiter spawnen"
- },
- "translations": {
- "filter": "Filtern",
- "missingOnly": "Nur fehlende"
- }
- },
- "errors": {
- "canNotBeEmpty": "{0} darf nicht leer sein"
- },
- "experiments": {
- "fires": {
- "noFires": {
- "text": "Keine Feuer zum Bearbeiten gefunden",
- "title": "Keine Feuer"
- },
- "success": {
- "text": "{0} Feuer wurden entzündet, aufgefüllt und ihre Brennrate geändert",
- "title": "Feuer verändert"
- }
- },
- "resetCannibalAngerLevel": {
- "success": {
- "text": "Änderungen hinzugefügt. Bitte speichern, um sie zu übernehmen",
- "title": "Änderungen hinzugefügt"
- }
- },
- "resetStructureDamage": {
- "noDamage": {
- "text": "Kein Strukturschaden muss repariert werden",
- "title": "Kein Strukturschaden"
- },
- "success": {
- "text": "{0} Strukturschäden wurden repariert",
- "title": "Schäden repariert"
- }
- }
- },
- "followers": {
- "buttons": {
- "fillAllBars": "Alle Balken füllen",
- "moveToKelvin": "Zu Kelvin teleportieren",
- "moveToPlayer": "Zum Spieler teleportieren",
- "moveToVirginia": "Zu Virginia teleportieren",
- "revive": "Wiederbeleben",
- "spawn": "Spawnen"
- },
- "details": {
- "status": "Status",
- "uniqueId": "UniqueID"
- },
- "equipmentLabel": "Ausrüstung",
- "outfitLabel": "Outfit",
- "outfits": {
- "9": {
- "-1": "Standard",
- "0": "Taktische Jacke",
- "1": "Anzug",
- "2": "Schlafanzug",
- "3": "Braune Lederjacke",
- "4": "Kapuzenpullover",
- "5": "Blaues T-Shirt",
- "6": "Blazer",
- "7": "Schwarze Lederjacke",
- "8": "Raumanzug",
- "9": "Priester-Outfit",
- "10": "Stewardess Outfit"
- },
- "10": {
- "-1": "Standard",
- "0": "Badeanzug",
- "1": "Trainingsanzug",
- "2": "Lederanzug",
- "3": "Tarnanzug",
- "4": "Kleid",
- "5": "Blaugrünes Kleid",
- "6": "Rotes Kleid"
- }
- },
- "reviveTooltip": "Stelle sicher, dass du dies außerhalb von Gebäuden tust, wenn der Körper fehlt, sonst könntest du in das Gebäude glitchen. Der Begleiter spawnt an der Position des Spielers und hat die konfigurierten Gegenstände und Kleidung ausgerüstet.",
- "status": {
- "alive": "Lebendig",
- "dead": "Tot",
- "unknown": "???"
- }
- },
- "game": {
- "setup": {
- "animalSpawnRate": {
- "_label": "Tier-Spawngeschwindigkeit"
- },
- "buildingResistance": "Gebäude-Langlebigkeit",
- "coldPenalties": "Kälte-Nachteile",
- "coldPenaltiesStatReduction": "Werte-Regenerationsstrafe",
- "consumableEffects": {
- "_label": "Verderb-Effekte",
- "_tooltip": "Wie viel Schaden du nimmst, wenn du schlechtes Essen isst"
- },
- "creativeMode": "Kreativ-Modus",
- "customSettings": "Benutzerdefinierte Einstellungen",
- "dayLength": {
- "default": "Standard",
- "long": "Lang",
- "realistic": "Realistisch",
- "short": "Kurz",
- "_label": "Tageslänge"
- },
- "enemyAggression": {
- "_label": "Feind-Aggressivität"
- },
- "enemyArmour": {
- "_label": "Feind-Rüstung"
- },
- "enemyDamage": {
- "_label": "Feind-Schaden"
- },
- "enemyHealth": {
- "_label": "Feind-Gesundheit"
- },
- "enemySearchParties": {
- "_label": "Feind-Suchtrupps"
- },
- "forcePlaceFullLoad": "Instant Bauen",
- "header": "Spiel-Setup",
- "headers": {
- "enemiesCustom": "Feinde",
- "multiplayer": "Mehrspieler",
- "weatherCustom": "Wetter"
- },
- "immortalMode": "Unverwundbarkeit",
- "inventoryPause": "Pause im Inventar",
- "mode": {
- "creative": "Kreativ",
- "custom": "Benutzerdefiniert",
- "hard": "Schwer",
- "hardSurvival": "Hard Survival",
- "normal": "Normal",
- "peaceful": "Friedlich",
- "_label": "Modus"
- },
- "noCuttingsSpawn": "No Cuttings Spawn",
- "oneHitToCutTrees": "Bäume sofort fällen",
- "playerStatsDamage": {
- "_label": "Spielerstatus-Schaden",
- "_tooltip": "Wie viel Schaden du durch Hunger und so weiter nimmst."
- },
- "playersTriggerTraps": "Spieler lösen Fallen aus",
- "precipitationFrequency": {
- "_label": "Niederschlagsfrequenz",
- "_tooltip": "Wie oft ändert sich das Wetter"
- },
- "pvpDamage": "PvP Schaden",
- "reducedAmmoInContainers": "Weniger Munition in Containern",
- "reducedFoodInContainers": "Weniger Essen in Containern",
- "seasonLength": {
- "default": "Standard",
- "long": "Lang",
- "realistic": "Realistisch",
- "short": "Kurz",
- "_label": "Saisonlänge"
- },
- "settingsValues": {
- "default": "Standard",
- "hard": "Schwer",
- "high": "Hoch",
- "low": "Niedrig",
- "normal": "Normal",
- "off": "Aus",
- "reduced": "Reduziert"
- },
- "singleUseContainers": "Einwegbehälter",
- "spawnEnemies": "Feinde spawnen",
- "startingSeason": {
- "autumn": "Herbst",
- "spring": "Frühling",
- "summer": "Sommer",
- "winter": "Winter",
- "_label": "Startsaison"
- },
- "uid": "UID"
- },
- "state": {
- "header": "Spielzustand",
- "headers": {
- "worldObjectStates": "Zustand der Weltobjekte"
- },
- "worldObjectStates": {
- "disclaimer": "Ich habe nicht vollständig untersucht, welche Werte welchen Zustand repräsentieren. Vermutlich:\n- 0 = Nicht festgelegt/geschlossen/nicht passiert\n- 1 oder 3 = Festgelegt/geöffnet/geschehen",
- "header": "Zustand der Weltobjekte"
- }
- }
- },
- "generic": {
- "add": "Hinzufügen",
- "cancel": "Abbrechen",
- "close": "Schließen",
- "edit": "Bearbeiten",
- "error": "Fehler",
- "exceptionMessage": "Ein Fehler ist aufgetreten: {0}",
- "name": "Name",
- "no": "Nein",
- "ok": "OK",
- "position": "Position",
- "save": "Speichern",
- "seconds": "Sekunde(n)",
- "setting": "Einstellung",
- "success": "Erfolg",
- "unknown": "Unbekannt",
- "update": "Aktualisieren",
- "value": "Wert",
- "yes": "Ja"
- },
- "influences": {
- "anger": "Wut",
- "disclaimer": "Stimmung definiert die Zuneigung, doch es ist nicht klar, wie dies Feinde beeinflusst.\nWenn der Angst-Wert hoch ist, rennen Feinde häufiger weg.\nEin hoher Wert in Wut erhöht die Wahrscheinlichkeit von Angriffen.",
- "fear": "Angst",
- "sentiment": "Stimmung"
- },
- "inventory": {
- "buttons": {
- "addAllFromCategory": "Alle von Kategorie hinzufügen",
- "max": "Max",
- "remove": "Entfernen",
- "removeAll": "Alle entfernen",
- "setAllToMax": "Alle auf Max setzen",
- "setAllToMin": "Alle auf Min setzen"
- },
- "filterWatermark": "Filtern...",
- "headers": {
- "itemsInInventory": "Gegenstände im Inventar",
- "unassignedItems": "Nicht zugewiesene Gegenstände"
- },
- "table": {
- "actions": "Aktionen",
- "count": {
- "text": "Anzahl",
- "tooltip": "Die Menge, die du im Inventar hast"
- },
- "id": "ID",
- "name": "Name",
- "type": "Typ"
- },
- "unknownItem": "??? Unbekannter Gegenstand"
- },
- "items": {
- "78": "Baumstamm",
- "340": "Gitarre",
- "341": "Fernglas",
- "346": "Schrotflintenaufsatz",
- "351": "Notfalltasche",
- "353": "Betäubungsgewehr",
- "354": "Nachtsichtgerät",
- "355": "Pistole",
- "356": "Moderne Axt",
- "357": "Luftgewehr",
- "358": "Schrotflinte",
- "359": "Machete",
- "360": "Kompositbogen",
- "361": "Gewehr",
- "362": "9-mm-Munition",
- "363": "Flintenlaufgeschoss",
- "364": "Schrotkugeln",
- "365": "Armbrust",
- "366": "Ortungspfeil",
- "367": "Katana",
- "368": "Armbrustbolzen",
- "369": "Betäubungsgewehrmunition",
- "370": "9-mm-Munition",
- "371": "Schrotkugeln",
- "372": "Flintenlaufgeschoss",
- "373": "Kohlefaserpfeil",
- "374": "Schalldämpfer",
- "375": "Laservisier",
- "376": "Pistolenaufsatz",
- "377": "Zielfernrohr",
- "378": "Taschenlampenvorrichtung",
- "379": "Taktische Axt",
- "380": "Kampfmesser",
- "381": "Granate",
- "382": "Granate",
- "383": "Gewehraufsatz",
- "384": "Armbrustköcher",
- "386": "Revolver",
- "387": "Gewehrmunition",
- "388": "Molotowcocktail",
- "389": "Molotow",
- "390": "Druckerharz",
- "391": "Rote Maske",
- "392": "Stock",
- "393": "Stein",
- "394": "Kettensäge",
- "395": "Brett",
- "396": "Elektroschocker",
- "397": "Shiitake",
- "398": "Kräuterseitling",
- "399": "Semmel-Stoppelpilz",
- "400": "Knollenblätterpilz",
- "401": "Schildkrötenei",
- "402": "Rucksack",
- "403": "Seil",
- "405": "Knochen",
- "406": "Viertelstamm",
- "408": "Stammhälfte",
- "409": "Dreiviertelstamm",
- "410": "Armbanduhr",
- "412": "GPS-Gerät",
- "413": "Feuerzeug",
- "414": "Wodka-Flasche",
- "415": "Stoff",
- "416": "Leiterplatte",
- "417": "Zeitbombe",
- "418": "Draht",
- "419": "Klebeband",
- "420": "C4-Ladung",
- "421": "Ramen-Nudeln",
- "422": "Reparaturwerkzeug",
- "423": "Roman [Fähnchenbanner]",
- "424": "Roman [Tiefschlaf]",
- "425": "Crunchie Wunchies",
- "426": "Gedruckte Trinkflasche",
- "427": "Gedrucktes Messer",
- "428": "Gedruckter Schlitten",
- "429": "Gedruckte Tauchermaske",
- "430": "Schädel",
- "431": "Feuerwehraxt",
- "432": "Dosenöffner",
- "433": "Fleisch",
- "434": "Konserven",
- "435": "Goldmaske",
- "436": "Fisch",
- "437": "Medizin",
- "438": "Feldration",
- "439": "Energydrink",
- "440": "Leuchtfackel",
- "441": "Energieriegel",
- "443": "Handgemachter Bogen",
- "444": "Tauchgerät",
- "445": "Heidelbeeren",
- "446": "Heckenkirsche",
- "447": "Lachsbeeren",
- "448": "Schneebeeren",
- "449": "Igelkraftwurz",
- "450": "Schachtelhalm",
- "451": "Aloe-Vera",
- "452": "Schafgarbe",
- "453": "Weidenröschen",
- "454": "Pfeilblatt",
- "455": "Gesundheitsmischung",
- "456": "Gesundheitsmischung +",
- "457": "Betäubungsgewehrmunition",
- "458": "Ladegerät",
- "459": "Schleuder",
- "460": "Batterie-Päckchen",
- "461": "Energiemischung",
- "462": "Energiemischung +",
- "463": "Flossen",
- "464": "Katzenfutter",
- "465": "Chicorée",
- "466": "Auster",
- "467": "Album-Cover",
- "468": "Kreuz",
- "469": "Lufttank",
- "470": "Zielfernrohr für Luftgewehr",
- "471": "Taschenlampe",
- "472": "Tierhaut",
- "473": "Blätterrüstung",
- "474": "Handgefertigter Speer",
- "475": "Reiseflasche",
- "476": "Kleiner Stein",
- "477": "Handgefertigte Keule",
- "478": "Kletteraxt",
- "479": "Feder",
- "480": "Arm",
- "481": "Bein",
- "482": "Kopf",
- "483": "Notfallpaket",
- "484": "Blatt",
- "485": "Schaufel",
- "486": "Walkie-Talkie",
- "487": "Schlafanzug",
- "488": "Blaues T-Shirt",
- "489": "Taktische Hose",
- "490": "Kapuzenpullover",
- "491": "Jackett",
- "492": "Smoking-Jacke",
- "493": "Lederjacke",
- "494": "Knochenrüstung",
- "495": "Taktische Jacke",
- "496": "Geld",
- "497": "Servierbrett",
- "498": "GRABS-Laserpointer",
- "499": "Neoprenanzug",
- "500": "Winterjacke",
- "501": "Stiefel",
- "502": "Münzen",
- "503": "Fackel",
- "504": "Plane",
- "505": "Laser-Messgerät",
- "506": "Schildkrötenpanzer",
- "507": "Steinpfeil",
- "508": "Lederbeutel",
- "509": "Flugblatt [Hölenquellen] ",
- "511": "Kontaktauslöser",
- "512": "Gefülltes Servierbrett",
- "513": "Feder",
- "514": "Kontaktfederauslöser",
- "515": "Tutorial [Grundlegendes Bauen]",
- "516": "Tutorial [Tarp-Zelt]",
- "517": "Kochtopf",
- "518": "Papierzielscheibe",
- "519": "Tierhautrüstung",
- "520": "Konstruktionselement",
- "521": "E-Mail [Hölenbeleuchtung]",
- "522": "Seilgewehr",
- "523": "Seilrutschenseil",
- "524": "Golfball",
- "525": "Putter",
- "526": "Testament von Hr. Puffy",
- "527": "Batterien",
- "528": "Mr. Puffys Finanzen",
- "529": "GPS-Peilsender",
- "530": "Bauplan Trockengestell",
- "531": "Bauplan Stühle aus Stöcken",
- "532": "Bauplan Bett aus Stöcken",
- "533": "Bauplan Waffenregal",
- "534": "E-Mail [Golf 1/4]",
- "535": "E-Mail [Golf 2/4]",
- "536": "E-Mail [Golf 3/4]",
- "537": "E-Mail [Golf 4/4]",
- "538": "E-Mail [Malerei]",
- "539": "Dokument [Out Demonia]",
- "540": "Dokument [Crosses burn Demons]",
- "541": "Dokument [Cube Activation Cycles]",
- "542": "Email [Thought you might find this interesting]",
- "543": "Email [Another one]",
- "544": "Email [One more]",
- "545": "Email [Photo Reference]",
- "546": "Email [Note to all employees]",
- "547": "Email [Safe in Cube]",
- "548": "Dokument [Stay in the Cube]",
- "549": "Bauplan Knochenmacherfalle",
- "550": "Bauplan Fliegenklatsche-Falle",
- "551": "Bauplan Kleintierfalle",
- "552": "Baupläne",
- "553": "Tech Mesh",
- "554": "Tech-Rüstung",
- "555": "Trainingsanzug",
- "556": "Kleid",
- "557": "Lederanzug",
- "558": "Tarnanzug",
- "559": "Gedruckte Pfeilspitze",
- "560": "Gedruckter Enterhaken",
- "561": "Gedruckter Blumentopf",
- "562": "Notizen [Holoville 1/4]",
- "563": "Notizen [Holoville 2/4]",
- "564": "Notizen [Holoville 3/4]",
- "565": "Notizen [Holoville 4/4]",
- "566": "Wartungsschlüsselkarte",
- "567": "Gästeschlüsselkarte",
- "568": "VIP-Schlüsselkarte",
- "569": "Gehirnstück",
- "570": "Steakstück",
- "571": "Speckstück",
- "572": "Uralte Rüstung",
- "573": "Schlafsack",
- "574": "Roman [Gerettet]",
- "575": "Roman [Parallelwelten]",
- "576": "Viertelbrett",
- "577": "Bretthälfte",
- "578": "Dreiviertelbrett",
- "579": "Bauplan Knochenstuhl",
- "580": "Bauplan Sprossenleiter",
- "581": "Bauplan Vogelhaus",
- "582": "Bauplan Fischreuse",
- "583": "Bauplan Aufbewahrungskiste",
- "584": "Bauplan Schaufensterfigur",
- "585": "Bauplan Vogelscheuche",
- "586": "Bauplan Wandpflanzkasten",
- "587": "Bauplan Pflanzgefäß",
- "588": "Bauplan Knochenleuchter",
- "589": "Handbuch",
- "590": "Radio",
- "591": "Kleine Blockhütte",
- "592": "Unheimliche Haut",
- "593": "Mutantenrüstung",
- "594": "Guarana-Beeren",
- "595": "Brombeeren",
- "596": "Aloe-Vera-Samen",
- "597": "Pfeilblattsamen",
- "598": "Brombeere",
- "599": "Heidelbeerstrauchsame",
- "600": "Igelkraftwurzsamen",
- "601": "Weidenröschensamen",
- "602": "Guarana-Samen",
- "603": "Schachtelhalmsamen",
- "604": "Lachsbeersamen",
- "605": "Wegwarte",
- "606": "Schafgarbensamen",
- "607": "Bauplan Steinlager",
- "608": "Bauplan Knochenlager",
- "609": "Bauplan Stammlager",
- "610": "Bauplan Stocklager",
- "611": "Ausdruck [Zahlen]",
- "612": "Zeitungsausschnitt [Missing CEO]",
- "613": "Zeitungsausschnitt [Puffcorp]",
- "614": "E-Mail [Artifact - Preliminary Findings]",
- "615": "E-Mail [Scientific Data - Cube]",
- "616": "Geheimes Dokumentflat",
- "617": "Aktienkurs",
- "618": "Gedruckter Pfeil",
- "619": "Badeanzug",
- "620": "Bauplan Tisch",
- "621": "Bauplan Regal",
- "622": "Bauplan Steinweg",
- "623": "Bauplan Wandregal",
- "624": "Bauplan Wandfackel",
- "625": "Bauplan Schädel-Lampe",
- "626": "Faltbarer Gleiter",
- "627": "Tischkarte von Mr. Puffton",
- "628": "Tischkarte von Mrs. Puffton",
- "629": "Wassersammler",
- "630": "Knight V",
- "631": "Hinter dem Reich",
- "632": "Bauplan Federfalle",
- "633": "Flugblatt [Kultiges]",
- "634": "Solarmodul",
- "635": "Glühbirne",
- "636": "TemplateD",
- "637": "Action-Kamera",
- "638": "Bauplan Einfacher Holzschlitten",
- "639": "Raumanzug",
- "640": "Stein",
- "641": "Bauplan Stein-Feuerstelle",
- "642": "Entenkopf",
- "643": "Adlerkopf",
- "644": "Kleiner Schildkrötenkopf",
- "645": "Bauplan Kopf Trophäenhalterung",
- "646": "Kaninchenkopf",
- "647": "Eichhörnchen-Kopf",
- "648": "Möwenkopf",
- "649": "Bauplan Stein-Lager",
- "650": "Schildkrötenkopf",
- "651": "Hirschkopf",
- "652": "Elchkopf",
- "653": "Persönliche Notiz A",
- "654": "Persönliche Notiz B",
- "655": "Persönliche Notiz C",
- "656": "Bauplan Hokey Pokey-Falle",
- "657": "Gedrucktes GPS Gehäuse",
- "658": "Bauplan Radio-Falle",
- "659": "Bauplan Radio",
- "661": "Golfwagen-Batterie",
- "662": "Artefakt Teil A",
- "663": "Spitzhacke",
- "664": "Solafit-Erz",
- "665": "Bauplan Item Plating",
- "666": "Bauplan beleuchtetes Kreuz",
- "667": "Artefakt Teil B",
- "668": "Artefakt Teil C",
- "669": "Artefakt Teil D",
- "670": "Bauplan Gore Stuhl",
- "671": "Bauplan Gore Couch",
- "672": "Bauplan Uber-Falle",
- "673": "Bauplan Runder Tisch",
- "674": "Alte Notiz A",
- "675": "Alte Notiz B",
- "676": "Alte Notiz C",
- "677": "Angeln Email A",
- "678": "Angeln Email B",
- "679": "Bauplan Häcksler-Falle",
- "680": "Bauplan Scheinwerfer",
- "681": "Bauplan Wanduhr",
- "682": "Bauplan Drehende Falle",
- "683": "Bauplan Doppelbett",
- "684": "Alte Notiz E",
- "685": "Alte Notiz D",
- "686": "Alte Notiz F",
- "687": "Puffton Email A",
- "688": "Bauplan Speerwerfer-Falle",
- "689": "Artefakt Teil E",
- "690": "Notizbuch",
- "691": "Alte Notiz F",
- "692": "Angeln Email C",
- "693": "Bunker-Karte A",
- "694": "Jianyu Email Ausdruck A",
- "695": "Kult-Zeichen G",
- "696": "Kult-Zeichen H",
- "697": "Kult-Zeichen I",
- "698": "Kult-Zeichen J",
- "699": "Kult-Zeichen K",
- "700": "Bauplan Speerhalter",
- "701": "Bauplan Bein-Lampe",
- "702": "Feuerholz-Lager",
- "703": "Priester-Outfit",
- "704": "Bauplan Wand-Waffenhalter",
- "705": "Zirkus-Flugblatt",
- "706": "Zeitungsausschnitt [Ehemänner]",
- "707": "Artefakt",
- "708": "Artefakt Teil F",
- "709": "Bauplan Teleporter",
- "710": "Bauplan Abwehr-Schrein",
- "711": "Bauplan Anziehungs-Schrein",
- "712": "Artefakt Teil G",
- "713": "Bauplan Plater Counter",
- "714": "Bauplan Armor Plater",
- "715": "Waschbär-Kopf",
- "716": "Biebel-Ausschnitt D",
- "717": "Alte Notiz G",
- "718": "Persönliche Notiz E",
- "719": "Persönliche Notiz F",
- "720": "Persönliche Notiz G",
- "721": "Bibel-Papierschnipsel A",
- "722": "Puffton Email B",
- "723": "Puffton Email C",
- "724": "Heckenkirsche-Samen",
- "725": "Schneebeeren-Samen",
- "726": "Hängegleiter-Startvorrichtung Blaupause",
- "727": "Solafitrüstung",
- "728": "Lebendiges Kaninchen",
- "729": "Stinktier-Kopf",
- "730": "Kleiner Kaninchenstall Blaupause",
- "749": "Stewardess Outfit"
- },
- "itemTypes": {
- "ammo": "Munition",
- "armor": "Rüstung",
- "attachment": "Aufsatz",
- "blueprint": "Bauplan",
- "bodyPart": "Körperteil",
- "book": "Buch",
- "clothes": "Kleidung",
- "consumable": "Verbrauchsmaterial",
- "container": "Behälter",
- "document": "Dokument",
- "electricity": "Elektrizität",
- "equipment": "Ausrüstung",
- "food": "Lebensmittel",
- "key": "Schlüssel",
- "log": "Stamm",
- "misc": "Sonstiges",
- "plant": "Pflanze",
- "printed": "Gedrucktes",
- "seed": "Samen",
- "tool": "Werkzeug",
- "trophy": "Trophäe",
- "weapon": "Waffe",
- "weaponMod": "Waffen-Modifikation"
- },
- "itemVariants": {
- "433": {
- "1": "Rohes Fleisch",
- "2": "Unbekanntes Fleisch",
- "3": "Verdorbenes Fleisch",
- "4": "Trockenfleisch",
- "5": "Gekochtes Fleisch",
- "6": "Verbranntes Fleisch"
- },
- "436": {
- "1": "Roher Fisch",
- "2": "Unbekannter Fisch",
- "3": "Verdorbener Fisch",
- "4": "Trockenfisch",
- "5": "Gekochter Fisch",
- "6": "Verbrannter Fisch"
- },
- "480": {
- "1": "Roher Arm",
- "2": "Unbekannter Arm",
- "3": "Verdorbener Arm",
- "4": "Getrockneter Arm",
- "5": "Gekochter Arm",
- "6": "Verbrannter Arm"
- },
- "481": {
- "1": "Rohes Bein",
- "2": "Unbekanntes Bein",
- "3": "Verdorbenes Bein",
- "4": "Getrocknetes Bein",
- "5": "Gekochtes Bein",
- "6": "Verbranntes Bein"
- }
- },
- "languages": {
- "de": "Deutsch (German)",
- "en": "Englisch (English)",
- "pl": "Polnisch (Polish)"
- },
- "map": {
- "actors": "NPCs",
- "altItems": "Alternative Gegenstände",
- "alwaysOnTop": "Immer im Vordergrund",
- "area": "Bereich",
- "areaFilter": {
- "text": "Bereiche",
- "types": {
- "all": "Alle",
- "surfaceOnly": "Nur Oberfläche",
- "undergroundOnly": "Nur Höhlen/Bunker"
- }
- },
- "buttons": {
- "createNewZipline": {
- "text": "Neue Seilrutsche von hier",
- "tooltip": "Nachdem du den Button angeklickt hast, wird die neue Seilrutsche zwischen der aktuellen und der nächsten angeklickten Position hergestellt"
- },
- "delete": "Löschen",
- "deleteBothAnchors": "Beide Anker löschen",
- "deselectAll": "Auswahl aufheben",
- "moveToNextClickedPosition": {
- "hint": "Bitte jetzt einen anderen Ort anklicken",
- "text": "Zur angeklickten Position verschieben",
- "tooltip": "Nachdem du den Button angeklickt hast, wird die Position zum nächsten angeklickten Icon verschoben"
- },
- "spawnActors": "Spawn Actors",
- "teleportKelvin": "Kelvin hierhin teleportieren",
- "teleportPlayer": "Spieler hierhin teleportieren",
- "teleportVirginia": "Virginia hierhin teleportieren"
- },
- "coordinates": "Koordinaten",
- "customPois": "Benutzerdefiniert",
- "details": "Details",
- "fill": "Füllen",
- "followers": "Begleiter",
- "followPlayer": "Spieler verfolgen",
- "fullText": {
- "text": "Volltext",
- "tooltip": "Sucht in Titel, Beschreibung, Gegenstands-Name und Gegenstands-Kategorie der aktuell ausgewählten Markierungs-Kategorien",
- "watermark": "Titel, Beschreibung, Item-Name..."
- },
- "inventoryFilter": "Nur nicht-gesammelte Gegenstände",
- "isInInventory": "Im Inventar",
- "isRuntimeCreated": "Ist Kopie",
- "isUnderground": "Unterirdisch",
- "itemId": "Item ID",
- "items": "Gegenstände",
- "mapType": {
- "dark": "Dunkel",
- "original": "Original"
- },
- "name": "Name",
- "objects": "Objekte",
- "options": "Optionen",
- "pois": "Sehenswürdigkeiten",
- "requirements": "Voraussetzungen",
- "requirementsFilter": {
- "text": "Voraussetzungen",
- "tooltip": "Zeigt nur Gegenstände, Bunker etc. an für die sich die erforderlichen Gegenstände wie die Schaufel im Inventar befinden",
- "types": {
- "AccessibleOnly": "Nur Erreichbares anzeigen",
- "All": "Alle",
- "InaccessibleOnly": "Nur Unerreichbares anzeigen"
- }
- },
- "spawnWindow": {
- "actorType": "Actor Typ",
- "count": "Anzahl",
- "disclaimer": "Sei vorsichtig mit der Position oder Anzahl. Es könnte das Spiel zum Absturz bringen. Manche Gegner lassen sich nicht an bestimmten unterirdischen Orten spawnen.",
- "doSpawn": "Actors erstellen",
- "family": "Familie",
- "familyOfDestinationActor": "Familie des Ziel-Actors",
- "information": "Informationen",
- "options": "Optionen",
- "position": "Position",
- "spaceBetween": {
- "text": "Abstand dazwischen",
- "tooltip": "Definiert den Abstand zwischen jedem Actor. Die Actors werden in einem gleichmäßigen Raster platziert, wenn dieser Wert > 0 ist"
- },
- "spawnPattern": {
- "Cross": "Kreuz",
- "Grid": "Raster",
- "HorizontalLine": "Horizontale Linie",
- "Random": "Zufällig",
- "Rectangle": "Rechteck",
- "text": "Spawn Muster",
- "VerticalLine": "Vertikale Linie"
- },
- "title": "Actor spawnen"
- },
- "structures": "Strukturen",
- "teleportation": "Teleportation",
- "teleportWindow": {
- "destination": "Ziel",
- "disclaimer": "Du kannst die Ziel-Koordinaten hier verändern. Wenn der Zielpunkt in einem Gegner ist besteht die Möglichkeit, in die Luft katapultiert zu werden. X und Z bestimmen den Ort und Y die Höhe. Bitte stelle sicher dass der korrekte Bereich eingestellt ist.",
- "doTeleport": "Teleportieren!",
- "mode": {
- "Kelvin": "Kelvin",
- "Player": "Spieler",
- "Virginia": "Virginia"
- },
- "offset": "Offset",
- "title": "Teleportieren",
- "toTeleport": "Zu teleportieren"
- },
- "wiki": "Wiki Link",
- "zipLineAnchor": "Seilrutschen-Anker",
- "zipLines": "Seilrutschen"
- },
- "menu": {
- "companion": {
- "setup": "Einrichtung",
- "text": "Companion"
- },
- "file": {
- "deleteAllBackups": "Alle Backups löschen",
- "exit": "Beenden",
- "openLastSavegame": "Letzten Spielstand öffnen...",
- "openLastSavegameWithSavegame": "{0} öffnen...",
- "openSavegame": "Spielstand öffnen...",
- "openSavegameDirInExplorer": "Spielstand-Ordner im Explorer öffnen",
- "reloadCurrentSavegame": "Aktuellen Spielstand neu laden",
- "restoreFromBackup": {
- "fromNewestBackup": "Vom neuesten Backup",
- "fromOldestBackup": "Vom ältesten Backup",
- "text": "Backup wiederherstellen"
- },
- "save": "Speichern",
- "settings": "Einstellungen",
- "text": "Datei"
- },
- "help": {
- "about": "Über...",
- "changelog": "Changelog",
- "links": {
- "discord": "Discord",
- "downloadLatestVersion": "Neueste Version herunterladen",
- "githubProject": "GitHub Projekt",
- "nexusMods": "NexusMods",
- "text": "Links",
- "thunderstoreIo": "thunderstore.io"
- },
- "readme": "Readme",
- "text": "?",
- "translations": "Übersetzungen",
- "updates": {
- "checkNow": "Jetzt prüfen",
- "checkOnStartup": "Beim Start prüfen",
- "text": "Aktualisierungen"
- }
- },
- "tools": {
- "cloneWorldObjects": {
- "text": "Welt-Gegenstände klonen...",
- "tooltip": "Klont einen Welt-Gegenstand an der Position des Spielers"
- },
- "eternalFires": {
- "text": "Ewige Feuer",
- "tooltip": "Entzündet Feuer, setzt Brenstoff-Vebrauch auf niedrig und setzt den Brennstoff-Wert hoch"
- },
- "fires": {
- "text": "Feuer",
- "tooltip": "Verändert Feuer in der Spielwelt"
- },
- "itemPlater": {
- "text": "Gegenstands- und Struktur-Beschichter",
- "tooltip": "Entfernt oder fügt eine Solafit-Beschichtung zu Gegenständen im Inventar, Waffenhaltern, Begleiter-Items und Gebäuden/Strukturen hinzu"
- },
- "map": {
- "text": "Interaktive Karte",
- "tooltip": "Eine interaktive Karte"
- },
- "modifyConsumedItems": {
- "text": "Verzehrte Gegenstände bearbeiten...",
- "tooltip": "Falls du dein Gedächtnis über bereits verzehrte Gegenstände löschen möchten."
- },
- "regrowTrees": "Bäume nachwachsen lassen...",
- "resetCannibalAngerLevel": {
- "text": "Kannibalen-Wut-Level zurücksetzen",
- "tooltip": "Setzt die Tötungsstatistik, Anzahl gefallene Bäume und Anzahl Sichtungen zurück, was zu kleineren und weniger Angriffen führt"
- },
- "resetContainers": {
- "text": "Behälter zurücksetzen",
- "tooltip": "Setzt Behälter in Höhlen und der Spielwelt zurück"
- },
- "resetFires": {
- "text": "Feuer zurücksetzen",
- "tooltip": "Entzündet Feuer und setzt Brennstoff-Verbrauch und Menge auf Standard"
- },
- "resetStructureDamage": {
- "text": "Schadenszähler für Gebäude zurücksetzen",
- "tooltip": "Ermöglicht es, alle Gebäude zu reparieren."
- },
- "resetTraps": {
- "text": "Fallen zurücksetzen",
- "tooltip": "Setzt alle Fallen zurück"
- },
- "setToEndgame": {
- "text": "Auf Endspiel setzen",
- "tooltip": "Setzt das Spiel auf \"Endspiel\" welches bestimmte Gegner freischaltet"
- },
- "text": "Tools",
- "unlocks": {
- "text": "Freischaltung",
- "tooltip": "Schaltet bestimmte Spiel-Features frei"
- }
- }
- },
- "npcs": {
- "tabs": {
- "byFamily": {
- "disclaimer": "Eine Familie stellt eine Gruppe von NPCs dar, die zueinander gehören. Mit anderen Worten: Ein Schwarm, ein Stamm zum Beispiel.",
- "text": "Nach Familie"
- },
- "byType": "Nach Typ"
- }
- },
- "player": {
- "areaMask": "Bereich",
- "buttons": {
- "moveToKelvin": "Zu Kelvin teleportieren",
- "moveToVirginia": "Zu Virginia teleportieren"
- },
- "currentHealth": "Aktuelle Gesundheit",
- "fillAllBars": "Alle Balken füllen",
- "mapGroupName": "Spieler",
- "maxHealth": "Maximale Gesundheit",
- "outfit": "Outfit",
- "sickness": "Krankheit",
- "strengthLevel": "Stärke-Level"
- },
- "poiGroups": {
- "Ammo": "Munition",
- "Bunkers": "Bunker",
- "Camps": "Camps",
- "CannibalVillages": "Kannibalen-Dörfer",
- "Caves": "Höhlen",
- "Crates": "Kisten",
- "Doors": "Türen",
- "Helicopters": "Helikopter",
- "Info": "Info",
- "Items": "Gegenstände",
- "Lakes": "Seen",
- "Laptops": "Laptops",
- "Ponds": "Tümpel",
- "Printers": "3D-Drucker",
- "Supply": "Vorrat",
- "Villages": "Dörfer"
- },
- "storage": {
- "batch": {
- "allSlots": "Alle Plätze",
- "clearAll": "Alle leeren",
- "fillAllWith": "Alles füllen mit",
- "setAllToMax": "Alle auf Maximum setzen"
- },
- "buttons": {
- "fillAllStorages": "Alle Lager füllen"
- },
- "errors": {
- "currentStateNotDefined": "CurrentState für Modul-ID {0} nicht definiert"
- },
- "headers": {
- "selectAStorage": "Wähle ein Lager aus",
- "storageTypes": "Lager-Typen"
- },
- "slot": {
- "max": "Max",
- "remove": "Entfernen"
- }
- },
- "structures": {
- "added": "Hinzugefügt",
- "applyToAllOfSameType": {
- "text": "Auf alle des selben Typs anwenden",
- "tooltip": "Wendet die oben eingestellten Items und Anzahl auf alle Storages des selben Typs an"
- },
- "buildCost": "Baukosten",
- "buttons": {
- "changeType": "Typ ändern",
- "setAllToAlmostFinish": "Alle auf \"Fast fertig\" setzen",
- "setAllToFinish": "Alle auf \"Fertigstellen\" setzen",
- "setAllToRemove": "Alle auf \"Entfernen\" setzen",
- "setAllToUnfinish": "Alle auf \"Unvollständig\" setzen",
- "unmodifyAll": "Alle Änderungen rückgängig"
- },
- "categories": {
- "furniture": "Möbel",
- "gardening": "Gartenarbeit",
- "misc": "Sonstiges",
- "raft": "Floß",
- "shelter": "Unterkunft",
- "storage": "Lagerung",
- "traps": "Fallen",
- "treeShelter": "Baum-Unterkunft",
- "utility": "Nützliches"
- },
- "category": "Kategorie",
- "headers": {
- "batch": "Batch",
- "finishedStructures": "Fertige Strukturen",
- "unfinishedStructures": "Unfertige Strukturen"
- },
- "modification": "Modifikation",
- "modificationMode": {
- "AlmostFinish": "Fast fertig",
- "Finish": "Fertigstellen",
- "None": "Keine Änderung",
- "Remove": "Entfernen",
- "Unfinish": "Unfertig stellen"
- },
- "percentDone": "Fortschritt",
- "structureTypeSelectorDisclaimer": "Wenn nichts ausgewählt wird, werden alle Strukturen geändert",
- "types": {
- "19": "Waffenhalter",
- "20": "Stuhl aus Stöckern",
- "21": "Falle des Knochenmachers",
- "22": "Bett aus Stöckern",
- "23": "Wand-Pflanzkasten",
- "24": "Knochenlampe",
- "25": "Knochenstuhl",
- "26": "Anbau",
- "27": "Trockengestell",
- "28": "Baumunterstand 2",
- "29": "Stocklager",
- "31": "Steinlager",
- "32": "Knochenlager",
- "34": "Kleine Blockhütte",
- "35": "Reuse",
- "36": "Rüstungsständer",
- "37": "Baumstammlager (Alt)",
- "38": "Aussichtsturm",
- "39": "Vogelscheuche",
- "40": "Pflanzkasten",
- "41": "Baumplattform 2",
- "42": "Falle für Kleintiere",
- "43": "Baumplattform 1",
- "44": "Baumunterstand 1",
- "45": "Fliegende Klatschfalle",
- "46": "Stockweg",
- "47": "Jagdhütte",
- "48": "Tisch",
- "49": "Regal",
- "50": "Steinweg",
- "51": "Wandregal",
- "52": "Bank",
- "53": "Wandfackel",
- "54": "Schädel-Deckenlampe",
- "55": "Seilrutsche",
- "56": "Regenfänger",
- "57": "Federfalle",
- "58": "Fortgeschrittener Holzschlitten",
- "59": "Einfacher Holzschlitten",
- "60": "Stein-Feuerstelle",
- "61": "Trophäen-Halter",
- "62": "Felsen-Lager",
- "63": "Hokey Pokey Falle",
- "64": "Radio Alarm Falle",
- "67": "Großer Baumstamm-Halter",
- "68": "Hirschfell-Teppich",
- "70": "Item Plating",
- "71": "Beleuchtetes Kreuz",
- "72": "Gore Stuhl",
- "73": "Gore Couch",
- "74": "Uber-Falle",
- "75": "Runder Tisch",
- "76": "Hächsler-Falle",
- "77": "Scheinwerfer",
- "78": "Wanduhr",
- "79": "Drehende Falle",
- "80": "Doppelbett",
- "81": "Speerwerfer-Falle",
- "82": "Speerhalter",
- "84": "Feuerholz-Lager",
- "85": "Bein-Lampe",
- "86": "Wand-Waffenhalter",
- "88": "Teleporter",
- "89": "Abwehr-Schrein",
- "90": "Anziehungs-Schrein",
- "91": "Sofa",
- "92": "Blätter-Falle",
- "93": "Molotov-Stolperdraht-Falle",
- "94": "Explosiv-Stolperdraht-Falle",
- "95": "Pfeil-Lager",
- "96": "Baumstammlager",
- "97": "Fell-Stuhl",
- "98": "Kleine Plattform",
- "99": "Mittlere Plattform",
- "100": "Plater Counter",
- "101": "Goldrüstungs-Beschichter",
- "102": "Hängegleiter-Plattform",
- "103": "Hängegleiter-Plattform",
- "104": "Explosiv-Lager",
- "106": "Kaninchenstall",
- "107": "Kleiner Kaninchenstall",
- "108": "Hausboot",
- "109": "Knight-V Halter",
- "110": "Vogelhaus",
- "113": "Faltbarer Gleitschirmhalter",
- "117": "Kleines Floß",
- "118": "Anlegestelle",
- "119": "Großes Floß"
- }
- },
- "tabs": {
- "followers": "Begleiter",
- "game": "Spiel",
- "inventory": "Inventar",
- "npcs": "NPCs",
- "player": "Spieler",
- "storage": "Lager",
- "structures": "Gebäude"
- },
- "weather": {
- "header": "Wetterzustand"
- },
- "windows": {
- "itemPlater": {
- "buttons": {
- "addPlating": "Beschichten",
- "removePlating": "Beschichtung entfernen"
- },
- "constructionCategories": {
- "Item": "Gegenstand",
- "Log": "Baumstamm",
- "LogPlank": "Brett",
- "Stick": "Stock",
- "Stone": "Stein"
- },
- "constructions": "Bauwerke",
- "disclaimer": "Vorsicht: Das Tool speichert NUR Änderungen an der Beschichtung läd das Savegame danach erneut.\r\n\r\nStelle also sicher dass es keine ungespeicherten Änderungen gibt. Falls doch, dann speicher zuerst die Änderungen, öffne DANN das Tool und führe die Beschichtung durch.\r\n\r\nEs kann außerdem eine Weile dauern bis die Änderungen gespeichert wurden.",
- "followerItems": "Begleiter-Gegenstände",
- "itemsInInventory": "Gegenstände im Inventar",
- "itemsInWeaponRacks": "Gegenstände in Waffenhaltern",
- "messages": {
- "addPlating": "{0} Beschichtungen wurden hinzugefügt",
- "removePlating": "{0} Beschichtungen wurden entfernt"
- },
- "structures": "Strukturen",
- "title": "Gegenstands- und Struktur-Beschichter"
- },
- "main": {
- "errors": {
- "errorCheckingLastVersion": "Beim Überprüfen der neuesten Version ist ein Fehler aufgetreten"
- },
- "map": "Karte",
- "messages": {
- "alreadyLatestVersion": {
- "text": "Du verwendest bereits die neueste Version",
- "title": "Kein Update"
- },
- "backupsDeleted": "{0} Backups gelöscht",
- "changesSaved": "Änderungen wurden erfolgreich gespeichert",
- "confirmCloseApplication": {
- "text": "Möchtest du die Anwendung schließen?",
- "title": "Anwendung schließen"
- },
- "confirmCreateBackup": {
- "text": "Möchtest du ein Backup erstellen?",
- "title": "Backup erstellen?"
- },
- "confirmDeleteBackups": {
- "text": "Möchtest du wirklich alle Backups löschen?",
- "title": "Alle Backups löschen"
- },
- "confirmOverwriteExternalChanges": {
- "text": "Das Savegame wurde extern geändert. Möchtest du wirklich alle Änderungen überschreiben?",
- "title": "Änderungen überschreiben"
- },
- "confirmRestoreBackups": {
- "text": "Bist du sicher, dass du Backups wiederherstellen möchten?",
- "title": "Backups wiederherstellen"
- },
- "followerAlreadyAlive": {
- "text": "{0} sollte bereits am Leben sein",
- "title": "Keine Änderungen"
- },
- "followerRevived": {
- "text": "{0} sollte jetzt wieder da sein",
- "title": "Wiederbelebt"
- },
- "followersCreated": {
- "text": "{0} Begleiter wurden erzeugt",
- "title": "Begleiter erzeugt"
- },
- "noChanges": {
- "text": "Keine Änderungen - Nichts gespeichert",
- "title": "Keine Änderungen"
- },
- "saveChanges": "Änderungen speichern",
- "unableToDeleteBackups": "Backups konnten nicht gelöscht werden: {0}",
- "unableToSpawnFollowers": "Begleiter konnten nicht erzeugt werden"
- },
- "title": " (Ausgewählt: {0}, {1} - Gespeichert am: {2}, Zuletzt geändert: {3})"
- },
- "modifyConsumedItems": {
- "key": "Key",
- "remove": "entfernen",
- "removeAll": "Alle entfernen",
- "title": "Verbrauchte Gegenstände bearbeiten"
- },
- "regrowTrees": {
- "all": "Alle",
- "gone": "Verschwunden",
- "halfChopped": "Halb gefällt",
- "messages": {
- "noTreesRegrown": "Keine Bäume mit dem Zustand \"{0}\" wiederhergestellt",
- "success": "{0} Bäume mit dem vorherigen Zustand \"{1}\" sollten jetzt wiederhergestellt sein. Bitte speichern, um die Änderungen zu übernehmen."
- },
- "pctRegrow": "Prozent nachwachsen lassen",
- "saveButton": "Bäume wiederherstellen",
- "stumps": "Baumstümpfe",
- "title": "Bäume wiederherstellen"
- },
- "resetContainers": {
- "messages": {
- "containersReset": {
- "text": "{0} Behälter wurden zurückgesetzt. Bitte speichere die Änderungen um sie anzuwenden",
- "title": "Behälter zurückgesetzt"
- },
- "nothingToReset": {
- "text": "Nichts zum zurücksetzen gefunden",
- "title": "Nichts gefunden"
- }
- }
- },
- "resetTraps": {
- "messages": {
- "nothingToReset": {
- "text": "Nichts zum zurücksetzen gefunden",
- "title": "Nichts gefunden"
- },
- "trapsReset": {
- "text": "{0} Fallen wurden zurückgesetzt. Bitte speichere die Änderungen um sie anzuwenden",
- "title": "Fallen zurückgesetzt"
- }
- }
- },
- "selectSavegame": {
- "buttons": {
- "change": "Ändern...",
- "setToDefault": "Auf Standard zurücksetzen"
- },
- "folderBrowserTitle": "Wähle das \"Saves\" Verzeichnis von Sons of the Forest",
- "headers": {
- "location": "Speicherort"
- },
- "lastSaveTimeTooltip": "Letzter Schreibzeitpunkt des Spielstandverzeichnisses",
- "selectedPath": {
- "label": "Ausgewählter Pfad:",
- "tooltip": "Normalerweise werden die Speicherstände unter C:\\Users\\[Benutzer]\\AppData\\LocalLow\\Endnight\\SonsOfTheForest\\Saves gespeichert"
- },
- "tabs": {
- "multiplayer": "Mehrspieler",
- "multiplayerClient": "Mehrspieler (Client)",
- "singleplayer": "Einzelspieler"
- },
- "title": "Spielstand auswählen..."
- },
- "settings": {
- "askForBackupsEveryTime": "Bei jedem Speichern fragen",
- "backupMode": "Backup-Modus",
- "fileMode": {
- "label": "Datei-Modus",
- "single": "Ein Backup pro geänderter JSON-Datei",
- "zip": "ZIP-Archiv"
- },
- "language": "Sprache",
- "messages": {
- "languageChanged": {
- "text": "Bitte starte die Anwendung neu damit die geänderte Sprache übernommen wird",
- "title": "Einstellungen gespeichert"
- }
- },
- "theme": "Theme",
- "title": "Einstellungen"
- },
- "unhandledException": {
- "applicationVersion": "Anwendungsversion",
- "buttons": {
- "copyErrorToClipboard": "Fehler in Zwischenablage kopieren",
- "exitApplication": "Anwendung beenden"
- },
- "callstack": "Callstack",
- "disclaimer": "Ein unerwarteter Fehler ist aufgetreten. Der Anwendungsstatus könnte beschädigt sein.",
- "exceptionMessage": "Exception-Message",
- "exceptionType": "Exception-Typ",
- "header": "Exception-Details",
- "innerException": "Innere Exception",
- "title": "Unbehandelte Ausnahme"
- },
- "unlocks": {
- "coreGameCompleted": "Kern-Spiel abgeschlossen",
- "creativeMode": "Creative Modus",
- "creativeModeItem": "Creative Modus Item (?)",
- "escapedIsland": "Insel entkommen",
- "messages": {
- "playerProfileNotFound": "PlayerProfile.json konnte nicht unter \"{0}\" gefunden werden"
- },
- "title": "Freischaltung"
- },
- "updateAvailable": {
- "buttons": {
- "download": "Herunterladen",
- "ignore": "Ignorieren"
- },
- "header": "Ein Update ist verfügbar",
- "title": "Update verfügbar"
- },
- "worldItemCloner": {
- "buttons": {
- "cloneAtPlayerPosition": {
- "text": "An Spielerposition kopieren",
- "tooltip": "Erstellt eine Kopie dieses Objekts an der Position des Spielers"
- },
- "removeAllCopies": {
- "text": "Alle Kopien von der Karte entfernen",
- "tooltip": "Entfernt alle Kopien dieses Objekts von der Karte"
- },
- "teleportObjectToPlayer": {
- "text": "Objekt zum Spieler teleportieren",
- "tooltip": "Teleportiert das Objekt zum Spieler"
- },
- "teleportPlayerToObject": {
- "text": "Spieler zum Objekt teleportieren",
- "tooltip": "Teleportiert den Spieler zum Objekt"
- }
- },
- "messages": {
- "clonesDeleted": {
- "text": "{0} Kopien von {1} wurden entfernt",
- "title": "Kopien entfernt"
- },
- "nothingToDelete": {
- "text": "Nichts zum Löschen gefunden",
- "title": "Nichts gefunden"
- },
- "nothingToMove": {
- "text": "Nichts zum teleportieren gefunden",
- "title": "Nichts gefunden"
- },
- "objectCloned": {
- "text": "Eine Kopie von {0} wurde an der Position des Spielers erstellt. Bitte speichere die Änderungen, um sie zu übernehmen",
- "title": "{0} erstellt"
- }
- },
- "pinTooltip": "Zeige Objektposition auf der Karte",
- "title": "Weltobjekt-Kloner",
- "unknownItem": "Unbekanntes Objekt ({0})",
- "unnamedItem": "Unbenannt ({0})",
- "worldItem": "Weltobjekt"
- }
- },
- "worldItemTypes": {
- "GolfCart": "Golfwagen",
- "HangGlider": "Hängegleiter",
- "KnightV": "Knight V",
- "Radio": "Radio"
- }
-}
\ No newline at end of file
diff --git a/SOTFEdit/data/lang/de.yaml b/SOTFEdit/data/lang/de.yaml
new file mode 100644
index 0000000..9b89425
--- /dev/null
+++ b/SOTFEdit/data/lang/de.yaml
@@ -0,0 +1,1503 @@
+actors:
+ classification:
+ animal: Tier
+ cannibal: Kannibale
+ creep: Gruselwesen
+ human: Mensch
+ misc: Sonstige
+ muddyCannibal: Schlammiger Kannibale
+ details:
+ area: Bereich
+ classification: Klassifikation
+ family: Familie
+ gender: Geschlecht
+ killedByPlayer: Getötet von Spieler
+ lastSpawnTime: Letzter Spawn
+ lastVisitedTime: Letzter Besuch
+ spawnedCount: Anzahl Spawns
+ state: Status
+ uniqueId: UniqueID
+ gender:
+ female: Weiblich
+ male: Männlich
+ grouping:
+ animals: Tiere
+ creeps: Gruselwesen
+ femaleCannibals: Weibliche Kannibalen
+ femaleMuddyCannibals: Weibliche Schlammige Kannibalen
+ maleCannibals: Männliche Kannibalen
+ maleMuddyCannibals: Männliche Schlammige Kannibalen
+ misc: Verschiedenes
+ mixed: Gemischt
+ mixedCannibals: Gemischte Kannibalen
+ mixedMuddyCannibals: Gemischte Schlammige Kannibalen
+ noFamily: Keine Familie
+ headers:
+ influences: Einflüsse
+ info: Information
+ killStatistics: Tötungsstatistik
+ modificationOptions: Änderungsoptionen
+ modifications: Änderungen
+ selection: Auswahl
+ stats: Statistiken
+ influenceType:
+ Cannibal: Kannibale
+ Creepy: Gruselige
+ Player: Spieler
+ modificationMode:
+ Modify: Ändern
+ Remove: Entfernen
+ modificationOptions:
+ allActorSelections:
+ allActors: Alle NPCs
+ allActorsOfSameFamily: Alle NPCs derselben Familie
+ allActorsOfSameType: Alle NPCs desselben Typs
+ thisActor: Dieser NPC
+ onlyInSameAreaAsActor: Nur in derselben Zone wie dieser NPC
+ removeSpawner:
+ text: Spawn-Punkt entfernen
+ tooltip: Wenn ausgewählt, wird der NPC nicht erneut spawnen
+ replaceType: Typ ersetzen
+ skipKelvin: Kelvin überspringen
+ skipVirginia: Virginia überspringen
+ teleport:
+ disclaimer: Sei vorsichtig, wenn du mehrere NPCs zum selben Ort teleportierst. Dies könnte dein Spiel abstürzen lassen!
+ none: Keiner
+ npcToPlayer: NPC zum Spieler
+ playerToNpc: Spieler zum NPC
+ teleportLabel: 'Teleportieren:'
+ updateInfluences: Einflüsse aktualisieren
+ state:
+ -1: Keine
+ 0: Beliebig
+ 1: Kampf
+ 2: Welt
+ 3: Schlafend
+ 4: Sterbend
+ 5: Verletzt
+ 6: Tot
+ 7: Fliegend
+ 8: Anschleichen
+ 20: Brennend
+ 21: Elektrisiert
+ 22: Schwimmend
+ 23: Benommen/Getroffen
+ 24: Ertrinkend
+ 25: Golfmobil
+ 40: Auf Felsen
+ 41: Auf Baum
+ 42: Unter Blättern
+ 43: Wandlaufen
+ 44: Gefangen
+ 45: Boss Intro
+ 46: Spawn Intro
+ 47: Decke
+ 48: Untergrund Höhle
+ 50: Kampf verlassen
+ 51: Verschwunden
+ stats:
+ affection: Zuneigung
+ anger: Wut
+ energy: Energie
+ fear: Angst
+ fullness: Sättigung
+ fullnessBuff: Sättigungsbonus
+ health: Gesundheit
+ hydration: Hydration
+ hydrationBuff: Hydrationsbonus
+ rest: Erholung
+ restBuff: Erholungsbonus
+ stamina: Ausdauer
+ types:
+ 1: Kaninchen
+ 2: Eichhörnchen
+ 3: Schildkröte
+ 4: Hai
+ 5: Möwe
+ 6: Adler
+ 7: Ente
+ 8: Timmy
+ 9: Kelvin
+ 10: Virginia
+ 11: Fingers
+ 12: Carl
+ 13: Andy
+ 14: Danny
+ 15: Billy
+ 16: GoldMaske
+ 17: Elch
+ 18: Baby
+ 19: Zwillinge
+ 20: Mr. Puffy
+ 21: Mrs. Puffy
+ 22: Slug
+ 23: Angel
+ 24: Lachs
+ 25: Brandy
+ 26: Crystal
+ 27: Destiny
+ 28: Verschlammte Frau
+ 29: Verschlammter Mann
+ 30: Starker Mann
+ 31: Sponge Test
+ 32: Fledermaus
+ 33: Hirsch
+ 34: Blaumeise
+ 35: Kolibri
+ 36: Killerwal
+ 37: Land-Schildkröte
+ 38: Dicker Mann
+ 39: Dicke Frau
+ 40: John2
+ 41: Gesichtsloser Mann
+ 42: Dämon
+ 43: Bemalter Mann
+ 44: Bemalte Frau
+ 45: Dämon Boss
+ 46: Mr. Puffton
+ 47: Mrs. Puffton
+ 48: Boss Mutant
+ 49: Mutanten-Virginia
+ 50: Armsy
+ 51: Frank
+ 52: Eddy
+ 53: Greg
+ 54: Henry
+ 55: Igor
+ 56: Elise
+ 57: Waschbär
+ 58: Legsy
+ 59: Holey
+ 60: Stinktier
+ 90: Helikopter
+ 100: PlayerRobby
+armor:
+ buttons:
+ resetAllDone:
+ text: Alle erledigten zurücksetzen
+ tooltip: Setzt alle als erledigt markierten POIs zurück
+ default: Standard
+ max: Max
+ remove: Entfernen
+ setAllToDefault:
+ text: Alle auf Standard
+ tooltip: Setzt die Haltbarkeit aller Rüstungsteile auf den Standardwert
+ setAllToMax:
+ text: Alle auf Max
+ tooltip: Setzt die Haltbarkeit aller Rüstungsteile auf das Maximum
+ setToDefault:
+ text: Standard
+ tooltip: Setzt die Haltbarkeit der Rüstung auf den Standardwert
+ setToMax:
+ text: Max
+ tooltip: Setzt die Haltbarkeit der Rüstung auf eine sehr hohe Zahl
+ durabilityInput:
+ tooltip: Die Haltbarkeit der Rüstung. Wenn sie 0 beträgt, bricht die Rüstung. Kann sehr hoch sein
+ watermark: Haltbarkeit
+ header: Ausgerüstete Rüstung (Max. 10)
+ headers:
+ actions: Aktionen
+ durability: Haltbarkeit
+ id: ID
+ name: Name
+ slot: Slot
+ unknownItem: ??? Unbekanntes Objekt
+backup:
+ messages:
+ backupsRestored:
+ text: '{0} Backups wurden wiederhergestellt. Gelöschte Dateien wurden in den Papierkorb verschoben'
+ title: Backups wiederhergestellt
+ mode:
+ Default: Immer sichern
+ InitialAndOne: Original behalten, ein zusätzliches Backup
+ None: Keine Backups
+ One: Ein Backup behalten und überschreiben
+companion:
+ address: IP/Addresse
+ connect: Verbinden
+ connectionFailed:
+ text: Der Verbindungsversuch mit dem Companion-Plugin ist fehlgeschlagen
+ textException: 'Der Verbindungsversuch mit dem Companion-Plugin ist fehlgeschlagen. Fehler: {0}'
+ title: Companion Verbindung fehlgeschlagen
+ connectionSuccessful:
+ text: >-
+ Verbindung zum Companion wurde erfolgreich hergestellt.
+
+ Du kannst jetzt die Ingame-Hotkeys, Live-Teleportation über die Karte und Positions-Tracking nutzen.
+ title: Companion verbunden
+ connectTimeout: Verbindungs-Timeout
+ disconnect: Verbindung trennen
+ disconnectFailed:
+ text: Der Versuch die Verbindung zum Companion-Plugin zu trennen ist fehlgeschlagen.
+ textException: 'Der Versuch die Verbindung zum Companion-Plugin zu trennen ist fehlgeschlagen. Fehler: {0}'
+ title: Companion Disconnect fehlgeschlagen
+ keepAliveInterval: Keep-Alive Intervall
+ mapPositionUpdateInterval: Aktualisiere Spieler-Positionen alle
+ port: Port
+ portHint: Für Ports > 1024 müssen Anwendung und Spiel als Admin gestartet werden!
+ readme: Readme
+ readme1: >-
+ Der "Companion" bietet Extra-Funktionalität für das Spiel, wie Ingame-Teleportation, Positions-Verfolgung und einiges mehr.
+
+
+ Bevor der Companion genutzt werden kann muss dieser erst eingerichtet werden. Hierfür müssen die folgenden Dinge installiert werden:
+
+
+ - BepInExPack
+
+ - SOTFEdit Companion Plugin
+
+
+ Diese können entweder manuell anhand der README oder einen Mod-Manager eingerichtet werden:
+ readme2: >-
+ Nachdem beides eingerichtet und das Spiel gestartet wurde, musst du über das Menü eine Verbindung zum Companion herstellen.
+
+
+ Danach stehen im Spiel zwei neue Hotkeys zur Verfügung:
+
+ - Ingame Teleportation zu den meisten Ingame-Orten (Standard: F8)
+
+ - Benutzerdefinierte Location erstellen (F9)
+
+
+ Außerdem wird die Position auf der Karte live aktualisiert.
+ settings: Einstellungen
+ status:
+ connected: Verbunden
+ connecting: Verbinde...
+ disconnected: Verbindung getrennt
+dialogs:
+ changeScrewStructureType:
+ disclaimer: Du kannst hier einen anderen Strukturtyp auswählen. Bitte beachte, dass die Rotation und Position der Struktur gleich bleiben, was zu Fehlern und Abstürzen führen kann.
+ spawnFollower:
+ disclaimer: >-
+ Wenn du Begleiter spawnen möchtest, musst du sicherstellen, dass du dich an einem freien Ort befindest. Die Begleiter werden an der Position des Spielers über der aktuellen Höhe des Spielers und mit einem leichten Offset gespawnt.
+
+
+ Ich habe viele Dinge für Virginia ausprobiert, aber konnte nur maximal 4 spawnen lassen. Es hat mit Kelvin besser geklappt.
+
+
+ Dies kann deine FPS töten und die langfristigen Auswirkungen sind derzeit auch nicht bekannt.
+
+
+ Wenn du mehr möchtest, solltest du das Spiel laden, alles spawnen lassen, das Spiel speichern, Begleiter spawnen lassen usw.
+ title: Begleiter spawnen
+ translations:
+ filter: Filtern
+ missingOnly: Nur fehlende
+errors:
+ canNotBeEmpty: '{0} darf nicht leer sein'
+experiments:
+ fires:
+ noFires:
+ text: Keine Feuer zum Bearbeiten gefunden
+ title: Keine Feuer
+ success:
+ text: '{0} Feuer wurden entzündet, aufgefüllt und ihre Brennrate geändert'
+ title: Feuer verändert
+ resetCannibalAngerLevel:
+ success:
+ text: Änderungen hinzugefügt. Bitte speichern, um sie zu übernehmen
+ title: Änderungen hinzugefügt
+ resetStructureDamage:
+ noDamage:
+ text: Kein Strukturschaden muss repariert werden
+ title: Kein Strukturschaden
+ success:
+ text: '{0} Strukturschäden wurden repariert'
+ title: Schäden repariert
+followers:
+ buttons:
+ fillAllBars: Alle Balken füllen
+ moveToKelvin: Zu Kelvin teleportieren
+ moveToPlayer: Zum Spieler teleportieren
+ moveToVirginia: Zu Virginia teleportieren
+ revive: Wiederbeleben
+ spawn: Spawnen
+ details:
+ status: Status
+ uniqueId: UniqueID
+ equipmentLabel: Ausrüstung
+ outfitLabel: Outfit
+ outfits:
+ 9:
+ -1: Standard
+ 0: Taktische Jacke
+ 1: Anzug
+ 2: Schlafanzug
+ 3: Braune Lederjacke
+ 4: Kapuzenpullover
+ 5: Blaues T-Shirt
+ 6: Blazer
+ 7: Schwarze Lederjacke
+ 8: Raumanzug
+ 9: Priester-Outfit
+ 10: Stewardess Outfit
+ 10:
+ -1: Standard
+ 0: Badeanzug
+ 1: Trainingsanzug
+ 2: Lederanzug
+ 3: Tarnanzug
+ 4: Kleid
+ 5: Blaugrünes Kleid
+ 6: Rotes Kleid
+ reviveTooltip: Stelle sicher, dass du dies außerhalb von Gebäuden tust, wenn der Körper fehlt, sonst könntest du in das Gebäude glitchen. Der Begleiter spawnt an der Position des Spielers und hat die konfigurierten Gegenstände und Kleidung ausgerüstet.
+ status:
+ alive: Lebendig
+ dead: Tot
+ unknown: ???
+game:
+ setup:
+ animalSpawnRate:
+ _label: Tier-Spawngeschwindigkeit
+ buildingResistance: Gebäude-Langlebigkeit
+ coldPenalties: Kälte-Nachteile
+ coldPenaltiesStatReduction: Werte-Regenerationsstrafe
+ consumableEffects:
+ _label: Verderb-Effekte
+ _tooltip: Wie viel Schaden du nimmst, wenn du schlechtes Essen isst
+ creativeMode: Kreativ-Modus
+ customSettings: Benutzerdefinierte Einstellungen
+ dayLength:
+ default: Standard
+ long: Lang
+ realistic: Realistisch
+ short: Kurz
+ _label: Tageslänge
+ enemyAggression:
+ _label: Feind-Aggressivität
+ enemyArmour:
+ _label: Feind-Rüstung
+ enemyDamage:
+ _label: Feind-Schaden
+ enemyHealth:
+ _label: Feind-Gesundheit
+ enemySearchParties:
+ _label: Feind-Suchtrupps
+ forcePlaceFullLoad: Instant Bauen
+ header: Spiel-Setup
+ headers:
+ enemiesCustom: Feinde
+ multiplayer: Mehrspieler
+ weatherCustom: Wetter
+ immortalMode: Unverwundbarkeit
+ inventoryPause: Pause im Inventar
+ mode:
+ creative: Kreativ
+ custom: Benutzerdefiniert
+ hard: Schwer
+ hardSurvival: Hard Survival
+ normal: Normal
+ peaceful: Friedlich
+ _label: Modus
+ noCuttingsSpawn: No Cuttings Spawn
+ oneHitToCutTrees: Bäume sofort fällen
+ playerStatsDamage:
+ _label: Spielerstatus-Schaden
+ _tooltip: Wie viel Schaden du durch Hunger und so weiter nimmst.
+ playersTriggerTraps: Spieler lösen Fallen aus
+ precipitationFrequency:
+ _label: Niederschlagsfrequenz
+ _tooltip: Wie oft ändert sich das Wetter
+ pvpDamage: PvP Schaden
+ reducedAmmoInContainers: Weniger Munition in Containern
+ reducedFoodInContainers: Weniger Essen in Containern
+ seasonLength:
+ default: Standard
+ long: Lang
+ realistic: Realistisch
+ short: Kurz
+ _label: Saisonlänge
+ settingsValues:
+ default: Standard
+ hard: Schwer
+ high: Hoch
+ low: Niedrig
+ normal: Normal
+ off: Aus
+ reduced: Reduziert
+ singleUseContainers: Einwegbehälter
+ spawnEnemies: Feinde spawnen
+ startingSeason:
+ autumn: Herbst
+ spring: Frühling
+ summer: Sommer
+ winter: Winter
+ _label: Startsaison
+ uid: UID
+ state:
+ header: Spielzustand
+ headers:
+ worldObjectStates: Zustand der Weltobjekte
+ worldObjectStates:
+ disclaimer: >-
+ Ich habe nicht vollständig untersucht, welche Werte welchen Zustand repräsentieren. Vermutlich:
+
+ - 0 = Nicht festgelegt/geschlossen/nicht passiert
+
+ - 1 oder 3 = Festgelegt/geöffnet/geschehen
+ header: Zustand der Weltobjekte
+generic:
+ add: Hinzufügen
+ cancel: Abbrechen
+ close: Schließen
+ edit: Bearbeiten
+ error: Fehler
+ exceptionMessage: 'Ein Fehler ist aufgetreten: {0}'
+ name: Name
+ no: Nein
+ ok: OK
+ position: Position
+ save: Speichern
+ seconds: Sekunde(n)
+ setting: Einstellung
+ success: Erfolg
+ unknown: Unbekannt
+ update: Aktualisieren
+ value: Wert
+ yes: Ja
+influences:
+ anger: Wut
+ disclaimer: >-
+ Stimmung definiert die Zuneigung, doch es ist nicht klar, wie dies Feinde beeinflusst.
+
+ Wenn der Angst-Wert hoch ist, rennen Feinde häufiger weg.
+
+ Ein hoher Wert in Wut erhöht die Wahrscheinlichkeit von Angriffen.
+ fear: Angst
+ sentiment: Stimmung
+inventory:
+ buttons:
+ addAllFromCategory: Alle von Kategorie hinzufügen
+ max: Max
+ remove: Entfernen
+ removeAll: Alle entfernen
+ setAllToMax: Alle auf Max setzen
+ setAllToMin: Alle auf Min setzen
+ filterWatermark: Filtern...
+ headers:
+ itemsInInventory: Gegenstände im Inventar
+ unassignedItems: Nicht zugewiesene Gegenstände
+ table:
+ actions: Aktionen
+ count:
+ text: Anzahl
+ tooltip: Die Menge, die du im Inventar hast
+ id: ID
+ name: Name
+ type: Typ
+ unknownItem: ??? Unbekannter Gegenstand
+items:
+ 78: Baumstamm
+ 340: Gitarre
+ 341: Fernglas
+ 346: Schrotflintenaufsatz
+ 351: Notfalltasche
+ 353: Betäubungsgewehr
+ 354: Nachtsichtgerät
+ 355: Pistole
+ 356: Moderne Axt
+ 357: Luftgewehr
+ 358: Schrotflinte
+ 359: Machete
+ 360: Kompositbogen
+ 361: Gewehr
+ 362: 9-mm-Munition
+ 363: Flintenlaufgeschoss
+ 364: Schrotkugeln
+ 365: Armbrust
+ 366: Ortungspfeil
+ 367: Katana
+ 368: Armbrustbolzen
+ 369: Betäubungsgewehrmunition
+ 370: 9-mm-Munition
+ 371: Schrotkugeln
+ 372: Flintenlaufgeschoss
+ 373: Kohlefaserpfeil
+ 374: Schalldämpfer
+ 375: Laservisier
+ 376: Pistolenaufsatz
+ 377: Zielfernrohr
+ 378: Taschenlampenvorrichtung
+ 379: Taktische Axt
+ 380: Kampfmesser
+ 381: Granate
+ 382: Granate
+ 383: Gewehraufsatz
+ 384: Armbrustköcher
+ 386: Revolver
+ 387: Gewehrmunition
+ 388: Molotowcocktail
+ 389: Molotow
+ 390: Druckerharz
+ 391: Rote Maske
+ 392: Stock
+ 393: Stein
+ 394: Kettensäge
+ 395: Brett
+ 396: Elektroschocker
+ 397: Shiitake
+ 398: Kräuterseitling
+ 399: Semmel-Stoppelpilz
+ 400: Knollenblätterpilz
+ 401: Schildkrötenei
+ 402: Rucksack
+ 403: Seil
+ 405: Knochen
+ 406: Viertelstamm
+ 408: Stammhälfte
+ 409: Dreiviertelstamm
+ 410: Armbanduhr
+ 412: GPS-Gerät
+ 413: Feuerzeug
+ 414: Wodka-Flasche
+ 415: Stoff
+ 416: Leiterplatte
+ 417: Zeitbombe
+ 418: Draht
+ 419: Klebeband
+ 420: C4-Ladung
+ 421: Ramen-Nudeln
+ 422: Reparaturwerkzeug
+ 423: Roman [Fähnchenbanner]
+ 424: Roman [Tiefschlaf]
+ 425: Crunchie Wunchies
+ 426: Gedruckte Trinkflasche
+ 427: Gedrucktes Messer
+ 428: Gedruckter Schlitten
+ 429: Gedruckte Tauchermaske
+ 430: Schädel
+ 431: Feuerwehraxt
+ 432: Dosenöffner
+ 433: Fleisch
+ 434: Konserven
+ 435: Goldmaske
+ 436: Fisch
+ 437: Medizin
+ 438: Feldration
+ 439: Energydrink
+ 440: Leuchtfackel
+ 441: Energieriegel
+ 443: Handgemachter Bogen
+ 444: Tauchgerät
+ 445: Heidelbeeren
+ 446: Heckenkirsche
+ 447: Lachsbeeren
+ 448: Schneebeeren
+ 449: Igelkraftwurz
+ 450: Schachtelhalm
+ 451: Aloe-Vera
+ 452: Schafgarbe
+ 453: Weidenröschen
+ 454: Pfeilblatt
+ 455: Gesundheitsmischung
+ 456: Gesundheitsmischung +
+ 457: Betäubungsgewehrmunition
+ 458: Ladegerät
+ 459: Schleuder
+ 460: Batterie-Päckchen
+ 461: Energiemischung
+ 462: Energiemischung +
+ 463: Flossen
+ 464: Katzenfutter
+ 465: Chicorée
+ 466: Auster
+ 467: Album-Cover
+ 468: Kreuz
+ 469: Lufttank
+ 470: Zielfernrohr für Luftgewehr
+ 471: Taschenlampe
+ 472: Tierhaut
+ 473: Blätterrüstung
+ 474: Handgefertigter Speer
+ 475: Reiseflasche
+ 476: Kleiner Stein
+ 477: Handgefertigte Keule
+ 478: Kletteraxt
+ 479: Feder
+ 480: Arm
+ 481: Bein
+ 482: Kopf
+ 483: Notfallpaket
+ 484: Blatt
+ 485: Schaufel
+ 486: Walkie-Talkie
+ 487: Schlafanzug
+ 488: Blaues T-Shirt
+ 489: Taktische Hose
+ 490: Kapuzenpullover
+ 491: Jackett
+ 492: Smoking-Jacke
+ 493: Lederjacke
+ 494: Knochenrüstung
+ 495: Taktische Jacke
+ 496: Geld
+ 497: Servierbrett
+ 498: GRABS-Laserpointer
+ 499: Neoprenanzug
+ 500: Winterjacke
+ 501: Stiefel
+ 502: Münzen
+ 503: Fackel
+ 504: Plane
+ 505: Laser-Messgerät
+ 506: Schildkrötenpanzer
+ 507: Steinpfeil
+ 508: Lederbeutel
+ 509: 'Flugblatt [Hölenquellen] '
+ 511: Kontaktauslöser
+ 512: Gefülltes Servierbrett
+ 513: Feder
+ 514: Kontaktfederauslöser
+ 515: Tutorial [Grundlegendes Bauen]
+ 516: Tutorial [Tarp-Zelt]
+ 517: Kochtopf
+ 518: Papierzielscheibe
+ 519: Tierhautrüstung
+ 520: Konstruktionselement
+ 521: E-Mail [Hölenbeleuchtung]
+ 522: Seilgewehr
+ 523: Seilrutschenseil
+ 524: Golfball
+ 525: Putter
+ 526: Testament von Hr. Puffy
+ 527: Batterien
+ 528: Mr. Puffys Finanzen
+ 529: GPS-Peilsender
+ 530: Bauplan Trockengestell
+ 531: Bauplan Stühle aus Stöcken
+ 532: Bauplan Bett aus Stöcken
+ 533: Bauplan Waffenregal
+ 534: E-Mail [Golf 1/4]
+ 535: E-Mail [Golf 2/4]
+ 536: E-Mail [Golf 3/4]
+ 537: E-Mail [Golf 4/4]
+ 538: E-Mail [Malerei]
+ 539: Dokument [Out Demonia]
+ 540: Dokument [Crosses burn Demons]
+ 541: Dokument [Cube Activation Cycles]
+ 542: Email [Thought you might find this interesting]
+ 543: Email [Another one]
+ 544: Email [One more]
+ 545: Email [Photo Reference]
+ 546: Email [Note to all employees]
+ 547: Email [Safe in Cube]
+ 548: Dokument [Stay in the Cube]
+ 549: Bauplan Knochenmacherfalle
+ 550: Bauplan Fliegenklatsche-Falle
+ 551: Bauplan Kleintierfalle
+ 552: Baupläne
+ 553: Tech Mesh
+ 554: Tech-Rüstung
+ 555: Trainingsanzug
+ 556: Kleid
+ 557: Lederanzug
+ 558: Tarnanzug
+ 559: Gedruckte Pfeilspitze
+ 560: Gedruckter Enterhaken
+ 561: Gedruckter Blumentopf
+ 562: Notizen [Holoville 1/4]
+ 563: Notizen [Holoville 2/4]
+ 564: Notizen [Holoville 3/4]
+ 565: Notizen [Holoville 4/4]
+ 566: Wartungsschlüsselkarte
+ 567: Gästeschlüsselkarte
+ 568: VIP-Schlüsselkarte
+ 569: Gehirnstück
+ 570: Steakstück
+ 571: Speckstück
+ 572: Uralte Rüstung
+ 573: Schlafsack
+ 574: Roman [Gerettet]
+ 575: Roman [Parallelwelten]
+ 576: Viertelbrett
+ 577: Bretthälfte
+ 578: Dreiviertelbrett
+ 579: Bauplan Knochenstuhl
+ 580: Bauplan Sprossenleiter
+ 581: Bauplan Vogelhaus
+ 582: Bauplan Fischreuse
+ 583: Bauplan Aufbewahrungskiste
+ 584: Bauplan Schaufensterfigur
+ 585: Bauplan Vogelscheuche
+ 586: Bauplan Wandpflanzkasten
+ 587: Bauplan Pflanzgefäß
+ 588: Bauplan Knochenleuchter
+ 589: Handbuch
+ 590: Radio
+ 591: Kleine Blockhütte
+ 592: Unheimliche Haut
+ 593: Mutantenrüstung
+ 594: Guarana-Beeren
+ 595: Brombeeren
+ 596: Aloe-Vera-Samen
+ 597: Pfeilblattsamen
+ 598: Brombeere
+ 599: Heidelbeerstrauchsame
+ 600: Igelkraftwurzsamen
+ 601: Weidenröschensamen
+ 602: Guarana-Samen
+ 603: Schachtelhalmsamen
+ 604: Lachsbeersamen
+ 605: Wegwarte
+ 606: Schafgarbensamen
+ 607: Bauplan Steinlager
+ 608: Bauplan Knochenlager
+ 609: Bauplan Stammlager
+ 610: Bauplan Stocklager
+ 611: Ausdruck [Zahlen]
+ 612: Zeitungsausschnitt [Missing CEO]
+ 613: Zeitungsausschnitt [Puffcorp]
+ 614: E-Mail [Artifact - Preliminary Findings]
+ 615: E-Mail [Scientific Data - Cube]
+ 616: Geheimes Dokumentflat
+ 617: Aktienkurs
+ 618: Gedruckter Pfeil
+ 619: Badeanzug
+ 620: Bauplan Tisch
+ 621: Bauplan Regal
+ 622: Bauplan Steinweg
+ 623: Bauplan Wandregal
+ 624: Bauplan Wandfackel
+ 625: Bauplan Schädel-Lampe
+ 626: Faltbarer Gleiter
+ 627: Tischkarte von Mr. Puffton
+ 628: Tischkarte von Mrs. Puffton
+ 629: Wassersammler
+ 630: Knight V
+ 631: Hinter dem Reich
+ 632: Bauplan Federfalle
+ 633: Flugblatt [Kultiges]
+ 634: Solarmodul
+ 635: Glühbirne
+ 636: TemplateD
+ 637: Action-Kamera
+ 638: Bauplan Einfacher Holzschlitten
+ 639: Raumanzug
+ 640: Stein
+ 641: Bauplan Stein-Feuerstelle
+ 642: Entenkopf
+ 643: Adlerkopf
+ 644: Kleiner Schildkrötenkopf
+ 645: Bauplan Kopf Trophäenhalterung
+ 646: Kaninchenkopf
+ 647: Eichhörnchen-Kopf
+ 648: Möwenkopf
+ 649: Bauplan Stein-Lager
+ 650: Schildkrötenkopf
+ 651: Hirschkopf
+ 652: Elchkopf
+ 653: Persönliche Notiz A
+ 654: Persönliche Notiz B
+ 655: Persönliche Notiz C
+ 656: Bauplan Hokey Pokey-Falle
+ 657: Gedrucktes GPS Gehäuse
+ 658: Bauplan Radio-Falle
+ 659: Bauplan Radio
+ 661: Golfwagen-Batterie
+ 662: Artefakt Teil A
+ 663: Spitzhacke
+ 664: Solafit-Erz
+ 665: Bauplan Item Plating
+ 666: Bauplan beleuchtetes Kreuz
+ 667: Artefakt Teil B
+ 668: Artefakt Teil C
+ 669: Artefakt Teil D
+ 670: Bauplan Gore Stuhl
+ 671: Bauplan Gore Couch
+ 672: Bauplan Uber-Falle
+ 673: Bauplan Runder Tisch
+ 674: Alte Notiz A
+ 675: Alte Notiz B
+ 676: Alte Notiz C
+ 677: Angeln Email A
+ 678: Angeln Email B
+ 679: Bauplan Häcksler-Falle
+ 680: Bauplan Scheinwerfer
+ 681: Bauplan Wanduhr
+ 682: Bauplan Drehende Falle
+ 683: Bauplan Doppelbett
+ 684: Alte Notiz E
+ 685: Alte Notiz D
+ 686: Alte Notiz F
+ 687: Puffton Email A
+ 688: Bauplan Speerwerfer-Falle
+ 689: Artefakt Teil E
+ 690: Notizbuch
+ 691: Alte Notiz F
+ 692: Angeln Email C
+ 693: Bunker-Karte A
+ 694: Jianyu Email Ausdruck A
+ 695: Kult-Zeichen G
+ 696: Kult-Zeichen H
+ 697: Kult-Zeichen I
+ 698: Kult-Zeichen J
+ 699: Kult-Zeichen K
+ 700: Bauplan Speerhalter
+ 701: Bauplan Bein-Lampe
+ 702: Feuerholz-Lager
+ 703: Priester-Outfit
+ 704: Bauplan Wand-Waffenhalter
+ 705: Zirkus-Flugblatt
+ 706: Zeitungsausschnitt [Ehemänner]
+ 707: Artefakt
+ 708: Artefakt Teil F
+ 709: Bauplan Teleporter
+ 710: Bauplan Abwehr-Schrein
+ 711: Bauplan Anziehungs-Schrein
+ 712: Artefakt Teil G
+ 713: Bauplan Plater Counter
+ 714: Bauplan Armor Plater
+ 715: Waschbär-Kopf
+ 716: Biebel-Ausschnitt D
+ 717: Alte Notiz G
+ 718: Persönliche Notiz E
+ 719: Persönliche Notiz F
+ 720: Persönliche Notiz G
+ 721: Bibel-Papierschnipsel A
+ 722: Puffton Email B
+ 723: Puffton Email C
+ 724: Heckenkirsche-Samen
+ 725: Schneebeeren-Samen
+ 726: Hängegleiter-Startvorrichtung Blaupause
+ 727: Solafitrüstung
+ 728: Lebendiges Kaninchen
+ 729: Stinktier-Kopf
+ 730: Kleiner Kaninchenstall Blaupause
+ 749: Stewardess Outfit
+itemTypes:
+ ammo: Munition
+ armor: Rüstung
+ attachment: Aufsatz
+ blueprint: Bauplan
+ bodyPart: Körperteil
+ book: Buch
+ clothes: Kleidung
+ consumable: Verbrauchsmaterial
+ container: Behälter
+ document: Dokument
+ electricity: Elektrizität
+ equipment: Ausrüstung
+ food: Lebensmittel
+ key: Schlüssel
+ log: Stamm
+ misc: Sonstiges
+ plant: Pflanze
+ printed: Gedrucktes
+ seed: Samen
+ tool: Werkzeug
+ trophy: Trophäe
+ weapon: Waffe
+ weaponMod: Waffen-Modifikation
+itemVariants:
+ 433:
+ 1: Rohes Fleisch
+ 2: Unbekanntes Fleisch
+ 3: Verdorbenes Fleisch
+ 4: Trockenfleisch
+ 5: Gekochtes Fleisch
+ 6: Verbranntes Fleisch
+ 436:
+ 1: Roher Fisch
+ 2: Unbekannter Fisch
+ 3: Verdorbener Fisch
+ 4: Trockenfisch
+ 5: Gekochter Fisch
+ 6: Verbrannter Fisch
+ 480:
+ 1: Roher Arm
+ 2: Unbekannter Arm
+ 3: Verdorbener Arm
+ 4: Getrockneter Arm
+ 5: Gekochter Arm
+ 6: Verbrannter Arm
+ 481:
+ 1: Rohes Bein
+ 2: Unbekanntes Bein
+ 3: Verdorbenes Bein
+ 4: Getrocknetes Bein
+ 5: Gekochtes Bein
+ 6: Verbranntes Bein
+languages:
+ de: Deutsch (German)
+ en: Englisch (English)
+ pl: Polnisch (Polish)
+map:
+ actors: NPCs
+ altItems: Alternative Gegenstände
+ alwaysOnTop: Immer im Vordergrund
+ area: Bereich
+ areaFilter:
+ text: Bereiche
+ types:
+ all: Alle
+ surfaceOnly: Nur Oberfläche
+ undergroundOnly: Nur Höhlen/Bunker
+ buttons:
+ createNewZipline:
+ text: Neue Seilrutsche von hier
+ tooltip: Nachdem du den Button angeklickt hast, wird die neue Seilrutsche zwischen der aktuellen und der nächsten angeklickten Position hergestellt
+ delete: Löschen
+ deleteBothAnchors: Beide Anker löschen
+ deselectAll: Auswahl aufheben
+ moveToNextClickedPosition:
+ hint: Bitte jetzt einen anderen Ort anklicken
+ text: Zur angeklickten Position verschieben
+ tooltip: Nachdem du den Button angeklickt hast, wird die Position zum nächsten angeklickten Icon verschoben
+ spawnActors: Spawn Actors
+ teleportKelvin: Kelvin hierhin teleportieren
+ teleportPlayer: Spieler hierhin teleportieren
+ teleportVirginia: Virginia hierhin teleportieren
+ resetAllDone:
+ text: Alle Abgeschlossen zurücksetzen
+ tooltip: Setzt alle POIs auf nicht abgeschlossen
+ markAsDone:
+ text: Als erledigt markieren
+ tooltip: Markiert diesen POI als erledigt
+ markAsUndone:
+ text: Als nicht erledigt markieren
+ tooltip: Setzt diesen POI auf nicht erledigt
+ coordinates: Koordinaten
+ customPois: Benutzerdefiniert
+ details: Details
+ fill: Füllen
+ followers: Begleiter
+ followPlayer: Spieler verfolgen
+ fullText:
+ text: Volltext
+ tooltip: Sucht in Titel, Beschreibung, Gegenstands-Name und Gegenstands-Kategorie der aktuell ausgewählten Markierungs-Kategorien
+ watermark: Titel, Beschreibung, Item-Name...
+ inventoryFilter: Abgeschlossene ausblenden
+ isInInventory: Im Inventar
+ isRuntimeCreated: Ist Kopie
+ isUnderground: Unterirdisch
+ itemId: Item ID
+ items: Gegenstände
+ mapType:
+ dark: Dunkel
+ original: Original
+ name: Name
+ objects: Objekte
+ options: Optionen
+ pois: Sehenswürdigkeiten
+ requirements: Voraussetzungen
+ requirementsFilter:
+ text: Voraussetzungen
+ tooltip: Zeigt nur Gegenstände, Bunker etc. an für die sich die erforderlichen Gegenstände wie die Schaufel im Inventar befinden
+ types:
+ AccessibleOnly: Nur Erreichbares anzeigen
+ All: Alle
+ InaccessibleOnly: Nur Unerreichbares anzeigen
+ spawnWindow:
+ actorType: Actor Typ
+ count: Anzahl
+ disclaimer: Sei vorsichtig mit der Position oder Anzahl. Es könnte das Spiel zum Absturz bringen. Manche Gegner lassen sich nicht an bestimmten unterirdischen Orten spawnen.
+ doSpawn: Actors erstellen
+ family: Familie
+ familyOfDestinationActor: Familie des Ziel-Actors
+ information: Informationen
+ options: Optionen
+ position: Position
+ spaceBetween:
+ text: Abstand dazwischen
+ tooltip: Definiert den Abstand zwischen jedem Actor. Die Actors werden in einem gleichmäßigen Raster platziert, wenn dieser Wert > 0 ist
+ spawnPattern:
+ Cross: Kreuz
+ Grid: Raster
+ HorizontalLine: Horizontale Linie
+ Random: Zufällig
+ Rectangle: Rechteck
+ text: Spawn Muster
+ VerticalLine: Vertikale Linie
+ title: Actor spawnen
+ structures: Strukturen
+ teleportation: Teleportation
+ teleportWindow:
+ destination: Ziel
+ disclaimer: Du kannst die Ziel-Koordinaten hier verändern. Wenn der Zielpunkt in einem Gegner ist besteht die Möglichkeit, in die Luft katapultiert zu werden. X und Z bestimmen den Ort und Y die Höhe. Bitte stelle sicher dass der korrekte Bereich eingestellt ist.
+ doTeleport: Teleportieren!
+ mode:
+ Kelvin: Kelvin
+ Player: Spieler
+ Virginia: Virginia
+ offset: Offset
+ title: Teleportieren
+ toTeleport: Zu teleportieren
+ wiki: Wiki Link
+ zipLineAnchor: Seilrutschen-Anker
+ zipLines: Seilrutschen
+menu:
+ companion:
+ setup: Einrichtung
+ text: Companion
+ file:
+ deleteAllBackups: Alle Backups löschen
+ exit: Beenden
+ openLastSavegame: Letzten Spielstand öffnen...
+ openLastSavegameWithSavegame: '{0} öffnen...'
+ openSavegame: Spielstand öffnen...
+ openSavegameDirInExplorer: Spielstand-Ordner im Explorer öffnen
+ reloadCurrentSavegame: Aktuellen Spielstand neu laden
+ restoreFromBackup:
+ fromNewestBackup: Vom neuesten Backup
+ fromOldestBackup: Vom ältesten Backup
+ text: Backup wiederherstellen
+ save: Speichern
+ settings: Einstellungen
+ text: Datei
+ help:
+ about: Über...
+ changelog: Changelog
+ links:
+ discord: Discord
+ downloadLatestVersion: Neueste Version herunterladen
+ githubProject: GitHub Projekt
+ nexusMods: NexusMods
+ text: Links
+ thunderstoreIo: thunderstore.io
+ readme: Readme
+ text: '?'
+ translations: Übersetzungen
+ updates:
+ checkNow: Jetzt prüfen
+ checkOnStartup: Beim Start prüfen
+ text: Aktualisierungen
+ tools:
+ cloneWorldObjects:
+ text: Welt-Gegenstände klonen...
+ tooltip: Klont einen Welt-Gegenstand an der Position des Spielers
+ eternalFires:
+ text: Ewige Feuer
+ tooltip: Entzündet Feuer, setzt Brenstoff-Vebrauch auf niedrig und setzt den Brennstoff-Wert hoch
+ fires:
+ text: Feuer
+ tooltip: Verändert Feuer in der Spielwelt
+ itemPlater:
+ text: Gegenstands- und Struktur-Beschichter
+ tooltip: Entfernt oder fügt eine Solafit-Beschichtung zu Gegenständen im Inventar, Waffenhaltern, Begleiter-Items und Gebäuden/Strukturen hinzu
+ map:
+ text: Interaktive Karte
+ tooltip: Eine interaktive Karte
+ modifyConsumedItems:
+ text: Verzehrte Gegenstände bearbeiten...
+ tooltip: Falls du dein Gedächtnis über bereits verzehrte Gegenstände löschen möchten.
+ regrowTrees: Bäume nachwachsen lassen...
+ resetCannibalAngerLevel:
+ text: Kannibalen-Wut-Level zurücksetzen
+ tooltip: Setzt die Tötungsstatistik, Anzahl gefallene Bäume und Anzahl Sichtungen zurück, was zu kleineren und weniger Angriffen führt
+ resetContainers:
+ text: Behälter zurücksetzen
+ tooltip: Setzt Behälter in Höhlen und der Spielwelt zurück
+ resetFires:
+ text: Feuer zurücksetzen
+ tooltip: Entzündet Feuer und setzt Brennstoff-Verbrauch und Menge auf Standard
+ resetStructureDamage:
+ text: Schadenszähler für Gebäude zurücksetzen
+ tooltip: Ermöglicht es, alle Gebäude zu reparieren.
+ resetTraps:
+ text: Fallen zurücksetzen
+ tooltip: Setzt alle Fallen zurück
+ setToEndgame:
+ text: Auf Endspiel setzen
+ tooltip: Setzt das Spiel auf "Endspiel" welches bestimmte Gegner freischaltet
+ text: Tools
+ unlocks:
+ text: Freischaltung
+ tooltip: Schaltet bestimmte Spiel-Features frei
+autoConnect: Automatisch verbinden
+autoReload: Automatisch neu laden
+npcs:
+ tabs:
+ byFamily:
+ disclaimer: 'Eine Familie stellt eine Gruppe von NPCs dar, die zueinander gehören. Mit anderen Worten: Ein Schwarm, ein Stamm zum Beispiel.'
+ text: Nach Familie
+ byType: Nach Typ
+player:
+ areaMask: Bereich
+ buttons:
+ moveToKelvin: Zu Kelvin teleportieren
+ moveToVirginia: Zu Virginia teleportieren
+ currentHealth: Aktuelle Gesundheit
+ fillAllBars: Alle Balken füllen
+ mapGroupName: Spieler
+ maxHealth: Maximale Gesundheit
+ outfit: Outfit
+ sickness: Krankheit
+ strengthLevel: Stärke-Level
+poiGroups:
+ Ammo: Munition
+ Bunkers: Bunker
+ Camps: Camps
+ CannibalVillages: Kannibalen-Dörfer
+ Caves: Höhlen
+ Crates: Kisten
+ Doors: Türen
+ Helicopters: Helikopter
+ Info: Info
+ Items: Gegenstände
+ Lakes: Seen
+ Laptops: Laptops
+ Ponds: Tümpel
+ Printers: 3D-Drucker
+ Supply: Vorrat
+ Villages: Dörfer
+storage:
+ batch:
+ allSlots: Alle Plätze
+ clearAll: Alle leeren
+ fillAllWith: Alles füllen mit
+ setAllToMax: Alle auf Maximum setzen
+ buttons:
+ fillAllStorages: Alle Lager füllen
+ errors:
+ currentStateNotDefined: CurrentState für Modul-ID {0} nicht definiert
+ headers:
+ selectAStorage: Wähle ein Lager aus
+ storageTypes: Lager-Typen
+ slot:
+ max: Max
+ remove: Entfernen
+structures:
+ added: Hinzugefügt
+ applyToAllOfSameType:
+ text: Auf alle des selben Typs anwenden
+ tooltip: Wendet die oben eingestellten Items und Anzahl auf alle Storages des selben Typs an
+ buildCost: Baukosten
+ buttons:
+ changeType: Typ ändern
+ setAllToAlmostFinish: Alle auf "Fast fertig" setzen
+ setAllToFinish: Alle auf "Fertigstellen" setzen
+ setAllToRemove: Alle auf "Entfernen" setzen
+ setAllToUnfinish: Alle auf "Unvollständig" setzen
+ unmodifyAll: Alle Änderungen rückgängig
+ categories:
+ furniture: Möbel
+ gardening: Gartenarbeit
+ misc: Sonstiges
+ raft: Floß
+ shelter: Unterkunft
+ storage: Lagerung
+ traps: Fallen
+ treeShelter: Baum-Unterkunft
+ utility: Nützliches
+ category: Kategorie
+ headers:
+ batch: Batch
+ finishedStructures: Fertige Strukturen
+ unfinishedStructures: Unfertige Strukturen
+ modification: Modifikation
+ modificationMode:
+ AlmostFinish: Fast fertig
+ Finish: Fertigstellen
+ None: Keine Änderung
+ Remove: Entfernen
+ Unfinish: Unfertig stellen
+ percentDone: Fortschritt
+ structureTypeSelectorDisclaimer: Wenn nichts ausgewählt wird, werden alle Strukturen geändert
+ types:
+ 19: Waffenhalter
+ 20: Stuhl aus Stöckern
+ 21: Falle des Knochenmachers
+ 22: Bett aus Stöckern
+ 23: Wand-Pflanzkasten
+ 24: Knochenlampe
+ 25: Knochenstuhl
+ 26: Anbau
+ 27: Trockengestell
+ 28: Baumunterstand 2
+ 29: Stocklager
+ 31: Steinlager
+ 32: Knochenlager
+ 34: Kleine Blockhütte
+ 35: Reuse
+ 36: Rüstungsständer
+ 37: Baumstammlager (Alt)
+ 38: Aussichtsturm
+ 39: Vogelscheuche
+ 40: Pflanzkasten
+ 41: Baumplattform 2
+ 42: Falle für Kleintiere
+ 43: Baumplattform 1
+ 44: Baumunterstand 1
+ 45: Fliegende Klatschfalle
+ 46: Stockweg
+ 47: Jagdhütte
+ 48: Tisch
+ 49: Regal
+ 50: Steinweg
+ 51: Wandregal
+ 52: Bank
+ 53: Wandfackel
+ 54: Schädel-Deckenlampe
+ 55: Seilrutsche
+ 56: Regenfänger
+ 57: Federfalle
+ 58: Fortgeschrittener Holzschlitten
+ 59: Einfacher Holzschlitten
+ 60: Stein-Feuerstelle
+ 61: Trophäen-Halter
+ 62: Felsen-Lager
+ 63: Hokey Pokey Falle
+ 64: Radio Alarm Falle
+ 67: Großer Baumstamm-Halter
+ 68: Hirschfell-Teppich
+ 70: Item Plating
+ 71: Beleuchtetes Kreuz
+ 72: Gore Stuhl
+ 73: Gore Couch
+ 74: Uber-Falle
+ 75: Runder Tisch
+ 76: Hächsler-Falle
+ 77: Scheinwerfer
+ 78: Wanduhr
+ 79: Drehende Falle
+ 80: Doppelbett
+ 81: Speerwerfer-Falle
+ 82: Speerhalter
+ 84: Feuerholz-Lager
+ 85: Bein-Lampe
+ 86: Wand-Waffenhalter
+ 88: Teleporter
+ 89: Abwehr-Schrein
+ 90: Anziehungs-Schrein
+ 91: Sofa
+ 92: Blätter-Falle
+ 93: Molotov-Stolperdraht-Falle
+ 94: Explosiv-Stolperdraht-Falle
+ 95: Pfeil-Lager
+ 96: Baumstammlager
+ 97: Fell-Stuhl
+ 98: Kleine Plattform
+ 99: Mittlere Plattform
+ 100: Plater Counter
+ 101: Goldrüstungs-Beschichter
+ 102: Hängegleiter-Plattform
+ 103: Hängegleiter-Plattform
+ 104: Explosiv-Lager
+ 106: Kaninchenstall
+ 107: Kleiner Kaninchenstall
+ 108: Hausboot
+ 109: Knight-V Halter
+ 110: Vogelhaus
+ 113: Faltbarer Gleitschirmhalter
+ 117: Kleines Floß
+ 118: Anlegestelle
+ 119: Großes Floß
+tabs:
+ followers: Begleiter
+ game: Spiel
+ inventory: Inventar
+ npcs: NPCs
+ player: Spieler
+ storage: Lager
+ structures: Gebäude
+weather:
+ header: Wetterzustand
+windows:
+ main:
+ title: '{0} v{1} [{2}, {3} ({4})]'
+ connection:
+ connected: 'Verbunden: {0}:{1}'
+ connecting: Verbinde...
+ disconnected: Nicht verbunden
+ savegame:
+ loaded: 'Spielstand: {0}\{1}'
+ none: Kein Spielstand geladen
+ modified: '{0}'
+ map:
+ buttons:
+ markAsDone: Als erledigt markieren
+ markAsUndone: Als unerledigt markieren
+ itemPlater:
+ buttons:
+ addPlating: Beschichten
+ removePlating: Beschichtung entfernen
+ constructionCategories:
+ Item: Gegenstand
+ Log: Baumstamm
+ LogPlank: Brett
+ Stick: Stock
+ Stone: Stein
+ constructions: Bauwerke
+ disclaimer: >-
+ Vorsicht: Das Tool speichert NUR Änderungen an der Beschichtung läd das Savegame danach erneut.
+
+
+ Stelle also sicher dass es keine ungespeicherten Änderungen gibt. Falls doch, dann speicher zuerst die Änderungen, öffne DANN das Tool und führe die Beschichtung durch.
+
+
+ Es kann außerdem eine Weile dauern bis die Änderungen gespeichert wurden.
+ followerItems: Begleiter-Gegenstände
+ itemsInInventory: Gegenstände im Inventar
+ itemsInWeaponRacks: Gegenstände in Waffenhaltern
+ messages:
+ addPlating: '{0} Beschichtungen wurden hinzugefügt'
+ removePlating: '{0} Beschichtungen wurden entfernt'
+ structures: Strukturen
+ title: Gegenstands- und Struktur-Beschichter
+ errors:
+ errorCheckingLastVersion: Beim Überprüfen der neuesten Version ist ein Fehler aufgetreten
+ messages:
+ alreadyLatestVersion:
+ text: Du verwendest bereits die neueste Version
+ title: Kein Update
+ backupsDeleted: '{0} Backups gelöscht'
+ changesSaved: Änderungen wurden erfolgreich gespeichert
+ confirmCloseApplication:
+ text: Möchtest du die Anwendung schließen?
+ title: Anwendung schließen
+ confirmCreateBackup:
+ text: Möchtest du ein Backup erstellen?
+ title: Backup erstellen?
+ confirmDeleteBackups:
+ text: Möchtest du wirklich alle Backups löschen?
+ title: Alle Backups löschen
+ confirmOverwriteExternalChanges:
+ text: Das Savegame wurde extern geändert. Möchtest du wirklich alle Änderungen überschreiben?
+ title: Änderungen überschreiben
+ confirmRestoreBackups:
+ text: Bist du sicher, dass du Backups wiederherstellen möchten?
+ title: Backups wiederherstellen
+ followerAlreadyAlive:
+ text: '{0} sollte bereits am Leben sein'
+ title: Keine Änderungen
+ followerRevived:
+ text: '{0} sollte jetzt wieder da sein'
+ title: Wiederbelebt
+ followersCreated:
+ text: '{0} Begleiter wurden erzeugt'
+ title: Begleiter erzeugt
+ noChanges:
+ text: Keine Änderungen - Nichts gespeichert
+ title: Keine Änderungen
+ saveChanges: Änderungen speichern
+ unableToDeleteBackups: 'Backups konnten nicht gelöscht werden: {0}'
+ unableToSpawnFollowers: Begleiter konnten nicht erzeugt werden
+ modifyConsumedItems:
+ key: Key
+ remove: entfernen
+ removeAll: Alle entfernen
+ title: Verbrauchte Gegenstände bearbeiten
+ regrowTrees:
+ all: Alle
+ gone: Verschwunden
+ halfChopped: Halb gefällt
+ messages:
+ noTreesRegrown: Keine Bäume mit dem Zustand "{0}" wiederhergestellt
+ success: '{0} Bäume mit dem vorherigen Zustand "{1}" sollten jetzt wiederhergestellt sein. Bitte speichern, um die Änderungen zu übernehmen.'
+ pctRegrow: Prozent nachwachsen lassen
+ saveButton: Bäume wiederherstellen
+ stumps: Baumstümpfe
+ title: Bäume wiederherstellen
+ resetContainers:
+ messages:
+ containersReset:
+ text: '{0} Behälter wurden zurückgesetzt. Bitte speichere die Änderungen um sie anzuwenden'
+ title: Behälter zurückgesetzt
+ nothingToReset:
+ text: Nichts zum zurücksetzen gefunden
+ title: Nichts gefunden
+ resetTraps:
+ messages:
+ nothingToReset:
+ text: Nichts zum zurücksetzen gefunden
+ title: Nichts gefunden
+ trapsReset:
+ text: '{0} Fallen wurden zurückgesetzt. Bitte speichere die Änderungen um sie anzuwenden'
+ title: Fallen zurückgesetzt
+ selectSavegame:
+ buttons:
+ change: Ändern...
+ setToDefault: Auf Standard zurücksetzen
+ folderBrowserTitle: Wähle das "Saves" Verzeichnis von Sons of the Forest
+ headers:
+ location: Speicherort
+ lastSaveTimeTooltip: Letzter Schreibzeitpunkt des Spielstandverzeichnisses
+ selectedPath:
+ label: 'Ausgewählter Pfad:'
+ tooltip: Normalerweise werden die Speicherstände unter C:\Users\[Benutzer]\AppData\LocalLow\Endnight\SonsOfTheForest\Saves gespeichert
+ tabs:
+ multiplayer: Mehrspieler
+ multiplayerClient: Mehrspieler (Client)
+ singleplayer: Einzelspieler
+ title: Spielstand auswählen...
+ settings:
+ askForBackupsEveryTime: Bei jedem Speichern fragen
+ backupMode: Backup-Modus
+ fileMode:
+ label: Datei-Modus
+ single: Ein Backup pro geänderter JSON-Datei
+ zip: ZIP-Archiv
+ language: Sprache
+ messages:
+ languageChanged:
+ text: Bitte starte die Anwendung neu damit die geänderte Sprache übernommen wird
+ title: Einstellungen gespeichert
+ theme: Theme
+ title: Einstellungen
+ unhandledException:
+ applicationVersion: Anwendungsversion
+ buttons:
+ copyErrorToClipboard: Fehler in Zwischenablage kopieren
+ exitApplication: Anwendung beenden
+ callstack: Callstack
+ disclaimer: Ein unerwarteter Fehler ist aufgetreten. Der Anwendungsstatus könnte beschädigt sein.
+ exceptionMessage: Exception-Message
+ exceptionType: Exception-Typ
+ header: Exception-Details
+ innerException: Innere Exception
+ title: Unbehandelte Ausnahme
+ unlocks:
+ coreGameCompleted: Kern-Spiel abgeschlossen
+ creativeMode: Creative Modus
+ creativeModeItem: Creative Modus Item (?)
+ escapedIsland: Insel entkommen
+ messages:
+ playerProfileNotFound: PlayerProfile.json konnte nicht unter "{0}" gefunden werden
+ title: Freischaltung
+ updateAvailable:
+ buttons:
+ download: Herunterladen
+ ignore: Ignorieren
+ header: Ein Update ist verfügbar
+ title: Update verfügbar
+ worldItemCloner:
+ buttons:
+ cloneAtPlayerPosition:
+ text: An Spielerposition kopieren
+ tooltip: Erstellt eine Kopie dieses Objekts an der Position des Spielers
+ removeAllCopies:
+ text: Alle Kopien von der Karte entfernen
+ tooltip: Entfernt alle Kopien dieses Objekts von der Karte
+ teleportObjectToPlayer:
+ text: Objekt zum Spieler teleportieren
+ tooltip: Teleportiert das Objekt zum Spieler
+ teleportPlayerToObject:
+ text: Spieler zum Objekt teleportieren
+ tooltip: Teleportiert den Spieler zum Objekt
+ messages:
+ clonesDeleted:
+ text: '{0} Kopien von {1} wurden entfernt'
+ title: Kopien entfernt
+ nothingToDelete:
+ text: Nichts zum Löschen gefunden
+ title: Nichts gefunden
+ nothingToMove:
+ text: Nichts zum teleportieren gefunden
+ title: Nichts gefunden
+ objectCloned:
+ text: Eine Kopie von {0} wurde an der Position des Spielers erstellt. Bitte speichere die Änderungen, um sie zu übernehmen
+ title: '{0} erstellt'
+ pinTooltip: Zeige Objektposition auf der Karte
+ title: Weltobjekt-Kloner
+ unknownItem: Unbekanntes Objekt ({0})
+ unnamedItem: Unbenannt ({0})
+ worldItem: Weltobjekt
+ map:
+ title: Karte - {0}, {1} ({2})
+worldItemTypes:
+ GolfCart: Golfwagen
+ HangGlider: Hängegleiter
+ KnightV: Knight V
+ Radio: Radio
diff --git a/SOTFEdit/data/lang/en.json b/SOTFEdit/data/lang/en.json
deleted file mode 100644
index 2fee453..0000000
--- a/SOTFEdit/data/lang/en.json
+++ /dev/null
@@ -1,1626 +0,0 @@
-{
- "actors": {
- "classification": {
- "animal": "Animal",
- "cannibal": "Cannibal",
- "creep": "Creep",
- "human": "Human",
- "muddyCannibal": "Muddy Cannibal",
- "misc": "Misc"
- },
- "details": {
- "area": "Area",
- "classification": "Classification",
- "family": "Family",
- "gender": "Gender",
- "killedByPlayer": "Killed by Player",
- "lastSpawnTime": "Last Spawn Time",
- "lastVisitedTime": "Last Visited Time",
- "spawnedCount": "Spawned Count",
- "state": "State",
- "uniqueId": "UniqueID"
- },
- "gender": {
- "female": "Female",
- "male": "Male"
- },
- "grouping": {
- "animals": "Animals",
- "creeps": "Creeps",
- "femaleCannibals": "Female Cannibals",
- "femaleMuddyCannibals": "Female Muddy Cannibals",
- "maleCannibals": "Male Cannibals",
- "maleMuddyCannibals": "Male Muddy Cannibals",
- "misc": "Misc",
- "mixed": "Mixed",
- "mixedCannibals": "Mixed Cannibals",
- "mixedMuddyCannibals": "Mixed Muddy Cannibals",
- "noFamily": "No Family"
- },
- "headers": {
- "influences": "Influences",
- "info": "Info",
- "killStatistics": "Kill Statistics",
- "modificationOptions": "Modification Options",
- "modifications": "Modifications",
- "selection": "Selection",
- "stats": "Stats"
- },
- "influenceType": {
- "Cannibal": "Cannibal",
- "Creepy": "Creepy",
- "Player": "Player"
- },
- "modificationMode": {
- "Modify": "Modify",
- "Remove": "Remove"
- },
- "modificationOptions": {
- "allActorSelections": {
- "allActors": "All Actors",
- "allActorsOfSameFamily": "All Actors of the same family",
- "allActorsOfSameType": "All Actors of the same type",
- "thisActor": "This Actor"
- },
- "onlyInSameAreaAsActor": "Only in the same area as this actor",
- "removeSpawner": {
- "text": "Remove Spawner",
- "tooltip": "If selected the NPC should not spawn again"
- },
- "replaceType": "Replace Type",
- "skipKelvin": "Skip Kelvin",
- "skipVirginia": "Skip Virginia",
- "teleport": {
- "disclaimer": "Be careful if you teleport multiple actors to the same location. This might crash your game!",
- "none": "None",
- "npcToPlayer": "NPC to Player",
- "playerToNpc": "Player to NPC",
- "teleportLabel": "Teleport:"
- },
- "updateInfluences": "Update Influences"
- },
- "state": {
- "-1": "None",
- "0": "Any",
- "1": "Combat",
- "2": "World",
- "3": "Sleeping",
- "4": "Dying",
- "5": "Injured",
- "6": "Dead",
- "7": "Flying",
- "8": "Stalking",
- "20": "Burning",
- "21": "Electrocuted",
- "22": "Swimming",
- "23": "Stunned/Hit",
- "24": "Drowning/Thrown",
- "25": "Golf Cart",
- "40": "On Rock",
- "41": "On Tree",
- "42": "Under Leaves",
- "43": "Wall Walking",
- "44": "Captured",
- "45": "Boss Intro",
- "46": "Spawn Intro",
- "47": "Ceiling",
- "48": "Underground Cave",
- "50": "Leave Combat",
- "51": "Despawned"
- },
- "stats": {
- "affection": "Affection",
- "anger": "Anger",
- "energy": "Energy",
- "fear": "Fear",
- "fullness": "Fullness",
- "fullnessBuff": "Fullness Buff",
- "health": "Health",
- "hydration": "Hydration",
- "hydrationBuff": "Hydration Buff",
- "rest": "Rest",
- "restBuff": "Rest Buff",
- "stamina": "Stamina"
- },
- "types": {
- "1": "Rabbit",
- "2": "Squirrel",
- "3": "Turtle",
- "4": "Shark",
- "5": "Seagull",
- "6": "Eagle",
- "7": "Duck",
- "8": "Timmy",
- "9": "Kelvin",
- "10": "Virginia",
- "11": "Fingers",
- "12": "Carl",
- "13": "Andy",
- "14": "Danny",
- "15": "Billy",
- "16": "GoldMask",
- "17": "Moose",
- "18": "Baby",
- "19": "Twins",
- "20": "Mr. Puffy",
- "21": "Mrs. Puffy",
- "22": "Slug",
- "23": "Angel",
- "24": "Salmon",
- "25": "Brandy",
- "26": "Crystal",
- "27": "Destiny",
- "28": "Muddy Female",
- "29": "Muddy Male",
- "30": "Heavy Male",
- "31": "Sponge Test",
- "32": "Bat",
- "33": "Deer",
- "34": "Bluebird",
- "35": "Hummingbird",
- "36": "Killer Whale",
- "37": "Land Turtle",
- "38": "Fat Male",
- "39": "Fat Female",
- "40": "John2",
- "41": "Faceless Male",
- "42": "Demon",
- "43": "Painted Male",
- "44": "Painted Female",
- "45": "Demon Boss",
- "46": "Mr. Puffton",
- "47": "Mrs. Puffton",
- "48": "Boss Mutant",
- "49": "Mutant Virginia",
- "50": "Armsy",
- "51": "Frank",
- "52": "Eddy",
- "53": "Greg",
- "54": "Henry",
- "55": "Igor",
- "56": "Elise",
- "57": "Raccoon",
- "58": "Legsy",
- "59": "Holey",
- "60": "Skunk",
- "90": "Helicopter",
- "100": "PlayerRobby"
- }
- },
- "armor": {
- "buttons": {
- "default": "Default",
- "max": "Max",
- "remove": "Remove",
- "setAllToDefault": {
- "text": "Set all to Default",
- "tooltip": "Set durability of all armor pieces to default"
- },
- "setAllToMax": {
- "text": "Set all to Max",
- "tooltip": "Set durability of all armor pieces to max"
- },
- "setToDefault": {
- "text": "Default",
- "tooltip": "Set to the armors default durability"
- },
- "setToMax": {
- "text": "Max",
- "tooltip": "Set the armors durability to an arbitrarily high number"
- }
- },
- "durabilityInput": {
- "tooltip": "The durability of the armor. If it is 0, the armor breaks. Can be very high",
- "watermark": "Durability"
- },
- "header": "Equipped Armor (Max. 10)",
- "headers": {
- "actions": "Actions",
- "durability": "Durability",
- "id": "ID",
- "name": "Name",
- "slot": "Slot"
- },
- "unknownItem": "??? Unknown Item"
- },
- "backup": {
- "messages": {
- "backupsRestored": {
- "text": "{0} backups have been restored. Deleted files were moved to the recycle bin",
- "title": "Backups restored"
- }
- },
- "mode": {
- "Default": "Backup always",
- "InitialAndOne": "Always keep original, one additional backup",
- "None": "No Backups",
- "One": "Keep one backup and overwrite"
- }
- },
- "companion": {
- "address": "IP/Address",
- "connect": "Connect",
- "connectionFailed": {
- "text": "An attempt to connect to the companion plugin failed",
- "textException": "An attempt to connect to the companion plugin failed. Error: {0}",
- "title": "Companion Connection failed"
- },
- "connectionSuccessful": {
- "text": "Successfully connected to the companion.\nYou may now use the ingame hotkeys, live-teleportation via map and live position tracking",
- "title": "Companion connected"
- },
- "connectTimeout": "Connect Timeout",
- "disconnect": "Disconnect",
- "disconnectFailed": {
- "text": "An attempt to disconnect from the companion plugin failed",
- "textException": "An attempt to disconnect from the companion plugin failed. Error: {0}",
- "title": "Companion Disconnect failed"
- },
- "keepAliveInterval": "Keep-Alive Interval",
- "mapPositionUpdateInterval": "Update Player Positions every",
- "port": "Port",
- "portHint": "Ports > 1024 require the program and game to be executed as an admin!",
- "readme": "Readme",
- "readme1": "The companion provides some added functionality to the game, like ingame teleportation, position tracking and much more.\n\nBefore you can use the Companion, you have to set it up first. In order to do so, you have to setup two things in your game:\n\n- BepInExPack\n- SOTFEdit Companion Plugin\n\nYou can get them here and install them either manually, following the README, or use a mod manager:",
- "readme2": "After both are setup and the game is launched, you have to connect to the Companion using the menu.\n\nAfterwards, ingame you have two new hotkeys:\n- Ingame Teleport to most of the ingame locations (Default: F8)\n- Create Custom Teleport POI (Default: F9)\n\nAt the same time, your position on the map will be live updated.",
- "settings": "Settings",
- "status": {
- "connected": "Connected",
- "connecting": "Connecting...",
- "disconnected": "Disconnected"
- }
- },
- "dialogs": {
- "changeScrewStructureType": {
- "disclaimer": "You can select a different structure type here. Please keep in mind that the rotation and location of the structure will stay the same, which could lead to bugs and crashes."
- },
- "spawnFollower": {
- "disclaimer": "If you want to spawn followers, you have to make sure that you are at an open space. The followers will be spawned at the players position above the players current height and a slight offset.\n\nI tried many things for Virginia but only could get a maximum of 4 to spawn. It was better with Kelvin.\n\nThis might kill your FPS and the long term consequences are also not known right now.\n\nIf you want to have more, you should load the game, let everything spawn, save the game, spawn followers and so on.",
- "title": "Spawn Follower"
- },
- "translations": {
- "filter": "Filter",
- "missingOnly": "Missing Only"
- }
- },
- "errors": {
- "canNotBeEmpty": "{0} can not be empty"
- },
- "experiments": {
- "fires": {
- "noFires": {
- "text": "No fires found to be modified",
- "title": "No fires"
- },
- "success": {
- "text": "{0} fires have been lit, refueled and their drain rate changed",
- "title": "Fires changed"
- }
- },
- "resetCannibalAngerLevel": {
- "success": {
- "text": "Changes added. Please save to persist them",
- "title": "Changes added"
- }
- },
- "resetStructureDamage": {
- "noDamage": {
- "text": "No structure damage has to be repaired",
- "title": "No structure damage"
- },
- "success": {
- "text": "{0} structural damages have been repaired",
- "title": "Damages repaired"
- }
- }
- },
- "followers": {
- "buttons": {
- "fillAllBars": "Fill all bars",
- "moveToKelvin": "Move to Kelvin",
- "moveToPlayer": "Move to Player",
- "moveToVirginia": "Move to Virginia",
- "revive": "Revive",
- "spawn": "Spawn"
- },
- "details": {
- "status": "Status",
- "uniqueId": "Unique ID"
- },
- "equipmentLabel": "Equipment",
- "outfitLabel": "Outfit",
- "outfits": {
- "9": {
- "-1": "Default",
- "0": "Tactical Jacket",
- "1": "Tuxedo",
- "2": "Pajamas",
- "3": "Brown Leather Jacket",
- "4": "Hoodie",
- "5": "Blue TShirt",
- "6": "Blazer",
- "7": "Black Leather Jacket",
- "8": "Space Suit",
- "9": "Priest Outfit",
- "10": "Stewardess Outfit"
- },
- "10": {
- "-1": "Default",
- "0": "Swim Suit",
- "1": "Track Suit",
- "2": "Leather Suit",
- "3": "Camouflage Suit",
- "4": "Dress",
- "5": "Teal Dress",
- "6": "Red Dress"
- }
- },
- "reviveTooltip": "Make sure you do this outside of buildings when the body is missing, else you might glitch into the building\\nThe follower will spawn at the players position and will have the items and outfit equipped as configured at the right",
- "status": {
- "alive": "Alive",
- "dead": "Dead",
- "unknown": "???"
- }
- },
- "game": {
- "setup": {
- "animalSpawnRate": {
- "_label": "Animal Spawn Rate"
- },
- "buildingResistance": "Building Resistance",
- "coldPenalties": "Cold Penalties",
- "consumableEffects": {
- "_label": "Consumable Effects",
- "_tooltip": "How much damage you take eating bad food"
- },
- "creativeMode": "Creative Mode",
- "customSettings": "Custom Settings",
- "dayLength": {
- "default": "Default",
- "long": "Long",
- "realistic": "Realistic",
- "short": "Short",
- "_label": "Day Length"
- },
- "enemyAggression": {
- "_label": "Enemy Aggression"
- },
- "enemyArmour": {
- "_label": "Enemy Armor"
- },
- "enemyDamage": {
- "_label": "Enemy Damage"
- },
- "enemyHealth": {
- "_label": "Enemy Health"
- },
- "enemySearchParties": {
- "_label": "Enemy Search Parties"
- },
- "forcePlaceFullLoad": "Instant Building",
- "header": "Game Setup",
- "headers": {
- "enemiesCustom": "Enemies",
- "multiplayer": "Multiplayer",
- "weatherCustom": "Weather"
- },
- "immortalMode": "God Mode",
- "inventoryPause": "Pause in Inventory",
- "mode": {
- "creative": "Creative",
- "custom": "Custom",
- "hard": "Hard",
- "hardSurvival": "Hard Survival",
- "normal": "Normal",
- "peaceful": "Peaceful",
- "_label": "Mode"
- },
- "noCuttingsSpawn": "No Cuttings Spawn",
- "oneHitToCutTrees": "One hit to cut trees",
- "playerStatsDamage": {
- "_label": "Player Stats Damage",
- "_tooltip": "How much damage you take from starvation and etc."
- },
- "playersTriggerTraps": "Players Trigger Traps",
- "precipitationFrequency": {
- "_label": "Precipitation Frequency",
- "_tooltip": "How often does the weather change"
- },
- "pvpDamage": "PvP Damage",
- "reducedAmmoInContainers": "Reduced Ammo in Containers",
- "reducedFoodInContainers": "Reduced Food in Containers",
- "seasonLength": {
- "default": "Default",
- "long": "Long",
- "realistic": "Realistic",
- "short": "Short",
- "_label": "Season Length"
- },
- "settingsValues": {
- "default": "Default",
- "hard": "Hard",
- "high": "High",
- "low": "Low",
- "normal": "Normal",
- "off": "Off",
- "reduced": "Reduced"
- },
- "singleUseContainers": "Single-Use Containers",
- "spawnEnemies": "Spawn Enemies",
- "startingSeason": {
- "autumn": "Autumn",
- "spring": "Spring",
- "summer": "Summer",
- "winter": "Winter",
- "_label": "Starting Season"
- },
- "coldPenaltiesStatReduction": "Stat Regeneration Penalties",
- "uid": "UID"
- },
- "state": {
- "header": "Game State",
- "headers": {
- "worldObjectStates": "World Object States"
- },
- "worldObjectStates": {
- "disclaimer": "I haven't fully investigated which values represent which state. Presumably:\n- 0 = Unset/Closed/Not happened\n- 1 or 3 = Set/Opened/Happened",
- "header": "World Object States"
- }
- }
- },
- "generic": {
- "add": "Add",
- "cancel": "Cancel",
- "close": "Close",
- "edit": "Edit",
- "error": "Error",
- "exceptionMessage": "An exception has occured: {0}",
- "name": "Name",
- "no": "No",
- "ok": "OK",
- "position": "Position",
- "save": "Save",
- "seconds": "Second(s)",
- "setting": "Setting",
- "success": "Success",
- "unknown": "Unknown",
- "update": "Update",
- "value": "Value",
- "yes": "Yes"
- },
- "influences": {
- "anger": "Anger",
- "disclaimer": "Sentiment defines the affection, yet it is not clear how this influences enemies.\nWhen the Fear value is high, enemies run away more often.\nA high value in Anger increases the likelihood of attacks.",
- "fear": "Fear",
- "sentiment": "Sentiment"
- },
- "inventory": {
- "buttons": {
- "addAllFromCategory": "Add All from Category",
- "max": "Max",
- "remove": "Remove",
- "removeAll": "Remove All",
- "setAllToMax": "Set all to Max",
- "setAllToMin": "Set all to Min"
- },
- "filterWatermark": "Filter...",
- "headers": {
- "itemsInInventory": "Items in Inventory",
- "unassignedItems": "Unassigned Items"
- },
- "table": {
- "actions": "Actions",
- "count": {
- "text": "Count",
- "tooltip": "The amount that you have in your inventory"
- },
- "id": "ID",
- "name": "Name",
- "type": "Type"
- },
- "unknownItem": "??? Unknown Item"
- },
- "items": {
- "78": "Log",
- "340": "Guitar",
- "341": "Binoculars",
- "346": "Shotgun Rail",
- "351": "Grab & Go Bag",
- "353": "Stun Gun",
- "354": "Night Vision Goggles",
- "355": "Compact Pistol",
- "356": "Modern Axe",
- "357": "Airgun",
- "358": "Shotgun",
- "359": "Machete",
- "360": "Compound/Tactical Bow",
- "361": "Rifle",
- "362": "Pistol Ammo",
- "363": "Shotgun Slug",
- "364": "Shotgun Buckshot",
- "365": "Crossbow",
- "366": "Tracker Dart",
- "367": "Katana",
- "368": "Crossbow Bolt",
- "369": "Stun Gun Ammo",
- "370": "Pistol Ammo",
- "371": "Shotgun Buckshot",
- "372": "Shotgun Slug",
- "373": "Carbon Fiber Arrow",
- "374": "Pistol Suppressor/Silencer",
- "375": "Laser Sight",
- "376": "Pistol Rail",
- "377": "Scope",
- "378": "Flashlight Attachment",
- "379": "Tactical Axe",
- "380": "Utility Knife",
- "381": "Grenade",
- "382": "GrenadeAmmo",
- "383": "Rifle Rail Mod",
- "384": "Crossbow Quiver",
- "386": "Revolver",
- "387": "Rifle Ammo",
- "388": "Molotov",
- "389": "MolotovAmmo",
- "390": "Printer Resin",
- "391": "Red Mask",
- "392": "Stick",
- "393": "Rock",
- "394": "Chainsaw",
- "395": "Log Plank",
- "396": "Stun Baton",
- "397": "Shiitake",
- "398": "King Oyster",
- "399": "Hydnum Repandum",
- "400": "Fly Amanita",
- "401": "Turtle Egg",
- "402": "Backpack",
- "403": "Rope",
- "405": "Bone",
- "406": "Quarter Log",
- "408": "Half Log",
- "409": "Three Quarter Log",
- "410": "Watch",
- "412": "GPS Tracker",
- "413": "Plasma Lighter",
- "414": "Vodka Bottle",
- "415": "Cloth",
- "416": "Circuit Board",
- "417": "Time Bomb",
- "418": "Wire",
- "419": "Duct Tape",
- "420": "C4 Brick",
- "421": "Ramen Noodles",
- "422": "Repair Tool",
- "423": "Novel [Pennant Line]",
- "424": "Novel [Deep Sleep]",
- "425": "Crunchie Wunchies",
- "426": "Printed Flask",
- "427": "Printed Knife",
- "428": "Printed Sled",
- "429": "Printed Scuba Mask",
- "430": "Skull",
- "431": "Firefighter Axe",
- "432": "Can Opener",
- "433": "Meat",
- "434": "Canned Food",
- "435": "Golden Mask",
- "436": "Fish",
- "437": "Meds",
- "438": "MRE Pack",
- "439": "Energy Drink",
- "440": "Flare",
- "441": "Energy Bar",
- "443": "Crafted Bow",
- "444": "Rebreather",
- "445": "Blueberries",
- "446": "Twinberries",
- "447": "Salmonberries",
- "448": "Snowberries",
- "449": "Devil's Club",
- "450": "Horsetail",
- "451": "Aloe Vera",
- "452": "Yarrow",
- "453": "Fireweed",
- "454": "Arrowleaf",
- "455": "Health Mix",
- "456": "Health Mix+",
- "457": "Stun Gun Ammo",
- "458": "Battery Charger",
- "459": "Slingshot",
- "460": "Battery Pack",
- "461": "Energy Mix",
- "462": "Energy Mix+",
- "463": "Flippers",
- "464": "Cat Food",
- "465": "Chicory",
- "466": "Oyster",
- "467": "Album Cover",
- "468": "Cross",
- "469": "Air Canister",
- "470": "Airgun Scope",
- "471": "Flashlight",
- "472": "Deer Hide",
- "473": "Leaf Armour",
- "474": "Crafted Spear",
- "475": "Flask",
- "476": "Small Rock",
- "477": "Crafted Club",
- "478": "Climbing Axe",
- "479": "Feather",
- "480": "Severed Arm",
- "481": "Severed Leg",
- "482": "Severed Head",
- "483": "Emergency Pack",
- "484": "Leaf",
- "485": "Shovel",
- "486": "Walkie Talkie",
- "487": "Silk Pajamas",
- "488": "Blue TShirt",
- "489": "Tactical Pants",
- "490": "Hoodie",
- "491": "Blazer",
- "492": "Tuxedo",
- "493": "Leather Jacket",
- "494": "Bone Armour",
- "495": "Tactical Jacket",
- "496": "Money",
- "497": "Food Tray",
- "498": "GRABS Laser Pointer",
- "499": "Wetsuit",
- "500": "Winter Jacket",
- "501": "Tactical Boots",
- "502": "Coins",
- "503": "Torch",
- "504": "Tarp",
- "505": "Laser Measure Tool",
- "506": "Turtle Shell",
- "507": "Stone Arrow",
- "508": "Skin Pouch",
- "509": "Holosprings Pamphlet",
- "511": "Contact Trigger",
- "512": "Filled Food Tray",
- "513": "Spring",
- "514": "Contact Spring Trigger",
- "515": "Basic Building Tutorial Page",
- "516": "Tarp Tent Tutorial Page",
- "517": "Cooking Pot",
- "518": "Paper Target",
- "519": "Deer Hide Armour",
- "520": "Structure Element",
- "521": "Email [More Lighting]",
- "522": "Rope Gun",
- "523": "Zipline Rope",
- "524": "Golf Ball",
- "525": "Putter",
- "526": "Mr Puffy Will",
- "527": "Batteries",
- "528": "MrPuffy Financials",
- "529": "GPS Locator",
- "530": "Drying Rack Blueprint",
- "531": "Stick Chair Blueprint",
- "532": "Stick Bed Blueprint",
- "533": "Weapon Rack Blueprint",
- "534": "Golf Email Pt 1",
- "535": "Golf Email Pt 2",
- "536": "Golf Email Pt 3",
- "537": "Golf Email Pt 4",
- "538": "Painting Email",
- "539": "Document [Out Demonia]",
- "540": "Document [Crosses burn Demons]",
- "541": "Document [Cube Activation Cycles]",
- "542": "Email [Thought you might find this interesting]",
- "543": "Email [Another one]",
- "544": "Email [One more]",
- "545": "Email [Photo Reference]",
- "546": "Email [Note to all employees]",
- "547": "Email [Safe in Cube]",
- "548": "Document [Stay in the Cube]",
- "549": "Bone Maker Blueprint",
- "550": "Fly Swatter Blueprint",
- "551": "Small Animal Catcher Blueprint",
- "552": "S.C.R.E.W.",
- "553": "Tech Mesh",
- "554": "Tech Armour",
- "555": "Track Suit",
- "556": "Dress",
- "557": "Leather Suit",
- "558": "Camouflage Suit",
- "559": "Printed Arrow Heads",
- "560": "Printed Grappling Hook",
- "561": "Printed Flower Pot",
- "562": "HolovilleNoticeA",
- "563": "HolovilleNoticeB",
- "564": "HolovilleNoticeC",
- "565": "HolovilleNoticeD",
- "566": "Maintenance Key Card",
- "567": "Guest Key Card",
- "568": "VIP Key Card",
- "569": "Brain Bite",
- "570": "Steak Bite",
- "571": "Steak and Bacon Bite",
- "572": "Ancient Armor",
- "573": "Sleeping Bag",
- "574": "Novel [Rescued]",
- "575": "Novel [Parallel Universes]",
- "576": "Quarter Log Plank",
- "577": "Half Log Plank",
- "578": "Three Quarter Log Plank",
- "579": "Bone Chair Blueprint",
- "580": "Stick Ladder Blueprint",
- "581": "Bird House Blueprint",
- "582": "Fish Trap Blueprint",
- "583": "Storage Box Blueprint",
- "584": "Mannequin Blueprint",
- "585": "Scarecrow Blueprint",
- "586": "Planter Wall Blueprint",
- "587": "Planter Floor Blueprint",
- "588": "Bone Chandelier Blueprint",
- "589": "S.C.R.E.W. / Tutorials",
- "590": "Radio",
- "591": "Small Log Cabin Blueprint",
- "592": "Creepy Skin",
- "593": "Creepy Armour",
- "594": "Guarana Berries",
- "595": "Blackberries",
- "596": "AloeVera Seed",
- "597": "Arrowleaf Seed",
- "598": "Blackberry Seed",
- "599": "Blueberry Seed",
- "600": "DevilsClub Seed",
- "601": "Fireweed Seed",
- "602": "Guarana Seed",
- "603": "Horsetail Seed",
- "604": "Salmonberry Seed",
- "605": "Chicory Seed",
- "606": "Yarro Seed",
- "607": "Rock Storage Blueprint",
- "608": "Stone Storage Blueprint",
- "609": "Log Storage Blueprint",
- "610": "Sticks Storage Blueprint",
- "611": "Numbers Printout",
- "612": "Newspaper Cutout [Missing CEO]",
- "613": "Newspaper Cutout [Puffcorp]",
- "614": "E-Mail [Artifact - Preliminary Findings]",
- "615": "E-Mail [Scientific Data - Cube]",
- "616": "Classified Document",
- "617": "Stock Price",
- "618": "Printed Arrow",
- "619": "Swim Suit",
- "620": "Table Blueprint",
- "621": "Shelf Blueprint",
- "622": "Rock Path Blueprint",
- "623": "Wall Shelf Blueprint",
- "624": "Wall Torch Blueprint",
- "625": "Hanging Skull Light Blueprint",
- "626": "Foldable Glider",
- "627": "Mr. Puffton's Reservation Card",
- "628": "Mrs. Puffton's Reservation Card",
- "629": "Rain Catcher Blueprint",
- "630": "KnightV",
- "631": "The Realm Beyond",
- "632": "Spring Trap Blueprint",
- "633": "Cult Pamphlet",
- "634": "Solar Panel",
- "635": "Light Bulb",
- "636": "TemplateD",
- "637": "Action Camera",
- "638": "Basic Log Sled Blueprint",
- "639": "Space Suit",
- "640": "Stone",
- "641": "Stone Fireplace Blueprint",
- "642": "Duck Head",
- "643": "Eagle Head",
- "644": "Small Turtle Head",
- "645": "Head Trophy Mount Blueprint",
- "646": "Rabbit Head",
- "647": "Squirrel Head",
- "648": "Seagull Head",
- "649": "Stones Storage Blueprint",
- "650": "Turtle Head",
- "651": "Deer Head",
- "652": "Moose Head",
- "653": "Personal Note A",
- "654": "Personal Note B",
- "655": "Personal Note C",
- "656": "Blueprint Hokey Pokey Trap",
- "657": "Printed GPS Case",
- "658": "Radio Trap Blueprint",
- "659": "Radio Blueprint",
- "661": "Golf Cart Battery",
- "662": "Artifact Piece A",
- "663": "Pickaxe",
- "664": "Solafite Ore",
- "665": "Item Plating Blueprint",
- "666": "Powered Cross Blueprint",
- "667": "Artifact Piece B",
- "668": "Artifact Piece C",
- "669": "Artifact Piece D",
- "670": "Gore Chair Blueprint",
- "671": "Gore Couch Blueprint",
- "672": "Uber Trap Blueprint",
- "673": "Round Table Blueprint",
- "674": "Old Note A",
- "675": "Old Note B",
- "676": "Old Note C",
- "677": "Fishing Email A",
- "678": "Fishing Email B",
- "679": "Grind Trap Blueprint",
- "680": "Spotlight Blueprint",
- "681": "Clock Blueprint",
- "682": "Spin Trap Blueprint",
- "683": "Double Bed Blueprint",
- "684": "Old Note E",
- "685": "Old Note D",
- "686": "Cult Sign F",
- "687": "Puffton Email A",
- "688": "Spear Thrower Trap Blueprint",
- "689": "Artifact Piece E",
- "690": "Story Pages",
- "691": "Old Note F",
- "692": "Fishing Email C",
- "693": "Bunker Map A",
- "694": "Jianyu Email Printout A",
- "695": "Cult Sign G",
- "696": "Cult Sign H",
- "697": "Cult Sign I",
- "698": "Cult Sign J",
- "699": "Cult Sign K",
- "700": "Spear Storage Blueprint",
- "701": "Leg Lamp Blueprint",
- "702": "Firewood Storage Blueprint",
- "703": "Priest Outfit",
- "704": "Wall Weapon Rack Blueprint",
- "705": "Circus Pamphlet",
- "706": "Newspaper Cutout [Husbands]",
- "707": "Artifact",
- "708": "Artifact Piece F",
- "709": "Teleporter Blueprint",
- "710": "Repel Shrine Blueprint",
- "711": "Attract Shrine Blueprint",
- "712": "Artifact Piece G",
- "713": "Plater Counter Blueprint",
- "714": "Gold Armor Plater Blueprint",
- "715": "Raccoon Head",
- "716": "Bible Paper D",
- "717": "Old Note G",
- "718": "Personal Note E",
- "719": "Personal Note F",
- "720": "Personal Note G",
- "721": "Bible Paper Scrap A",
- "722": "Puffton Email B",
- "723": "Puffton Email C",
- "724": "Twinberry Seed",
- "725": "Snowberry Seed",
- "726": "Hang Glider Launcher Blueprint",
- "727": "Solafite Armor",
- "728": "Living Rabbit",
- "729": "Skunk Head",
- "730": "Small Rabbit Hutch Blueprint",
- "749": "Stewardess Outfit"
- },
- "itemTypes": {
- "ammo": "Ammo",
- "armor": "Armor",
- "attachment": "Attachment",
- "blueprint": "Blueprint",
- "bodyPart": "Body Part",
- "book": "Book",
- "clothes": "Clothes",
- "consumable": "Consumable",
- "container": "Container",
- "document": "Document",
- "electricity": "Electricity",
- "equipment": "Equipment",
- "food": "Food",
- "key": "Key",
- "log": "Log",
- "misc": "Misc",
- "plant": "Plant",
- "printed": "Printed",
- "seed": "Seed",
- "tool": "Tool",
- "trophy": "Trophy",
- "weapon": "Weapon",
- "weaponMod": "Weapon Modification"
- },
- "itemVariants": {
- "433": {
- "1": "Raw Meat",
- "2": "Unknown Meat",
- "3": "Spoiled Meat",
- "4": "Dried Meat",
- "5": "Cooked Meat",
- "6": "Burned Meat"
- },
- "436": {
- "1": "Raw Fish",
- "2": "Unknown Fish",
- "3": "Spoiled Fish",
- "4": "Dried Fish",
- "5": "Cooked Fish",
- "6": "Burned Fish"
- },
- "480": {
- "1": "Raw Arm",
- "2": "Unknown Arm",
- "3": "Spoiled Arm",
- "4": "Dried Arm",
- "5": "Cooked Arm",
- "6": "Burned Arm"
- },
- "481": {
- "1": "Raw Leg",
- "2": "Unknown Leg",
- "3": "Spoiled Leg",
- "4": "Dried Leg",
- "5": "Cooked Leg",
- "6": "Burned Leg"
- }
- },
- "languages": {
- "de": "Deutsch",
- "en": "English",
- "pl": "Polski"
- },
- "map": {
- "actors": "Actors",
- "altItems": "Alternative Items",
- "alwaysOnTop": "Always on top",
- "area": "Area",
- "areaFilter": {
- "text": "Area",
- "types": {
- "all": "All",
- "surfaceOnly": "Surface only",
- "undergroundOnly": "Caves/Bunkers only"
- }
- },
- "buttons": {
- "createNewZipline": {
- "text": "New Zipline from here",
- "tooltip": "After you have clicked this button, the new zipline will be created between the current position and the next point that you click"
- },
- "delete": "Delete",
- "deleteBothAnchors": "Delete both anchors",
- "deselectAll": "Deselect all",
- "moveToNextClickedPosition": {
- "hint": "Please click now another location",
- "text": "Move to clicked position",
- "tooltip": "After you have clicked this button, the anchor will be moved to the next point that you click"
- },
- "spawnActors": "Spawn Actors",
- "teleportKelvin": "Teleport Kelvin here",
- "teleportPlayer": "Teleport Player here",
- "teleportVirginia": "Teleport Virginia here"
- },
- "coordinates": "Coordinates",
- "customPois": "Custom",
- "details": "Details",
- "fill": "Fill",
- "followers": "Followers",
- "followPlayer": "Follow Player",
- "fullText": {
- "text": "Full Text",
- "tooltip": "Searches in title, description, item name and item category of the currently selected map marker categories",
- "watermark": "Title, Description, Item name..."
- },
- "inventoryFilter": "Show only uncollected items",
- "isInInventory": "Owned",
- "isRuntimeCreated": "Is Copy",
- "isUnderground": "Is underground",
- "itemId": "Item-ID",
- "items": "Items",
- "mapType": {
- "dark": "Dark",
- "original": "Original"
- },
- "name": "Name",
- "objects": "Objects",
- "options": "Options",
- "pois": "Points of Interest",
- "requirements": "Requirements",
- "requirementsFilter": {
- "text": "Requirements",
- "tooltip": "Only show items, caves, bunkers etc. where you own the required items to access them, e.g. a shovel or key card",
- "types": {
- "AccessibleOnly": "Only show accessible",
- "All": "All",
- "InaccessibleOnly": "Only show inaccessible"
- }
- },
- "spawnWindow": {
- "actorType": "Actor Type",
- "count": "Count",
- "disclaimer": "Be careful with the positioning and number of enemies. It might crash the game. Some enemies can not be spawned at certain underground places.",
- "doSpawn": "Create Actors",
- "family": "Family",
- "familyOfDestinationActor": "Family of Destination Actor",
- "information": "Information",
- "options": "Options",
- "position": "Position",
- "spaceBetween": {
- "text": "Space between",
- "tooltip": "Defines the space between each actor. The actors will be places in a uniform grid if this value is > 0"
- },
- "spawnPattern": {
- "Cross": "Cross",
- "Grid": "Grid",
- "HorizontalLine": "Horizontal Line",
- "Random": "Random",
- "Rectangle": "Rectangle",
- "text": "Spawn Pattern",
- "VerticalLine": "Vertical Line"
- },
- "title": "Spawn Actors"
- },
- "structures": "Structures",
- "teleportation": "Teleportation",
- "teleportWindow": {
- "destination": "Destination",
- "disclaimer": "You can adjust the location here. If you spawn inside an enemy, chances are that you will be rocketed into the sky. X and Z determine the location, Y the height. Please make sure that the correct area is selected.",
- "doTeleport": "Teleport!",
- "mode": {
- "Kelvin": "Kelvin",
- "Player": "Player",
- "Virginia": "Virginia"
- },
- "offset": "Offset",
- "title": "Teleport",
- "toTeleport": "To teleport"
- },
- "wiki": "Wiki Link",
- "zipLineAnchor": "Zip Line Anchor",
- "zipLines": "Zip Lines"
- },
- "menu": {
- "companion": {
- "setup": "Setup",
- "text": "Companion"
- },
- "file": {
- "deleteAllBackups": "Delete all backups",
- "exit": "Exit",
- "openLastSavegame": "Open last savegame...",
- "openLastSavegameWithSavegame": "Open {0}...",
- "openSavegame": "Open Savegame...",
- "openSavegameDirInExplorer": "Open Savegame Dir in Explorer",
- "reloadCurrentSavegame": "Reload Current Savegame",
- "restoreFromBackup": {
- "fromNewestBackup": "From newest backup",
- "fromOldestBackup": "From oldest backup",
- "text": "Restore from Backups"
- },
- "save": "Save",
- "settings": "Settings",
- "text": "File"
- },
- "help": {
- "about": "About...",
- "changelog": "Changelog",
- "links": {
- "discord": "Discord",
- "downloadLatestVersion": "Download Latest Version",
- "githubProject": "GitHub Project",
- "nexusMods": "NexusMods",
- "text": "Links",
- "thunderstoreIo": "thunderstore.io"
- },
- "readme": "Readme",
- "text": "?",
- "translations": "Translations",
- "updates": {
- "checkNow": "Check now",
- "checkOnStartup": "Check on Startup",
- "text": "Updates"
- }
- },
- "tools": {
- "cloneWorldObjects": {
- "text": "Clone World Items...",
- "tooltip": "Clones World Items at the players position"
- },
- "eternalFires": {
- "text": "Eternal Fires",
- "tooltip": "Fires will be ignited, fuel drain rate is set low and amount of fuel is set very high"
- },
- "fires": {
- "text": "Fires",
- "tooltip": "Modify fires around the world"
- },
- "itemPlater": {
- "text": "Item and Structure Plater",
- "tooltip": "Adds or removes solafite plating to items in inventory, weapon racks, follower items and structures"
- },
- "map": {
- "text": "Interactive Map",
- "tooltip": "An interactive map"
- },
- "modifyConsumedItems": {
- "text": "Modify Consumed Items...",
- "tooltip": "In case you want to purge your memory about items that you have consumed already"
- },
- "regrowTrees": "Regrow Trees...",
- "resetCannibalAngerLevel": {
- "text": "Reset Cannibal Anger Level",
- "tooltip": "Resets the kill statistics, number of cut trees and village visit count, which leads to fewer and smaller cannibal raids"
- },
- "resetContainers": {
- "text": "Reset Containers",
- "tooltip": "Resets crates, boxes and cases in caves and the open world"
- },
- "resetFires": {
- "text": "Reset Fires",
- "tooltip": "Fires will be ignited, fuel drain rate and fuel amount is set to default"
- },
- "resetStructureDamage": {
- "text": "Reset Structure Damage",
- "tooltip": "Lets you repair all structures"
- },
- "resetTraps": {
- "text": "Reset Traps",
- "tooltip": "Resets all traps"
- },
- "setToEndgame": {
- "text": "Set to Endgame",
- "tooltip": "Sets the game to \"Endgame\" which will unlock some enemies"
- },
- "text": "Tools",
- "unlocks": {
- "text": "Unlocks",
- "tooltip": "Lets unlock certain game features"
- }
- }
- },
- "npcs": {
- "tabs": {
- "byFamily": {
- "disclaimer": "A family represents a group of NPCs which belong to each other. In other words: A swarm, a tribe for example.",
- "text": "By Family"
- },
- "byType": "By Type"
- }
- },
- "player": {
- "areaMask": "Area",
- "buttons": {
- "moveToKelvin": "Move to Kelvin",
- "moveToVirginia": "Move to Virginia"
- },
- "currentHealth": "Current Health",
- "fillAllBars": "Fill all bars",
- "mapGroupName": "Player",
- "maxHealth": "Max Health",
- "outfit": "Outfit",
- "sickness": "Sickness",
- "strengthLevel": "Strength Level"
- },
- "poiGroups": {
- "Ammo": "Ammo",
- "Bunkers": "Bunkers",
- "Camps": "Camps",
- "CannibalVillages": "Cannibal Villages",
- "Caves": "Caves",
- "Crates": "Crates",
- "Doors": "Doors",
- "Helicopters": "Helicopters",
- "Info": "Info",
- "Items": "Items",
- "Lakes": "Lakes",
- "Laptops": "Laptops",
- "Ponds": "Ponds",
- "Printers": "3D-Printers",
- "Supply": "Supply",
- "Villages": "Villages"
- },
- "storage": {
- "batch": {
- "allSlots": "All Slots",
- "clearAll": "Clear All",
- "fillAllWith": "Fill all with",
- "setAllToMax": "Set All to Max"
- },
- "buttons": {
- "fillAllStorages": "Fill all Storages"
- },
- "errors": {
- "currentStateNotDefined": "CurrentState not defined for moduleId {0}"
- },
- "headers": {
- "selectAStorage": "Select a Storage",
- "storageTypes": "Storage Types"
- },
- "slot": {
- "max": "Max",
- "remove": "Remove"
- }
- },
- "structures": {
- "added": "Added",
- "applyToAllOfSameType": {
- "text": "Apply to all of same type",
- "tooltip": "Applies the assigned items and count above to all storages of the same type"
- },
- "buildCost": "Build Cost",
- "buttons": {
- "changeType": "Change Type",
- "setAllToAlmostFinish": "Set all to \"Almost Finish\"",
- "setAllToFinish": "Set all to \"Finish\"",
- "setAllToRemove": "Set all to \"Remove\"",
- "setAllToUnfinish": "Set all to \"Unfinish\"",
- "unmodifyAll": "Un-modify all"
- },
- "categories": {
- "furniture": "Furniture",
- "gardening": "Gardening",
- "misc": "Misc",
- "raft": "Raft",
- "shelter": "Shelter",
- "storage": "Storage",
- "traps": "Traps",
- "treeShelter": "Tree Shelter",
- "utility": "Utility"
- },
- "category": "Category",
- "headers": {
- "batch": "Batch",
- "finishedStructures": "Finished Structures",
- "unfinishedStructures": "Unfinished Structures"
- },
- "modification": "Modification",
- "modificationMode": {
- "AlmostFinish": "Almost Finish",
- "Finish": "Finish",
- "None": "None",
- "Remove": "Remove",
- "Unfinish": "Un-finish"
- },
- "percentDone": "Percent Done",
- "structureTypeSelectorDisclaimer": "If nothing is selected, all structures will be changed",
- "types": {
- "19": "Weapon Rack",
- "20": "Stick Chair",
- "21": "Bone Maker Trap",
- "22": "Stick Bed",
- "23": "Wall Planter",
- "24": "Bone Chandelier",
- "25": "Bone Chair",
- "26": "Lean-to",
- "27": "Drying Rack",
- "28": "Tree Shelter 2",
- "29": "Stick Storage",
- "31": "Rock Storage",
- "32": "Bone Storage",
- "34": "Small Log Cabin",
- "35": "Fish Trap",
- "36": "Armor Rack",
- "37": "Log Storage (Old)",
- "38": "Look Out Tower",
- "39": "Scarecrow",
- "40": "Standing Planter",
- "41": "Tree Platform 2",
- "42": "Small Animal Trap",
- "43": "Tree Platform 1",
- "44": "Tree Shelter 1",
- "45": "Fly Swatter Trap",
- "46": "Stick Path",
- "47": "Hunting Shelter",
- "48": "Table",
- "49": "Shelf",
- "50": "Rock Path",
- "51": "Wall Shelf",
- "52": "Bench",
- "53": "Wall Torch",
- "54": "Ceiling Skull Lamp",
- "55": "Zipline",
- "56": "Rain Catcher",
- "57": "Spring Trap",
- "58": "Advanced Log Sled",
- "59": "Basic Log Sled",
- "60": "Stone Fireplace",
- "61": "Head Trophy",
- "62": "Stone Storage",
- "63": "Hokey Pokey Trap",
- "64": "Radio Alarm Trap",
- "67": "Large Log Storage",
- "68": "Deer Hide Rug",
- "70": "Item Plating",
- "71": "Powered Cross",
- "72": "Gore Chair",
- "73": "Gore Couch",
- "74": "Uber Trap",
- "75": "Round Table",
- "76": "Grind Trap",
- "77": "Spotlight",
- "78": "Clock",
- "79": "Spin Trap",
- "80": "Double Bed",
- "81": "Spear Thrower Trap",
- "82": "Spear Rack",
- "84": "Firewood Storage",
- "85": "Leg Lamp",
- "86": "Wall Weapon Rack",
- "88": "Teleporter",
- "89": "Repel Shrine",
- "90": "Attract Shrine",
- "91": "Couch",
- "92": "Leaf Trap",
- "93": "Molotov Tripwire Trap",
- "94": "Explosive Tripwire Trap",
- "95": "Arrow Holder",
- "96": "Log Storage",
- "97": "Chair (Fur)",
- "98": "Small Platform",
- "99": "Medium Platform",
- "100": "Plater Counter",
- "101": "Gold Armor Plater",
- "102": "Hang Glider Launcher",
- "103": "Hang Glider Launcher",
- "104": "Explosive Storage",
- "106": "Rabbit Hutch",
- "107": "Small Rabbit Hutch",
- "108": "House Boat",
- "109": "Knight-V Holder",
- "110": "Bird House",
- "113": "Foldable Glider Holder",
- "117": "Small Raft",
- "118": "Mooring",
- "119": "Large Raft"
- }
- },
- "tabs": {
- "followers": "Followers",
- "game": "Game",
- "inventory": "Inventory",
- "npcs": "NPCs",
- "player": "Player",
- "storage": "Storage",
- "structures": "Structures"
- },
- "weather": {
- "header": "Weather State"
- },
- "windows": {
- "itemPlater": {
- "buttons": {
- "addPlating": "Add Plating",
- "removePlating": "Remove Plating"
- },
- "constructionCategories": {
- "Item": "Item",
- "Log": "Log",
- "LogPlank": "Log Plank",
- "Stick": "Stick",
- "Stone": "Stone"
- },
- "constructions": "Constructions",
- "disclaimer": "Be careful: The tool ONLY saves changes to the plating and reloads the savegame afterwards.\r\n\r\nSo make sure that there are no unsaved changes, else save the other changes before, THEN open the tool and apply the plating.\r\n\r\nMoreover, when you save, it can take some time if your savegame is rather huge.",
- "followerItems": "Follower Items",
- "itemsInInventory": "Items in Inventory",
- "itemsInWeaponRacks": "Items in Weapon Racks",
- "messages": {
- "addPlating": "{0} item platings have been added",
- "removePlating": "{0} item platings have been removed"
- },
- "structures": "Structures",
- "title": "Item and Structure Plater"
- },
- "main": {
- "errors": {
- "errorCheckingLastVersion": "An error occured while checking for latest version"
- },
- "map": "Map",
- "messages": {
- "alreadyLatestVersion": {
- "text": "You are already using the latest version",
- "title": "No update"
- },
- "backupsDeleted": "Deleted {0} backups",
- "changesSaved": "Changes saved successfully",
- "confirmCloseApplication": {
- "text": "Do you want to close the application?",
- "title": "Close Application"
- },
- "confirmCreateBackup": {
- "text": "Do you want to create a backup?",
- "title": "Create a backup?"
- },
- "confirmDeleteBackups": {
- "text": "Do you really want to delete all backups?",
- "title": "Delete all backups"
- },
- "confirmOverwriteExternalChanges": {
- "text": "The savegame has been modified outside. Do you really want to overwrite any changes?",
- "title": "Overwrite Changes"
- },
- "confirmRestoreBackups": {
- "text": "Are you sure that you want to restore backups?",
- "title": "Restore backups"
- },
- "followerAlreadyAlive": {
- "text": "{0} should be alive already",
- "title": "No changes"
- },
- "followerRevived": {
- "text": "{0} should now be back again",
- "title": "Revived"
- },
- "followersCreated": {
- "text": "{0} followers have been created",
- "title": "Followers created"
- },
- "noChanges": {
- "text": "No changes - Nothing saved",
- "title": "No changes"
- },
- "saveChanges": "Save Changes",
- "unableToDeleteBackups": "Unable to delete backups: {0}",
- "unableToSpawnFollowers": "Unable to spawn followers"
- },
- "title": " (Selected: {0}, {1} - Saved at: {2}, Last Modified: {3})"
- },
- "modifyConsumedItems": {
- "key": "Key",
- "remove": "remove",
- "removeAll": "Remove All",
- "title": "Modify Consumed Items"
- },
- "regrowTrees": {
- "all": "All",
- "gone": "Gone",
- "halfChopped": "Half-chopped",
- "messages": {
- "noTreesRegrown": "No trees with state \"{0}\" regrown",
- "success": "{0} trees with previous state \"{1}\" should now have regrown. Please save to persist the changes."
- },
- "pctRegrow": "Regrow Percent",
- "saveButton": "Regrow Trees",
- "stumps": "Stumps",
- "title": "Regrow Trees"
- },
- "resetContainers": {
- "messages": {
- "containersReset": {
- "text": "{0} Containers have been reset. Please save the changes to apply them to the savegame",
- "title": "Containers reset"
- },
- "nothingToReset": {
- "text": "Nothing to reset found",
- "title": "Nothing found"
- }
- }
- },
- "resetTraps": {
- "messages": {
- "nothingToReset": {
- "text": "Nothing to reset found",
- "title": "Nothing found"
- },
- "trapsReset": {
- "text": "{0} traps have been reset. Please save the changes to apply them to the savegame",
- "title": "Traps reset"
- }
- }
- },
- "selectSavegame": {
- "buttons": {
- "change": "Change...",
- "setToDefault": "Set to default"
- },
- "folderBrowserTitle": "Select Sons of the Forest \"Saves\" Directory",
- "headers": {
- "location": "Location"
- },
- "lastSaveTimeTooltip": "Last write time of the savegame directory",
- "selectedPath": {
- "label": "Selected Path:",
- "tooltip": "Usually the Savegames are stored at C:\\Users\\[user]\\AppData\\LocalLow\\Endnight\\SonsOfTheForest\\Saves"
- },
- "tabs": {
- "multiplayer": "Multiplayer",
- "multiplayerClient": "Multiplayer (Client)",
- "singleplayer": "Singleplayer"
- },
- "title": "Select Savegame..."
- },
- "settings": {
- "askForBackupsEveryTime": "Ask for backups every time",
- "backupMode": "Backup Mode",
- "fileMode": {
- "label": "File Mode",
- "single": "One backup per changed JSON file",
- "zip": "ZIP Archive"
- },
- "language": "Language",
- "messages": {
- "languageChanged": {
- "text": "Please restart the application to apply the changed language",
- "title": "Settings saved"
- }
- },
- "theme": "Theme",
- "title": "Settings"
- },
- "unhandledException": {
- "applicationVersion": "Application Version",
- "buttons": {
- "copyErrorToClipboard": "Copy Error to Clipboard",
- "exitApplication": "Exit Application"
- },
- "callstack": "Callstack",
- "disclaimer": "An unexpected error occured. The application state might be corrupted.",
- "exceptionMessage": "Exception Message",
- "exceptionType": "Exception Type",
- "header": "Exception Details",
- "innerException": "Inner Exception",
- "title": "Unhandled Exception"
- },
- "unlocks": {
- "coreGameCompleted": "Core Game completed",
- "creativeMode": "Creative Mode",
- "creativeModeItem": "Creative Mode Item (?)",
- "escapedIsland": "Escaped Island",
- "messages": {
- "playerProfileNotFound": "PlayerProfile.json could not be found at \"{0}\""
- },
- "title": "Unlocks"
- },
- "updateAvailable": {
- "buttons": {
- "download": "Download",
- "ignore": "Ignore"
- },
- "header": "An Update is available",
- "title": "Update available"
- },
- "worldItemCloner": {
- "buttons": {
- "cloneAtPlayerPosition": {
- "text": "Clone at Player Position",
- "tooltip": "Creates a clone of this object at the players position"
- },
- "removeAllCopies": {
- "text": "Remove all copies from map",
- "tooltip": "Removes all copies of this type from map"
- },
- "teleportObjectToPlayer": {
- "text": "Teleport object to player",
- "tooltip": "Teleports the object to the player"
- },
- "teleportPlayerToObject": {
- "text": "Teleport player to object",
- "tooltip": "Teleports the player to the object"
- }
- },
- "messages": {
- "clonesDeleted": {
- "text": "{0} clones of {1} were removed",
- "title": "Clones removed"
- },
- "nothingToDelete": {
- "text": "Nothing to delete",
- "title": "Nothing found"
- },
- "nothingToMove": {
- "text": "Nothing to move found",
- "title": "Nothing found"
- },
- "objectCloned": {
- "text": "A copy of {0} was created at player position. Please save changes to persist them",
- "title": "{0} created"
- }
- },
- "pinTooltip": "Show Object Position on Map",
- "title": "World Item Cloner",
- "unknownItem": "Unknown Item ({0})",
- "unnamedItem": "Unnamed ({0})",
- "worldItem": "World Item"
- }
- },
- "worldItemTypes": {
- "GolfCart": "Golf Cart",
- "HangGlider": "Hang Glider",
- "KnightV": "Knight V",
- "Radio": "Radio"
- }
-}
\ No newline at end of file
diff --git a/SOTFEdit/data/lang/en.yaml b/SOTFEdit/data/lang/en.yaml
new file mode 100644
index 0000000..3e94de7
--- /dev/null
+++ b/SOTFEdit/data/lang/en.yaml
@@ -0,0 +1,1503 @@
+actors:
+ classification:
+ animal: Animal
+ cannibal: Cannibal
+ creep: Creep
+ human: Human
+ misc: Misc
+ muddyCannibal: Muddy Cannibal
+ details:
+ area: Area
+ classification: Classification
+ family: Family
+ gender: Gender
+ killedByPlayer: Killed by Player
+ lastSpawnTime: Last Spawn Time
+ lastVisitedTime: Last Visited Time
+ spawnedCount: Spawned Count
+ state: State
+ uniqueId: UniqueID
+ gender:
+ female: Female
+ male: Male
+ grouping:
+ animals: Animals
+ creeps: Creeps
+ femaleCannibals: Female Cannibals
+ femaleMuddyCannibals: Female Muddy Cannibals
+ maleCannibals: Male Cannibals
+ maleMuddyCannibals: Male Muddy Cannibals
+ misc: Misc
+ mixed: Mixed
+ mixedCannibals: Mixed Cannibals
+ mixedMuddyCannibals: Mixed Muddy Cannibals
+ noFamily: No Family
+ headers:
+ influences: Influences
+ info: Info
+ killStatistics: Kill Statistics
+ modificationOptions: Modification Options
+ modifications: Modifications
+ selection: Selection
+ stats: Stats
+ influenceType:
+ Cannibal: Cannibal
+ Creepy: Creepy
+ Player: Player
+ modificationMode:
+ Modify: Modify
+ Remove: Remove
+ modificationOptions:
+ allActorSelections:
+ allActors: All Actors
+ allActorsOfSameFamily: All Actors of the same family
+ allActorsOfSameType: All Actors of the same type
+ thisActor: This Actor
+ onlyInSameAreaAsActor: Only in the same area as this actor
+ removeSpawner:
+ text: Remove Spawner
+ tooltip: If selected the NPC should not spawn again
+ replaceType: Replace Type
+ skipKelvin: Skip Kelvin
+ skipVirginia: Skip Virginia
+ teleport:
+ disclaimer: Be careful if you teleport multiple actors to the same location. This might crash your game!
+ none: None
+ npcToPlayer: NPC to Player
+ playerToNpc: Player to NPC
+ teleportLabel: 'Teleport:'
+ updateInfluences: Update Influences
+ state:
+ -1: None
+ 0: Any
+ 1: Combat
+ 2: World
+ 3: Sleeping
+ 4: Dying
+ 5: Injured
+ 6: Dead
+ 7: Flying
+ 8: Stalking
+ 20: Burning
+ 21: Electrocuted
+ 22: Swimming
+ 23: Stunned/Hit
+ 24: Drowning/Thrown
+ 25: Golf Cart
+ 40: On Rock
+ 41: On Tree
+ 42: Under Leaves
+ 43: Wall Walking
+ 44: Captured
+ 45: Boss Intro
+ 46: Spawn Intro
+ 47: Ceiling
+ 48: Underground Cave
+ 50: Leave Combat
+ 51: Despawned
+ stats:
+ affection: Affection
+ anger: Anger
+ energy: Energy
+ fear: Fear
+ fullness: Fullness
+ fullnessBuff: Fullness Buff
+ health: Health
+ hydration: Hydration
+ hydrationBuff: Hydration Buff
+ rest: Rest
+ restBuff: Rest Buff
+ stamina: Stamina
+ types:
+ 1: Rabbit
+ 2: Squirrel
+ 3: Turtle
+ 4: Shark
+ 5: Seagull
+ 6: Eagle
+ 7: Duck
+ 8: Timmy
+ 9: Kelvin
+ 10: Virginia
+ 11: Fingers
+ 12: Carl
+ 13: Andy
+ 14: Danny
+ 15: Billy
+ 16: GoldMask
+ 17: Moose
+ 18: Baby
+ 19: Twins
+ 20: Mr. Puffy
+ 21: Mrs. Puffy
+ 22: Slug
+ 23: Angel
+ 24: Salmon
+ 25: Brandy
+ 26: Crystal
+ 27: Destiny
+ 28: Muddy Female
+ 29: Muddy Male
+ 30: Heavy Male
+ 31: Sponge Test
+ 32: Bat
+ 33: Deer
+ 34: Bluebird
+ 35: Hummingbird
+ 36: Killer Whale
+ 37: Land Turtle
+ 38: Fat Male
+ 39: Fat Female
+ 40: John2
+ 41: Faceless Male
+ 42: Demon
+ 43: Painted Male
+ 44: Painted Female
+ 45: Demon Boss
+ 46: Mr. Puffton
+ 47: Mrs. Puffton
+ 48: Boss Mutant
+ 49: Mutant Virginia
+ 50: Armsy
+ 51: Frank
+ 52: Eddy
+ 53: Greg
+ 54: Henry
+ 55: Igor
+ 56: Elise
+ 57: Raccoon
+ 58: Legsy
+ 59: Holey
+ 60: Skunk
+ 90: Helicopter
+ 100: PlayerRobby
+armor:
+ buttons:
+ default: Default
+ max: Max
+ remove: Remove
+ setAllToDefault:
+ text: Set all to Default
+ tooltip: Set durability of all armor pieces to default
+ setAllToMax:
+ text: Set all to Max
+ tooltip: Set durability of all armor pieces to max
+ setToDefault:
+ text: Default
+ tooltip: Set to the armors default durability
+ setToMax:
+ text: Max
+ tooltip: Set the armors durability to an arbitrarily high number
+ durabilityInput:
+ tooltip: The durability of the armor. If it is 0, the armor breaks. Can be very high
+ watermark: Durability
+ header: Equipped Armor (Max. 10)
+ headers:
+ actions: Actions
+ durability: Durability
+ id: ID
+ name: Name
+ slot: Slot
+ unknownItem: ??? Unknown Item
+backup:
+ messages:
+ backupsRestored:
+ text: '{0} backups have been restored. Deleted files were moved to the recycle bin'
+ title: Backups restored
+ mode:
+ Default: Backup always
+ InitialAndOne: Always keep original, one additional backup
+ None: No Backups
+ One: Keep one backup and overwrite
+companion:
+ address: IP/Address
+ connect: Connect
+ connectionFailed:
+ text: An attempt to connect to the companion plugin failed
+ textException: 'An attempt to connect to the companion plugin failed. Error: {0}'
+ title: Companion Connection failed
+ connectionSuccessful:
+ text: >-
+ Successfully connected to the companion.
+
+ You may now use the ingame hotkeys, live-teleportation via map and live position tracking
+ title: Companion connected
+ connectTimeout: Connect Timeout
+ disconnect: Disconnect
+ disconnectFailed:
+ text: An attempt to disconnect from the companion plugin failed
+ textException: 'An attempt to disconnect from the companion plugin failed. Error: {0}'
+ title: Companion Disconnect failed
+ keepAliveInterval: Keep-Alive Interval
+ mapPositionUpdateInterval: Update Player Positions every
+ port: Port
+ portHint: Ports > 1024 require the program and game to be executed as an admin!
+ readme: Readme
+ readme1: >-
+ The companion provides some added functionality to the game, like ingame teleportation, position tracking and much more.
+
+
+ Before you can use the Companion, you have to set it up first. In order to do so, you have to setup two things in your game:
+
+
+ - BepInExPack
+
+ - SOTFEdit Companion Plugin
+
+
+ You can get them here and install them either manually, following the README, or use a mod manager:
+ readme2: >-
+ After both are setup and the game is launched, you have to connect to the Companion using the menu.
+
+
+ Afterwards, ingame you have two new hotkeys:
+
+ - Ingame Teleport to most of the ingame locations (Default: F8)
+
+ - Create Custom Teleport POI (Default: F9)
+
+
+ At the same time, your position on the map will be live updated.
+ settings: Settings
+ status:
+ connected: Connected
+ connecting: Connecting...
+ disconnected: Disconnected
+dialogs:
+ changeScrewStructureType:
+ disclaimer: You can select a different structure type here. Please keep in mind that the rotation and location of the structure will stay the same, which could lead to bugs and crashes.
+ spawnFollower:
+ disclaimer: >-
+ If you want to spawn followers, you have to make sure that you are at an open space. The followers will be spawned at the players position above the players current height and a slight offset.
+
+
+ I tried many things for Virginia but only could get a maximum of 4 to spawn. It was better with Kelvin.
+
+
+ This might kill your FPS and the long term consequences are also not known right now.
+
+
+ If you want to have more, you should load the game, let everything spawn, save the game, spawn followers and so on.
+ title: Spawn Follower
+ translations:
+ filter: Filter
+ missingOnly: Missing Only
+errors:
+ canNotBeEmpty: '{0} can not be empty'
+experiments:
+ fires:
+ noFires:
+ text: No fires found to be modified
+ title: No fires
+ success:
+ text: '{0} fires have been lit, refueled and their drain rate changed'
+ title: Fires changed
+ resetCannibalAngerLevel:
+ success:
+ text: Changes added. Please save to persist them
+ title: Changes added
+ resetStructureDamage:
+ noDamage:
+ text: No structure damage has to be repaired
+ title: No structure damage
+ success:
+ text: '{0} structural damages have been repaired'
+ title: Damages repaired
+followers:
+ buttons:
+ fillAllBars: Fill all bars
+ moveToKelvin: Move to Kelvin
+ moveToPlayer: Move to Player
+ moveToVirginia: Move to Virginia
+ revive: Revive
+ spawn: Spawn
+ details:
+ status: Status
+ uniqueId: Unique ID
+ equipmentLabel: Equipment
+ outfitLabel: Outfit
+ outfits:
+ 9:
+ -1: Default
+ 0: Tactical Jacket
+ 1: Tuxedo
+ 2: Pajamas
+ 3: Brown Leather Jacket
+ 4: Hoodie
+ 5: Blue TShirt
+ 6: Blazer
+ 7: Black Leather Jacket
+ 8: Space Suit
+ 9: Priest Outfit
+ 10: Stewardess Outfit
+ 10:
+ -1: Default
+ 0: Swim Suit
+ 1: Track Suit
+ 2: Leather Suit
+ 3: Camouflage Suit
+ 4: Dress
+ 5: Teal Dress
+ 6: Red Dress
+ reviveTooltip: Make sure you do this outside of buildings when the body is missing, else you might glitch into the building\nThe follower will spawn at the players position and will have the items and outfit equipped as configured at the right
+ status:
+ alive: Alive
+ dead: Dead
+ unknown: ???
+game:
+ setup:
+ animalSpawnRate:
+ _label: Animal Spawn Rate
+ buildingResistance: Building Resistance
+ coldPenalties: Cold Penalties
+ coldPenaltiesStatReduction: Stat Regeneration Penalties
+ consumableEffects:
+ _label: Consumable Effects
+ _tooltip: How much damage you take eating bad food
+ creativeMode: Creative Mode
+ customSettings: Custom Settings
+ dayLength:
+ default: Default
+ long: Long
+ realistic: Realistic
+ short: Short
+ _label: Day Length
+ enemyAggression:
+ _label: Enemy Aggression
+ enemyArmour:
+ _label: Enemy Armor
+ enemyDamage:
+ _label: Enemy Damage
+ enemyHealth:
+ _label: Enemy Health
+ enemySearchParties:
+ _label: Enemy Search Parties
+ forcePlaceFullLoad: Instant Building
+ header: Game Setup
+ headers:
+ enemiesCustom: Enemies
+ multiplayer: Multiplayer
+ weatherCustom: Weather
+ immortalMode: God Mode
+ inventoryPause: Pause in Inventory
+ mode:
+ creative: Creative
+ custom: Custom
+ hard: Hard
+ hardSurvival: Hard Survival
+ normal: Normal
+ peaceful: Peaceful
+ _label: Mode
+ noCuttingsSpawn: No Cuttings Spawn
+ oneHitToCutTrees: One hit to cut trees
+ playerStatsDamage:
+ _label: Player Stats Damage
+ _tooltip: How much damage you take from starvation and etc.
+ playersTriggerTraps: Players Trigger Traps
+ precipitationFrequency:
+ _label: Precipitation Frequency
+ _tooltip: How often does the weather change
+ pvpDamage: PvP Damage
+ reducedAmmoInContainers: Reduced Ammo in Containers
+ reducedFoodInContainers: Reduced Food in Containers
+ seasonLength:
+ default: Default
+ long: Long
+ realistic: Realistic
+ short: Short
+ _label: Season Length
+ settingsValues:
+ default: Default
+ hard: Hard
+ high: High
+ low: Low
+ normal: Normal
+ off: Off
+ reduced: Reduced
+ singleUseContainers: Single-Use Containers
+ spawnEnemies: Spawn Enemies
+ startingSeason:
+ autumn: Autumn
+ spring: Spring
+ summer: Summer
+ winter: Winter
+ _label: Starting Season
+ uid: UID
+ state:
+ header: Game State
+ headers:
+ worldObjectStates: World Object States
+ worldObjectStates:
+ disclaimer: >-
+ I haven't fully investigated which values represent which state. Presumably:
+
+ - 0 = Unset/Closed/Not happened
+
+ - 1 or 3 = Set/Opened/Happened
+ header: World Object States
+generic:
+ add: Add
+ cancel: Cancel
+ close: Close
+ edit: Edit
+ error: Error
+ exceptionMessage: 'An exception has occured: {0}'
+ name: Name
+ no: No
+ ok: OK
+ position: Position
+ save: Save
+ seconds: Second(s)
+ setting: Setting
+ success: Success
+ unknown: Unknown
+ update: Update
+ value: Value
+ yes: Yes
+influences:
+ anger: Anger
+ disclaimer: >-
+ Sentiment defines the affection, yet it is not clear how this influences enemies.
+
+ When the Fear value is high, enemies run away more often.
+
+ A high value in Anger increases the likelihood of attacks.
+ fear: Fear
+ sentiment: Sentiment
+inventory:
+ buttons:
+ addAllFromCategory: Add All from Category
+ max: Max
+ remove: Remove
+ removeAll: Remove All
+ setAllToMax: Set all to Max
+ setAllToMin: Set all to Min
+ filterWatermark: Filter...
+ headers:
+ itemsInInventory: Items in Inventory
+ unassignedItems: Unassigned Items
+ table:
+ actions: Actions
+ count:
+ text: Count
+ tooltip: The amount that you have in your inventory
+ id: ID
+ name: Name
+ type: Type
+ unknownItem: ??? Unknown Item
+items:
+ 78: Log
+ 340: Guitar
+ 341: Binoculars
+ 346: Shotgun Rail
+ 351: Grab & Go Bag
+ 353: Stun Gun
+ 354: Night Vision Goggles
+ 355: Compact Pistol
+ 356: Modern Axe
+ 357: Airgun
+ 358: Shotgun
+ 359: Machete
+ 360: Compound/Tactical Bow
+ 361: Rifle
+ 362: Pistol Ammo
+ 363: Shotgun Slug
+ 364: Shotgun Buckshot
+ 365: Crossbow
+ 366: Tracker Dart
+ 367: Katana
+ 368: Crossbow Bolt
+ 369: Stun Gun Ammo
+ 370: Pistol Ammo
+ 371: Shotgun Buckshot
+ 372: Shotgun Slug
+ 373: Carbon Fiber Arrow
+ 374: Pistol Suppressor/Silencer
+ 375: Laser Sight
+ 376: Pistol Rail
+ 377: Scope
+ 378: Flashlight Attachment
+ 379: Tactical Axe
+ 380: Utility Knife
+ 381: Grenade
+ 382: GrenadeAmmo
+ 383: Rifle Rail Mod
+ 384: Crossbow Quiver
+ 386: Revolver
+ 387: Rifle Ammo
+ 388: Molotov
+ 389: MolotovAmmo
+ 390: Printer Resin
+ 391: Red Mask
+ 392: Stick
+ 393: Rock
+ 394: Chainsaw
+ 395: Log Plank
+ 396: Stun Baton
+ 397: Shiitake
+ 398: King Oyster
+ 399: Hydnum Repandum
+ 400: Fly Amanita
+ 401: Turtle Egg
+ 402: Backpack
+ 403: Rope
+ 405: Bone
+ 406: Quarter Log
+ 408: Half Log
+ 409: Three Quarter Log
+ 410: Watch
+ 412: GPS Tracker
+ 413: Plasma Lighter
+ 414: Vodka Bottle
+ 415: Cloth
+ 416: Circuit Board
+ 417: Time Bomb
+ 418: Wire
+ 419: Duct Tape
+ 420: C4 Brick
+ 421: Ramen Noodles
+ 422: Repair Tool
+ 423: Novel [Pennant Line]
+ 424: Novel [Deep Sleep]
+ 425: Crunchie Wunchies
+ 426: Printed Flask
+ 427: Printed Knife
+ 428: Printed Sled
+ 429: Printed Scuba Mask
+ 430: Skull
+ 431: Firefighter Axe
+ 432: Can Opener
+ 433: Meat
+ 434: Canned Food
+ 435: Golden Mask
+ 436: Fish
+ 437: Meds
+ 438: MRE Pack
+ 439: Energy Drink
+ 440: Flare
+ 441: Energy Bar
+ 443: Crafted Bow
+ 444: Rebreather
+ 445: Blueberries
+ 446: Twinberries
+ 447: Salmonberries
+ 448: Snowberries
+ 449: Devil's Club
+ 450: Horsetail
+ 451: Aloe Vera
+ 452: Yarrow
+ 453: Fireweed
+ 454: Arrowleaf
+ 455: Health Mix
+ 456: Health Mix+
+ 457: Stun Gun Ammo
+ 458: Battery Charger
+ 459: Slingshot
+ 460: Battery Pack
+ 461: Energy Mix
+ 462: Energy Mix+
+ 463: Flippers
+ 464: Cat Food
+ 465: Chicory
+ 466: Oyster
+ 467: Album Cover
+ 468: Cross
+ 469: Air Canister
+ 470: Airgun Scope
+ 471: Flashlight
+ 472: Deer Hide
+ 473: Leaf Armour
+ 474: Crafted Spear
+ 475: Flask
+ 476: Small Rock
+ 477: Crafted Club
+ 478: Climbing Axe
+ 479: Feather
+ 480: Severed Arm
+ 481: Severed Leg
+ 482: Severed Head
+ 483: Emergency Pack
+ 484: Leaf
+ 485: Shovel
+ 486: Walkie Talkie
+ 487: Silk Pajamas
+ 488: Blue TShirt
+ 489: Tactical Pants
+ 490: Hoodie
+ 491: Blazer
+ 492: Tuxedo
+ 493: Leather Jacket
+ 494: Bone Armour
+ 495: Tactical Jacket
+ 496: Money
+ 497: Food Tray
+ 498: GRABS Laser Pointer
+ 499: Wetsuit
+ 500: Winter Jacket
+ 501: Tactical Boots
+ 502: Coins
+ 503: Torch
+ 504: Tarp
+ 505: Laser Measure Tool
+ 506: Turtle Shell
+ 507: Stone Arrow
+ 508: Skin Pouch
+ 509: Holosprings Pamphlet
+ 511: Contact Trigger
+ 512: Filled Food Tray
+ 513: Spring
+ 514: Contact Spring Trigger
+ 515: Basic Building Tutorial Page
+ 516: Tarp Tent Tutorial Page
+ 517: Cooking Pot
+ 518: Paper Target
+ 519: Deer Hide Armour
+ 520: Structure Element
+ 521: Email [More Lighting]
+ 522: Rope Gun
+ 523: Zipline Rope
+ 524: Golf Ball
+ 525: Putter
+ 526: Mr Puffy Will
+ 527: Batteries
+ 528: MrPuffy Financials
+ 529: GPS Locator
+ 530: Drying Rack Blueprint
+ 531: Stick Chair Blueprint
+ 532: Stick Bed Blueprint
+ 533: Weapon Rack Blueprint
+ 534: Golf Email Pt 1
+ 535: Golf Email Pt 2
+ 536: Golf Email Pt 3
+ 537: Golf Email Pt 4
+ 538: Painting Email
+ 539: Document [Out Demonia]
+ 540: Document [Crosses burn Demons]
+ 541: Document [Cube Activation Cycles]
+ 542: Email [Thought you might find this interesting]
+ 543: Email [Another one]
+ 544: Email [One more]
+ 545: Email [Photo Reference]
+ 546: Email [Note to all employees]
+ 547: Email [Safe in Cube]
+ 548: Document [Stay in the Cube]
+ 549: Bone Maker Blueprint
+ 550: Fly Swatter Blueprint
+ 551: Small Animal Catcher Blueprint
+ 552: S.C.R.E.W.
+ 553: Tech Mesh
+ 554: Tech Armour
+ 555: Track Suit
+ 556: Dress
+ 557: Leather Suit
+ 558: Camouflage Suit
+ 559: Printed Arrow Heads
+ 560: Printed Grappling Hook
+ 561: Printed Flower Pot
+ 562: HolovilleNoticeA
+ 563: HolovilleNoticeB
+ 564: HolovilleNoticeC
+ 565: HolovilleNoticeD
+ 566: Maintenance Key Card
+ 567: Guest Key Card
+ 568: VIP Key Card
+ 569: Brain Bite
+ 570: Steak Bite
+ 571: Steak and Bacon Bite
+ 572: Ancient Armor
+ 573: Sleeping Bag
+ 574: Novel [Rescued]
+ 575: Novel [Parallel Universes]
+ 576: Quarter Log Plank
+ 577: Half Log Plank
+ 578: Three Quarter Log Plank
+ 579: Bone Chair Blueprint
+ 580: Stick Ladder Blueprint
+ 581: Bird House Blueprint
+ 582: Fish Trap Blueprint
+ 583: Storage Box Blueprint
+ 584: Mannequin Blueprint
+ 585: Scarecrow Blueprint
+ 586: Planter Wall Blueprint
+ 587: Planter Floor Blueprint
+ 588: Bone Chandelier Blueprint
+ 589: S.C.R.E.W. / Tutorials
+ 590: Radio
+ 591: Small Log Cabin Blueprint
+ 592: Creepy Skin
+ 593: Creepy Armour
+ 594: Guarana Berries
+ 595: Blackberries
+ 596: AloeVera Seed
+ 597: Arrowleaf Seed
+ 598: Blackberry Seed
+ 599: Blueberry Seed
+ 600: DevilsClub Seed
+ 601: Fireweed Seed
+ 602: Guarana Seed
+ 603: Horsetail Seed
+ 604: Salmonberry Seed
+ 605: Chicory Seed
+ 606: Yarro Seed
+ 607: Rock Storage Blueprint
+ 608: Stone Storage Blueprint
+ 609: Log Storage Blueprint
+ 610: Sticks Storage Blueprint
+ 611: Numbers Printout
+ 612: Newspaper Cutout [Missing CEO]
+ 613: Newspaper Cutout [Puffcorp]
+ 614: E-Mail [Artifact - Preliminary Findings]
+ 615: E-Mail [Scientific Data - Cube]
+ 616: Classified Document
+ 617: Stock Price
+ 618: Printed Arrow
+ 619: Swim Suit
+ 620: Table Blueprint
+ 621: Shelf Blueprint
+ 622: Rock Path Blueprint
+ 623: Wall Shelf Blueprint
+ 624: Wall Torch Blueprint
+ 625: Hanging Skull Light Blueprint
+ 626: Foldable Glider
+ 627: Mr. Puffton's Reservation Card
+ 628: Mrs. Puffton's Reservation Card
+ 629: Rain Catcher Blueprint
+ 630: KnightV
+ 631: The Realm Beyond
+ 632: Spring Trap Blueprint
+ 633: Cult Pamphlet
+ 634: Solar Panel
+ 635: Light Bulb
+ 636: TemplateD
+ 637: Action Camera
+ 638: Basic Log Sled Blueprint
+ 639: Space Suit
+ 640: Stone
+ 641: Stone Fireplace Blueprint
+ 642: Duck Head
+ 643: Eagle Head
+ 644: Small Turtle Head
+ 645: Head Trophy Mount Blueprint
+ 646: Rabbit Head
+ 647: Squirrel Head
+ 648: Seagull Head
+ 649: Stones Storage Blueprint
+ 650: Turtle Head
+ 651: Deer Head
+ 652: Moose Head
+ 653: Personal Note A
+ 654: Personal Note B
+ 655: Personal Note C
+ 656: Blueprint Hokey Pokey Trap
+ 657: Printed GPS Case
+ 658: Radio Trap Blueprint
+ 659: Radio Blueprint
+ 661: Golf Cart Battery
+ 662: Artifact Piece A
+ 663: Pickaxe
+ 664: Solafite Ore
+ 665: Item Plating Blueprint
+ 666: Powered Cross Blueprint
+ 667: Artifact Piece B
+ 668: Artifact Piece C
+ 669: Artifact Piece D
+ 670: Gore Chair Blueprint
+ 671: Gore Couch Blueprint
+ 672: Uber Trap Blueprint
+ 673: Round Table Blueprint
+ 674: Old Note A
+ 675: Old Note B
+ 676: Old Note C
+ 677: Fishing Email A
+ 678: Fishing Email B
+ 679: Grind Trap Blueprint
+ 680: Spotlight Blueprint
+ 681: Clock Blueprint
+ 682: Spin Trap Blueprint
+ 683: Double Bed Blueprint
+ 684: Old Note E
+ 685: Old Note D
+ 686: Cult Sign F
+ 687: Puffton Email A
+ 688: Spear Thrower Trap Blueprint
+ 689: Artifact Piece E
+ 690: Story Pages
+ 691: Old Note F
+ 692: Fishing Email C
+ 693: Bunker Map A
+ 694: Jianyu Email Printout A
+ 695: Cult Sign G
+ 696: Cult Sign H
+ 697: Cult Sign I
+ 698: Cult Sign J
+ 699: Cult Sign K
+ 700: Spear Storage Blueprint
+ 701: Leg Lamp Blueprint
+ 702: Firewood Storage Blueprint
+ 703: Priest Outfit
+ 704: Wall Weapon Rack Blueprint
+ 705: Circus Pamphlet
+ 706: Newspaper Cutout [Husbands]
+ 707: Artifact
+ 708: Artifact Piece F
+ 709: Teleporter Blueprint
+ 710: Repel Shrine Blueprint
+ 711: Attract Shrine Blueprint
+ 712: Artifact Piece G
+ 713: Plater Counter Blueprint
+ 714: Gold Armor Plater Blueprint
+ 715: Raccoon Head
+ 716: Bible Paper D
+ 717: Old Note G
+ 718: Personal Note E
+ 719: Personal Note F
+ 720: Personal Note G
+ 721: Bible Paper Scrap A
+ 722: Puffton Email B
+ 723: Puffton Email C
+ 724: Twinberry Seed
+ 725: Snowberry Seed
+ 726: Hang Glider Launcher Blueprint
+ 727: Solafite Armor
+ 728: Living Rabbit
+ 729: Skunk Head
+ 730: Small Rabbit Hutch Blueprint
+ 749: Stewardess Outfit
+itemTypes:
+ ammo: Ammo
+ armor: Armor
+ attachment: Attachment
+ blueprint: Blueprint
+ bodyPart: Body Part
+ book: Book
+ clothes: Clothes
+ consumable: Consumable
+ container: Container
+ document: Document
+ electricity: Electricity
+ equipment: Equipment
+ food: Food
+ key: Key
+ log: Log
+ misc: Misc
+ plant: Plant
+ printed: Printed
+ seed: Seed
+ tool: Tool
+ trophy: Trophy
+ weapon: Weapon
+ weaponMod: Weapon Modification
+itemVariants:
+ 433:
+ 1: Raw Meat
+ 2: Unknown Meat
+ 3: Spoiled Meat
+ 4: Dried Meat
+ 5: Cooked Meat
+ 6: Burned Meat
+ 436:
+ 1: Raw Fish
+ 2: Unknown Fish
+ 3: Spoiled Fish
+ 4: Dried Fish
+ 5: Cooked Fish
+ 6: Burned Fish
+ 480:
+ 1: Raw Arm
+ 2: Unknown Arm
+ 3: Spoiled Arm
+ 4: Dried Arm
+ 5: Cooked Arm
+ 6: Burned Arm
+ 481:
+ 1: Raw Leg
+ 2: Unknown Leg
+ 3: Spoiled Leg
+ 4: Dried Leg
+ 5: Cooked Leg
+ 6: Burned Leg
+languages:
+ de: Deutsch
+ en: English
+ pl: Polski
+map:
+ actors: Actors
+ altItems: Alternative Items
+ alwaysOnTop: Always on top
+ area: Area
+ areaFilter:
+ text: Area
+ types:
+ all: All
+ surfaceOnly: Surface only
+ undergroundOnly: Caves/Bunkers only
+ buttons:
+ createNewZipline:
+ text: New Zipline from here
+ tooltip: After you have clicked this button, the new zipline will be created between the current position and the next point that you click
+ delete: Delete
+ deleteBothAnchors: Delete both anchors
+ deselectAll: Deselect all
+ moveToNextClickedPosition:
+ hint: Please click now another location
+ text: Move to clicked position
+ tooltip: After you have clicked this button, the anchor will be moved to the next point that you click
+ spawnActors: Spawn Actors
+ teleportKelvin: Teleport Kelvin here
+ teleportPlayer: Teleport Player here
+ teleportVirginia: Teleport Virginia here
+ resetAllDone:
+ text: Reset All Done
+ tooltip: Unmark all POIs as done
+ markAsDone:
+ text: Mark as done
+ tooltip: Mark this POI as completed
+ markAsUndone:
+ text: Mark as undone
+ tooltip: Unmark this POI as completed
+ coordinates: Coordinates
+ customPois: Custom
+ details: Details
+ fill: Fill
+ followers: Followers
+ followPlayer: Follow Player
+ fullText:
+ text: Full Text
+ tooltip: Searches in title, description, item name and item category of the currently selected map marker categories
+ watermark: Title, Description, Item name...
+ inventoryFilter: Hide completed
+ isInInventory: Owned
+ isRuntimeCreated: Is Copy
+ isUnderground: Is underground
+ itemId: Item-ID
+ items: Items
+ mapType:
+ dark: Dark
+ original: Original
+ name: Name
+ objects: Objects
+ options: Options
+ pois: Points of Interest
+ requirements: Requirements
+ requirementsFilter:
+ text: Requirements
+ tooltip: Only show items, caves, bunkers etc. where you own the required items to access them, e.g. a shovel or key card
+ types:
+ AccessibleOnly: Only show accessible
+ All: All
+ InaccessibleOnly: Only show inaccessible
+ spawnWindow:
+ actorType: Actor Type
+ count: Count
+ disclaimer: Be careful with the positioning and number of enemies. It might crash the game. Some enemies can not be spawned at certain underground places.
+ doSpawn: Create Actors
+ family: Family
+ familyOfDestinationActor: Family of Destination Actor
+ information: Information
+ options: Options
+ position: Position
+ spaceBetween:
+ text: Space between
+ tooltip: Defines the space between each actor. The actors will be places in a uniform grid if this value is > 0
+ spawnPattern:
+ Cross: Cross
+ Grid: Grid
+ HorizontalLine: Horizontal Line
+ Random: Random
+ Rectangle: Rectangle
+ text: Spawn Pattern
+ VerticalLine: Vertical Line
+ title: Spawn Actors
+ structures: Structures
+ teleportation: Teleportation
+ teleportWindow:
+ destination: Destination
+ disclaimer: You can adjust the location here. If you spawn inside an enemy, chances are that you will be rocketed into the sky. X and Z determine the location, Y the height. Please make sure that the correct area is selected.
+ doTeleport: Teleport!
+ mode:
+ Kelvin: Kelvin
+ Player: Player
+ Virginia: Virginia
+ offset: Offset
+ title: Teleport
+ toTeleport: To teleport
+ wiki: Wiki Link
+ zipLineAnchor: Zip Line Anchor
+ zipLines: Zip Lines
+menu:
+ companion:
+ setup: Setup
+ text: Companion
+ file:
+ deleteAllBackups: Delete all backups
+ exit: Exit
+ openLastSavegame: Open last savegame...
+ openLastSavegameWithSavegame: Open {0}...
+ openSavegame: Open Savegame...
+ openSavegameDirInExplorer: Open Savegame Dir in Explorer
+ reloadCurrentSavegame: Reload Current Savegame
+ restoreFromBackup:
+ fromNewestBackup: From newest backup
+ fromOldestBackup: From oldest backup
+ text: Restore from Backups
+ save: Save
+ settings: Settings
+ text: File
+ help:
+ about: About...
+ changelog: Changelog
+ links:
+ discord: Discord
+ downloadLatestVersion: Download Latest Version
+ githubProject: GitHub Project
+ nexusMods: NexusMods
+ text: Links
+ thunderstoreIo: thunderstore.io
+ readme: Readme
+ text: '?'
+ translations: Translations
+ updates:
+ checkNow: Check now
+ checkOnStartup: Check on Startup
+ text: Updates
+ tools:
+ cloneWorldObjects:
+ text: Clone World Items...
+ tooltip: Clones World Items at the players position
+ eternalFires:
+ text: Eternal Fires
+ tooltip: Fires will be ignited, fuel drain rate is set low and amount of fuel is set very high
+ fires:
+ text: Fires
+ tooltip: Modify fires around the world
+ itemPlater:
+ text: Item and Structure Plater
+ tooltip: Adds or removes solafite plating to items in inventory, weapon racks, follower items and structures
+ map:
+ text: Interactive Map
+ tooltip: An interactive map
+ modifyConsumedItems:
+ text: Modify Consumed Items...
+ tooltip: In case you want to purge your memory about items that you have consumed already
+ regrowTrees: Regrow Trees...
+ resetCannibalAngerLevel:
+ text: Reset Cannibal Anger Level
+ tooltip: Resets the kill statistics, number of cut trees and village visit count, which leads to fewer and smaller cannibal raids
+ resetContainers:
+ text: Reset Containers
+ tooltip: Resets crates, boxes and cases in caves and the open world
+ resetFires:
+ text: Reset Fires
+ tooltip: Fires will be ignited, fuel drain rate and fuel amount is set to default
+ resetStructureDamage:
+ text: Reset Structure Damage
+ tooltip: Lets you repair all structures
+ resetTraps:
+ text: Reset Traps
+ tooltip: Resets all traps
+ setToEndgame:
+ text: Set to Endgame
+ tooltip: Sets the game to "Endgame" which will unlock some enemies
+ text: Tools
+ unlocks:
+ text: Unlocks
+ tooltip: Lets unlock certain game features
+ resetAllDone:
+ text: Reset POIs
+ tooltip: Reset POIs marked as done
+autoConnect: Auto Connect
+autoReload: Auto Reload
+npcs:
+ tabs:
+ byFamily:
+ disclaimer: 'A family represents a group of NPCs which belong to each other. In other words: A swarm, a tribe for example.'
+ text: By Family
+ byType: By Type
+player:
+ areaMask: Area
+ buttons:
+ moveToKelvin: Move to Kelvin
+ moveToVirginia: Move to Virginia
+ currentHealth: Current Health
+ fillAllBars: Fill all bars
+ mapGroupName: Player
+ maxHealth: Max Health
+ outfit: Outfit
+ sickness: Sickness
+ strengthLevel: Strength Level
+poiGroups:
+ Ammo: Ammo
+ Bunkers: Bunkers
+ Camps: Camps
+ CannibalVillages: Cannibal Villages
+ Caves: Caves
+ Crates: Crates
+ Doors: Doors
+ Helicopters: Helicopters
+ Info: Info
+ Items: Items
+ Lakes: Lakes
+ Laptops: Laptops
+ Ponds: Ponds
+ Printers: 3D-Printers
+ Supply: Supply
+ Villages: Villages
+storage:
+ batch:
+ allSlots: All Slots
+ clearAll: Clear All
+ fillAllWith: Fill all with
+ setAllToMax: Set All to Max
+ buttons:
+ fillAllStorages: Fill all Storages
+ errors:
+ currentStateNotDefined: CurrentState not defined for moduleId {0}
+ headers:
+ selectAStorage: Select a Storage
+ storageTypes: Storage Types
+ slot:
+ max: Max
+ remove: Remove
+structures:
+ added: Added
+ applyToAllOfSameType:
+ text: Apply to all of same type
+ tooltip: Applies the assigned items and count above to all storages of the same type
+ buildCost: Build Cost
+ buttons:
+ changeType: Change Type
+ setAllToAlmostFinish: Set all to "Almost Finish"
+ setAllToFinish: Set all to "Finish"
+ setAllToRemove: Set all to "Remove"
+ setAllToUnfinish: Set all to "Unfinish"
+ unmodifyAll: Un-modify all
+ categories:
+ furniture: Furniture
+ gardening: Gardening
+ misc: Misc
+ raft: Raft
+ shelter: Shelter
+ storage: Storage
+ traps: Traps
+ treeShelter: Tree Shelter
+ utility: Utility
+ category: Category
+ headers:
+ batch: Batch
+ finishedStructures: Finished Structures
+ unfinishedStructures: Unfinished Structures
+ modification: Modification
+ modificationMode:
+ AlmostFinish: Almost Finish
+ Finish: Finish
+ None: None
+ Remove: Remove
+ Unfinish: Un-finish
+ percentDone: Percent Done
+ structureTypeSelectorDisclaimer: If nothing is selected, all structures will be changed
+ types:
+ 19: Weapon Rack
+ 20: Stick Chair
+ 21: Bone Maker Trap
+ 22: Stick Bed
+ 23: Wall Planter
+ 24: Bone Chandelier
+ 25: Bone Chair
+ 26: Lean-to
+ 27: Drying Rack
+ 28: Tree Shelter 2
+ 29: Stick Storage
+ 31: Rock Storage
+ 32: Bone Storage
+ 34: Small Log Cabin
+ 35: Fish Trap
+ 36: Armor Rack
+ 37: Log Storage (Old)
+ 38: Look Out Tower
+ 39: Scarecrow
+ 40: Standing Planter
+ 41: Tree Platform 2
+ 42: Small Animal Trap
+ 43: Tree Platform 1
+ 44: Tree Shelter 1
+ 45: Fly Swatter Trap
+ 46: Stick Path
+ 47: Hunting Shelter
+ 48: Table
+ 49: Shelf
+ 50: Rock Path
+ 51: Wall Shelf
+ 52: Bench
+ 53: Wall Torch
+ 54: Ceiling Skull Lamp
+ 55: Zipline
+ 56: Rain Catcher
+ 57: Spring Trap
+ 58: Advanced Log Sled
+ 59: Basic Log Sled
+ 60: Stone Fireplace
+ 61: Head Trophy
+ 62: Stone Storage
+ 63: Hokey Pokey Trap
+ 64: Radio Alarm Trap
+ 67: Large Log Storage
+ 68: Deer Hide Rug
+ 70: Item Plating
+ 71: Powered Cross
+ 72: Gore Chair
+ 73: Gore Couch
+ 74: Uber Trap
+ 75: Round Table
+ 76: Grind Trap
+ 77: Spotlight
+ 78: Clock
+ 79: Spin Trap
+ 80: Double Bed
+ 81: Spear Thrower Trap
+ 82: Spear Rack
+ 84: Firewood Storage
+ 85: Leg Lamp
+ 86: Wall Weapon Rack
+ 88: Teleporter
+ 89: Repel Shrine
+ 90: Attract Shrine
+ 91: Couch
+ 92: Leaf Trap
+ 93: Molotov Tripwire Trap
+ 94: Explosive Tripwire Trap
+ 95: Arrow Holder
+ 96: Log Storage
+ 97: Chair (Fur)
+ 98: Small Platform
+ 99: Medium Platform
+ 100: Plater Counter
+ 101: Gold Armor Plater
+ 102: Hang Glider Launcher
+ 103: Hang Glider Launcher
+ 104: Explosive Storage
+ 106: Rabbit Hutch
+ 107: Small Rabbit Hutch
+ 108: House Boat
+ 109: Knight-V Holder
+ 110: Bird House
+ 113: Foldable Glider Holder
+ 117: Small Raft
+ 118: Mooring
+ 119: Large Raft
+tabs:
+ followers: Followers
+ game: Game
+ inventory: Inventory
+ npcs: NPCs
+ player: Player
+ storage: Storage
+ structures: Structures
+weather:
+ header: Weather State
+windows:
+ main:
+ title: '{0} v{1} [{2}, {3} ({4})]'
+ connection:
+ connected: 'Connected: {0}:{1}'
+ connecting: Connecting...
+ disconnected: Not connected
+ savegame:
+ loaded: 'Savegame: {0}\{1}'
+ none: No Savegame loaded
+ map:
+ buttons:
+ markAsDone: Mark as done
+ markAsUndone: Mark as undone
+ itemPlater:
+ buttons:
+ addPlating: Add Plating
+ removePlating: Remove Plating
+ constructionCategories:
+ Item: Item
+ Log: Log
+ LogPlank: Log Plank
+ Stick: Stick
+ Stone: Stone
+ constructions: Constructions
+ disclaimer: >-
+ Be careful: The tool ONLY saves changes to the plating and reloads the savegame afterwards.
+
+
+ So make sure that there are no unsaved changes, else save the other changes before, THEN open the tool and apply the plating.
+
+
+ Moreover, when you save, it can take some time if your savegame is rather huge.
+ followerItems: Follower Items
+ itemsInInventory: Items in Inventory
+ itemsInWeaponRacks: Items in Weapon Racks
+ messages:
+ addPlating: '{0} item platings have been added'
+ removePlating: '{0} item platings have been removed'
+ structures: Structures
+ title: Item and Structure Plater
+ modified: '{0}'
+ errors:
+ errorCheckingLastVersion: An error occured while checking for latest version
+ messages:
+ alreadyLatestVersion:
+ text: You are already using the latest version
+ title: No update
+ backupsDeleted: Deleted {0} backups
+ changesSaved: Changes saved successfully
+ confirmCloseApplication:
+ text: Do you want to close the application?
+ title: Close Application
+ confirmCreateBackup:
+ text: Do you want to create a backup?
+ title: Create a backup?
+ confirmDeleteBackups:
+ text: Do you really want to delete all backups?
+ title: Delete all backups
+ confirmOverwriteExternalChanges:
+ text: The savegame has been modified outside. Do you really want to overwrite any changes?
+ title: Overwrite Changes
+ confirmRestoreBackups:
+ text: Are you sure that you want to restore backups?
+ title: Restore backups
+ followerAlreadyAlive:
+ text: '{0} should be alive already'
+ title: No changes
+ followerRevived:
+ text: '{0} should now be back again'
+ title: Revived
+ followersCreated:
+ text: '{0} followers have been created'
+ title: Followers created
+ noChanges:
+ text: No changes - Nothing saved
+ title: No changes
+ saveChanges: Save Changes
+ unableToDeleteBackups: 'Unable to delete backups: {0}'
+ unableToSpawnFollowers: Unable to spawn followers
+ modifyConsumedItems:
+ key: Key
+ remove: remove
+ removeAll: Remove All
+ title: Modify Consumed Items
+ regrowTrees:
+ all: All
+ gone: Gone
+ halfChopped: Half-chopped
+ messages:
+ noTreesRegrown: No trees with state "{0}" regrown
+ success: '{0} trees with previous state "{1}" should now have regrown. Please save to persist the changes.'
+ pctRegrow: Regrow Percent
+ saveButton: Regrow Trees
+ stumps: Stumps
+ title: Regrow Trees
+ resetContainers:
+ messages:
+ containersReset:
+ text: '{0} Containers have been reset. Please save the changes to apply them to the savegame'
+ title: Containers reset
+ nothingToReset:
+ text: Nothing to reset found
+ title: Nothing found
+ resetTraps:
+ messages:
+ nothingToReset:
+ text: Nothing to reset found
+ title: Nothing found
+ trapsReset:
+ text: '{0} traps have been reset. Please save the changes to apply them to the savegame'
+ title: Traps reset
+ selectSavegame:
+ buttons:
+ change: Change...
+ setToDefault: Set to default
+ folderBrowserTitle: Select Sons of the Forest "Saves" Directory
+ headers:
+ location: Location
+ lastSaveTimeTooltip: Last write time of the savegame directory
+ selectedPath:
+ label: 'Selected Path:'
+ tooltip: Usually the Savegames are stored at C:\Users\[user]\AppData\LocalLow\Endnight\SonsOfTheForest\Saves
+ tabs:
+ multiplayer: Multiplayer
+ multiplayerClient: Multiplayer (Client)
+ singleplayer: Singleplayer
+ title: Select Savegame...
+ settings:
+ askForBackupsEveryTime: Ask for backups every time
+ backupMode: Backup Mode
+ fileMode:
+ label: File Mode
+ single: One backup per changed JSON file
+ zip: ZIP Archive
+ language: Language
+ messages:
+ languageChanged:
+ text: Please restart the application to apply the changed language
+ title: Settings saved
+ theme: Theme
+ title: Settings
+ unhandledException:
+ applicationVersion: Application Version
+ buttons:
+ copyErrorToClipboard: Copy Error to Clipboard
+ exitApplication: Exit Application
+ callstack: Callstack
+ disclaimer: An unexpected error occured. The application state might be corrupted.
+ exceptionMessage: Exception Message
+ exceptionType: Exception Type
+ header: Exception Details
+ innerException: Inner Exception
+ title: Unhandled Exception
+ unlocks:
+ coreGameCompleted: Core Game completed
+ creativeMode: Creative Mode
+ creativeModeItem: Creative Mode Item (?)
+ escapedIsland: Escaped Island
+ messages:
+ playerProfileNotFound: PlayerProfile.json could not be found at "{0}"
+ title: Unlocks
+ updateAvailable:
+ buttons:
+ download: Download
+ ignore: Ignore
+ header: An Update is available
+ title: Update available
+ worldItemCloner:
+ buttons:
+ cloneAtPlayerPosition:
+ text: Clone at Player Position
+ tooltip: Creates a clone of this object at the players position
+ removeAllCopies:
+ text: Remove all copies from map
+ tooltip: Removes all copies of this type from map
+ teleportObjectToPlayer:
+ text: Teleport object to player
+ tooltip: Teleports the object to the player
+ teleportPlayerToObject:
+ text: Teleport player to object
+ tooltip: Teleports the player to the object
+ messages:
+ clonesDeleted:
+ text: '{0} clones of {1} were removed'
+ title: Clones removed
+ nothingToDelete:
+ text: Nothing to delete
+ title: Nothing found
+ nothingToMove:
+ text: Nothing to move found
+ title: Nothing found
+ objectCloned:
+ text: A copy of {0} was created at player position. Please save changes to persist them
+ title: '{0} created'
+ pinTooltip: Show Object Position on Map
+ title: World Item Cloner
+ unknownItem: Unknown Item ({0})
+ unnamedItem: Unnamed ({0})
+ worldItem: World Item
+ map:
+ title: Map - {0}, {1} ({2})
+worldItemTypes:
+ GolfCart: Golf Cart
+ HangGlider: Hang Glider
+ KnightV: Knight V
+ Radio: Radio
diff --git a/SOTFEdit/data/lang/pl.json b/SOTFEdit/data/lang/pl.json
deleted file mode 100644
index b030b8f..0000000
--- a/SOTFEdit/data/lang/pl.json
+++ /dev/null
@@ -1,1626 +0,0 @@
-{
- "actors": {
- "classification": {
- "animal": "Zwierzę",
- "cannibal": "Kanibal",
- "creep": "Mutant",
- "human": "Człowiek",
- "misc": "Inne",
- "muddyCannibal": "Błotnisty Kanibal"
- },
- "details": {
- "area": "Obszar",
- "classification": "Klasyfikacja",
- "family": "Rodzina",
- "gender": "Płeć",
- "killedByPlayer": "Zabity przez gracza",
- "lastSpawnTime": "Ostatni czas respa",
- "lastVisitedTime": "Ostatni odwiedzony czas",
- "spawnedCount": "Ilość zrespionych",
- "state": "Stan",
- "uniqueId": "UniqueID"
- },
- "gender": {
- "female": "Kobieta",
- "male": "Mężczyzna"
- },
- "grouping": {
- "animals": "Zwierzęta",
- "creeps": "Mutanty",
- "femaleCannibals": "Kanibale Kobiety",
- "femaleMuddyCannibals": "Błotniste Kanibale Kobiety",
- "maleCannibals": "Kanibale Mężczyźni",
- "maleMuddyCannibals": "Błotniści Kanibale Mężczyźni",
- "misc": "Inne",
- "mixed": "Mieszane",
- "mixedCannibals": "Mieszane Kanibale",
- "mixedMuddyCannibals": "Błotniste Kanibale Mieszane",
- "noFamily": "Bez rodziny"
- },
- "headers": {
- "influences": "Odziaływania",
- "info": "Informacje",
- "killStatistics": "Statystyki zabójstw",
- "modificationOptions": "Opcje modyfikacji",
- "modifications": "Modyfikacje",
- "selection": "Selekcja",
- "stats": "Statystyki"
- },
- "influenceType": {
- "Cannibal": "Kanibal",
- "Creepy": "Mutant",
- "Player": "Gracz"
- },
- "modificationMode": {
- "Modify": "Zmień",
- "Remove": "Usuń"
- },
- "modificationOptions": {
- "allActorSelections": {
- "allActors": "Wszyscy NPC",
- "allActorsOfSameFamily": "Wszyscy NPC tej rodziny",
- "allActorsOfSameType": "Wszyscy NPC tego typu",
- "thisActor": "Ten NPC"
- },
- "onlyInSameAreaAsActor": "Tylko w okolicy tego NPC",
- "removeSpawner": {
- "text": "Usuń Spawner",
- "tooltip": "Jeżeli wybrane NPC nie powinien się zrespić"
- },
- "replaceType": "Zamień typ",
- "skipKelvin": "Pomiń Kelvins",
- "skipVirginia": "Pomiń Virginię",
- "teleport": {
- "disclaimer": "Bądź ostrożny przy teleportowaniu kilku NPC do tego samego miejsca. To może zcrashować grę!",
- "none": "Nic",
- "npcToPlayer": "NPC to Gracza",
- "playerToNpc": "Gracz do NPC",
- "teleportLabel": "Teleportuj:"
- },
- "updateInfluences": "Zaktualizuj oddziałwyania"
- },
- "state": {
- "-1": "Brak",
- "0": "Dowolny",
- "1": "Walka",
- "2": "Świat",
- "3": "Śpi",
- "4": "Umiera",
- "5": "Ranny",
- "6": "Martwy",
- "7": "Lata",
- "8": "Podkrada się",
- "20": "Pali się",
- "21": "Porażony prądem",
- "22": "Pływa",
- "23": "Ogłuszony",
- "24": "Topi się",
- "25": "Wózek Golfowy",
- "40": "Na skale",
- "41": "Na drzewie",
- "42": "Pod liśćmi",
- "43": "Chodzi po ścianach",
- "44": "Złapany",
- "45": "Intro do bossa",
- "46": "Spawn Intro",
- "47": "Sufit",
- "48": "Podziemna Jaskinia",
- "50": "Opuszcza walkę",
- "51": "Zdespawnował się"
- },
- "stats": {
- "affection": "Przywiązanie",
- "anger": "Złość",
- "energy": "Energia",
- "fear": "Strach",
- "fullness": "Nasycenie",
- "fullnessBuff": "Wzmocnienie nasycenia",
- "health": "Zdrowie",
- "hydration": "Nawodnienie",
- "hydrationBuff": "Wzmocnienie nawodnienia",
- "rest": "Odpoczynek",
- "restBuff": "Wzmocnienie odpoczynku",
- "stamina": "Stamina"
- },
- "types": {
- "1": "Królik",
- "2": "Wiewiórka",
- "3": "Rzułf",
- "4": "Rekin",
- "5": "Mewa",
- "6": "Orzeł",
- "7": "Kaczka",
- "8": "Timmy",
- "9": "Kelvin / Robby",
- "10": "Virginia",
- "11": "Fingers",
- "12": "Carl",
- "13": "Andy",
- "14": "Danny",
- "15": "Billy",
- "16": "Złota Maska",
- "17": "Łoś",
- "18": "Dziecko",
- "19": "Bliźniaki",
- "20": "Mutant jaskiniowy - Mężczyzna",
- "21": "Mutant jaskiniowy - Kobieta",
- "22": "Glut",
- "23": "Anioł",
- "24": "Łosoś",
- "25": "Brandy",
- "26": "Crystal",
- "27": "Destiny",
- "28": "Błotnista Kobieta",
- "29": "Błotnisy Mężczyzna",
- "30": "Ciężki Mężczyzna",
- "31": "Gąbka testowa",
- "32": "Nietoperz",
- "33": "Jeleń",
- "34": "Niebieski ptak",
- "35": "Koliber",
- "36": "Orka",
- "37": "Żółw Lądowy",
- "38": "Gruby Mężczyzna",
- "39": "Gruba Kobieta",
- "40": "Jan2",
- "41": "Bezimienny",
- "42": "Demon",
- "43": "Umalowany Mężczyzna",
- "44": "Umalowana Kobieta",
- "45": "Demon Boss",
- "46": "Pan Puffton",
- "47": "Pani Puffton",
- "48": "Boss Mutant",
- "49": "Virginia-Mutant",
- "50": "Armsy",
- "51": "Frank",
- "52": "Eddy",
- "53": "Greg",
- "54": "Henry",
- "55": "Igor",
- "56": "Elise",
- "57": "Szop Pracz",
- "58": "Legsy",
- "59": "Holey",
- "60": "Skunks",
- "90": "Helikopter",
- "100": "PlayerRobby"
- }
- },
- "armor": {
- "buttons": {
- "default": "Zwykły",
- "max": "Max",
- "remove": "Usuń",
- "setAllToDefault": {
- "text": "Ustaw wszystkie na zwykłą",
- "tooltip": "Ustawia wytrzymałość wszystkich pancerzów na zwykłą"
- },
- "setAllToMax": {
- "text": "Set all to Max",
- "tooltip": "Ustawia wytrzymałość wszystkich pancerzów na maksymalną"
- },
- "setToDefault": {
- "text": "Zwykły",
- "tooltip": "Ustawia wytrzymałość pancerza na zwykłą"
- },
- "setToMax": {
- "text": "Max",
- "tooltip": "Ustawia wytrzymałość pancerza na maksymalną"
- }
- },
- "durabilityInput": {
- "tooltip": "Wytrzymałość pancerza. Jeżeli będzie równe 0, pancerz się niszczy. Może być bardzo wysoka",
- "watermark": "Wytrzymałość"
- },
- "header": "Założony pancerz (Max. 10)",
- "headers": {
- "actions": "Akcje",
- "durability": "Wytrzymałość",
- "id": "ID",
- "name": "Nazwa",
- "slot": "Slot"
- },
- "unknownItem": "??? Nieznany przedmiot"
- },
- "backup": {
- "messages": {
- "backupsRestored": {
- "text": "{0} backups zostały przywrócone. Usunięte pliki przesunięto do kosza",
- "title": "Backupy przywrócone"
- }
- },
- "mode": {
- "Default": "Zawsze backupuj",
- "InitialAndOne": "Zawsze zostaw orginał i jeden dodatkowy bakup",
- "None": "Bez Backupów",
- "One": "Zostaw jeden backup i nadpisuj"
- }
- },
- "companion": {
- "address": "IP/Addres",
- "connect": "Połącz",
- "connectionFailed": {
- "text": "Próba połączenia do plugina nieudana",
- "textException": "Próba połączenia do plugina nieudana. Error: {0}",
- "title": "Połączenie do Companion nieudane"
- },
- "connectionSuccessful": {
- "text": "Połączono do Companion\r\nMożesz teraz używać hotkeyów w grze, teleportacji i śledzenia pozycji na żywo",
- "title": "Companion Połączony"
- },
- "connectTimeout": "Limit czasu połączenia",
- "disconnect": "Rozłącz",
- "disconnectFailed": {
- "text": "Próba rozłączenia do plugina nieudana",
- "textException": "Próba rozłączenia do plugina nieudana. Error: {0}",
- "title": "Rozłączenie Companion Nieudane"
- },
- "keepAliveInterval": "Interwał zostań-żywy",
- "mapPositionUpdateInterval": "Aktualizuj pozycję gracza co",
- "port": "Port",
- "portHint": "Ports > 1024 wymagają uruchomienia programu i gry jako admin!",
- "readme": "Readme",
- "readme1": "Companion dodaje niektóre dodatkowe funkcje do gry, takie jak teleportacja w grze, śledzenie pozycji i wiele innych.\n\nZanim będziesz mógł używać Companiona, musisz najpierw go skonfigurować. Aby to zrobić, musisz skonfigurować dwie rzeczy w swojej grze:\n\n- BepInExPack\n- SOTFEdit Companion Plugin\n\nMożesz je pobrać stąd i zainstalować ręcznie, postępując zgodnie z instrukcjami w README, lub użyć menedżera modów:",
- "readme2": "Po przygotowaniu obydwóch, i włączeniu gry, musisz połączyć do Companion używając menu.\n\nNastępnie, w grze, masz do dyspozycji dwie nowe skróty klawiszowe:\n\n- Teleportacja w grze do większości lokalizacji w grze (Domyślnie: F8)\n- Tworzenie niestandardowego punktu teleportacji POI (Domyślnie: F9)\n\nJednocześnie, Twoja pozycja na mapie będzie na bieżąco aktualizowana.",
- "settings": "Ustawienia",
- "status": {
- "connected": "Połączony",
- "connecting": "Łączenie...",
- "disconnected": "Rozłączony"
- }
- },
- "dialogs": {
- "changeScrewStructureType": {
- "disclaimer": "Możesz tutaj wybrać inny typ struktury. Pamiętaj, że obrót i położenie struktury pozostaną takie same, co może prowadzić do błędów i crashów."
- },
- "spawnFollower": {
- "disclaimer": "Jeśli chcesz zrodzić Kelvina/Virginię, musisz się upewnić, że jesteś na otwartej przestrzeni. Będą oni się pojawiać w pozycji gracza powyżej jego aktualnej wysokości i z lekkim przesunięciem.\n\nPróbowałem wielu rzeczy dla Virginii, ale tylko mogłem zespawnić maksymalnie 4. Z Kelvinem było lepiej.\n\nThis might kill your FPS and the long term consequences are also not known right now, bla bla bla.\n\nKontunuj na własne ryzyko.",
- "title": "Spawn Follower"
- },
- "translations": {
- "filter": "Fi",
- "missingOnly": "Tylko Brakujące"
- }
- },
- "errors": {
- "canNotBeEmpty": "{0} nie może być pusty"
- },
- "experiments": {
- "fires": {
- "noFires": {
- "text": "Nie znaleziono ognisk do zmodyfikowania",
- "title": "Brak ognisk"
- },
- "success": {
- "text": "{0} ognisk zostało podpalonych",
- "title": "Zmodyfikowano ogniska"
- }
- },
- "resetCannibalAngerLevel": {
- "success": {
- "text": "Dodano zmiany. Zapisz, żeby je zatrzymać",
- "title": "Dodano zmiany"
- }
- },
- "resetStructureDamage": {
- "noDamage": {
- "text": "Brak obrażeń do naprawienia",
- "title": "Brak obrażeń zadanych"
- },
- "success": {
- "text": "{0} obrażeń zostało naprawionych",
- "title": "Damages repaired"
- }
- }
- },
- "followers": {
- "buttons": {
- "fillAllBars": "Uzupełnij wszystkie paski",
- "moveToKelvin": "Przesuń do Kelvin",
- "moveToPlayer": "Przesuń do gracza",
- "moveToVirginia": "Przesuń do Virginii",
- "revive": "Odródź",
- "spawn": "Przywołaj"
- },
- "details": {
- "status": "Status",
- "uniqueId": "Unique ID"
- },
- "equipmentLabel": "Wyposażenie",
- "outfitLabel": "Strój",
- "outfits": {
- "9": {
- "-1": "Bazowy",
- "0": "Taktyczna kurtka",
- "1": "Smoking",
- "2": "Piżamy",
- "3": "Brązowa skórzana kurtka",
- "4": "Bluza z Kapturem",
- "5": "Niebieski TShirt",
- "6": "Garnitur",
- "7": "Czarna skórzana kurtka",
- "8": "Skafander Kosmiczny",
- "9": "Strój Księdza",
- "10": "Strój Stewardessy"
- },
- "10": {
- "-1": "Bazowy",
- "0": "Strój Kąpielowy",
- "1": "Dres",
- "2": "Strój skórzany",
- "3": "Strój kamuflujący",
- "4": "Sukienka",
- "5": "Turkusowa Sukienka",
- "6": "Czerwona Sukienka"
- }
- },
- "reviveTooltip": "Upewnij się, że robisz to poza budynkami, gdy brakuje ciała, w przeciwnym razie możesz wglithować do budynku\\n Kelwin/Virinia pojawi się na pozycji gracza i będzie miał przedmioty i strój skonfigurowane po prawej stronie.",
- "status": {
- "alive": "Żywy",
- "dead": "Martwy",
- "unknown": "???"
- }
- },
- "game": {
- "setup": {
- "animalSpawnRate": {
- "_label": "Ilość zwierząt"
- },
- "buildingResistance": "Odporność Budynków",
- "coldPenalties": "Kary za Zimno",
- "coldPenaltiesStatReduction": "Kary do odnowiania statystyk",
- "consumableEffects": {
- "_label": "Efekty złego jedzenia",
- "_tooltip": "Ile obrażeń dostaniesz po zjedzeniu złego jedzenia"
- },
- "creativeMode": "Tryb Kreatywny",
- "customSettings": "Specjane ustawienia",
- "dayLength": {
- "default": "Normalna",
- "long": "Długa",
- "realistic": "Realistyczna",
- "short": "Krótka",
- "_label": "Długość dnia"
- },
- "enemyAggression": {
- "_label": "Agresja przeciwników"
- },
- "enemyArmour": {
- "_label": "Pancerz przeciwników"
- },
- "enemyDamage": {
- "_label": "Obrażenia od przeciwników"
- },
- "enemyHealth": {
- "_label": "Zdrowie przeciwników"
- },
- "enemySearchParties": {
- "_label": "Ekipy poszukiwawcze przeciwników"
- },
- "forcePlaceFullLoad": "Natychmiastowe Budowanie",
- "header": "Ustawienia gry",
- "headers": {
- "enemiesCustom": "Przeciwnicy (Custom)",
- "multiplayer": "Mulitplayer",
- "weatherCustom": "Pogoda (Custom)"
- },
- "immortalMode": "God-Mode",
- "inventoryPause": "Pauzuj w ekwipunku",
- "mode": {
- "creative": "Kreatywny",
- "custom": "Własny",
- "hard": "Trudny",
- "hardSurvival": "Trudny Survival",
- "normal": "Normalny",
- "peaceful": "Spokojny",
- "_label": "Tryb"
- },
- "noCuttingsSpawn": "No Cuttings Spawn",
- "oneHitToCutTrees": "1 trafienie do zniszczenia drzewa",
- "playerStatsDamage": {
- "_label": "Obrażenia od odwodnienia itp.",
- "_tooltip": "Ile obrażeń otrzymasz od odwodnienia itp."
- },
- "playersTriggerTraps": "Gracze uruchamiają pułapki",
- "precipitationFrequency": {
- "_label": "Zmiany pogody",
- "_tooltip": "Jak szybko zmienia się pogoda"
- },
- "pvpDamage": "Obrażenia PvP",
- "reducedAmmoInContainers": "Mniej ammunicji w pojemnikach",
- "reducedFoodInContainers": "Zmniejszona ilość jedzenia w pojemnikach",
- "seasonLength": {
- "default": "Normalne",
- "long": "Długie",
- "realistic": "Realistyczne",
- "short": "Krótkie",
- "_label": "Długość pór roku"
- },
- "settingsValues": {
- "default": "Normalnie",
- "hard": "Trudny",
- "high": "Często",
- "low": "Rzadko",
- "normal": "Średnia",
- "off": "Off",
- "reduced": "Zredukowane"
- },
- "singleUseContainers": "Pojemniki jednorazowego użytku",
- "spawnEnemies": "Przywołaj przeciwników",
- "startingSeason": {
- "autumn": "Jesień",
- "spring": "Wiosna",
- "summer": "Lato",
- "winter": "Zima",
- "_label": "Początkowa pora roku"
- },
- "uid": "UID"
- },
- "state": {
- "header": "Game State",
- "headers": {
- "worldObjectStates": "Stany obiektów w świecie"
- },
- "worldObjectStates": {
- "disclaimer": "Nie jest pewne co każdy stan oznacza. Prawdopodobnie:\n- 0 = Nie ustawiony/Zamknięty/Nie wydarzyło się\n- 1 or 3 = Ustawiony/Otwarty/Wydarzyło się",
- "header": "Stany obiektów w świecie"
- }
- }
- },
- "generic": {
- "add": "Dodaj",
- "cancel": "Anuluj",
- "close": "Zamknij",
- "edit": "Edytuj",
- "error": "Błąd",
- "exceptionMessage": "Pojawił się wyjątek: {0}",
- "name": "Nazwa",
- "no": "Nie",
- "ok": "OK",
- "position": "Pozycja",
- "save": "Zapisz",
- "seconds": "Sekund",
- "setting": "Ustawienia",
- "success": "Sukces",
- "unknown": "Nieznane",
- "update": "Aktualizuj",
- "value": "Wartość",
- "yes": "Tak"
- },
- "influences": {
- "anger": "Złość",
- "disclaimer": "Sentyment odpowiada za przywiązanie, aczkolwiek ciągle nie rozumiemy jak oddziałowywuje to na przeciwników.\nWyższa wartość strachu zwiększa szansę na ucieczkę przeiwników podczas walki.\nWyższy poziom złości zwiększa częstotliwość ataków.",
- "fear": "Strach",
- "sentiment": "Sentyment"
- },
- "inventory": {
- "buttons": {
- "addAllFromCategory": "Dodaj wszystkie z kategorii",
- "max": "Max",
- "remove": "Usuń",
- "removeAll": "Usuń wszystkie",
- "setAllToMax": "Ustaw ilość wszystkich na maksymalną",
- "setAllToMin": "Ustaw ilość wszystkich na minimalną"
- },
- "filterWatermark": "Filtruj...",
- "headers": {
- "itemsInInventory": "Przedmioty w ekwipunku",
- "unassignedItems": "Nieprzypisane przedmioty"
- },
- "table": {
- "actions": "Akcje",
- "count": {
- "text": "Ilość",
- "tooltip": "Ilość ile masz w ekwipunku"
- },
- "id": "ID",
- "name": "Nazwa",
- "type": "Typ"
- },
- "unknownItem": "??? Nieznany przedmiot"
- },
- "items": {
- "78": "Kłoda",
- "340": "Gitara",
- "341": "Lornetka",
- "346": "Szyna do strzelby",
- "351": "Torba z łatwym dostępem",
- "353": "Paralizator",
- "354": "Noktowizor",
- "355": "Pistolet",
- "356": "Nowoczesna siekiera",
- "357": "Wiatrówka",
- "358": "Strzelba",
- "359": "Maczeta",
- "360": "Taktyczny łuk",
- "361": "Karabin",
- "362": "Amunicja do pistoletu",
- "363": "Śrut do strzelby",
- "364": "Kulki do strzelby",
- "365": "Kusza",
- "366": "Rzutka śledząca",
- "367": "Katana",
- "368": "Bełt do kuszy",
- "369": "Amunicja do paralizatora",
- "370": "Amunicja do pistoletu",
- "371": "Kulki do strzelby",
- "372": "Śrut do strzelby",
- "373": "Taktyczna strzała",
- "374": "Tłumik",
- "375": "Celownik laserowy",
- "376": "Szyna do pistoletu",
- "377": "Luneta",
- "378": "Mocowanie latarki",
- "379": "Taktyczna siekiera",
- "380": "Nóż bojowy",
- "381": "Granat",
- "382": "Amunicja do granatnika",
- "383": "Szyna do karabinu",
- "384": "Kołczan do kuszy",
- "386": "Rewolwer",
- "387": "Amunicja do karabinu",
- "388": "Molotow",
- "389": "Amunicja do molotowa",
- "390": "Żywica do drukarki",
- "391": "Czerwona maska",
- "392": "Patyk",
- "393": "Kamień",
- "394": "Piła łańcuchowa",
- "395": "Deska",
- "396": "Pałka ogłuszająca",
- "397": "Shiitake",
- "398": "Boczniak mikołajkowy",
- "399": "Kolczak obłączasty",
- "400": "Muchomor Czerwony",
- "401": "Jajo żółwia",
- "402": "Plecak",
- "403": "Lina",
- "405": "Kość",
- "406": "Ćwierć kłody",
- "408": "Pół kłody",
- "409": "Trzy czwarte kłody",
- "410": "Zegarek",
- "412": "Nadajnik GPS",
- "413": "Zapalniczka plazmowa",
- "414": "Butelka wódki",
- "415": "Szmatka",
- "416": "Płytka drukowana",
- "417": "Bomba czasowa",
- "418": "Przewód",
- "419": "Taśma klejąca",
- "420": "Ładunek C4",
- "421": "Ramen",
- "422": "Narzędzie naprawcze",
- "423": "Powieść A",
- "424": "Powieść B",
- "425": "Płatki śniadaniowe",
- "426": "Drukowana manierka",
- "427": "Drukowany nóż",
- "428": "Drukowane sanki",
- "429": "Drukowana maska do nurkowania",
- "430": "Czaszka",
- "431": "Topór strażacki",
- "432": "Otwieracz do puszek",
- "433": "Mięso",
- "434": "Konserwy",
- "435": "Złota maska",
- "436": "Ryba",
- "437": "Leki",
- "438": "Pakiet MRE",
- "439": "Napój energetyczny",
- "440": "Flara",
- "441": "Baton energetyczny",
- "443": "Łuk własnej roboty",
- "444": "Oddycharka",
- "445": "Borówki",
- "446": "Wiciokrzew",
- "447": "Maliny",
- "448": "Śnieguliczka",
- "449": "Kolcosił straszliwy",
- "450": "Skrzyp polny",
- "451": "Aloes",
- "452": "Krwawnik pospolity",
- "453": "Wierzbówka kiprzyca",
- "454": "Ostryż",
- "455": "Mieszanka lecząca",
- "456": "Mieszanka lecząca+",
- "457": "Amunicja do paralizatora",
- "458": "Ładowarka do baterii",
- "459": "Proca",
- "460": "Pudełko Baterii",
- "461": "Mieszanka energetyczna",
- "462": "Mieszanka energetyczna+",
- "463": "Płetwy",
- "464": "Karma dla kota",
- "465": "Cykoria",
- "466": "Ostryga",
- "467": "Okładka albumu",
- "468": "Krzyż",
- "469": "Butla z powietrzem",
- "470": "Celownik do wiatrówki",
- "471": "Latarka",
- "472": "Skóra jelenia",
- "473": "Zbroja z liści",
- "474": "Włócznia własnej roboty",
- "475": "Manierka",
- "476": "Mały kamień",
- "477": "Maczuga własnej roboty",
- "478": "Czekan",
- "479": "Pióro",
- "480": "Odcięta ręka",
- "481": "Odcięta noga",
- "482": "Odcięta głowa",
- "483": "Pakiet ratunkowy",
- "484": "Liść",
- "485": "Łopata",
- "486": "Krótkofalówka",
- "487": "Piżamy",
- "488": "Niebieska koszulka",
- "489": "Taktyczne spodnie",
- "490": "Bluza z kapturem",
- "491": "Marynarka",
- "492": "Smoking",
- "493": "Skórzana kurtka",
- "494": "Pancerz kościany",
- "495": "Kurtka taktyczna",
- "496": "Pieniądze",
- "497": "Tacka na jedzenie",
- "498": "Celownik laserowy GRABS",
- "499": "Kombinezon nurkowy",
- "500": "Puchowa kurtka",
- "501": "Buty taktyczne",
- "502": "Monety",
- "503": "Latarka",
- "504": "Plandeka",
- "505": "Miernik laserowy",
- "506": "Skorupa żółwia",
- "507": "Ręcznie robione strzały",
- "508": "Skórzana torba",
- "509": "Broszura Holosprings",
- "511": "Wyłącznik kontaktowy",
- "512": "Pełna tacka na jedzenie",
- "513": "Sprężyna",
- "514": "Kontaktowa sprężyna",
- "515": "Podstawowa strona poradnika budowania",
- "516": "Strona poradnika budowania namiotu z plandeki",
- "517": "Garnek",
- "518": "Cel papierowy",
- "519": "Pancerz z jeleniej skóry",
- "520": "Element struktury",
- "521": "Email o oświetleniu jaskini",
- "522": "Pistolet do tyrolek",
- "523": "Linka do tyrolek",
- "524": "Piłka golfowa",
- "525": "Kij golfowy",
- "526": "Testament E. Pufftona",
- "527": "Baterie",
- "528": "Finanse E. Pufftona",
- "529": "Lokalizator GPS",
- "530": "Projekt stojaka do suszenia",
- "531": "Projekt krzesła ze patyków",
- "532": "Projekt łóżka ze patyków",
- "533": "Projekt stojaka na broń",
- "534": "Email o golfa, cz. 1",
- "535": "Email o golfa, cz. 2",
- "536": "Email o golfa, cz. 3",
- "537": "Email o golfa, cz. 4",
- "538": "Email o malarstwie",
- "539": "Email o astrologii, cz. 1",
- "540": "Email o astrologii, cz. 2",
- "541": "Email o astrologii, cz. 3",
- "542": "Email polityka, cz. 1",
- "543": "Email polityka, cz. 2",
- "544": "List od polityków, część 1",
- "545": "List od polityków, część 2",
- "546": "List od polityków, część 3",
- "547": "List od baletnicy",
- "548": "List o skrzypiących butach, część 1",
- "549": "Projektowanie kości",
- "550": "Projektowanie lotki na muchy",
- "551": "Projektowanie pułapki na małe zwierzęta",
- "552": "Książka z projektami",
- "553": "Siatka techniczna",
- "554": "Pancarz Techniczny",
- "555": "Dres",
- "556": "Sukienka",
- "557": "Skórzany garnitur",
- "558": "Kamuflażowy kombinezon",
- "559": "Drukowane groty strzał",
- "560": "Drukowany hak wspinaczkowy",
- "561": "Drukowany doniczka",
- "562": "Ogłoszenie Holoville A",
- "563": "Ogłoszenie Holoville B",
- "564": "Ogłoszenie Holoville C",
- "565": "Ogłoszenie Holoville D",
- "566": "Karta dostępu do konserwacji",
- "567": "Karta dostępu gości",
- "568": "Karta dostępu VIP",
- "569": "Kąsek mózgu",
- "570": "Kąsek stekowy",
- "571": "Kąsek ze steku i bekonu",
- "572": "Starożytny Pancerz",
- "573": "Śpiwór",
- "574": "Powieść C",
- "575": "Powieść D",
- "576": "Ćwierć deski",
- "577": "Pół deski",
- "578": "Trzy czwarte deski",
- "579": "Projektowanie krzesła z kości",
- "580": "Projektowanie drabiny z patyków",
- "581": "Projektowanie domku dla ptaków",
- "582": "Projektowanie pułapki na ryby",
- "583": "Projektowanie skrzynki na przechowywanie",
- "584": "Projektowanie manekina",
- "585": "Projektowanie stracha na wróble",
- "586": "Projektowanie ściennego doniczka",
- "587": "Projektowanie podłogowego doniczka",
- "588": "Projektowanie żyrandola z kości",
- "589": "S.C.R.E.W. / Samouczki",
- "590": "Radio",
- "591": "Projektowanie małego drewnianego domku",
- "592": "Przerażająca skóra",
- "593": "Przerażający pancerz",
- "594": "Jagody guarany",
- "595": "Jeżyny",
- "596": "Nasiona aloesu",
- "597": "Nasiona ostryżu",
- "598": "Nasiona jeżyn",
- "599": "Nasiona jagód",
- "600": "Nasiona Kolcosiła straszliwego",
- "601": "Nasiona wierzbówki kiprzyca",
- "602": "Nasiona Gurany",
- "603": "Nasiona skrzypu polnego",
- "604": "Nasiona malin",
- "605": "Nasiona Chicory",
- "606": "Nasiona Krwawnika pospolitego",
- "607": "Projekt magazynu kamieni",
- "608": "Projekt magazynu kości",
- "609": "Projekt magazynu kłód",
- "610": "Projekt magazynu patyków",
- "611": "Wydruk z numerami",
- "612": "Wycinek z gazety",
- "613": "Wycinek z gazety 2/2",
- "614": "Email",
- "615": "Email",
- "616": "Email",
- "617": "Cena akcji",
- "618": "Wystrzelona strzała",
- "619": "Kostium kąpielowy",
- "620": "Projekt stołu",
- "621": "Projekt półki",
- "622": "Projekt ścieżki z kamieni",
- "623": "Projekt półki ściennego",
- "624": "Projekt pochodni ściennych",
- "625": "Projekt wiszącej czaszki",
- "626": "Lotnia",
- "627": "Karta stołowa Pana Pufftona",
- "628": "Karta stołowa Pani Puffton",
- "629": "Zbiornik na deszczówkę",
- "630": "Knight V",
- "631": "The Realm Beyond",
- "632": "Plan pułapki sprężynowej",
- "633": "Broszura kultu",
- "634": "Panel słoneczny",
- "635": "Żarówka",
- "636": "TemplateD",
- "637": "Kamera",
- "638": "Plan Prostych Sań na Kłody",
- "639": "Skafander Kosmiczny",
- "640": "Kamień",
- "641": "Projaekt kamiennego kominka",
- "642": "Głowa Kaczki",
- "643": "Głowa Orła",
- "644": "Mała Głowa Żółwia",
- "645": "Plan stojaku na trofea",
- "646": "Głowa Królika",
- "647": "Głowa Wiewiórki",
- "648": "Głowa Mewy",
- "649": "Plan przechowywalni kamieni",
- "650": "Głowa Żółwia",
- "651": "Głowa Jelenia",
- "652": "Głowa Łosia",
- "653": "Notatka Osobista A",
- "654": "Notatka Osobista B",
- "655": "Notatka Osobista C",
- "656": "Projekt Pułapki Hokey Pokey",
- "657": "Wydrukowana opakówka na GPS",
- "658": "Projekt RadioPułapki",
- "659": "Projekt Radia",
- "661": "Bateria Wózka Golfowego",
- "662": "Część Artefaktu A",
- "663": "Kilof",
- "664": "Ruda Solafitu",
- "665": "Plan Ulepszania Broni",
- "666": "Plan zasilonego krzyża",
- "667": "Część Artefaktu B",
- "668": "Część Artefaktu C",
- "669": "Część Artefaktu D",
- "670": "Projekt krzesła z flaków",
- "671": "Projekt kanapy z flaków",
- "672": "Plan Pułapki-Uber",
- "673": "Plan okrągłego stołu",
- "674": "Stara notatka A",
- "675": "Stara notatka B",
- "676": "Stara notatka C",
- "677": "Email Rybacki A",
- "678": "Email Rybacki B",
- "679": "Plan Pułapki Mielarki",
- "680": "Plan Reflektora",
- "681": "Plan zagara",
- "682": "Plan pułapki obrotowej",
- "683": "Plan podwójnego łóżka",
- "684": "Stara notatka E",
- "685": "Stara Notatka D",
- "686": "Stara notatka F",
- "687": "Email Pufftona A",
- "688": "Plan pułapki rzucającej włóczniami",
- "689": "Część artefaktu E",
- "690": "Strony fabularne",
- "691": "Stara notatka F",
- "692": "Mail Rybacki C",
- "693": "Mapa Bunkra A",
- "694": "Wydruk Emailu Jianyu A",
- "695": "Znak kultu G",
- "696": "Znak kultu H",
- "697": "Znak kultu I",
- "698": "Znak kultu J",
- "699": "Znak kultu K",
- "700": "Plan magazynu na włócznie",
- "701": "Plan Nogo-Lampy",
- "702": "Plan magazynu na drewno opałowe",
- "703": "Strój Księdza",
- "704": "Plan półki na broń",
- "705": "Broszura Cyrkowa",
- "706": "Wycinek Gazety (Mąż)",
- "707": "Artefakt",
- "708": "Część Arefaktu F",
- "709": "Plan teleportera",
- "710": "Plan Kapliczki Odpychania",
- "711": "Plan Kapliczki Przyciągania",
- "712": "Część Artefaktu G",
- "713": "Plan Plater Counter",
- "714": "Plan Pokrywacza Zbrój",
- "715": "Głowa Szopa Pracza",
- "716": "Papier z Bibli D",
- "717": "Stara notatka G",
- "718": "Personalna Notatka E",
- "719": "Personalna Notatka F",
- "720": "Personalna Notatka G",
- "721": "Wycinek Bibli A",
- "722": "Email Pufftona B",
- "723": "Email Pufftona C",
- "724": "Nasion Jagody Bliźniaczej",
- "725": "Nasiono Śnieźnej Jagody",
- "726": "Plan Wyrzutni Składanej Lotni",
- "727": "Zbroja z solafitu",
- "728": "Żyjący królik",
- "729": "Głowa skunksa",
- "730": "Plan małej klatki dla królików",
- "749": "Strój Stewardessy"
- },
- "itemTypes": {
- "ammo": "Ammunicja",
- "armor": "Pancerz",
- "attachment": "Dodatki na broń",
- "blueprint": "Projekt",
- "bodyPart": "Część ciała",
- "book": "Książki",
- "clothes": "Ubrania",
- "consumable": "Zużywalne",
- "container": "Pojemnik",
- "document": "Dokument",
- "electricity": "Elektryczność",
- "equipment": "Wyposażenia",
- "food": "Jedzenie",
- "key": "Klucz",
- "log": "Kłoda",
- "misc": "Inne",
- "plant": "Roślina",
- "printed": "Wydruk",
- "seed": "Nasiona",
- "tool": "Narzędzia",
- "trophy": "Trofeum",
- "weapon": "Broń",
- "weaponMod": "Modyfikacje broni"
- },
- "itemVariants": {
- "433": {
- "1": "Surowe Mięso",
- "2": "Nieznane Mięso",
- "3": "Zepsute Mięso",
- "4": "Suszone Mięso",
- "5": "Gotowane Mięso",
- "6": "Spalone Mięso"
- },
- "436": {
- "1": "Surowa Ryba",
- "2": "Nieznana Ryba",
- "3": "Zesputa Ryba",
- "4": "Suszona Ryba",
- "5": "Ugotowana Ryba",
- "6": "Spalona Ryba"
- },
- "480": {
- "1": "Surowe Ramię",
- "2": "Nieznane Ramię",
- "3": "Zepsute Ramię",
- "4": "Suszone Ramię",
- "5": "Gotowane Ramię",
- "6": "Spalone Ramię"
- },
- "481": {
- "1": "Surowa Noga",
- "2": "Nieznana Noga",
- "3": "Zesputa Noga",
- "4": "Suszona Noga",
- "5": "Ugotowana Noga",
- "6": "Spalona Noga"
- }
- },
- "languages": {
- "de": "Niemiecki (German)",
- "en": "Angielski (English)",
- "pl": "Polski (Polish)"
- },
- "map": {
- "actors": "NPC-y",
- "altItems": "Alternatywne przedmioty",
- "alwaysOnTop": "Zawsze na wierzchu",
- "area": "Obszar",
- "areaFilter": {
- "text": "Obszar",
- "types": {
- "all": "Wszystkie",
- "surfaceOnly": "Tylko na powierzchni",
- "undergroundOnly": "Tylko w Jaskiniach/Bunkrach"
- }
- },
- "buttons": {
- "createNewZipline": {
- "text": "Nowa tyrolka stąd",
- "tooltip": "Po wsiśnieciu stworzy się tyrolka pomiędzy obecnie wybranym punktem a następnie wybranym"
- },
- "delete": "Usuń",
- "deleteBothAnchors": "Usuń obydwa końce tyrolki",
- "deselectAll": "Odznacz wszystkie",
- "moveToNextClickedPosition": {
- "hint": "Wybierz nową lokalicaję",
- "text": "Przenieś do wybranej pozycjii",
- "tooltip": "Przenieś koniec tyrolki do następnego wybrnego miejsca"
- },
- "spawnActors": "Przywołaj NPC",
- "teleportKelvin": "Teleportuj tutaj Kelvina",
- "teleportPlayer": "Teleportuj tutaj Gracza",
- "teleportVirginia": "Teleportuj tutaj Virginię"
- },
- "coordinates": "Koordynaty",
- "customPois": "Własne",
- "details": "Szczegóły",
- "fill": "Wypełnij",
- "followers": "Towarzysze",
- "followPlayer": "Podążaj za graczem",
- "fullText": {
- "text": "Nazwa",
- "tooltip": "Szuka zarówno w nazwach lokalizacji, przedmiotów i innych znaczników na mapie, oraz w ich opisach",
- "watermark": "Nazwa lokalizacji, przedmiotu, czy ich opis"
- },
- "inventoryFilter": "Pokaż tylko niezebrane przedmioty",
- "isInInventory": "Posiadane",
- "isRuntimeCreated": "Jest kopią",
- "isUnderground": "Jest podziemią",
- "itemId": "ID przedmiotu",
- "items": "Przedmioty",
- "mapType": {
- "dark": "Ciemna",
- "original": "Oryginalna"
- },
- "name": "Nazwa",
- "objects": "Przedmioty",
- "options": "Opcje",
- "pois": "Punkty zainteresowań",
- "requirements": "Wymgania",
- "requirementsFilter": {
- "text": "Wymagania",
- "tooltip": "Pokaż tylko przedmioty i miejsca do których masz dostęp (Masz kartę itp.)",
- "types": {
- "AccessibleOnly": "Pokaż tylko dostępne",
- "All": "Wszystko",
- "InaccessibleOnly": "Pokaż tylko niedostępne"
- }
- },
- "spawnWindow": {
- "actorType": "Typ NPC-a",
- "count": "Ilość",
- "disclaimer": "Bądź ostrożny z ilością i pozycją respionych NPC. Może zcrashować to grę. Niektórzy przeciwnicy mogę zostać zrespieni w jaskiniach.",
- "doSpawn": "Stwórz NPC-a",
- "family": "Rodzina",
- "familyOfDestinationActor": "Rodzina docelowego NPC-a",
- "information": "Informacja",
- "options": "Opcje",
- "position": "Pozycja",
- "spaceBetween": {
- "text": "Odległość pomiędzy",
- "tooltip": "Definiuje odległości pomiędzy przywoływanymi NPC-ami"
- },
- "spawnPattern": {
- "Cross": "Krzyż",
- "Grid": "Siatka",
- "HorizontalLine": "Pozioma Linia",
- "Random": "Losowa",
- "Rectangle": "Prostokąt",
- "text": "Wzór przywołania",
- "VerticalLine": "Pionowa Linia"
- },
- "title": "Przywołaj NPC-a"
- },
- "structures": "Struktury",
- "teleportation": "Teleportacja",
- "teleportWindow": {
- "destination": "Cel",
- "disclaimer": "Tutaj możesz dostosowywać pozycję NPC-a. Jeżeli zrespisz przeciwnika w sobie, jest możliwe, że polecisz w kosmos. X i Z to lokalizacja, Y to wysokość. Upewnij się że ustawiony obszar jest poprawny.",
- "doTeleport": "Teleportuj!",
- "mode": {
- "Kelvin": "Kelvin",
- "Player": "Gracz",
- "Virginia": "Virginia"
- },
- "offset": "Przesunięcie",
- "title": "Teleport",
- "toTeleport": "Teleport"
- },
- "wiki": "Link do Wikipedii",
- "zipLineAnchor": "Końce tyrolek",
- "zipLines": "Tyrolki"
- },
- "menu": {
- "companion": {
- "setup": "Konfiguracja",
- "text": "Companion"
- },
- "file": {
- "deleteAllBackups": "Usuń wszystkie backupy",
- "exit": "Wyjdź",
- "openLastSavegame": "Otwórz ostatni zapis...",
- "openLastSavegameWithSavegame": "Otwórz {0}...",
- "openSavegame": "Otwórz zapis...",
- "openSavegameDirInExplorer": "Otwórz zapis Dir w eksplorerze",
- "reloadCurrentSavegame": "Załaduj obecny zapis",
- "restoreFromBackup": {
- "fromNewestBackup": "Z najnowszego backupa",
- "fromOldestBackup": "Z najstarszego backupa",
- "text": "Odtwórz z backupów"
- },
- "save": "Zapisz",
- "settings": "Ustawienia",
- "text": "Plik"
- },
- "help": {
- "about": "O programie",
- "changelog": "Changelog",
- "links": {
- "discord": "Discord",
- "downloadLatestVersion": "Pobierz najnowszą wersję",
- "githubProject": "Projekt na GitHubie",
- "nexusMods": "NexusMods",
- "text": "Linki",
- "thunderstoreIo": "thunderstore.io"
- },
- "readme": "Przeczytaj mnie!",
- "text": "?",
- "translations": "Tłumaczenia",
- "updates": {
- "checkNow": "Sprawdź teraz",
- "checkOnStartup": "Sprawdź przy włączeniu",
- "text": "Aktualizacje"
- }
- },
- "tools": {
- "cloneWorldObjects": {
- "text": "Klonuj przedmioty ze świata",
- "tooltip": "Klonuje przedmioty ze świata do pozycji gracza"
- },
- "eternalFires": {
- "text": "Wieczne ognie",
- "tooltip": "Ognie zostaną zapalone, zużycie paliwa będzie niskie a jego ilość duża"
- },
- "fires": {
- "text": "Ognie",
- "tooltip": "Modyfikuj ognie na świecie"
- },
- "itemPlater": {
- "text": "Plater przedmiotów i struktur",
- "tooltip": "Dodaje lub usuwa solafitowy plating do przemiotów w ekwipunku"
- },
- "map": {
- "text": "Interaktywna mapa",
- "tooltip": "Po prosu interaktywna mapa."
- },
- "modifyConsumedItems": {
- "text": "Modyfikuj zjedzone przedmioty...",
- "tooltip": "W przypadku, gdy chcesz oczyścić pamięć o przedmiotach, które już zjadłeś"
- },
- "regrowTrees": "Odrośnij drzewa...",
- "resetCannibalAngerLevel": {
- "text": "Zresetuj poziom agresji kanibali",
- "tooltip": "Zresetuj statystyki zabójstw, liczbę ściętch drzew, i ilość odwiedzonych wiosek, co przełoży się na mniej najazdów"
- },
- "resetContainers": {
- "text": "Zresetuj pojemniki",
- "tooltip": "Resetuje pojemniki, w jaskiniach i otwartym świecie"
- },
- "resetFires": {
- "text": "Zresetuj ognie",
- "tooltip": "Ognie zostaną zapalone, a prędkość zużycia i ilość paliwa ustawione na domyślne"
- },
- "resetStructureDamage": {
- "text": "Zresetuj obrażenia struktur",
- "tooltip": "Naprawia wszystkie struktury"
- },
- "resetTraps": {
- "text": "Zresetuj pułapki",
- "tooltip": "Resetuje pułapki"
- },
- "setToEndgame": {
- "text": "Ustaw na Koniec Gry",
- "tooltip": "Ustawia grę na \"Koniec gry\" co odblokowywuje nowych przeciwników"
- },
- "text": "Narzędzia",
- "unlocks": {
- "text": "Odblokowywania",
- "tooltip": "Pozwala odblokować niektóre części gry"
- }
- }
- },
- "npcs": {
- "tabs": {
- "byFamily": {
- "disclaimer": "Rodzina oznacza grupę przeciwników, np plemię.",
- "text": "Rodziną"
- },
- "byType": "Typem"
- }
- },
- "player": {
- "areaMask": "Obszar",
- "buttons": {
- "moveToKelvin": "Przeteleportj do Kelvina",
- "moveToVirginia": "Przeteleportj do Virginii"
- },
- "currentHealth": "Obecne zdrowie",
- "fillAllBars": "Wypełnij wszystkie paski",
- "mapGroupName": "Gracz",
- "maxHealth": "Maksymalne zdrowie",
- "outfit": "Strój",
- "sickness": "Choroba",
- "strengthLevel": "Poziom siły"
- },
- "poiGroups": {
- "Ammo": "Ammunicja",
- "Bunkers": "Bunkry",
- "Camps": "Obozowiska",
- "CannibalVillages": "Wioski kanibalów",
- "Caves": "Jaskinie",
- "Crates": "Skrzynie",
- "Doors": "Drzwi",
- "Helicopters": "Helikoptery",
- "Info": "Informacje",
- "Items": "Przedmioty",
- "Lakes": "Jeziora",
- "Laptops": "Laptopy",
- "Ponds": "Jeziorka",
- "Printers": "Drukarki 3D",
- "Supply": "Zapasy",
- "Villages": "Wioski"
- },
- "storage": {
- "batch": {
- "allSlots": "Wszystkie miejca",
- "clearAll": "Usuń wszystkie",
- "fillAllWith": "Wypełnij wszystko",
- "setAllToMax": "Ustaw wszystkie na"
- },
- "buttons": {
- "fillAllStorages": "Wypełnij wszystkie magazyny"
- },
- "errors": {
- "currentStateNotDefined": "CurrentState nie zdefiniowane dla id {0}"
- },
- "headers": {
- "selectAStorage": "Wybierz magazyn",
- "storageTypes": "Typ magazynu"
- },
- "slot": {
- "max": "Dodaj",
- "remove": "Usuń"
- }
- },
- "structures": {
- "added": "Dodano",
- "applyToAllOfSameType": {
- "text": "Zaaplikuj do wszystich tego samego typu",
- "tooltip": "Aplikuje do wszystkich tego samego typu"
- },
- "buildCost": "Koszt budowy",
- "buttons": {
- "changeType": "Zmień typ",
- "setAllToAlmostFinish": "Ustaw wszystkie na prawie ukończone\"",
- "setAllToFinish": "Ustaw wszystkie na \"Ukończone\"",
- "setAllToRemove": "Ustaw wszystkie na \"Usunięte\"",
- "setAllToUnfinish": "Ustaw wszystkie na \"Nieukończone\"",
- "unmodifyAll": "Od-modyfikuj wszystkie"
- },
- "categories": {
- "furniture": "Meble",
- "gardening": "Ogrodnictwo",
- "misc": "Inne",
- "raft": "Tratfa",
- "shelter": "Schronienie",
- "storage": "Magazyn",
- "traps": "Pułapki",
- "treeShelter": "Schronienie na drzewie",
- "utility": "Użytkowość"
- },
- "category": "Kategoria",
- "headers": {
- "batch": "Partia",
- "finishedStructures": "Ukończone struktury",
- "unfinishedStructures": "Nieukończone struktury"
- },
- "modification": "Modyfikacja",
- "modificationMode": {
- "AlmostFinish": "Prawie ukończone",
- "Finish": "Ukończ",
- "None": "Nic",
- "Remove": "Usuń",
- "Unfinish": "Od-ukończ"
- },
- "percentDone": "Dodano procent",
- "structureTypeSelectorDisclaimer": "Jeżeli nic nie będzie wybrane, wszystkie struktury zostaną zmienione!",
- "types": {
- "19": "Stojak na Broń",
- "20": "Krzesło z Patyków",
- "21": "Pułapka Robiąca Kości",
- "22": "Łóżko z Patyków",
- "23": "Donica Ścienna",
- "24": "Żyrandol z Kości",
- "25": "Krzesło z Kości",
- "26": "Dobudówka",
- "27": "Suszarka",
- "28": "Schronienie na drzewie 2",
- "29": "Magazyn na Patyki",
- "31": "Magazyn na Kamienie",
- "32": "Magazyn na Kości",
- "34": "Mała Chatka",
- "35": "Pułapka na Ryby",
- "36": "Stojak na Zbroje",
- "37": "Magazyn na Kłody",
- "38": "Wieża obserwacyjna",
- "39": "Strach na Wróble",
- "40": "Stojąca Donica",
- "41": "Platforma na Drzewie 2",
- "42": "Mała Pułapka na zwierzęta",
- "43": "Platforma na drzewie 1",
- "44": "Schronienie na drzewie 1",
- "45": "Pułapka z Łapką na Muchy",
- "46": "Ścieżka z Patyków",
- "47": "Schronienie Myśliwego",
- "48": "Stół",
- "49": "Półka",
- "50": "Ścieżka z Kamieni",
- "51": "Półka Naścienna",
- "52": "Ławka",
- "53": "Pochodnia ścienna",
- "54": "Lampa z Czaszki",
- "55": "Tyrolka",
- "56": "Zbiornik na Deszczówkę",
- "57": "Pułapka Sprężynowa",
- "58": "Sanie na Kłody",
- "59": "Proste Sanie na Kłody",
- "60": "Kamienny kominek",
- "61": "Trofeum z głowy",
- "62": "Magazyn kamieni",
- "63": "Pułapka Hokey Pokey",
- "64": "Pułapka Radio-Alarmowa",
- "67": "Duży magazyn kłód",
- "68": "Dywan z futra jelenia",
- "70": "Plating przedmiotu",
- "71": "Ulepszony Krzyż",
- "72": "Krzesło z flaków",
- "73": "Kanapa z Flaków",
- "74": "Pułapka Uber",
- "75": "Okrągły stół",
- "76": "Pułapka Mielarka",
- "77": "Reflektor",
- "78": "Zegar",
- "79": "Pułapka obrotowa",
- "80": "Podwójne łóżko",
- "81": "Pułapka rzucająca włóczniami",
- "82": "Magazyn na włócznie",
- "84": "Magazyn na Drewno Opałowe",
- "85": "Nogo-Lampa",
- "86": "Półka na Bronie",
- "88": "Teleporter",
- "89": "Kapliczka Odpychania",
- "90": "Kapliczka Przyciągania",
- "91": "Kanapa",
- "92": "Pułapka Liściowa",
- "93": "Pułapka z Mołotwem",
- "94": "Eksplodująca pułapka",
- "95": "Magazyn na strzały",
- "96": "Magazyn na Kłody",
- "97": "Futrzane Krzesło",
- "98": "Mała Platforma",
- "99": "Średnia Platforma",
- "100": "Plater Counter",
- "101": "Gold Armor Plater",
- "102": "Wyrzutnia Składanych Lotni",
- "103": "Wyrzutnia Składanych Lotni",
- "104": "Magazyn na materiały wybuchowe",
- "106": "Klatka dla królików",
- "107": "Mała klatka dla królików",
- "108": "Łódź mieszkalna",
- "109": "Magazyn na Knight-V",
- "110": "Domek dla ptaków",
- "113": "Składana lotnia",
- "117": "Mała tratwa",
- "118": "Poler",
- "119": "Duża tratwa"
- }
- },
- "tabs": {
- "followers": "Towarzysze",
- "game": "Gra",
- "inventory": "Ekwipunek",
- "npcs": "NPC",
- "player": "Gracz",
- "storage": "Magazyn",
- "structures": "Struktury"
- },
- "weather": {
- "header": "Pogoda"
- },
- "windows": {
- "itemPlater": {
- "buttons": {
- "addPlating": "Dodaj plating",
- "removePlating": "Usuń plating"
- },
- "constructionCategories": {
- "Item": "Przedmiot",
- "Log": "Kłoda",
- "LogPlank": "Deska",
- "Stick": "Patyk",
- "Stone": "Kamień"
- },
- "constructions": "Konstrukcje",
- "disclaimer": "Bądż ostrożny. Narzędzie TYLKO zapisuje zmniany do platingu i następnie ładuje zapis.\r\n\r\nUpewnij się więc, że nie ma nie żadnych niezapisanych zmian, które mogłyby zostać stracone\r\n\r\nProces może zająć trochę czasu, jeżeli twój zapis jest duży",
- "followerItems": "Przedmioty towarzyszy",
- "itemsInInventory": "Przedmioty w ekwipunku",
- "itemsInWeaponRacks": "Przedmioty na stojakach na broń",
- "messages": {
- "addPlating": "Dodano platingi przedmiotów",
- "removePlating": "Usunięto platingi przedmiotów"
- },
- "structures": "Struktury",
- "title": "Plater przedmiotów i struktur"
- },
- "main": {
- "errors": {
- "errorCheckingLastVersion": "Pojawił się błąd podczas sprawdzania dostępność nowszej wersji"
- },
- "map": "Mapa",
- "messages": {
- "alreadyLatestVersion": {
- "text": "Używasz najnowszej wersji",
- "title": "Brak aktualizacji"
- },
- "backupsDeleted": "Usunięto {0} backupów",
- "changesSaved": "Zapisano zmiany",
- "confirmCloseApplication": {
- "text": "Czy chcesz zamknąć aplikację?",
- "title": "Zamknij aplikację"
- },
- "confirmCreateBackup": {
- "text": "Czy chcesz stworzyć backup?",
- "title": "Tworzenie backupa"
- },
- "confirmDeleteBackups": {
- "text": "Czy chcesz usunąć backupy?",
- "title": "Usuwanie backupów"
- },
- "confirmOverwriteExternalChanges": {
- "text": "Zapis został zmodyfikowany na zewnątrz. Czy naprawdę chcesz nadpisać wszelkie zmiany?",
- "title": "Nadpisywanie zmian"
- },
- "confirmRestoreBackups": {
- "text": "Jesteś pewien, że chcesz przywrócić backupy?",
- "title": "Przywracanie backupów"
- },
- "followerAlreadyAlive": {
- "text": "{0} jest już żywy",
- "title": "Brak zmian"
- },
- "followerRevived": {
- "text": "{0} powinien być spowrotem",
- "title": "Odrodzono"
- },
- "followersCreated": {
- "text": "{0} followerów zostało zrespionych",
- "title": "Towarzysze zrespieni"
- },
- "noChanges": {
- "text": "Brak zmian - nic nie zapisano",
- "title": "Brak zmian"
- },
- "saveChanges": "Zapisz zmiany",
- "unableToDeleteBackups": "Nie można usunąć backupów: {0}",
- "unableToSpawnFollowers": "Nie można zrespić followera"
- },
- "title": " (Wybrano: {0}, {1} - Zapisano: {2}, Ostatnio modyfikowano: {3})"
- },
- "modifyConsumedItems": {
- "key": "Klucz",
- "remove": "Usuń",
- "removeAll": "Usuń wszystkie",
- "title": "Modyfikuj zjedzone jedzenie"
- },
- "regrowTrees": {
- "all": "Wszystkie",
- "gone": "Brak pozostałości",
- "halfChopped": "Pół ścięte",
- "messages": {
- "noTreesRegrown": "Brak drzew ze statusem \"{0}\" odrosło",
- "success": "{0} drzew z stanem \"{1}\" powinno odrosnąć. Zapisz aby je zatrzymać."
- },
- "pctRegrow": "Procent odrośnięcia",
- "saveButton": "Odrośnij drzewa",
- "stumps": "Pieńki",
- "title": "Odrośnij drzewa"
- },
- "resetContainers": {
- "messages": {
- "containersReset": {
- "text": "Zaktualizowano pojemniki. Zapisz zmiany aby zmienić zapis gry",
- "title": "Reset pojemników"
- },
- "nothingToReset": {
- "text": "Nic nie znaleziono do zresetowania",
- "title": "Nic nie znaleziono"
- }
- }
- },
- "resetTraps": {
- "messages": {
- "nothingToReset": {
- "text": "Nic nie znaleziono do zresetowania",
- "title": "Nic nie znaleziono"
- },
- "trapsReset": {
- "text": "{0} pułapek zostało zresetowanych. Zapisz zmiany aby zmienić zapis gry",
- "title": "Reset pułapek"
- }
- }
- },
- "selectSavegame": {
- "buttons": {
- "change": "Zmień...",
- "setToDefault": "Ustaw na bazowe"
- },
- "folderBrowserTitle": "Wybierz Sons of the Forest \"Saves\" Directory",
- "headers": {
- "location": "Pozycja"
- },
- "lastSaveTimeTooltip": "Last write time of the savegame directory",
- "selectedPath": {
- "label": "Wybrana ścieżka:",
- "tooltip": "Zazwyczaj zapisy przechowywane są w C:\\Users\\[user]\\AppData\\LocalLow\\Endnight\\SonsOfTheForest\\Saves"
- },
- "tabs": {
- "multiplayer": "Multiplayer",
- "multiplayerClient": "Multiplayer (Client)",
- "singleplayer": "Singleplayer"
- },
- "title": "Wybierz zapis..."
- },
- "settings": {
- "askForBackupsEveryTime": "Pytaj o backupy za każdym razem",
- "backupMode": "Tryb backupów",
- "fileMode": {
- "label": "Tryb plików",
- "single": "Jeden backup na zmieniony plik JSON",
- "zip": "Archiwum ZIP"
- },
- "language": "Język",
- "messages": {
- "languageChanged": {
- "text": "Zrestartuj aplikację aby zapisać zmianę języka",
- "title": "Zapisano ustawienia"
- }
- },
- "theme": "motyw",
- "title": "Ustawienia"
- },
- "unhandledException": {
- "applicationVersion": "Wersja Aplikacji",
- "buttons": {
- "copyErrorToClipboard": "Skopiuj błąd do schowka",
- "exitApplication": "Wyjdź z Aplikacji"
- },
- "callstack": "callstack",
- "disclaimer": "Wystąpił nieoczekiwany błąd. Stan aplikacji może być uszkodzony.",
- "exceptionMessage": "Komunikat Wyjątku",
- "exceptionType": "Typ Wyjątku",
- "header": "Szczegóły Wyjątku",
- "innerException": "Wewnętrzny Wyjątek",
- "title": "Nieobsłużony Wyjątek"
- },
- "unlocks": {
- "coreGameCompleted": "Ukończono bazową grę",
- "creativeMode": "Tryb Kreatywny",
- "creativeModeItem": "Przedmiot trybu kreatywnego (?)",
- "escapedIsland": "Opuszczono wyspę",
- "messages": {
- "playerProfileNotFound": "Nie można było znaleźć PlayerProfile.json w \"{0}\""
- },
- "title": "Odblokowywania"
- },
- "updateAvailable": {
- "buttons": {
- "download": "Pobierz",
- "ignore": "Ignoruj"
- },
- "header": "Dostępna aktulizacja",
- "title": "Dostępna aktulizacja"
- },
- "worldItemCloner": {
- "buttons": {
- "cloneAtPlayerPosition": {
- "text": "Klonuj przy pozycji gracza",
- "tooltip": "Tworzy kopie tego obiektu przy graczu"
- },
- "removeAllCopies": {
- "text": "Usuń wszystkie kopie",
- "tooltip": "Usuwa wszystkie kopie tego typu z mapy"
- },
- "teleportObjectToPlayer": {
- "text": "Teleportuj obiekt do gracza",
- "tooltip": "Teleportuje obiekty do gracza"
- },
- "teleportPlayerToObject": {
- "text": "Teleportuj gracza do obiektu",
- "tooltip": "Teleportuje gracza do obiektu"
- }
- },
- "messages": {
- "clonesDeleted": {
- "text": "Usunięto {0} klonów {1}",
- "title": "Klony usunięte"
- },
- "nothingToDelete": {
- "text": "Nic do usunięcia",
- "title": "Nic nie znaleziono"
- },
- "nothingToMove": {
- "text": "Nic do przesunięcia",
- "title": "Nic nie znaleziono"
- },
- "objectCloned": {
- "text": "Kopia {0} stworzona w lokalizacji gracza. Zapisz and zatrzymać zmiany",
- "title": "{0} stworzony"
- }
- },
- "pinTooltip": "Pokaż pozycje przedmiotu na mapie",
- "title": "Kopiarka obiektów",
- "unknownItem": "Nieznany przedmiot ({0})",
- "unnamedItem": "Nienazwane ({0})",
- "worldItem": "Przedmiot"
- }
- },
- "worldItemTypes": {
- "GolfCart": "Wózek golfowy",
- "HangGlider": "Składana Lotnia",
- "KnightV": "Knight V",
- "Radio": "Radio"
- }
-}
\ No newline at end of file
diff --git a/SOTFEdit/data/lang/pl.yaml b/SOTFEdit/data/lang/pl.yaml
new file mode 100644
index 0000000..7498568
--- /dev/null
+++ b/SOTFEdit/data/lang/pl.yaml
@@ -0,0 +1,1504 @@
+actors:
+ classification:
+ animal: Zwierzę
+ cannibal: Kanibal
+ creep: Mutant
+ human: Człowiek
+ misc: Inne
+ muddyCannibal: Błotnisty Kanibal
+ details:
+ area: Obszar
+ classification: Klasyfikacja
+ family: Rodzina
+ gender: Płeć
+ killedByPlayer: Zabity przez gracza
+ lastSpawnTime: Ostatni czas respa
+ lastVisitedTime: Ostatni odwiedzony czas
+ spawnedCount: Ilość zrespionych
+ state: Stan
+ uniqueId: UniqueID
+ gender:
+ female: Kobieta
+ male: Mężczyzna
+ grouping:
+ animals: Zwierzęta
+ creeps: Mutanty
+ femaleCannibals: Kanibale Kobiety
+ femaleMuddyCannibals: Błotniste Kanibale Kobiety
+ maleCannibals: Kanibale Mężczyźni
+ maleMuddyCannibals: Błotniści Kanibale Mężczyźni
+ misc: Inne
+ mixed: Mieszane
+ mixedCannibals: Mieszane Kanibale
+ mixedMuddyCannibals: Błotniste Kanibale Mieszane
+ noFamily: Bez rodziny
+ headers:
+ influences: Odziaływania
+ info: Informacje
+ killStatistics: Statystyki zabójstw
+ modificationOptions: Opcje modyfikacji
+ modifications: Modyfikacje
+ selection: Selekcja
+ stats: Statystyki
+ influenceType:
+ Cannibal: Kanibal
+ Creepy: Mutant
+ Player: Gracz
+ modificationMode:
+ Modify: Zmień
+ Remove: Usuń
+ modificationOptions:
+ allActorSelections:
+ allActors: Wszyscy NPC
+ allActorsOfSameFamily: Wszyscy NPC tej rodziny
+ allActorsOfSameType: Wszyscy NPC tego typu
+ thisActor: Ten NPC
+ onlyInSameAreaAsActor: Tylko w okolicy tego NPC
+ removeSpawner:
+ text: Usuń Spawner
+ tooltip: Jeżeli wybrane NPC nie powinien się zrespić
+ replaceType: Zamień typ
+ skipKelvin: Pomiń Kelvins
+ skipVirginia: Pomiń Virginię
+ teleport:
+ disclaimer: Bądź ostrożny przy teleportowaniu kilku NPC do tego samego miejsca. To może zcrashować grę!
+ none: Nic
+ npcToPlayer: NPC to Gracza
+ playerToNpc: Gracz do NPC
+ teleportLabel: 'Teleportuj:'
+ updateInfluences: Zaktualizuj oddziałwyania
+ state:
+ -1: Brak
+ 0: Dowolny
+ 1: Walka
+ 2: Świat
+ 3: Śpi
+ 4: Umiera
+ 5: Ranny
+ 6: Martwy
+ 7: Lata
+ 8: Podkrada się
+ 20: Pali się
+ 21: Porażony prądem
+ 22: Pływa
+ 23: Ogłuszony
+ 24: Topi się
+ 25: Wózek Golfowy
+ 40: Na skale
+ 41: Na drzewie
+ 42: Pod liśćmi
+ 43: Chodzi po ścianach
+ 44: Złapany
+ 45: Intro do bossa
+ 46: Spawn Intro
+ 47: Sufit
+ 48: Podziemna Jaskinia
+ 50: Opuszcza walkę
+ 51: Zdespawnował się
+ stats:
+ affection: Przywiązanie
+ anger: Złość
+ energy: Energia
+ fear: Strach
+ fullness: Nasycenie
+ fullnessBuff: Wzmocnienie nasycenia
+ health: Zdrowie
+ hydration: Nawodnienie
+ hydrationBuff: Wzmocnienie nawodnienia
+ rest: Odpoczynek
+ restBuff: Wzmocnienie odpoczynku
+ stamina: Stamina
+ types:
+ 1: Królik
+ 2: Wiewiórka
+ 3: Rzułf
+ 4: Rekin
+ 5: Mewa
+ 6: Orzeł
+ 7: Kaczka
+ 8: Timmy
+ 9: Kelvin / Robby
+ 10: Virginia
+ 11: Fingers
+ 12: Carl
+ 13: Andy
+ 14: Danny
+ 15: Billy
+ 16: Złota Maska
+ 17: Łoś
+ 18: Dziecko
+ 19: Bliźniaki
+ 20: Mutant jaskiniowy - Mężczyzna
+ 21: Mutant jaskiniowy - Kobieta
+ 22: Glut
+ 23: Anioł
+ 24: Łosoś
+ 25: Brandy
+ 26: Crystal
+ 27: Destiny
+ 28: Błotnista Kobieta
+ 29: Błotnisy Mężczyzna
+ 30: Ciężki Mężczyzna
+ 31: Gąbka testowa
+ 32: Nietoperz
+ 33: Jeleń
+ 34: Niebieski ptak
+ 35: Koliber
+ 36: Orka
+ 37: Żółw Lądowy
+ 38: Gruby Mężczyzna
+ 39: Gruba Kobieta
+ 40: Jan2
+ 41: Bezimienny
+ 42: Demon
+ 43: Umalowany Mężczyzna
+ 44: Umalowana Kobieta
+ 45: Demon Boss
+ 46: Pan Puffton
+ 47: Pani Puffton
+ 48: Boss Mutant
+ 49: Virginia-Mutant
+ 50: Armsy
+ 51: Frank
+ 52: Eddy
+ 53: Greg
+ 54: Henry
+ 55: Igor
+ 56: Elise
+ 57: Szop Pracz
+ 58: Legsy
+ 59: Holey
+ 60: Skunks
+ 90: Helikopter
+ 100: PlayerRobby
+armor:
+ buttons:
+ default: Zwykły
+ max: Max
+ remove: Usuń
+ setAllToDefault:
+ text: Ustaw wszystkie na zwykłą
+ tooltip: Ustawia wytrzymałość wszystkich pancerzów na zwykłą
+ setAllToMax:
+ text: Set all to Max
+ tooltip: Ustawia wytrzymałość wszystkich pancerzów na maksymalną
+ setToDefault:
+ text: Zwykły
+ tooltip: Ustawia wytrzymałość pancerza na zwykłą
+ setToMax:
+ text: Max
+ tooltip: Ustawia wytrzymałość pancerza na maksymalną
+ durabilityInput:
+ tooltip: Wytrzymałość pancerza. Jeżeli będzie równe 0, pancerz się niszczy. Może być bardzo wysoka
+ watermark: Wytrzymałość
+ header: Założony pancerz (Max. 10)
+ headers:
+ actions: Akcje
+ durability: Wytrzymałość
+ id: ID
+ name: Nazwa
+ slot: Slot
+ unknownItem: ??? Nieznany przedmiot
+backup:
+ messages:
+ backupsRestored:
+ text: '{0} backups zostały przywrócone. Usunięte pliki przesunięto do kosza'
+ title: Backupy przywrócone
+ mode:
+ Default: Zawsze backupuj
+ InitialAndOne: Zawsze zostaw orginał i jeden dodatkowy bakup
+ None: Bez Backupów
+ One: Zostaw jeden backup i nadpisuj
+companion:
+ address: IP/Addres
+ connect: Połącz
+ connectionFailed:
+ text: Próba połączenia do plugina nieudana
+ textException: 'Próba połączenia do plugina nieudana. Error: {0}'
+ title: Połączenie do Companion nieudane
+ connectionSuccessful:
+ text: >-
+ Połączono do Companion
+
+ Możesz teraz używać hotkeyów w grze, teleportacji i śledzenia pozycji na żywo
+ title: Companion Połączony
+ connectTimeout: Limit czasu połączenia
+ disconnect: Rozłącz
+ disconnectFailed:
+ text: Próba rozłączenia do plugina nieudana
+ textException: 'Próba rozłączenia do plugina nieudana. Error: {0}'
+ title: Rozłączenie Companion Nieudane
+ keepAliveInterval: Interwał zostań-żywy
+ mapPositionUpdateInterval: Aktualizuj pozycję gracza co
+ port: Port
+ portHint: Ports > 1024 wymagają uruchomienia programu i gry jako admin!
+ readme: Readme
+ readme1: >-
+ Companion dodaje niektóre dodatkowe funkcje do gry, takie jak teleportacja w grze, śledzenie pozycji i wiele innych.
+
+
+ Zanim będziesz mógł używać Companiona, musisz najpierw go skonfigurować. Aby to zrobić, musisz skonfigurować dwie rzeczy w swojej grze:
+
+
+ - BepInExPack
+
+ - SOTFEdit Companion Plugin
+
+
+ Możesz je pobrać stąd i zainstalować ręcznie, postępując zgodnie z instrukcjami w README, lub użyć menedżera modów:
+ readme2: >-
+ Po przygotowaniu obydwóch, i włączeniu gry, musisz połączyć do Companion używając menu.
+
+
+ Następnie, w grze, masz do dyspozycji dwie nowe skróty klawiszowe:
+
+
+ - Teleportacja w grze do większości lokalizacji w grze (Domyślnie: F8)
+
+ - Tworzenie niestandardowego punktu teleportacji POI (Domyślnie: F9)
+
+
+ Jednocześnie, Twoja pozycja na mapie będzie na bieżąco aktualizowana.
+ settings: Ustawienia
+ status:
+ connected: Połączony
+ connecting: Łączenie...
+ disconnected: Rozłączony
+dialogs:
+ changeScrewStructureType:
+ disclaimer: Możesz tutaj wybrać inny typ struktury. Pamiętaj, że obrót i położenie struktury pozostaną takie same, co może prowadzić do błędów i crashów.
+ spawnFollower:
+ disclaimer: >-
+ Jeśli chcesz zrodzić Kelvina/Virginię, musisz się upewnić, że jesteś na otwartej przestrzeni. Będą oni się pojawiać w pozycji gracza powyżej jego aktualnej wysokości i z lekkim przesunięciem.
+
+
+ Próbowałem wielu rzeczy dla Virginii, ale tylko mogłem zespawnić maksymalnie 4. Z Kelvinem było lepiej.
+
+
+ This might kill your FPS and the long term consequences are also not known right now, bla bla bla.
+
+
+ Kontunuj na własne ryzyko.
+ title: Spawn Follower
+ translations:
+ filter: Fi
+ missingOnly: Tylko Brakujące
+errors:
+ canNotBeEmpty: '{0} nie może być pusty'
+experiments:
+ fires:
+ noFires:
+ text: Nie znaleziono ognisk do zmodyfikowania
+ title: Brak ognisk
+ success:
+ text: '{0} ognisk zostało podpalonych'
+ title: Zmodyfikowano ogniska
+ resetCannibalAngerLevel:
+ success:
+ text: Dodano zmiany. Zapisz, żeby je zatrzymać
+ title: Dodano zmiany
+ resetStructureDamage:
+ noDamage:
+ text: Brak obrażeń do naprawienia
+ title: Brak obrażeń zadanych
+ success:
+ text: '{0} obrażeń zostało naprawionych'
+ title: Damages repaired
+followers:
+ buttons:
+ fillAllBars: Uzupełnij wszystkie paski
+ moveToKelvin: Przesuń do Kelvin
+ moveToPlayer: Przesuń do gracza
+ moveToVirginia: Przesuń do Virginii
+ revive: Odródź
+ spawn: Przywołaj
+ details:
+ status: Status
+ uniqueId: Unique ID
+ equipmentLabel: Wyposażenie
+ outfitLabel: Strój
+ outfits:
+ 9:
+ -1: Bazowy
+ 0: Taktyczna kurtka
+ 1: Smoking
+ 2: Piżamy
+ 3: Brązowa skórzana kurtka
+ 4: Bluza z Kapturem
+ 5: Niebieski TShirt
+ 6: Garnitur
+ 7: Czarna skórzana kurtka
+ 8: Skafander Kosmiczny
+ 9: Strój Księdza
+ 10: Strój Stewardessy
+ 10:
+ -1: Bazowy
+ 0: Strój Kąpielowy
+ 1: Dres
+ 2: Strój skórzany
+ 3: Strój kamuflujący
+ 4: Sukienka
+ 5: Turkusowa Sukienka
+ 6: Czerwona Sukienka
+ reviveTooltip: Upewnij się, że robisz to poza budynkami, gdy brakuje ciała, w przeciwnym razie możesz wglithować do budynku\n Kelwin/Virinia pojawi się na pozycji gracza i będzie miał przedmioty i strój skonfigurowane po prawej stronie.
+ status:
+ alive: Żywy
+ dead: Martwy
+ unknown: ???
+game:
+ setup:
+ animalSpawnRate:
+ _label: Ilość zwierząt
+ buildingResistance: Odporność Budynków
+ coldPenalties: Kary za Zimno
+ coldPenaltiesStatReduction: Kary do odnowiania statystyk
+ consumableEffects:
+ _label: Efekty złego jedzenia
+ _tooltip: Ile obrażeń dostaniesz po zjedzeniu złego jedzenia
+ creativeMode: Tryb Kreatywny
+ customSettings: Specjane ustawienia
+ dayLength:
+ default: Normalna
+ long: Długa
+ realistic: Realistyczna
+ short: Krótka
+ _label: Długość dnia
+ enemyAggression:
+ _label: Agresja przeciwników
+ enemyArmour:
+ _label: Pancerz przeciwników
+ enemyDamage:
+ _label: Obrażenia od przeciwników
+ enemyHealth:
+ _label: Zdrowie przeciwników
+ enemySearchParties:
+ _label: Ekipy poszukiwawcze przeciwników
+ forcePlaceFullLoad: Natychmiastowe Budowanie
+ header: Ustawienia gry
+ headers:
+ enemiesCustom: Przeciwnicy (Custom)
+ multiplayer: Mulitplayer
+ weatherCustom: Pogoda (Custom)
+ immortalMode: God-Mode
+ inventoryPause: Pauzuj w ekwipunku
+ mode:
+ creative: Kreatywny
+ custom: Własny
+ hard: Trudny
+ hardSurvival: Trudny Survival
+ normal: Normalny
+ peaceful: Spokojny
+ _label: Tryb
+ noCuttingsSpawn: No Cuttings Spawn
+ oneHitToCutTrees: 1 trafienie do zniszczenia drzewa
+ playerStatsDamage:
+ _label: Obrażenia od odwodnienia itp.
+ _tooltip: Ile obrażeń otrzymasz od odwodnienia itp.
+ playersTriggerTraps: Gracze uruchamiają pułapki
+ precipitationFrequency:
+ _label: Zmiany pogody
+ _tooltip: Jak szybko zmienia się pogoda
+ pvpDamage: Obrażenia PvP
+ reducedAmmoInContainers: Mniej ammunicji w pojemnikach
+ reducedFoodInContainers: Zmniejszona ilość jedzenia w pojemnikach
+ seasonLength:
+ default: Normalne
+ long: Długie
+ realistic: Realistyczne
+ short: Krótkie
+ _label: Długość pór roku
+ settingsValues:
+ default: Normalnie
+ hard: Trudny
+ high: Często
+ low: Rzadko
+ normal: Średnia
+ off: Off
+ reduced: Zredukowane
+ singleUseContainers: Pojemniki jednorazowego użytku
+ spawnEnemies: Przywołaj przeciwników
+ startingSeason:
+ autumn: Jesień
+ spring: Wiosna
+ summer: Lato
+ winter: Zima
+ _label: Początkowa pora roku
+ uid: UID
+ state:
+ header: Game State
+ headers:
+ worldObjectStates: Stany obiektów w świecie
+ worldObjectStates:
+ disclaimer: >-
+ Nie jest pewne co każdy stan oznacza. Prawdopodobnie:
+
+ - 0 = Nie ustawiony/Zamknięty/Nie wydarzyło się
+
+ - 1 or 3 = Ustawiony/Otwarty/Wydarzyło się
+ header: Stany obiektów w świecie
+generic:
+ add: Dodaj
+ cancel: Anuluj
+ close: Zamknij
+ edit: Edytuj
+ error: Błąd
+ exceptionMessage: 'Pojawił się wyjątek: {0}'
+ name: Nazwa
+ no: Nie
+ ok: OK
+ position: Pozycja
+ save: Zapisz
+ seconds: Sekund
+ setting: Ustawienia
+ success: Sukces
+ unknown: Nieznane
+ update: Aktualizuj
+ value: Wartość
+ yes: Tak
+influences:
+ anger: Złość
+ disclaimer: >-
+ Sentyment odpowiada za przywiązanie, aczkolwiek ciągle nie rozumiemy jak oddziałowywuje to na przeciwników.
+
+ Wyższa wartość strachu zwiększa szansę na ucieczkę przeiwników podczas walki.
+
+ Wyższy poziom złości zwiększa częstotliwość ataków.
+ fear: Strach
+ sentiment: Sentyment
+inventory:
+ buttons:
+ addAllFromCategory: Dodaj wszystkie z kategorii
+ max: Max
+ remove: Usuń
+ removeAll: Usuń wszystkie
+ setAllToMax: Ustaw ilość wszystkich na maksymalną
+ setAllToMin: Ustaw ilość wszystkich na minimalną
+ filterWatermark: Filtruj...
+ headers:
+ itemsInInventory: Przedmioty w ekwipunku
+ unassignedItems: Nieprzypisane przedmioty
+ table:
+ actions: Akcje
+ count:
+ text: Ilość
+ tooltip: Ilość ile masz w ekwipunku
+ id: ID
+ name: Nazwa
+ type: Typ
+ unknownItem: ??? Nieznany przedmiot
+items:
+ 78: Kłoda
+ 340: Gitara
+ 341: Lornetka
+ 346: Szyna do strzelby
+ 351: Torba z łatwym dostępem
+ 353: Paralizator
+ 354: Noktowizor
+ 355: Pistolet
+ 356: Nowoczesna siekiera
+ 357: Wiatrówka
+ 358: Strzelba
+ 359: Maczeta
+ 360: Taktyczny łuk
+ 361: Karabin
+ 362: Amunicja do pistoletu
+ 363: Śrut do strzelby
+ 364: Kulki do strzelby
+ 365: Kusza
+ 366: Rzutka śledząca
+ 367: Katana
+ 368: Bełt do kuszy
+ 369: Amunicja do paralizatora
+ 370: Amunicja do pistoletu
+ 371: Kulki do strzelby
+ 372: Śrut do strzelby
+ 373: Taktyczna strzała
+ 374: Tłumik
+ 375: Celownik laserowy
+ 376: Szyna do pistoletu
+ 377: Luneta
+ 378: Mocowanie latarki
+ 379: Taktyczna siekiera
+ 380: Nóż bojowy
+ 381: Granat
+ 382: Amunicja do granatnika
+ 383: Szyna do karabinu
+ 384: Kołczan do kuszy
+ 386: Rewolwer
+ 387: Amunicja do karabinu
+ 388: Molotow
+ 389: Amunicja do molotowa
+ 390: Żywica do drukarki
+ 391: Czerwona maska
+ 392: Patyk
+ 393: Kamień
+ 394: Piła łańcuchowa
+ 395: Deska
+ 396: Pałka ogłuszająca
+ 397: Shiitake
+ 398: Boczniak mikołajkowy
+ 399: Kolczak obłączasty
+ 400: Muchomor Czerwony
+ 401: Jajo żółwia
+ 402: Plecak
+ 403: Lina
+ 405: Kość
+ 406: Ćwierć kłody
+ 408: Pół kłody
+ 409: Trzy czwarte kłody
+ 410: Zegarek
+ 412: Nadajnik GPS
+ 413: Zapalniczka plazmowa
+ 414: Butelka wódki
+ 415: Szmatka
+ 416: Płytka drukowana
+ 417: Bomba czasowa
+ 418: Przewód
+ 419: Taśma klejąca
+ 420: Ładunek C4
+ 421: Ramen
+ 422: Narzędzie naprawcze
+ 423: Powieść A
+ 424: Powieść B
+ 425: Płatki śniadaniowe
+ 426: Drukowana manierka
+ 427: Drukowany nóż
+ 428: Drukowane sanki
+ 429: Drukowana maska do nurkowania
+ 430: Czaszka
+ 431: Topór strażacki
+ 432: Otwieracz do puszek
+ 433: Mięso
+ 434: Konserwy
+ 435: Złota maska
+ 436: Ryba
+ 437: Leki
+ 438: Pakiet MRE
+ 439: Napój energetyczny
+ 440: Flara
+ 441: Baton energetyczny
+ 443: Łuk własnej roboty
+ 444: Oddycharka
+ 445: Borówki
+ 446: Wiciokrzew
+ 447: Maliny
+ 448: Śnieguliczka
+ 449: Kolcosił straszliwy
+ 450: Skrzyp polny
+ 451: Aloes
+ 452: Krwawnik pospolity
+ 453: Wierzbówka kiprzyca
+ 454: Ostryż
+ 455: Mieszanka lecząca
+ 456: Mieszanka lecząca+
+ 457: Amunicja do paralizatora
+ 458: Ładowarka do baterii
+ 459: Proca
+ 460: Pudełko Baterii
+ 461: Mieszanka energetyczna
+ 462: Mieszanka energetyczna+
+ 463: Płetwy
+ 464: Karma dla kota
+ 465: Cykoria
+ 466: Ostryga
+ 467: Okładka albumu
+ 468: Krzyż
+ 469: Butla z powietrzem
+ 470: Celownik do wiatrówki
+ 471: Latarka
+ 472: Skóra jelenia
+ 473: Zbroja z liści
+ 474: Włócznia własnej roboty
+ 475: Manierka
+ 476: Mały kamień
+ 477: Maczuga własnej roboty
+ 478: Czekan
+ 479: Pióro
+ 480: Odcięta ręka
+ 481: Odcięta noga
+ 482: Odcięta głowa
+ 483: Pakiet ratunkowy
+ 484: Liść
+ 485: Łopata
+ 486: Krótkofalówka
+ 487: Piżamy
+ 488: Niebieska koszulka
+ 489: Taktyczne spodnie
+ 490: Bluza z kapturem
+ 491: Marynarka
+ 492: Smoking
+ 493: Skórzana kurtka
+ 494: Pancerz kościany
+ 495: Kurtka taktyczna
+ 496: Pieniądze
+ 497: Tacka na jedzenie
+ 498: Celownik laserowy GRABS
+ 499: Kombinezon nurkowy
+ 500: Puchowa kurtka
+ 501: Buty taktyczne
+ 502: Monety
+ 503: Latarka
+ 504: Plandeka
+ 505: Miernik laserowy
+ 506: Skorupa żółwia
+ 507: Ręcznie robione strzały
+ 508: Skórzana torba
+ 509: Broszura Holosprings
+ 511: Wyłącznik kontaktowy
+ 512: Pełna tacka na jedzenie
+ 513: Sprężyna
+ 514: Kontaktowa sprężyna
+ 515: Podstawowa strona poradnika budowania
+ 516: Strona poradnika budowania namiotu z plandeki
+ 517: Garnek
+ 518: Cel papierowy
+ 519: Pancerz z jeleniej skóry
+ 520: Element struktury
+ 521: Email o oświetleniu jaskini
+ 522: Pistolet do tyrolek
+ 523: Linka do tyrolek
+ 524: Piłka golfowa
+ 525: Kij golfowy
+ 526: Testament E. Pufftona
+ 527: Baterie
+ 528: Finanse E. Pufftona
+ 529: Lokalizator GPS
+ 530: Projekt stojaka do suszenia
+ 531: Projekt krzesła ze patyków
+ 532: Projekt łóżka ze patyków
+ 533: Projekt stojaka na broń
+ 534: Email o golfa, cz. 1
+ 535: Email o golfa, cz. 2
+ 536: Email o golfa, cz. 3
+ 537: Email o golfa, cz. 4
+ 538: Email o malarstwie
+ 539: Email o astrologii, cz. 1
+ 540: Email o astrologii, cz. 2
+ 541: Email o astrologii, cz. 3
+ 542: Email polityka, cz. 1
+ 543: Email polityka, cz. 2
+ 544: List od polityków, część 1
+ 545: List od polityków, część 2
+ 546: List od polityków, część 3
+ 547: List od baletnicy
+ 548: List o skrzypiących butach, część 1
+ 549: Projektowanie kości
+ 550: Projektowanie lotki na muchy
+ 551: Projektowanie pułapki na małe zwierzęta
+ 552: Książka z projektami
+ 553: Siatka techniczna
+ 554: Pancarz Techniczny
+ 555: Dres
+ 556: Sukienka
+ 557: Skórzany garnitur
+ 558: Kamuflażowy kombinezon
+ 559: Drukowane groty strzał
+ 560: Drukowany hak wspinaczkowy
+ 561: Drukowany doniczka
+ 562: Ogłoszenie Holoville A
+ 563: Ogłoszenie Holoville B
+ 564: Ogłoszenie Holoville C
+ 565: Ogłoszenie Holoville D
+ 566: Karta dostępu do konserwacji
+ 567: Karta dostępu gości
+ 568: Karta dostępu VIP
+ 569: Kąsek mózgu
+ 570: Kąsek stekowy
+ 571: Kąsek ze steku i bekonu
+ 572: Starożytny Pancerz
+ 573: Śpiwór
+ 574: Powieść C
+ 575: Powieść D
+ 576: Ćwierć deski
+ 577: Pół deski
+ 578: Trzy czwarte deski
+ 579: Projektowanie krzesła z kości
+ 580: Projektowanie drabiny z patyków
+ 581: Projektowanie domku dla ptaków
+ 582: Projektowanie pułapki na ryby
+ 583: Projektowanie skrzynki na przechowywanie
+ 584: Projektowanie manekina
+ 585: Projektowanie stracha na wróble
+ 586: Projektowanie ściennego doniczka
+ 587: Projektowanie podłogowego doniczka
+ 588: Projektowanie żyrandola z kości
+ 589: S.C.R.E.W. / Samouczki
+ 590: Radio
+ 591: Projektowanie małego drewnianego domku
+ 592: Przerażająca skóra
+ 593: Przerażający pancerz
+ 594: Jagody guarany
+ 595: Jeżyny
+ 596: Nasiona aloesu
+ 597: Nasiona ostryżu
+ 598: Nasiona jeżyn
+ 599: Nasiona jagód
+ 600: Nasiona Kolcosiła straszliwego
+ 601: Nasiona wierzbówki kiprzyca
+ 602: Nasiona Gurany
+ 603: Nasiona skrzypu polnego
+ 604: Nasiona malin
+ 605: Nasiona Chicory
+ 606: Nasiona Krwawnika pospolitego
+ 607: Projekt magazynu kamieni
+ 608: Projekt magazynu kości
+ 609: Projekt magazynu kłód
+ 610: Projekt magazynu patyków
+ 611: Wydruk z numerami
+ 612: Wycinek z gazety
+ 613: Wycinek z gazety 2/2
+ 614: Email
+ 615: Email
+ 616: Email
+ 617: Cena akcji
+ 618: Wystrzelona strzała
+ 619: Kostium kąpielowy
+ 620: Projekt stołu
+ 621: Projekt półki
+ 622: Projekt ścieżki z kamieni
+ 623: Projekt półki ściennego
+ 624: Projekt pochodni ściennych
+ 625: Projekt wiszącej czaszki
+ 626: Lotnia
+ 627: Karta stołowa Pana Pufftona
+ 628: Karta stołowa Pani Puffton
+ 629: Zbiornik na deszczówkę
+ 630: Knight V
+ 631: The Realm Beyond
+ 632: Plan pułapki sprężynowej
+ 633: Broszura kultu
+ 634: Panel słoneczny
+ 635: Żarówka
+ 636: TemplateD
+ 637: Kamera
+ 638: Plan Prostych Sań na Kłody
+ 639: Skafander Kosmiczny
+ 640: Kamień
+ 641: Projaekt kamiennego kominka
+ 642: Głowa Kaczki
+ 643: Głowa Orła
+ 644: Mała Głowa Żółwia
+ 645: Plan stojaku na trofea
+ 646: Głowa Królika
+ 647: Głowa Wiewiórki
+ 648: Głowa Mewy
+ 649: Plan przechowywalni kamieni
+ 650: Głowa Żółwia
+ 651: Głowa Jelenia
+ 652: Głowa Łosia
+ 653: Notatka Osobista A
+ 654: Notatka Osobista B
+ 655: Notatka Osobista C
+ 656: Projekt Pułapki Hokey Pokey
+ 657: Wydrukowana opakówka na GPS
+ 658: Projekt RadioPułapki
+ 659: Projekt Radia
+ 661: Bateria Wózka Golfowego
+ 662: Część Artefaktu A
+ 663: Kilof
+ 664: Ruda Solafitu
+ 665: Plan Ulepszania Broni
+ 666: Plan zasilonego krzyża
+ 667: Część Artefaktu B
+ 668: Część Artefaktu C
+ 669: Część Artefaktu D
+ 670: Projekt krzesła z flaków
+ 671: Projekt kanapy z flaków
+ 672: Plan Pułapki-Uber
+ 673: Plan okrągłego stołu
+ 674: Stara notatka A
+ 675: Stara notatka B
+ 676: Stara notatka C
+ 677: Email Rybacki A
+ 678: Email Rybacki B
+ 679: Plan Pułapki Mielarki
+ 680: Plan Reflektora
+ 681: Plan zagara
+ 682: Plan pułapki obrotowej
+ 683: Plan podwójnego łóżka
+ 684: Stara notatka E
+ 685: Stara Notatka D
+ 686: Stara notatka F
+ 687: Email Pufftona A
+ 688: Plan pułapki rzucającej włóczniami
+ 689: Część artefaktu E
+ 690: Strony fabularne
+ 691: Stara notatka F
+ 692: Mail Rybacki C
+ 693: Mapa Bunkra A
+ 694: Wydruk Emailu Jianyu A
+ 695: Znak kultu G
+ 696: Znak kultu H
+ 697: Znak kultu I
+ 698: Znak kultu J
+ 699: Znak kultu K
+ 700: Plan magazynu na włócznie
+ 701: Plan Nogo-Lampy
+ 702: Plan magazynu na drewno opałowe
+ 703: Strój Księdza
+ 704: Plan półki na broń
+ 705: Broszura Cyrkowa
+ 706: Wycinek Gazety (Mąż)
+ 707: Artefakt
+ 708: Część Arefaktu F
+ 709: Plan teleportera
+ 710: Plan Kapliczki Odpychania
+ 711: Plan Kapliczki Przyciągania
+ 712: Część Artefaktu G
+ 713: Plan Plater Counter
+ 714: Plan Pokrywacza Zbrój
+ 715: Głowa Szopa Pracza
+ 716: Papier z Bibli D
+ 717: Stara notatka G
+ 718: Personalna Notatka E
+ 719: Personalna Notatka F
+ 720: Personalna Notatka G
+ 721: Wycinek Bibli A
+ 722: Email Pufftona B
+ 723: Email Pufftona C
+ 724: Nasion Jagody Bliźniaczej
+ 725: Nasiono Śnieźnej Jagody
+ 726: Plan Wyrzutni Składanej Lotni
+ 727: Zbroja z solafitu
+ 728: Żyjący królik
+ 729: Głowa skunksa
+ 730: Plan małej klatki dla królików
+ 749: Strój Stewardessy
+itemTypes:
+ ammo: Ammunicja
+ armor: Pancerz
+ attachment: Dodatki na broń
+ blueprint: Projekt
+ bodyPart: Część ciała
+ book: Książki
+ clothes: Ubrania
+ consumable: Zużywalne
+ container: Pojemnik
+ document: Dokument
+ electricity: Elektryczność
+ equipment: Wyposażenia
+ food: Jedzenie
+ key: Klucz
+ log: Kłoda
+ misc: Inne
+ plant: Roślina
+ printed: Wydruk
+ seed: Nasiona
+ tool: Narzędzia
+ trophy: Trofeum
+ weapon: Broń
+ weaponMod: Modyfikacje broni
+itemVariants:
+ 433:
+ 1: Surowe Mięso
+ 2: Nieznane Mięso
+ 3: Zepsute Mięso
+ 4: Suszone Mięso
+ 5: Gotowane Mięso
+ 6: Spalone Mięso
+ 436:
+ 1: Surowa Ryba
+ 2: Nieznana Ryba
+ 3: Zesputa Ryba
+ 4: Suszona Ryba
+ 5: Ugotowana Ryba
+ 6: Spalona Ryba
+ 480:
+ 1: Surowe Ramię
+ 2: Nieznane Ramię
+ 3: Zepsute Ramię
+ 4: Suszone Ramię
+ 5: Gotowane Ramię
+ 6: Spalone Ramię
+ 481:
+ 1: Surowa Noga
+ 2: Nieznana Noga
+ 3: Zesputa Noga
+ 4: Suszona Noga
+ 5: Ugotowana Noga
+ 6: Spalona Noga
+languages:
+ de: Niemiecki (German)
+ en: Angielski (English)
+ pl: Polski (Polish)
+map:
+ actors: NPC-y
+ altItems: Alternatywne przedmioty
+ alwaysOnTop: Zawsze na wierzchu
+ area: Obszar
+ areaFilter:
+ text: Obszar
+ types:
+ all: Wszystkie
+ surfaceOnly: Tylko na powierzchni
+ undergroundOnly: Tylko w Jaskiniach/Bunkrach
+ buttons:
+ createNewZipline:
+ text: Nowa tyrolka stąd
+ tooltip: Po wsiśnieciu stworzy się tyrolka pomiędzy obecnie wybranym punktem a następnie wybranym
+ delete: Usuń
+ deleteBothAnchors: Usuń obydwa końce tyrolki
+ deselectAll: Odznacz wszystkie
+ moveToNextClickedPosition:
+ hint: Wybierz nową lokalicaję
+ text: Przenieś do wybranej pozycjii
+ tooltip: Przenieś koniec tyrolki do następnego wybrnego miejsca
+ spawnActors: Przywołaj NPC
+ teleportKelvin: Teleportuj tutaj Kelvina
+ teleportPlayer: Teleportuj tutaj Gracza
+ teleportVirginia: Teleportuj tutaj Virginię
+ resetAllDone:
+ text: Zresetuj wszystkie ukończone
+ tooltip: Odznacz wszystkie POI jako ukończone
+ markAsDone:
+ text: Oznacz jako ukończone
+ tooltip: Oznacz ten punkt jako ukończony
+ markAsUndone:
+ text: Cofnij ukończenie
+ tooltip: Odznacz ten punkt jako ukończony
+ coordinates: Koordynaty
+ customPois: Własne
+ details: Szczegóły
+ fill: Wypełnij
+ followers: Towarzysze
+ followPlayer: Podążaj za graczem
+ fullText:
+ text: Nazwa
+ tooltip: Szuka zarówno w nazwach lokalizacji, przedmiotów i innych znaczników na mapie, oraz w ich opisach
+ watermark: Nazwa lokalizacji, przedmiotu, czy ich opis
+ inventoryFilter: Ukryj ukończone
+ isInInventory: Posiadane
+ isRuntimeCreated: Jest kopią
+ isUnderground: Jest podziemią
+ itemId: ID przedmiotu
+ items: Przedmioty
+ mapType:
+ dark: Ciemna
+ original: Oryginalna
+ name: Nazwa
+ objects: Przedmioty
+ options: Opcje
+ pois: Punkty zainteresowań
+ requirements: Wymgania
+ requirementsFilter:
+ text: Wymagania
+ tooltip: Pokaż tylko przedmioty i miejsca do których masz dostęp (Masz kartę itp.)
+ types:
+ AccessibleOnly: Pokaż tylko dostępne
+ All: Wszystko
+ InaccessibleOnly: Pokaż tylko niedostępne
+ spawnWindow:
+ actorType: Typ NPC-a
+ count: Ilość
+ disclaimer: Bądź ostrożny z ilością i pozycją respionych NPC. Może zcrashować to grę. Niektórzy przeciwnicy mogę zostać zrespieni w jaskiniach.
+ doSpawn: Stwórz NPC-a
+ family: Rodzina
+ familyOfDestinationActor: Rodzina docelowego NPC-a
+ information: Informacja
+ options: Opcje
+ position: Pozycja
+ spaceBetween:
+ text: Odległość pomiędzy
+ tooltip: Definiuje odległości pomiędzy przywoływanymi NPC-ami
+ spawnPattern:
+ Cross: Krzyż
+ Grid: Siatka
+ HorizontalLine: Pozioma Linia
+ Random: Losowa
+ Rectangle: Prostokąt
+ text: Wzór przywołania
+ VerticalLine: Pionowa Linia
+ title: Przywołaj NPC-a
+ structures: Struktury
+ teleportation: Teleportacja
+ teleportWindow:
+ destination: Cel
+ disclaimer: Tutaj możesz dostosowywać pozycję NPC-a. Jeżeli zrespisz przeciwnika w sobie, jest możliwe, że polecisz w kosmos. X i Z to lokalizacja, Y to wysokość. Upewnij się że ustawiony obszar jest poprawny.
+ doTeleport: Teleportuj!
+ mode:
+ Kelvin: Kelvin
+ Player: Gracz
+ Virginia: Virginia
+ offset: Przesunięcie
+ title: Teleport
+ toTeleport: Teleport
+ wiki: Link do Wikipedii
+ zipLineAnchor: Końce tyrolek
+ zipLines: Tyrolki
+menu:
+ companion:
+ setup: Konfiguracja
+ text: Companion
+ file:
+ deleteAllBackups: Usuń wszystkie backupy
+ exit: Wyjdź
+ openLastSavegame: Otwórz ostatni zapis...
+ openLastSavegameWithSavegame: Otwórz {0}...
+ openSavegame: Otwórz zapis...
+ openSavegameDirInExplorer: Otwórz zapis Dir w eksplorerze
+ reloadCurrentSavegame: Załaduj obecny zapis
+ restoreFromBackup:
+ fromNewestBackup: Z najnowszego backupa
+ fromOldestBackup: Z najstarszego backupa
+ text: Odtwórz z backupów
+ save: Zapisz
+ settings: Ustawienia
+ text: Plik
+ help:
+ about: O programie
+ changelog: Changelog
+ links:
+ discord: Discord
+ downloadLatestVersion: Pobierz najnowszą wersję
+ githubProject: Projekt na GitHubie
+ nexusMods: NexusMods
+ text: Linki
+ thunderstoreIo: thunderstore.io
+ readme: Przeczytaj mnie!
+ text: '?'
+ translations: Tłumaczenia
+ updates:
+ checkNow: Sprawdź teraz
+ checkOnStartup: Sprawdź przy włączeniu
+ text: Aktualizacje
+ tools:
+ cloneWorldObjects:
+ text: Klonuj przedmioty ze świata
+ tooltip: Klonuje przedmioty ze świata do pozycji gracza
+ eternalFires:
+ text: Wieczne ognie
+ tooltip: Ognie zostaną zapalone, zużycie paliwa będzie niskie a jego ilość duża
+ fires:
+ text: Ognie
+ tooltip: Modyfikuj ognie na świecie
+ itemPlater:
+ text: Plater przedmiotów i struktur
+ tooltip: Dodaje lub usuwa solafitowy plating do przemiotów w ekwipunku
+ map:
+ text: Interaktywna mapa
+ tooltip: Po prosu interaktywna mapa.
+ modifyConsumedItems:
+ text: Modyfikuj zjedzone przedmioty...
+ tooltip: W przypadku, gdy chcesz oczyścić pamięć o przedmiotach, które już zjadłeś
+ regrowTrees: Odrośnij drzewa...
+ resetCannibalAngerLevel:
+ text: Zresetuj poziom agresji kanibali
+ tooltip: Zresetuj statystyki zabójstw, liczbę ściętch drzew, i ilość odwiedzonych wiosek, co przełoży się na mniej najazdów
+ resetContainers:
+ text: Zresetuj pojemniki
+ tooltip: Resetuje pojemniki, w jaskiniach i otwartym świecie
+ resetFires:
+ text: Zresetuj ognie
+ tooltip: Ognie zostaną zapalone, a prędkość zużycia i ilość paliwa ustawione na domyślne
+ resetStructureDamage:
+ text: Zresetuj obrażenia struktur
+ tooltip: Naprawia wszystkie struktury
+ resetTraps:
+ text: Zresetuj pułapki
+ tooltip: Resetuje pułapki
+ setToEndgame:
+ text: Ustaw na Koniec Gry
+ tooltip: Ustawia grę na "Koniec gry" co odblokowywuje nowych przeciwników
+ text: Narzędzia
+ unlocks:
+ text: Odblokowywania
+ tooltip: Pozwala odblokować niektóre części gry
+ resetAllDone:
+ text: Zresetuj wszystkie ukończone
+ tooltip: Odznacz wszystkie POI jako ukończone
+autoConnect: Automatyczne łączenie
+autoReload: Automatyczne przeładowanie
+npcs:
+ tabs:
+ byFamily:
+ disclaimer: Rodzina oznacza grupę przeciwników, np plemię.
+ text: Rodziną
+ byType: Typem
+player:
+ areaMask: Obszar
+ buttons:
+ moveToKelvin: Przeteleportj do Kelvina
+ moveToVirginia: Przeteleportj do Virginii
+ currentHealth: Obecne zdrowie
+ fillAllBars: Wypełnij wszystkie paski
+ mapGroupName: Gracz
+ maxHealth: Maksymalne zdrowie
+ outfit: Strój
+ sickness: Choroba
+ strengthLevel: Poziom siły
+poiGroups:
+ Ammo: Ammunicja
+ Bunkers: Bunkry
+ Camps: Obozowiska
+ CannibalVillages: Wioski kanibalów
+ Caves: Jaskinie
+ Crates: Skrzynie
+ Doors: Drzwi
+ Helicopters: Helikoptery
+ Info: Informacje
+ Items: Przedmioty
+ Lakes: Jeziora
+ Laptops: Laptopy
+ Ponds: Jeziorka
+ Printers: Drukarki 3D
+ Supply: Zapasy
+ Villages: Wioski
+storage:
+ batch:
+ allSlots: Wszystkie miejca
+ clearAll: Usuń wszystkie
+ fillAllWith: Wypełnij wszystko
+ setAllToMax: Ustaw wszystkie na
+ buttons:
+ fillAllStorages: Wypełnij wszystkie magazyny
+ errors:
+ currentStateNotDefined: CurrentState nie zdefiniowane dla id {0}
+ headers:
+ selectAStorage: Wybierz magazyn
+ storageTypes: Typ magazynu
+ slot:
+ max: Dodaj
+ remove: Usuń
+structures:
+ added: Dodano
+ applyToAllOfSameType:
+ text: Zaaplikuj do wszystich tego samego typu
+ tooltip: Aplikuje do wszystkich tego samego typu
+ buildCost: Koszt budowy
+ buttons:
+ changeType: Zmień typ
+ setAllToAlmostFinish: Ustaw wszystkie na prawie ukończone"
+ setAllToFinish: Ustaw wszystkie na "Ukończone"
+ setAllToRemove: Ustaw wszystkie na "Usunięte"
+ setAllToUnfinish: Ustaw wszystkie na "Nieukończone"
+ unmodifyAll: Od-modyfikuj wszystkie
+ categories:
+ furniture: Meble
+ gardening: Ogrodnictwo
+ misc: Inne
+ raft: Tratfa
+ shelter: Schronienie
+ storage: Magazyn
+ traps: Pułapki
+ treeShelter: Schronienie na drzewie
+ utility: Użytkowość
+ category: Kategoria
+ headers:
+ batch: Partia
+ finishedStructures: Ukończone struktury
+ unfinishedStructures: Nieukończone struktury
+ modification: Modyfikacja
+ modificationMode:
+ AlmostFinish: Prawie ukończone
+ Finish: Ukończ
+ None: Nic
+ Remove: Usuń
+ Unfinish: Od-ukończ
+ percentDone: Dodano procent
+ structureTypeSelectorDisclaimer: Jeżeli nic nie będzie wybrane, wszystkie struktury zostaną zmienione!
+ types:
+ 19: Stojak na Broń
+ 20: Krzesło z Patyków
+ 21: Pułapka Robiąca Kości
+ 22: Łóżko z Patyków
+ 23: Donica Ścienna
+ 24: Żyrandol z Kości
+ 25: Krzesło z Kości
+ 26: Dobudówka
+ 27: Suszarka
+ 28: Schronienie na drzewie 2
+ 29: Magazyn na Patyki
+ 31: Magazyn na Kamienie
+ 32: Magazyn na Kości
+ 34: Mała Chatka
+ 35: Pułapka na Ryby
+ 36: Stojak na Zbroje
+ 37: Magazyn na Kłody
+ 38: Wieża obserwacyjna
+ 39: Strach na Wróble
+ 40: Stojąca Donica
+ 41: Platforma na Drzewie 2
+ 42: Mała Pułapka na zwierzęta
+ 43: Platforma na drzewie 1
+ 44: Schronienie na drzewie 1
+ 45: Pułapka z Łapką na Muchy
+ 46: Ścieżka z Patyków
+ 47: Schronienie Myśliwego
+ 48: Stół
+ 49: Półka
+ 50: Ścieżka z Kamieni
+ 51: Półka Naścienna
+ 52: Ławka
+ 53: Pochodnia ścienna
+ 54: Lampa z Czaszki
+ 55: Tyrolka
+ 56: Zbiornik na Deszczówkę
+ 57: Pułapka Sprężynowa
+ 58: Sanie na Kłody
+ 59: Proste Sanie na Kłody
+ 60: Kamienny kominek
+ 61: Trofeum z głowy
+ 62: Magazyn kamieni
+ 63: Pułapka Hokey Pokey
+ 64: Pułapka Radio-Alarmowa
+ 67: Duży magazyn kłód
+ 68: Dywan z futra jelenia
+ 70: Plating przedmiotu
+ 71: Ulepszony Krzyż
+ 72: Krzesło z flaków
+ 73: Kanapa z Flaków
+ 74: Pułapka Uber
+ 75: Okrągły stół
+ 76: Pułapka Mielarka
+ 77: Reflektor
+ 78: Zegar
+ 79: Pułapka obrotowa
+ 80: Podwójne łóżko
+ 81: Pułapka rzucająca włóczniami
+ 82: Magazyn na włócznie
+ 84: Magazyn na Drewno Opałowe
+ 85: Nogo-Lampa
+ 86: Półka na Bronie
+ 88: Teleporter
+ 89: Kapliczka Odpychania
+ 90: Kapliczka Przyciągania
+ 91: Kanapa
+ 92: Pułapka Liściowa
+ 93: Pułapka z Mołotwem
+ 94: Eksplodująca pułapka
+ 95: Magazyn na strzały
+ 96: Magazyn na Kłody
+ 97: Futrzane Krzesło
+ 98: Mała Platforma
+ 99: Średnia Platforma
+ 100: Plater Counter
+ 101: Gold Armor Plater
+ 102: Wyrzutnia Składanych Lotni
+ 103: Wyrzutnia Składanych Lotni
+ 104: Magazyn na materiały wybuchowe
+ 106: Klatka dla królików
+ 107: Mała klatka dla królików
+ 108: Łódź mieszkalna
+ 109: Magazyn na Knight-V
+ 110: Domek dla ptaków
+ 113: Składana lotnia
+ 117: Mała tratwa
+ 118: Poler
+ 119: Duża tratwa
+tabs:
+ followers: Towarzysze
+ game: Gra
+ inventory: Ekwipunek
+ npcs: NPC
+ player: Gracz
+ storage: Magazyn
+ structures: Struktury
+weather:
+ header: Pogoda
+windows:
+ main:
+ title: '{0} v{1} [{2}, {3} ({4})]'
+ connection:
+ connected: 'Połączono: {0}:{1}'
+ connecting: Łączenie...
+ disconnected: Nie połączono
+ savegame:
+ loaded: 'Zapis gry: {0}\{1}'
+ none: Brak wczytanego zapisu gry
+ modified: '{0}'
+ map:
+ buttons:
+ markAsDone: Oznacz jako ukończone
+ markAsUndone: Oznacz jako nieukończone
+ itemPlater:
+ buttons:
+ addPlating: Dodaj plating
+ removePlating: Usuń plating
+ constructionCategories:
+ Item: Przedmiot
+ Log: Kłoda
+ LogPlank: Deska
+ Stick: Patyk
+ Stone: Kamień
+ constructions: Konstrukcje
+ disclaimer: >-
+ Bądż ostrożny. Narzędzie TYLKO zapisuje zmniany do platingu i następnie ładuje zapis.
+
+
+ Upewnij się więc, że nie ma nie żadnych niezapisanych zmian, które mogłyby zostać stracone
+
+
+ Proces może zająć trochę czasu, jeżeli twój zapis jest duży
+ followerItems: Przedmioty towarzyszy
+ itemsInInventory: Przedmioty w ekwipunku
+ itemsInWeaponRacks: Przedmioty na stojakach na broń
+ messages:
+ addPlating: Dodano platingi przedmiotów
+ removePlating: Usunięto platingi przedmiotów
+ structures: Struktury
+ title: Plater przedmiotów i struktur
+ errors:
+ errorCheckingLastVersion: Pojawił się błąd podczas sprawdzania dostępność nowszej wersji
+ messages:
+ alreadyLatestVersion:
+ text: Używasz najnowszej wersji
+ title: Brak aktualizacji
+ backupsDeleted: Usunięto {0} backupów
+ changesSaved: Zapisano zmiany
+ confirmCloseApplication:
+ text: Czy chcesz zamknąć aplikację?
+ title: Zamknij aplikację
+ confirmCreateBackup:
+ text: Czy chcesz stworzyć backup?
+ title: Tworzenie backupa
+ confirmDeleteBackups:
+ text: Czy chcesz usunąć backupy?
+ title: Usuwanie backupów
+ confirmOverwriteExternalChanges:
+ text: Zapis został zmodyfikowany na zewnątrz. Czy naprawdę chcesz nadpisać wszelkie zmiany?
+ title: Nadpisywanie zmian
+ confirmRestoreBackups:
+ text: Jesteś pewien, że chcesz przywrócić backupy?
+ title: Przywracanie backupów
+ followerAlreadyAlive:
+ text: '{0} jest już żywy'
+ title: Brak zmian
+ followerRevived:
+ text: '{0} powinien być spowrotem'
+ title: Odrodzono
+ followersCreated:
+ text: '{0} followerów zostało zrespionych'
+ title: Towarzysze zrespieni
+ noChanges:
+ text: Brak zmian - nic nie zapisano
+ title: Brak zmian
+ saveChanges: Zapisz zmiany
+ unableToDeleteBackups: 'Nie można usunąć backupów: {0}'
+ unableToSpawnFollowers: Nie można zrespić followera
+ modifyConsumedItems:
+ key: Klucz
+ remove: Usuń
+ removeAll: Usuń wszystkie
+ title: Modyfikuj zjedzone jedzenie
+ regrowTrees:
+ all: Wszystkie
+ gone: Brak pozostałości
+ halfChopped: Pół ścięte
+ messages:
+ noTreesRegrown: Brak drzew ze statusem "{0}" odrosło
+ success: '{0} drzew z stanem "{1}" powinno odrosnąć. Zapisz aby je zatrzymać.'
+ pctRegrow: Procent odrośnięcia
+ saveButton: Odrośnij drzewa
+ stumps: Pieńki
+ title: Odrośnij drzewa
+ resetContainers:
+ messages:
+ containersReset:
+ text: Zaktualizowano pojemniki. Zapisz zmiany aby zmienić zapis gry
+ title: Reset pojemników
+ nothingToReset:
+ text: Nic nie znaleziono do zresetowania
+ title: Nic nie znaleziono
+ resetTraps:
+ messages:
+ nothingToReset:
+ text: Nic nie znaleziono do zresetowania
+ title: Nic nie znaleziono
+ trapsReset:
+ text: '{0} pułapek zostało zresetowanych. Zapisz zmiany aby zmienić zapis gry'
+ title: Reset pułapek
+ selectSavegame:
+ buttons:
+ change: Zmień...
+ setToDefault: Ustaw na bazowe
+ folderBrowserTitle: Wybierz Sons of the Forest "Saves" Directory
+ headers:
+ location: Pozycja
+ lastSaveTimeTooltip: Last write time of the savegame directory
+ selectedPath:
+ label: 'Wybrana ścieżka:'
+ tooltip: Zazwyczaj zapisy przechowywane są w C:\Users\[user]\AppData\LocalLow\Endnight\SonsOfTheForest\Saves
+ tabs:
+ multiplayer: Multiplayer
+ multiplayerClient: Multiplayer (Client)
+ singleplayer: Singleplayer
+ title: Wybierz zapis...
+ settings:
+ askForBackupsEveryTime: Pytaj o backupy za każdym razem
+ backupMode: Tryb backupów
+ fileMode:
+ label: Tryb plików
+ single: Jeden backup na zmieniony plik JSON
+ zip: Archiwum ZIP
+ language: Język
+ messages:
+ languageChanged:
+ text: Zrestartuj aplikację aby zapisać zmianę języka
+ title: Zapisano ustawienia
+ theme: motyw
+ title: Ustawienia
+ unhandledException:
+ applicationVersion: Wersja Aplikacji
+ buttons:
+ copyErrorToClipboard: Skopiuj błąd do schowka
+ exitApplication: Wyjdź z Aplikacji
+ callstack: callstack
+ disclaimer: Wystąpił nieoczekiwany błąd. Stan aplikacji może być uszkodzony.
+ exceptionMessage: Komunikat Wyjątku
+ exceptionType: Typ Wyjątku
+ header: Szczegóły Wyjątku
+ innerException: Wewnętrzny Wyjątek
+ title: Nieobsłużony Wyjątek
+ unlocks:
+ coreGameCompleted: Ukończono bazową grę
+ creativeMode: Tryb Kreatywny
+ creativeModeItem: Przedmiot trybu kreatywnego (?)
+ escapedIsland: Opuszczono wyspę
+ messages:
+ playerProfileNotFound: Nie można było znaleźć PlayerProfile.json w "{0}"
+ title: Odblokowywania
+ updateAvailable:
+ buttons:
+ download: Pobierz
+ ignore: Ignoruj
+ header: Dostępna aktulizacja
+ title: Dostępna aktulizacja
+ worldItemCloner:
+ buttons:
+ cloneAtPlayerPosition:
+ text: Klonuj przy pozycji gracza
+ tooltip: Tworzy kopie tego obiektu przy graczu
+ removeAllCopies:
+ text: Usuń wszystkie kopie
+ tooltip: Usuwa wszystkie kopie tego typu z mapy
+ teleportObjectToPlayer:
+ text: Teleportuj obiekt do gracza
+ tooltip: Teleportuje obiekty do gracza
+ teleportPlayerToObject:
+ text: Teleportuj gracza do obiektu
+ tooltip: Teleportuje gracza do obiektu
+ messages:
+ clonesDeleted:
+ text: Usunięto {0} klonów {1}
+ title: Klony usunięte
+ nothingToDelete:
+ text: Nic do usunięcia
+ title: Nic nie znaleziono
+ nothingToMove:
+ text: Nic do przesunięcia
+ title: Nic nie znaleziono
+ objectCloned:
+ text: Kopia {0} stworzona w lokalizacji gracza. Zapisz and zatrzymać zmiany
+ title: '{0} stworzony'
+ pinTooltip: Pokaż pozycje przedmiotu na mapie
+ title: Kopiarka obiektów
+ unknownItem: Nieznany przedmiot ({0})
+ unnamedItem: Nienazwane ({0})
+ worldItem: Przedmiot
+ map:
+ title: Mapa - {0}, {1} ({2})
+worldItemTypes:
+ GolfCart: Wózek golfowy
+ HangGlider: Składana Lotnia
+ KnightV: Knight V
+ Radio: Radio
diff --git a/SOTFEdit/images/icons/done.png b/SOTFEdit/images/icons/done.png
new file mode 100644
index 0000000..35acbd9
Binary files /dev/null and b/SOTFEdit/images/icons/done.png differ
diff --git a/ZoomControl/ZoomControl.cs b/ZoomControl/ZoomControl.cs
index d151bfb..2770783 100644
--- a/ZoomControl/ZoomControl.cs
+++ b/ZoomControl/ZoomControl.cs
@@ -72,6 +72,7 @@ static ZoomControl()
public ZoomControl()
{
+ _transformGroup = new TransformGroup();
PreviewMouseWheel += ZoomControlMouseWheel;
PreviewMouseDown += (_, e) => OnMouseDown(e, true);
MouseDown += (_, e) => OnMouseDown(e, false);
diff --git a/ZoomControl/ZoomControl.csproj b/ZoomControl/ZoomControl.csproj
index b076d79..bb8ba25 100644
--- a/ZoomControl/ZoomControl.csproj
+++ b/ZoomControl/ZoomControl.csproj
@@ -1,7 +1,7 @@
- net6.0-windows
+ net8.0-windows
enable
true