diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..14b1261 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +# Exclude "obj" folders in source folder +1.5/source/obj/ +1.6/source/obj/ + +# Exclude everything .vs folders anywhere in the project +**/.vs/ +**/.vscode/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index f9d27dc..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "dotnet.defaultSolution": "1.6/Source/ProgressionStorytellers.sln" -} \ No newline at end of file diff --git a/1.5/.vscode/settings.json b/1.5/.vscode/settings.json deleted file mode 100644 index 013007b..0000000 --- a/1.5/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "dotnet.preferCSharpExtension": true -} \ No newline at end of file diff --git a/1.5/.vscode/tasks.json b/1.5/.vscode/tasks.json deleted file mode 100644 index 333df64..0000000 --- a/1.5/.vscode/tasks.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "SaveAllFiles", - "command": "${command:workbench.action.files.saveAll}", - "type": "shell", - "problemMatcher": [] - }, - { - "label": "build", - "type": "process", - "command": "dotnet", - "args": [ - "build", - "${workspaceFolder}/Source/ProgressionStorytellers.csproj" - ], - "problemMatcher": "$msCompile", - "group": { - "kind": "build", - "isDefault": true - }, - "dependsOrder": "sequence", // need this, "parallel" is the default otherwise - "dependsOn": "Save All Files" // Add this line to ensure saving happens before build - } - ] -} diff --git a/1.5/Source/.vscode/settings.json b/1.5/Source/.vscode/settings.json deleted file mode 100644 index 013007b..0000000 --- a/1.5/Source/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "dotnet.preferCSharpExtension": true -} \ No newline at end of file diff --git a/1.5/Source/.vscode/tasks.json b/1.5/Source/.vscode/tasks.json deleted file mode 100644 index 6656e6d..0000000 --- a/1.5/Source/.vscode/tasks.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "type": "process", - "command": "dotnet", - "args": [ - "build", - "${workspaceFolder}/ProgressionStorytellers.csproj" - ], - "problemMatcher": "$msCompile", - "group": { - "kind": "build", - "isDefault": true - } - } - ] -} diff --git a/1.5/Source/obj/Debug/ProgressionStorytellers.GeneratedMSBuildEditorConfig.editorconfig b/1.5/Source/obj/Debug/ProgressionStorytellers.GeneratedMSBuildEditorConfig.editorconfig index 25c6838..b7d19eb 100644 --- a/1.5/Source/obj/Debug/ProgressionStorytellers.GeneratedMSBuildEditorConfig.editorconfig +++ b/1.5/Source/obj/Debug/ProgressionStorytellers.GeneratedMSBuildEditorConfig.editorconfig @@ -1,6 +1,6 @@ is_global = true build_property.RootNamespace = ProgressionStorytellers -build_property.ProjectDir = c:\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\Progression-Storytellers\1.5\Source\ +build_property.ProjectDir = C:\Users\Nikita\Documents\Rimworld_workspace\Progression-Storytellers-Rus\1.5\Source\ build_property.EnableComHosting = build_property.EnableGeneratedComInterfaceComImportInterop = build_property.CsWinRTUseWindowsUIXamlProjections = false diff --git a/1.5/Source/obj/Debug/ProgressionStorytellers.assets.cache b/1.5/Source/obj/Debug/ProgressionStorytellers.assets.cache index 4712e42..e98cf92 100644 Binary files a/1.5/Source/obj/Debug/ProgressionStorytellers.assets.cache and b/1.5/Source/obj/Debug/ProgressionStorytellers.assets.cache differ diff --git a/1.5/Source/obj/Debug/ProgressionStorytellers.csproj.AssemblyReference.cache b/1.5/Source/obj/Debug/ProgressionStorytellers.csproj.AssemblyReference.cache index eda0bdf..72097b2 100644 Binary files a/1.5/Source/obj/Debug/ProgressionStorytellers.csproj.AssemblyReference.cache and b/1.5/Source/obj/Debug/ProgressionStorytellers.csproj.AssemblyReference.cache differ diff --git a/1.6/.vscode/settings.json b/1.6/.vscode/settings.json deleted file mode 100644 index 013007b..0000000 --- a/1.6/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "dotnet.preferCSharpExtension": true -} \ No newline at end of file diff --git a/1.6/.vscode/tasks.json b/1.6/.vscode/tasks.json deleted file mode 100644 index 333df64..0000000 --- a/1.6/.vscode/tasks.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "SaveAllFiles", - "command": "${command:workbench.action.files.saveAll}", - "type": "shell", - "problemMatcher": [] - }, - { - "label": "build", - "type": "process", - "command": "dotnet", - "args": [ - "build", - "${workspaceFolder}/Source/ProgressionStorytellers.csproj" - ], - "problemMatcher": "$msCompile", - "group": { - "kind": "build", - "isDefault": true - }, - "dependsOrder": "sequence", // need this, "parallel" is the default otherwise - "dependsOn": "Save All Files" // Add this line to ensure saving happens before build - } - ] -} diff --git a/1.6/Assemblies/ProgressionStorytellers.dll b/1.6/Assemblies/ProgressionStorytellers.dll index f227504..33dcaa8 100644 Binary files a/1.6/Assemblies/ProgressionStorytellers.dll and b/1.6/Assemblies/ProgressionStorytellers.dll differ diff --git a/1.6/Source/.vscode/settings.json b/1.6/Source/.vscode/settings.json deleted file mode 100644 index 013007b..0000000 --- a/1.6/Source/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "dotnet.preferCSharpExtension": true -} \ No newline at end of file diff --git a/1.6/Source/.vscode/tasks.json b/1.6/Source/.vscode/tasks.json deleted file mode 100644 index 6656e6d..0000000 --- a/1.6/Source/.vscode/tasks.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "type": "process", - "command": "dotnet", - "args": [ - "build", - "${workspaceFolder}/ProgressionStorytellers.csproj" - ], - "problemMatcher": "$msCompile", - "group": { - "kind": "build", - "isDefault": true - } - } - ] -} diff --git a/1.6/Source/DebugStartup.cs b/1.6/Source/DebugStartup.cs new file mode 100644 index 0000000..d024074 --- /dev/null +++ b/1.6/Source/DebugStartup.cs @@ -0,0 +1,31 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using HarmonyLib; +using RimWorld; +using Verse; + +namespace ProgressionStorytellers +{ + [StaticConstructorOnStartup] + public static class DebugStartup + { + static DebugStartup() + { + Log.Message("[ProgressionStorytellers] Mod starting for RimWorld 1.6"); + + // Проверим, загружен ли наш тип + var type = GenTypes.GetTypeInAnyAssembly("ProgressionStorytellers.StorytellerExtension"); + if (type != null) + { + Log.Message($"[ProgressionStorytellers] Type found: {type.FullName}"); + } + else + { + Log.Error("[ProgressionStorytellers] Type NOT found!"); + } + } + } +} diff --git a/1.6/Source/Page_SelectStorytellerCategory.cs b/1.6/Source/Page_SelectStorytellerCategory.cs index 4c66896..3403f36 100644 --- a/1.6/Source/Page_SelectStorytellerCategory.cs +++ b/1.6/Source/Page_SelectStorytellerCategory.cs @@ -6,145 +6,264 @@ namespace ProgressionStorytellers { - [HotSwappable] - [StaticConstructorOnStartup] - public class Page_SelectStorytellerCategory : Page - { - public override string PageTitle => "What kind of story would interest you?"; - private readonly StorytellerCategory[] storytellerCategories = Enum.GetValues(typeof(StorytellerCategory)) - .Cast().Where(x => x != StorytellerCategory.Undefined).ToArray(); - private Page_CreateWorldParams nextPage; - public Page_SelectStorytellerCategory(Page_CreateWorldParams nextPage) - { - this.nextPage = nextPage; - } - - public override void DoWindowContents(Rect rect) - { - Text.Anchor = TextAnchor.UpperCenter; - rect.y += 45; - rect.height -= 45; - Text.Font = GameFont.Medium; - - var fontIndex = 2; - var oldStyle = Text.fontStyles[fontIndex]; - var newStyle = new GUIStyle(oldStyle); - Text.fontStyles[fontIndex] = newStyle; - newStyle.fontSize = 20; - Widgets.Label(new Rect(rect.x, rect.y - 30, rect.width, 30f), PageTitle); - Text.fontStyles[fontIndex] = oldStyle; - Text.Font = GameFont.Small; - Text.Anchor = TextAnchor.MiddleCenter; - - Widgets.BeginGroup(rect); - var scale = 0.9f; - float boxWidth = 300 * scale; - float boxHeight = 350 * scale; - float xSpacing = 60; - float ySpacing = 15; - - Text.Font = GameFont.Medium; - var yOffset = 55 - 50; - float boxScale = 30; - int columns = 3; - for (int i = 0; i < storytellerCategories.Length; i++) - { - int row = i / columns; - int column = i % columns; - float xOffset = (row == 1) ? 20 : 0; - if (row == 1) - { - xSpacing = 40; - boxHeight = 300 * scale; - yOffset = 110 - 50; - boxScale = 45; - } - Rect boxRect = new Rect(column * (boxWidth + xSpacing) + 20 + xOffset, - yOffset + row * (boxHeight + ySpacing) + 10, boxWidth, boxHeight); - DrawStorytellerCategoryBox(boxRect, storytellerCategories[i], boxScale); - } - - Text.Font = GameFont.Small; - Text.Anchor = TextAnchor.UpperLeft; - Widgets.EndGroup(); - - float y = rect.y + rect.height - 38f; - Text.Font = GameFont.Small; - string label = "Back".Translate(); - var backSize = 200; - if ((Widgets.ButtonText(new Rect(((rect.x + rect.width) / 2f) - (backSize / 2), y, backSize, BottomButSize.y), label) || KeyBindingDefOf.Cancel.KeyDownEvent) && CanDoBack()) - { - DoBack(); - } - } - - private void DrawStorytellerCategoryBox(Rect boxRect, StorytellerCategory category, float boxScale) - { - Widgets.DrawBox(boxRect, 1, BaseContent.GreyTex); - var iconRect = boxRect.ContractedBy(boxScale); - iconRect.y -= 35; - if (Widgets.ButtonImageFitted(iconRect, GetIcon(category))) - { - StorytellerUI_DrawStorytellerSelectionInterface_Patch.selectedCategory = category; - if (StorytellerUI_DrawStorytellerSelectionInterface_Patch.FilteredStorytellers(DefDatabase.AllDefs).Any()) - { - this.Close(); - var page = new Page_SelectStoryteller(); - page.next = nextPage; - nextPage.prev = page; - page.prev = this; - Find.WindowStack.Add(page); - } - else - { - StorytellerUI_DrawStorytellerSelectionInterface_Patch.selectedCategory = StorytellerCategory.Undefined; - Messages.Message("There are no available storytellers in that category.", MessageTypeDefOf.RejectInput, historical: false); - } - } - Text.Font = GameFont.Medium; - var categoryLabel = new Rect(boxRect.x, boxRect.y + (boxRect.height - 80), boxRect.width, 30); - Widgets.Label(categoryLabel, GetCategoryLabel(category)); - Text.Font = GameFont.Small; - GUI.color = new ColorInt(240, 240, 240).ToColor; - var oldStyle = Text.fontStyles[1]; - var newStyle = new GUIStyle(oldStyle); - Text.fontStyles[1] = newStyle; - newStyle.fontSize = 17; - Widgets.Label(new Rect(boxRect.x + 10, categoryLabel.yMax - 5, boxRect.width - 20, 50), GetCategoryDescription(category)); - Text.fontStyles[1] = oldStyle; - GUI.color = Color.white; - } - - private static Texture2D GetIcon(StorytellerCategory category) - { - switch (category) - { - case StorytellerCategory.SlowPaced: return DefsOf.Phoebe.portraitLargeTex; - case StorytellerCategory.Engaging: return StorytellerDefOf.Cassandra.portraitLargeTex; - case StorytellerCategory.Chaotic: return DefsOf.Randy.portraitLargeTex; - } - return ContentFinder.Get("UI/Icons/" + category.ToString()); - } - private string GetCategoryLabel(StorytellerCategory category) - { - return category switch - { - StorytellerCategory.SlowPaced => "Slow-paced", - _ => category.ToString() - }; - } - private string GetCategoryDescription(StorytellerCategory category) - { - return category switch - { - StorytellerCategory.SlowPaced => "A story that lets you relax between major events.", - StorytellerCategory.Engaging => "A story with present momentum, adjusting to your highs and lows.", - StorytellerCategory.Chaotic => "A story with no regard for consistency, utter chaos.", - StorytellerCategory.Consistent => "A story with predictable rates of events and triggers.", - StorytellerCategory.Brutal => "A bloody test of patience, skill, and strategy.", - StorytellerCategory.Bizarre => "Stories told in new formats, often feeling completely new.", - _ => "Unknown category." - }; - } - } + /// + /// Custom page for selecting storyteller categories in the game setup flow. + /// Replaces the standard storyteller selection page with a category-based approach. + /// + [HotSwappable] + [StaticConstructorOnStartup] + public class Page_SelectStorytellerCategory : Page + { + // Gets the page title from translation keys for localization support + public override string PageTitle => "ProgressionStorytellers.PageTitle".Translate(); + + // All available storyteller categories (excluding Undefined) + private readonly StorytellerCategory[] storytellerCategories = Enum.GetValues(typeof(StorytellerCategory)) + .Cast() + .Where(x => x != StorytellerCategory.Undefined) + .ToArray(); + + private Page_CreateWorldParams nextPage; + + /// + /// Initializes a new instance with reference to the next page in the setup flow + /// + public Page_SelectStorytellerCategory(Page_CreateWorldParams nextPage) + { + this.nextPage = nextPage; + } + + /// + /// Main method for rendering the window contents + /// + public override void DoWindowContents(Rect rect) + { + // Setup title area + Text.Anchor = TextAnchor.UpperCenter; + rect.y += 45; + rect.height -= 45; + Text.Font = GameFont.Medium; + + // Custom font styling for page title + var fontIndex = 2; // Medium font index + var oldStyle = Text.fontStyles[fontIndex]; + var newStyle = new GUIStyle(oldStyle); + Text.fontStyles[fontIndex] = newStyle; + newStyle.fontSize = 20; + + Widgets.Label(new Rect(rect.x, rect.y - 30, rect.width, 30f), PageTitle); + + Text.fontStyles[fontIndex] = oldStyle; + Text.Font = GameFont.Small; + Text.Anchor = TextAnchor.MiddleCenter; + + // Begin category grid layout + Widgets.BeginGroup(rect); + + // Grid layout parameters + var scale = 0.9f; + float boxWidth = 300 * scale; + float boxHeight = 350 * scale; + float xSpacing = 60; + float ySpacing = 15; + + Text.Font = GameFont.Medium; + var yOffset = 55 - 50; // Base vertical offset + float boxScale = 30; // Icon scaling factor + int columns = 3; // 3-column grid layout + + // Render each category in a grid + for (int i = 0; i < storytellerCategories.Length; i++) + { + int row = i / columns; + int column = i % columns; + float xOffset = (row == 1) ? 20 : 0; + + // Adjust layout for middle row (different category count arrangement) + if (row == 1) + { + xSpacing = 40; + boxHeight = 300 * scale; + yOffset = 110 - 50; + boxScale = 45; + } + + // Calculate position for this category box + Rect boxRect = new Rect( + column * (boxWidth + xSpacing) + 20 + xOffset, + yOffset + row * (boxHeight + ySpacing) + 10, + boxWidth, + boxHeight + ); + + DrawStorytellerCategoryBox(boxRect, storytellerCategories[i], boxScale); + } + + // Reset UI state + Text.Font = GameFont.Small; + Text.Anchor = TextAnchor.UpperLeft; + Widgets.EndGroup(); + + // Add back button at the bottom + float y = rect.y + rect.height - 38f; + Text.Font = GameFont.Small; + string label = "Back".Translate(); + var backSize = 200; + + if ((Widgets.ButtonText(new Rect(((rect.x + rect.width) / 2f) - (backSize / 2), y, backSize, BottomButSize.y), label) || + KeyBindingDefOf.Cancel.KeyDownEvent) && CanDoBack()) + { + DoBack(); + } + } + + /// + /// Renders an individual category selection box + /// + private void DrawStorytellerCategoryBox(Rect boxRect, StorytellerCategory category, float boxScale) + { + // Draw background box + Widgets.DrawBox(boxRect, 1, BaseContent.GreyTex); + + // Calculate icon position and size + var iconRect = boxRect.ContractedBy(boxScale); + iconRect.y -= 35; + + // Make the icon clickable to select this category + if (Widgets.ButtonImageFitted(iconRect, GetIcon(category))) + { + StorytellerUI_DrawStorytellerSelectionInterface_Patch.selectedCategory = category; + + // Check if there are storytellers in this category + if (StorytellerUI_DrawStorytellerSelectionInterface_Patch.FilteredStorytellers(DefDatabase.AllDefs).Any()) + { + // Proceed to storyteller selection within this category + this.Close(); + var page = new Page_SelectStoryteller(); + page.next = nextPage; + nextPage.prev = page; + page.prev = this; + Find.WindowStack.Add(page); + } + else + { + // No storytellers in this category - show error message + StorytellerUI_DrawStorytellerSelectionInterface_Patch.selectedCategory = StorytellerCategory.Undefined; + Messages.Message( + "ProgressionStorytellers.NoStorytellersInCategory".Translate(), + MessageTypeDefOf.RejectInput, + historical: false + ); + } + } + + // Display category name + Text.Font = GameFont.Medium; + var categoryLabel = new Rect(boxRect.x, boxRect.y + (boxRect.height - 80), boxRect.width, 30); + Widgets.Label(categoryLabel, GetCategoryLabel(category)); + + // Display category description with adaptive text sizing + Text.Font = GameFont.Small; + GUI.color = new ColorInt(240, 240, 240).ToColor; + + Rect descriptionRect = new Rect( + boxRect.x + 10, + categoryLabel.yMax + 5, + boxRect.width - 20, + boxRect.y + boxRect.height - categoryLabel.yMax - 15 + ); + + DrawAdaptiveText(descriptionRect, GetCategoryDescription(category), GameFont.Small); + + GUI.color = Color.white; + } + + /// + /// Renders text that automatically adjusts font size to fit within the given rectangle + /// Falls back to smaller fonts (Medium -> Small -> Tiny) if text doesn't fit + /// + private void DrawAdaptiveText(Rect rect, string text, GameFont baseFont = GameFont.Small) + { + // Save current text settings + GameFont originalFont = Text.Font; + bool originalWordWrap = Text.WordWrap; + var originalStyle = Text.fontStyles[(int)GameFont.Small]; // Style for Small font + + Text.WordWrap = true; + + // Try different font sizes: Medium -> Small -> Tiny + GameFont selectedFont = GameFont.Small; + foreach (var fontSize in new[] { GameFont.Medium, GameFont.Small, GameFont.Tiny }) + { + Text.Font = fontSize; + float textHeight = Text.CalcHeight(text, rect.width); + + // Use this font if text fits or if we've reached the smallest font + if (textHeight <= rect.height || fontSize == GameFont.Tiny) + { + selectedFont = fontSize; + break; + } + } + + // Adjust style for the selected font + if (selectedFont == GameFont.Small) + { + var newStyle = new GUIStyle(Text.fontStyles[(int)GameFont.Small]); + newStyle.fontSize = 15; // Slightly smaller than default for better fit + Text.fontStyles[(int)GameFont.Small] = newStyle; + } + + // Draw the text with selected font + Text.Font = selectedFont; + Widgets.Label(rect, text); + + // Add tooltip with full text if it doesn't fit completely + if (Text.CalcHeight(text, rect.width) > rect.height) + { + TooltipHandler.TipRegion(rect, text); + } + + // Restore original text settings + Text.fontStyles[(int)GameFont.Small] = originalStyle; + Text.Font = originalFont; + Text.WordWrap = originalWordWrap; + } + + /// + /// Returns the appropriate icon texture for a given storyteller category + /// Uses vanilla storyteller portraits for some categories, custom icons for others + /// + private static Texture2D GetIcon(StorytellerCategory category) + { + switch (category) + { + case StorytellerCategory.SlowPaced: + return DefsOf.Phoebe.portraitLargeTex; + case StorytellerCategory.Engaging: + return StorytellerDefOf.Cassandra.portraitLargeTex; + case StorytellerCategory.Chaotic: + return DefsOf.Randy.portraitLargeTex; + default: + // Fall back to custom icons in UI/Icons folder + return ContentFinder.Get("UI/Icons/" + category.ToString()); + } + } + + /// + /// Gets the translated display name for a storyteller category + /// + private string GetCategoryLabel(StorytellerCategory category) + { + return ("ProgressionStorytellers.Category." + category.ToString()).Translate(); + } + + /// + /// Gets the translated description for a storyteller category + /// + private string GetCategoryDescription(StorytellerCategory category) + { + return ("ProgressionStorytellers.Category." + category.ToString() + ".Description").Translate(); + } + } } \ No newline at end of file diff --git a/About/About.xml b/About/About.xml index 842fbdf..77ce274 100644 --- a/About/About.xml +++ b/About/About.xml @@ -1,13 +1,16 @@ - Progression: Storytellers - ferny - ferny.ProgressionStorytellers - Integrate many storytellers in modded Rimworld. - -
  • 1.5
  • -
  • 1.6
  • -
    + Progression: Storytellers + ferny + ferny.ProgressionStorytellers + Integrate many storytellers in modded Rimworld. Include Russian and English Translation for 1.6 + +
  • 1.5
  • +
  • 1.6
  • +
    + +
  • ferny.ProgressionStorytellers.plastmastick.fork
  • +
  • brrainz.harmony diff --git a/Languages/English/Keyed/ProgressionStorytellers.xml b/Languages/English/Keyed/ProgressionStorytellers.xml new file mode 100644 index 0000000..c5d397b --- /dev/null +++ b/Languages/English/Keyed/ProgressionStorytellers.xml @@ -0,0 +1,24 @@ + + + + What kind of story would interest you? + + + Slow-paced + Engaging + Chaotic + Consistent + Brutal + Bizarre + + + A story that lets you relax between major events. + A story with present momentum, adjusting to your highs and lows. + A story with no regard for consistency, utter chaos. + A story with predictable rates of events and triggers. + A bloody test of patience, skill, and strategy. + Stories told in new formats, often feeling completely new. + + + There are no available storytellers in that category. + \ No newline at end of file diff --git a/Languages/Keyed/ProgressionStorytellers.xml b/Languages/Keyed/ProgressionStorytellers.xml new file mode 100644 index 0000000..0d8d1d1 --- /dev/null +++ b/Languages/Keyed/ProgressionStorytellers.xml @@ -0,0 +1,21 @@ + + + + What kind of story would interest you? + + Slow-paced + Engaging + Chaotic + Consistent + Brutal + Bizarre + + A story that lets you relax between major events. + A story with present momentum, adjusting to your highs and lows. + A story with no regard for consistency, utter chaos. + A story with predictable rates of events and triggers. + A bloody test of patience, skill, and strategy. + Stories told in new formats, often feeling completely new. + + There are no available storytellers in that category. + \ No newline at end of file diff --git a/Languages/Russian/Keyed/ProgressionStorytellers.xml b/Languages/Russian/Keyed/ProgressionStorytellers.xml new file mode 100644 index 0000000..19d8743 --- /dev/null +++ b/Languages/Russian/Keyed/ProgressionStorytellers.xml @@ -0,0 +1,24 @@ + + + + Какую историю вы хотите? + + + Неторопливая + Захватывающая + Хаотичная + Последовательная + Безжалостная + Причудливая + + + История, которая позволяет расслабиться между важными событиями. + История развития, адаптирующаяся к вашим успехам и неудачам. + История без правил и последовательности, полный хаос. + История с предсказуемыми событиями и триггерами. + Кровавое испытание терпения, навыков и стратегии. + Истории, рассказанные в новых форматах, часто ощущающиеся совершенно новыми. + + + В этой категории нет доступных рассказчиков. + \ No newline at end of file diff --git a/LoadFolders.xml b/LoadFolders.xml index 6faf68c..4800341 100644 --- a/LoadFolders.xml +++ b/LoadFolders.xml @@ -29,7 +29,8 @@
  • /
  • -
  • 1.5
  • +
  • 1.6
  • +
  • Languages
  • Mods and Shit/VFE Mechanoids
  • Mods and Shit/VE Psycasts
  • Mods and Shit/VFE Pirates