diff --git a/RemnantSaveGuardian/RemnantCharacter.cs b/RemnantSaveGuardian/RemnantCharacter.cs index 43a5d7b..da29993 100644 --- a/RemnantSaveGuardian/RemnantCharacter.cs +++ b/RemnantSaveGuardian/RemnantCharacter.cs @@ -63,7 +63,10 @@ public static List GetCharactersFromSave(RemnantSave remnantSa try { string profileData = remnantSave.GetProfileData(); - var archetypes = Regex.Matches(profileData, @"/Game/(World_Base|World_DLC\d)/Items/Archetypes/(?\w+)/Archetype_\w+_UI\.Archetype_\w+_UI_C"); + #if DEBUG + File.WriteAllText(remnantSave.SaveProfilePath.Replace(".sav", ".txt"), profileData); + #endif + var archetypes = Regex.Matches(profileData, @"/Game/World_(Base|DLC\d+)/Items/Archetypes/(?\w+)/Archetype_\w+_UI\.Archetype_\w+_UI_C"); var inventoryStarts = Regex.Matches(profileData, "/Game/Characters/Player/Base/Character_Master_Player.Character_Master_Player_C"); var inventoryEnds = Regex.Matches(profileData, "[^.]Character_Master_Player_C"); for (var i = 0; i < inventoryStarts.Count; i++) diff --git a/RemnantSaveGuardian/RemnantItem.cs b/RemnantSaveGuardian/RemnantItem.cs index 46aa808..ad858c3 100644 --- a/RemnantSaveGuardian/RemnantItem.cs +++ b/RemnantSaveGuardian/RemnantItem.cs @@ -11,11 +11,13 @@ public class RemnantItem : IEquatable, IComparable @"/Items/(?Mods)/\w+/(?\w+)(?:\.|$)", // weapon mods @"/Items/(?Archetypes)/\w+/(?Archetype_\w+)(?:\.|$)", // archetypes @"/Items/Archetypes/(?\w+)/(?\w+)/\w+/(?\w+)(?:\.|$)", // perks and skills - @"/Items/(?Traits)/(?\w+)/\w+/(?\w+)(?:\.|$)", // traits + @"/Items/(?Traits)/(?\w+?/)?\w+?/(?\w+)(?:\.|$)", // traits + @"/Items/Archetypes/(?\w+)/(?Armor)/(?\w+)(?:\.|$)", // armors @"/Items/(?Armor)/(?:\w+/)?(?:(?\w+)/)?(?\w+)(?:\.|$)", // armor @"/Items/(?Weapons)/(?:\w+/)+(?\w+)(?:\.|$)", // weapons @"/Items/(?Gems)/(?:\w+/)+(?\w+)(?:\.|$)", // gems @"/Items/Armor/(?:\w+/)?(?Relic)Testing/(?:\w+/)+(?\w+)(?:\.|$)", // relics + @"/Items/(?Relic)s/(?:\w+/)+(?\w+)(?:\.|$)", // relics @"/Items/Materials/(?Engrams)/(?\w+)(?:\.|$)", // engrams @"/(?Quests)/Quest_\w+/Items/(?\w+)(?:\.|$)", // quest items @"/Items/(?Materials)/World/\w+/(?\w+)(?:\.|$)", // materials @@ -33,7 +35,7 @@ public enum RemnantItemMode private string _type; private string _set; private string _part; - public string Name { + public string Name { get { if (this._set != "" && this._part != "") @@ -49,7 +51,7 @@ public string Name { } } return Loc.GameT(_name); - } + } } public string RawName { @@ -96,7 +98,7 @@ public RemnantItem(string nameOrKey) this.Coop = false; TileSet = ""; IsArmorSet = true; - foreach (string pattern in ItemKeyPatterns) { + foreach (string pattern in ItemKeyPatterns) { var nameMatch = Regex.Match(nameOrKey, pattern); if (!nameMatch.Success) { @@ -107,6 +109,7 @@ public RemnantItem(string nameOrKey) this._name = nameMatch.Groups["itemName"].Value; if (nameMatch.Groups.ContainsKey("armorSet")) { + //this._type = "Armor"; this._set = nameMatch.Groups["armorSet"].Value; var armorMatch = Regex.Match(this._name, @"Armor_(?\w+)_\w+"); if (armorMatch.Success) diff --git a/RemnantSaveGuardian/RemnantWorldEvent.cs b/RemnantSaveGuardian/RemnantWorldEvent.cs index c4371b1..264b793 100644 --- a/RemnantSaveGuardian/RemnantWorldEvent.cs +++ b/RemnantSaveGuardian/RemnantWorldEvent.cs @@ -52,7 +52,7 @@ public string Name } } public List MissingItems { - get + get { return mItems; } @@ -139,7 +139,8 @@ public RemnantWorldEvent(string key, string name, List locations, string } if (type.Contains("Injectable") || type.Contains("Abberation")) { - _name = _name.Split('_').Last(); + var nameSplit = _name.Split('_'); + _name = nameSplit.Last() == "DLC" ? nameSplit[nameSplit.Length-2] : nameSplit.Last(); } if (type == "RootEarth") { @@ -434,11 +435,7 @@ static public void ProcessEventsOld(RemnantCharacter character, string savetext, } } - List eventList = character.CampaignEvents; - if (mode == ProcessMode.Adventure) - { - eventList = character.AdventureEvents; - } + List eventList = mode==ProcessMode.Adventure?character.AdventureEvents:character.CampaignEvents; eventList.Clear(); /*bool churchAdded = false; @@ -595,7 +592,7 @@ static public void ProcessEvents_old_again(RemnantCharacter character, string sa { return; } - + if (eventEnds.Count != eventStarts.Count) { return; @@ -942,7 +939,7 @@ static public void ProcessEvents(RemnantCharacter character, List areas, RemnantWorldEvent lastEventTree; //List excludeTypes = new() { "Global", "Earth" }; List excludeWorlds = new() { "World_Base", "World_Labyrinth" }; - List excludeEventDetails = new() { "TheHunterDream" }; + List excludeEventDetails = new() { "TheHunterDream", "Dranception" }; var unknownAreaCount = 0; foreach (Match area in areas) { @@ -958,12 +955,19 @@ static public void ProcessEvents(RemnantCharacter character, List areas, MatchCollection eventMatches = Regex.Matches(area.Groups["events"].Value, @"/Game/(?(?:World|Campaign)_\w+)/Quests/(?:Quest_)?(?[a-zA-Z0-9]+)_(?\w+)/(?
\w+)\.\w+"); foreach (Match eventMatch in eventMatches) { + var prevWorld = currentWorld; currentWorld = eventMatch.Groups["world"].Value; if (currentWorld == null || excludeWorlds.Contains(currentWorld)) { continue; } - var lastTemplate = lastTemplates.ContainsKey(eventMatch.Groups["world"].Value) ? lastTemplates[eventMatch.Groups["world"].Value] : null; + + if (currentWorld == "World_DLC1" && prevWorld != null) + { + currentWorld = prevWorld; + + } + var lastTemplate = lastTemplates.ContainsKey(currentWorld) ? lastTemplates[currentWorld] : null; if (lastTemplate != null) { currentMainLocation = lastTemplate.RawName; @@ -987,6 +991,10 @@ static public void ProcessEvents(RemnantCharacter character, List areas, { currentSublocation = area.Groups["locationName"].Value; } + if (currentSublocation == "Consecrated Throne") + { + continue; + } if (currentSublocation == null && eventMatch.Groups["eventType"].Value != "OverworldPOI") { if (spawnTable != null) @@ -1006,7 +1014,8 @@ static public void ProcessEvents(RemnantCharacter character, List areas, } //eventStrings.Add(eventMatch.Value); - var worldEvent = new RemnantWorldEvent(eventMatch);//, currentArea.Groups["location"].Value.Trim()); + //var worldEvent = new RemnantWorldEvent(eventMatch);//, currentArea.Groups["location"].Value.Trim()); + var worldEvent = new RemnantWorldEvent(eventMatch.Value, eventMatch.Groups["eventName"].Value, new() { currentWorld }, eventMatch.Groups["eventType"].Value); worldEvent.TileSet = tileSets; if (areaEvents.FindIndex(e => e.RawName == worldEvent.RawName) != -1) { @@ -1323,7 +1332,7 @@ static public void ProcessEventsAC(RemnantCharacter character, string saveText, firstZone = zone; } //Debug.WriteLine("Parse: " + textLine); - + if (textLine.Contains("Ring") || textLine.Contains("Amulet")) { //eventName = textLine.Split('/')[4].Split('_')[3]; @@ -1561,7 +1570,7 @@ static public Dictionary> GetInjectables(s campaignStart = campaignBlob.LastIndexOf(strCampaignStart); eventBlobs[ProcessMode.Campaign] = campaignBlob.Substring(campaignStart); } - var adventureMatch = Regex.Match(saveText, @"/Game/World_(?\w+)/Quests/Quest_AdventureMode/Quest_AdventureMode_\w+.Quest_AdventureMode_\w+_C"); + var adventureMatch = Regex.Match(saveText, @"/Game/World_(?\w+)/Quests/Quest_AdventureMode(_[a-zA-Z]+)?/Quest_AdventureMode(_[a-zA-Z]+)?_\w+.Quest_AdventureMode(_[a-zA-Z]+)?_\w+_C"); if (adventureMatch.Success) { int adventureEnd = adventureMatch.Index; @@ -1586,7 +1595,9 @@ static public Dictionary> GetInjectables(s { continue; } - var eventName = ev.Groups["eventName"].Value.Split("_").Last(); + + var eventNameSplitted = ev.Groups["eventName"].Value.Split("_"); + var eventName = eventNameSplitted.Last() == "DLC" ? eventNameSplitted[eventNameSplitted.Length-2] : eventNameSplitted.Last(); Match parentEvent; if (GameInfo.InjectableParents.ContainsKey(eventName)) { @@ -1677,7 +1688,9 @@ static public void ProcessEvents(RemnantCharacter character, string saveText) static public void ProcessEvents(RemnantCharacter character) { var savetext = RemnantSave.DecompressSaveAsString(character.Save.WorldSaves[character.WorldIndex]); - //File.WriteAllText(character.Save.WorldSaves[character.WorldIndex].Replace(".sav", ".txt"), savetext); + #if DEBUG + System.IO.File.WriteAllText(character.Save.WorldSaves[character.WorldIndex].Replace(".sav", ".txt"), savetext); + #endif ProcessEvents(character, savetext); } diff --git a/RemnantSaveGuardian/Views/Pages/WorldAnalyzerPage.xaml.cs b/RemnantSaveGuardian/Views/Pages/WorldAnalyzerPage.xaml.cs index b7ba946..d4560a6 100644 --- a/RemnantSaveGuardian/Views/Pages/WorldAnalyzerPage.xaml.cs +++ b/RemnantSaveGuardian/Views/Pages/WorldAnalyzerPage.xaml.cs @@ -1,688 +1,688 @@ -using RemnantSaveGuardian.locales; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Input; -using System.Windows.Media; -using Wpf.Ui.Common.Interfaces; - -namespace RemnantSaveGuardian.Views.Pages -{ - /// - /// Interaction logic for WorldAnalyzerPage.xaml - /// - public partial class WorldAnalyzerPage : INavigableView, INotifyPropertyChanged - { - public ViewModels.WorldAnalyzerViewModel ViewModel - { - get; - } - private RemnantSave Save; - private List filteredCampaign; - private List filteredAdventure; - private ListViewItem menuSrcItem; - public WorldAnalyzerPage(ViewModels.WorldAnalyzerViewModel viewModel, string? pathToSaveFiles = null) - { - ViewModel = viewModel; - - InitializeComponent(); - EventTransfer.Event += ChangeGridVisibility; - - try - { - if (pathToSaveFiles == null) - { - pathToSaveFiles = Properties.Settings.Default.SaveFolder; - } - - Properties.Settings.Default.PropertyChanged += Default_PropertyChanged; - - Save = new(pathToSaveFiles); - if (pathToSaveFiles == Properties.Settings.Default.SaveFolder) - { - SaveWatcher.SaveUpdated += (sender, eventArgs) => { - Dispatcher.Invoke(() => - { - var selectedIndex = CharacterControl.SelectedIndex; - Save.UpdateCharacters(); - CharacterControl.Items.Refresh(); - if (selectedIndex >= CharacterControl.Items.Count) - { - selectedIndex = 0; - } - CharacterControl.SelectedIndex = selectedIndex; - //CharacterControl_SelectionChanged(null, null); - }); - }; - Properties.Settings.Default.PropertyChanged += Default_PropertyChanged; - BackupsPage.BackupSaveRestored += BackupsPage_BackupSaveRestored; - } - CharacterControl.ItemsSource = Save.Characters; - - //FontSizeSlider.Value = AdventureData.FontSize; - //FontSizeSlider.Minimum = 2.0; - //FontSizeSlider.Maximum = AdventureData.FontSize * 2; - FontSizeSlider.Value = Properties.Settings.Default.AnalyzerFontSize; - FontSizeSlider.ValueChanged += FontSizeSlider_ValueChanged; - - filteredCampaign = new(); - filteredAdventure = new(); - CampaignData.ItemsSource = filteredCampaign; - AdventureData.ItemsSource = filteredAdventure; - - Task task = new Task(FirstLoad); - task.Start(); - } catch (Exception ex) { - Logger.Error($"Error initializing analzyer page: {ex}"); - } - } - private void ChangeGridVisibility(Object sender, EventTransfer.MessageArgs message) - { - OptionGrid.Visibility = (Visibility)message._message; - if (message._message is Visibility.Visible) - { - tabGrid.Margin = new Thickness(23, 0, 23, 23); - tabCampaign.Visibility = Visibility.Visible; - tabAdventure.Visibility = Visibility.Visible; - tabMissing.Visibility = Visibility.Visible; - } - else if (message._message is Visibility.Collapsed) - { - tabGrid.Margin = new Thickness(4, 0, 4, 4); - tabCampaign.Visibility = Visibility.Collapsed; - tabAdventure.Visibility = Visibility.Collapsed; - tabMissing.Visibility = Visibility.Collapsed; - } - } - - private void FirstLoad() - { - System.Threading.Thread.Sleep(500); //Wait for UI render first - Save.UpdateCharacters(); - Dispatcher.Invoke(() => { - CharacterControl.SelectedIndex = 0; - checkAdventureTab(); - progressRing.Visibility = Visibility.Collapsed; - }); - } - - private void BackupsPage_BackupSaveRestored(object? sender, EventArgs e) - { - var selectedIndex = CharacterControl.SelectedIndex; - Save.UpdateCharacters(); - CharacterControl.Items.Refresh(); - if (selectedIndex >= CharacterControl.Items.Count) - { - selectedIndex = 0; - } - CharacterControl.SelectedIndex = selectedIndex; - } - - public WorldAnalyzerPage(ViewModels.WorldAnalyzerViewModel viewModel) : this(viewModel, null) - { - - } - - #region INotifiedProperty Block - public event PropertyChangedEventHandler PropertyChanged; - - protected void OnPropertyChanged(string propertyName) - { - PropertyChangedEventHandler handler = PropertyChanged; - - if (handler != null) - { - handler(this, new PropertyChangedEventArgs(propertyName)); - } - } - #endregion - - private void FontSizeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) - { - Properties.Settings.Default.AnalyzerFontSize = (int)Math.Round(FontSizeSlider.Value); - reloadEventGrids(); - } - - private void GameType_CollapsedExpanded(object sender, PropertyChagedEventArgs e) - { - TreeListClass item = (TreeListClass)sender; - Properties.Settings.Default[$"{item.Tag}_Expanded"] = item.IsExpanded; - } - - private void SavePlaintextButton_Click(object sender, RoutedEventArgs e) - { - try - { - System.Windows.Forms.FolderBrowserDialog openFolderDialog = new System.Windows.Forms.FolderBrowserDialog(); - openFolderDialog.Description = Loc.T("Export save files as plaintext"); - openFolderDialog.UseDescriptionForTitle = true; - System.Windows.Forms.DialogResult result = openFolderDialog.ShowDialog(); - if (result != System.Windows.Forms.DialogResult.OK) - { - return; - } - if (openFolderDialog.SelectedPath == Properties.Settings.Default.SaveFolder || openFolderDialog.SelectedPath == Save.SaveFolderPath) - { - Logger.Error(Loc.T("export_save_invalid_folder_error")); - return; - } - File.WriteAllText($@"{openFolderDialog.SelectedPath}\profile.txt", Save.GetProfileData()); - File.Copy(Save.SaveProfilePath, $@"{openFolderDialog.SelectedPath}\profile.sav", true); - foreach (var filePath in Save.WorldSaves) - { - File.WriteAllText($@"{openFolderDialog.SelectedPath}\{filePath.Substring(filePath.LastIndexOf(@"\")).Replace(".sav", ".txt")}", RemnantSave.DecompressSaveAsString(filePath)); - File.Copy(filePath, $@"{openFolderDialog.SelectedPath}\{filePath.Substring(filePath.LastIndexOf(@"\"))}", true); - } - Logger.Success(Loc.T($"Exported save files successfully to {openFolderDialog.SelectedPath}")); - } catch (Exception ex) - { - Logger.Error(Loc.T("Error exporting save files: {errorMessage}", new() { { "errorMessage", ex.Message } })); - } - } - - private void Default_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) - { - if (e.PropertyName == "ShowPossibleItems" || e.PropertyName == "MissingItemColor") - { - Dispatcher.Invoke(() => - { - reloadEventGrids(); - CharacterControl_SelectionChanged(null, null); - }); - } - if (e.PropertyName == "SaveFolder") - { - Dispatcher.Invoke(() => { - Save = new(Properties.Settings.Default.SaveFolder); - Save.UpdateCharacters(); - reloadPage(); - checkAdventureTab(); - }); - } - if (e.PropertyName == "ShowCoopItems") - { - Dispatcher.Invoke(() => - { - Save.UpdateCharacters(); - reloadEventGrids(); - CharacterControl_SelectionChanged(null, null); - }); - } - - if(e.PropertyName == "Language") - { - Dispatcher.Invoke(() => - { - reloadEventGrids(); - CharacterControl_SelectionChanged(null, null); - }); - } - } - private void ListView_PreviewMouseWheel(object sender, MouseWheelEventArgs e) - { - var eBack = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta); - eBack.RoutedEvent = UIElement.MouseWheelEvent; - - var src = e.Source as ListView; - var ui = src.Parent as UIElement; - ui.RaiseEvent(eBack); - } - private void ListViewItem_Selected(object sender, RoutedEventArgs e) - { - var item = (ListViewItem)e.Source; - if (menuSrcItem != null && !item.Equals(menuSrcItem)) - { - menuSrcItem.IsSelected = false; - } - menuSrcItem = item; - } - private DataGridTemplateColumn GeneratingColumn(string strHeader, string strProperty, string strStyle, string strSortBy) - { - var stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel)); - stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Vertical); - var listView = new FrameworkElementFactory(typeof(ListView)); - - Style style = (Style)this.Resources[strStyle]; - listView.SetValue(StyleProperty, style); - listView.SetValue(ContextMenuProperty, this.Resources["CommonContextMenu"]); - listView.SetBinding(ListView.ItemsSourceProperty, - new Binding() - { - UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, - Path = new PropertyPath(strProperty), - Mode = BindingMode.OneWay - } - ); - listView.AddHandler(MouseWheelEvent, new MouseWheelEventHandler(ListView_PreviewMouseWheel), true); - - stackPanelFactory.AppendChild(listView); - - var dataTemplate = new DataTemplate - { - VisualTree = stackPanelFactory - }; - var templateColumn = new DataGridTemplateColumn - { - Header = strHeader, - CanUserSort = true, - SortMemberPath = strSortBy, - CellTemplate = dataTemplate - }; - return templateColumn; - } - #region missingItemsTextColor - private Brush _missingItemsTextColor; - public Brush missingItemsTextColor - { - get { return _missingItemsTextColor; } - set { _missingItemsTextColor = value; OnPropertyChanged("missingItemsTextColor"); } - } - #endregion - private void Data_AutoGeneratingColumn(object? sender, DataGridAutoGeneratingColumnEventArgs e) - { - var allowColumns = new List() { - "Location", - "Type", - "Name", - "MissingItems", - }; - if (Properties.Settings.Default.ShowPossibleItems) - { - allowColumns.Add("PossibleItems"); - } - if (!allowColumns.Contains(e.Column.Header)) - { - e.Cancel = true; - return; - } - - //Replace the MissingItems column with a custom template column. - if (e.PropertyName == "MissingItems") - { - e.Column = GeneratingColumn("Missing Items", "MissingItems", "lvMissingItemsStyle", "MissingItemsString"); - if (Properties.Settings.Default.MissingItemColor == "Highlight") - { - var highlight = Brushes.RoyalBlue; - missingItemsTextColor = highlight; - } else { - Brush brush = (Brush)FindResource("TextFillColorPrimaryBrush"); - missingItemsTextColor = brush; - } - } else if (e.PropertyName == "PossibleItems") { - e.Column = GeneratingColumn("Possible Items", "PossibleItems", "lvPossibleItemsStyle", "PossibleItemsString"); - } - - e.Column.Header = Loc.T(e.Column.Header.ToString()); - } - - private static string[] ModeTags = { "treeMissingNormal", "treeMissingHardcore", "treeMissingSurvival" }; - List itemModeNode = new List(); - private void CharacterControl_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - //if (CharacterControl.SelectedIndex == -1 && listCharacters.Count > 0) return; - if (CharacterControl.Items.Count > 0 && CharacterControl.SelectedIndex > -1) - { - checkAdventureTab(); - applyFilter(); - //txtMissingItems.Text = string.Join("\n", Save.Characters[CharacterControl.SelectedIndex].GetMissingItems()); - - itemModeNode.Clear(); - List[] itemNode = new List[3] { new List(), new List(), new List() }; - List[] itemChild = new List[20]; - string[] Modes = { Strings.Normal, Strings.Hardcore, Strings.Survival }; - for (int i = 0;i <= 2; i++) - { - TreeListClass item = new TreeListClass() { Name = Modes[i], Childnode = itemNode[i], Tag = ModeTags[i], IsExpanded = (bool)Properties.Settings.Default[$"{ModeTags[i]}_Expanded"] }; - item.Expanded += GameType_CollapsedExpanded; - itemModeNode.Add(item); - } - var idx = -1; - string typeNodeTag = ""; - - Save.Characters[CharacterControl.SelectedIndex].GetMissingItems().Sort(new SortCompare()); - foreach (RemnantItem rItem in Save.Characters[CharacterControl.SelectedIndex].GetMissingItems()) - { - string modeNode = ModeTags[(int)rItem.ItemMode]; - if (!typeNodeTag.Equals($"{modeNode}{rItem.RawType}")) - { - typeNodeTag = $"{modeNode}{rItem.RawType}"; - idx++; - itemChild[idx] = new List(); - bool isExpanded = true; - try - { - isExpanded = (bool)Properties.Settings.Default[$"{typeNodeTag}_Expanded"]; - } catch (Exception ex) { - Logger.Warn($"Not found properties: {typeNodeTag}_Expand"); - } - TreeListClass item = new TreeListClass() { Name = rItem.Type, Childnode = itemChild[idx], Tag = typeNodeTag, IsExpanded = isExpanded }; - item.Expanded += GameType_CollapsedExpanded; - itemNode[(int)rItem.ItemMode].Add(item); - } - itemChild[idx].Add(new TreeListClass() { Name = rItem.Name, Notes = rItem.ItemNotes, Tag = rItem }); - } - - treeMissingItems.ItemsSource = null; - treeMissingItems.ItemsSource = itemModeNode; - - foreach (TreeListClass modeNode in itemModeNode) - { - if (modeNode != null) - { - modeNode.Visibility = (modeNode.Childnode.Count == 0 ? Visibility.Collapsed : Visibility.Visible); - } - } - foreach (List categoryNode in itemNode) - { - if (categoryNode != null) - { - foreach (TreeListClass category in categoryNode) - { - category.Visibility = (category.Childnode.Count == 0 ? Visibility.Collapsed : Visibility.Visible); - } - categoryNode.Sort(); - } - } - foreach (List typeNode in itemChild) { - if (typeNode != null) { - typeNode.Sort(); - } - } - } - } - - private void checkAdventureTab() - { - Dispatcher.Invoke(() => { - if (CharacterControl.SelectedIndex > -1 && Save.Characters[CharacterControl.SelectedIndex].AdventureEvents.Count > 0) - { - tabAdventure.IsEnabled = true; - } - else - { - tabAdventure.IsEnabled = false; - if (tabAnalyzer.SelectedIndex == 1) - { - tabAnalyzer.SelectedIndex = 0; - } - } - }); - } - private void reloadPage() - { - CharacterControl.ItemsSource = null; - CharacterControl.ItemsSource = Save.Characters; - if (filteredCampaign == null) filteredCampaign = new(); - if (filteredAdventure == null) filteredAdventure = new(); - CharacterControl.SelectedIndex = 0; - CharacterControl.Items.Refresh(); - } - private void reloadEventGrids() - { - var tempData = filteredCampaign; - CampaignData.ItemsSource = null; - CampaignData.ItemsSource = tempData; - - tempData = filteredAdventure; - AdventureData.ItemsSource = null; - AdventureData.ItemsSource = tempData; - } - - private string GetTreeListItem(TreeListClass item) - { - if (item == null) - { - return ""; - } - if (item.Tag.GetType().ToString() == "RemnantSaveGuardian.RemnantItem") return item.Name; - StringBuilder sb = new StringBuilder(); - sb.AppendLine(item.Name + ":"); - foreach (TreeListClass i in item.Childnode) - { - sb.AppendLine("\t- " + GetTreeListItem(i)); - } - return sb.ToString(); - } - - private void CommonCopyItem_Click(object sender, RoutedEventArgs e) - { - if (menuSrcItem == null) { return; } - var item = menuSrcItem.Content as RemnantItem; - Clipboard.SetDataObject(item.Name); - } - - private void CommonSearchItem_Click(object sender, RoutedEventArgs e) - { - if (menuSrcItem == null) { return; } - var lstItem = menuSrcItem.Content as RemnantItem; - if (lstItem == null) { return; } - SearchItem(lstItem); - } - - private void CopyItem_Click(object sender, RoutedEventArgs e) - { - if (treeMissingItems.SelectedItem == null) - { - return; - } - Clipboard.SetDataObject(GetTreeListItem((TreeListClass)treeMissingItems.SelectedItem)); - } - private void SearchItem_Click(object sender, RoutedEventArgs e) - { - var treeItem = (TreeListClass)treeMissingItems.SelectedItem; - var item = (RemnantItem)treeItem.Tag; - SearchItem(item); - } - private void SearchItem(RemnantItem item) - { - var itemname = item.Name; - if (!WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture.ToString().StartsWith("en")) - { - itemname = item.RawName; - var setFound = false; - if (item.RawType == "Armor") - { - var armorMatch = Regex.Match(itemname, @"\w+_(?(?:Head|Body|Gloves|Legs))_\w+"); - if (armorMatch.Success) - { - itemname = itemname.Replace($"{armorMatch.Groups["armorPart"].Value}_", ""); - setFound = true; - } - } - itemname = Loc.GameT(itemname, new() { { "locale", "en-US" } }); - if (setFound) - { - itemname += " ("; - } - } - - if (item.RawType == "Armor" && item.IsArmorSet) - { - itemname = itemname?.Substring(0, itemname.IndexOf("(")) + "Set"; - } else if (item.RawType == "Armor") - { - itemname = itemname?.Substring(0, itemname.IndexOf(" (")); - } - Process.Start("explorer.exe", $"https://remnant2.wiki.fextralife.com/{itemname}"); - } - private void ExpandAllItem_Click(object sender, RoutedEventArgs e) - { - CollapseExpandAllItems(itemModeNode, true); - } - private void CollapseAllItem_Click(object sender, RoutedEventArgs e) - { - CollapseExpandAllItems(itemModeNode, false); - } - private void CollapseExpandAllItems(List lstItems, bool bExpand) - { - foreach (TreeListClass item in lstItems) - { - item.IsExpanded = bExpand; - var child = item.Childnode; - if (child != null && child.Count > 0) - { - var node = child[0].Childnode; - if (node != null && node.Count > 0) { CollapseExpandAllItems(child, bExpand); } - } - } - } - private void treeMissingItems_ContextMenuOpening(object sender, ContextMenuEventArgs e) - { - var item = (TreeListClass)treeMissingItems.SelectedItem; - if (item != null) - { - menuMissingItemOpenWiki.Visibility = item.Tag.GetType().ToString() != "RemnantSaveGuardian.RemnantItem" ? Visibility.Collapsed : Visibility.Visible; - menuMissingItemCopy.Visibility = Visibility.Visible; - } else { - menuMissingItemOpenWiki.Visibility = Visibility.Collapsed; - menuMissingItemCopy.Visibility = Visibility.Collapsed; - } - } - - private void treeMissingItems_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - var item = sender as TreeViewItem; - if (item != null) - { - var node = (TreeListClass)item.Header; - if (node != null) { - node.IsSelected = true; - e.Handled = true; - } - } - } - - private void WorldAnalyzerFilter_TextChanged(object sender, TextChangedEventArgs e) - { - applyFilter(); - } - private bool eventPassesFilter(RemnantWorldEvent e) - { - var filter = WorldAnalyzerFilter.Text.ToLower(); - if (filter.Length == 0) - { - return true; - } - if (e.MissingItemsString.ToLower().Contains(filter)) - { - return true; - } - if (Properties.Settings.Default.ShowPossibleItems && e.PossibleItemsString.ToLower().Contains(filter)) - { - return true; - } - if (e.Name.ToLower().Contains(filter)) - { - return true; - } - return false; - } - private void applyFilter() - { - if (CharacterControl.Items.Count == 0 || CharacterControl.SelectedIndex == -1) - { - return; - } - var character = Save.Characters[CharacterControl.SelectedIndex]; - if (character == null) - { - return; - } - filteredCampaign.Clear(); - filteredCampaign.AddRange(character.CampaignEvents.FindAll(e => eventPassesFilter(e))); - filteredAdventure.Clear(); - filteredAdventure.AddRange(character.AdventureEvents.FindAll(e => eventPassesFilter(e))); - reloadEventGrids(); - } - public class SortCompare : IComparer - { - public int Compare(RemnantItem? x, RemnantItem? y) - { - if (x.ItemMode != y.ItemMode) - { - return x.ItemMode.CompareTo(y.ItemMode); - } else { - return x.RawType.CompareTo(y.RawType); - } - } - } - public class TreeListClass : IComparable, INotifyPropertyChanged - { - public delegate void EventHandler(object sender, PropertyChagedEventArgs e); - public event EventHandler Expanded; - public event PropertyChangedEventHandler PropertyChanged; - private List _childnode; - private Object _tag; - private bool _isselected; - private bool _isexpanded; - private Visibility _visibility; - public String Name { get; set; } - public String? Notes { get; set; } - public Object Tag { - get { return _tag == null ? new object() : _tag; } - set { _tag = value; } - } - public List Childnode { - get { return _childnode == null ? new List(0) : _childnode; } - set { _childnode = value; } - } - public bool IsSelected { - get { return _isselected; } - set { _isselected = value; OnPropertyChanged(); } - } - public bool IsExpanded - { - get { return _isexpanded; } - set - { - if (value != _isexpanded) - { - _isexpanded = value; - OnPropertyChanged(); - PropertyChagedEventArgs ev = new PropertyChagedEventArgs("IsExpanded", _isexpanded, value); - if (Expanded != null) - { - this.Expanded(this, ev); - } - } - } - } - public Visibility Visibility - { - get { return _visibility; } - set { _visibility = value; OnPropertyChanged(); } - } - protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) - { - if (this.PropertyChanged != null) - this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); - } - public int CompareTo(TreeListClass other) - { - return Name.CompareTo(other.Name); - } - } - public class PropertyChagedEventArgs : EventArgs - { - public PropertyChagedEventArgs(string propertyName, object oldValue, object newValue) - { - PropertyName = propertyName; - OldValue = oldValue; - NewValue = newValue; - } - public string PropertyName { get; private set; } - public object OldValue { get; private set; } - public object NewValue { get; set; } - } - } -} +using RemnantSaveGuardian.locales; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Media; +using Wpf.Ui.Common.Interfaces; + +namespace RemnantSaveGuardian.Views.Pages +{ + /// + /// Interaction logic for WorldAnalyzerPage.xaml + /// + public partial class WorldAnalyzerPage : INavigableView, INotifyPropertyChanged + { + public ViewModels.WorldAnalyzerViewModel ViewModel + { + get; + } + private RemnantSave Save; + private List filteredCampaign; + private List filteredAdventure; + private ListViewItem menuSrcItem; + public WorldAnalyzerPage(ViewModels.WorldAnalyzerViewModel viewModel, string? pathToSaveFiles = null) + { + ViewModel = viewModel; + + InitializeComponent(); + EventTransfer.Event += ChangeGridVisibility; + + try + { + if (pathToSaveFiles == null) + { + pathToSaveFiles = Properties.Settings.Default.SaveFolder; + } + + Properties.Settings.Default.PropertyChanged += Default_PropertyChanged; + + Save = new(pathToSaveFiles); + if (pathToSaveFiles == Properties.Settings.Default.SaveFolder) + { + SaveWatcher.SaveUpdated += (sender, eventArgs) => { + Dispatcher.Invoke(() => + { + var selectedIndex = CharacterControl.SelectedIndex; + Save.UpdateCharacters(); + CharacterControl.Items.Refresh(); + if (selectedIndex >= CharacterControl.Items.Count) + { + selectedIndex = 0; + } + CharacterControl.SelectedIndex = selectedIndex; + //CharacterControl_SelectionChanged(null, null); + }); + }; + Properties.Settings.Default.PropertyChanged += Default_PropertyChanged; + BackupsPage.BackupSaveRestored += BackupsPage_BackupSaveRestored; + } + CharacterControl.ItemsSource = Save.Characters; + + //FontSizeSlider.Value = AdventureData.FontSize; + //FontSizeSlider.Minimum = 2.0; + //FontSizeSlider.Maximum = AdventureData.FontSize * 2; + FontSizeSlider.Value = Properties.Settings.Default.AnalyzerFontSize; + FontSizeSlider.ValueChanged += FontSizeSlider_ValueChanged; + + filteredCampaign = new(); + filteredAdventure = new(); + CampaignData.ItemsSource = filteredCampaign; + AdventureData.ItemsSource = filteredAdventure; + + Task task = new Task(FirstLoad); + task.Start(); + } catch (Exception ex) { + Logger.Error($"Error initializing analzyer page: {ex}"); + } + } + private void ChangeGridVisibility(Object sender, EventTransfer.MessageArgs message) + { + OptionGrid.Visibility = (Visibility)message._message; + if (message._message is Visibility.Visible) + { + tabGrid.Margin = new Thickness(23, 0, 23, 23); + tabCampaign.Visibility = Visibility.Visible; + tabAdventure.Visibility = Visibility.Visible; + tabMissing.Visibility = Visibility.Visible; + } + else if (message._message is Visibility.Collapsed) + { + tabGrid.Margin = new Thickness(4, 0, 4, 4); + tabCampaign.Visibility = Visibility.Collapsed; + tabAdventure.Visibility = Visibility.Collapsed; + tabMissing.Visibility = Visibility.Collapsed; + } + } + + private void FirstLoad() + { + System.Threading.Thread.Sleep(500); //Wait for UI render first + Save.UpdateCharacters(); + Dispatcher.Invoke(() => { + CharacterControl.SelectedIndex = 0; + checkAdventureTab(); + progressRing.Visibility = Visibility.Collapsed; + }); + } + + private void BackupsPage_BackupSaveRestored(object? sender, EventArgs e) + { + var selectedIndex = CharacterControl.SelectedIndex; + Save.UpdateCharacters(); + CharacterControl.Items.Refresh(); + if (selectedIndex >= CharacterControl.Items.Count) + { + selectedIndex = 0; + } + CharacterControl.SelectedIndex = selectedIndex; + } + + public WorldAnalyzerPage(ViewModels.WorldAnalyzerViewModel viewModel) : this(viewModel, null) + { + + } + + #region INotifiedProperty Block + public event PropertyChangedEventHandler PropertyChanged; + + protected void OnPropertyChanged(string propertyName) + { + PropertyChangedEventHandler handler = PropertyChanged; + + if (handler != null) + { + handler(this, new PropertyChangedEventArgs(propertyName)); + } + } + #endregion + + private void FontSizeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + Properties.Settings.Default.AnalyzerFontSize = (int)Math.Round(FontSizeSlider.Value); + reloadEventGrids(); + } + + private void GameType_CollapsedExpanded(object sender, PropertyChagedEventArgs e) + { + TreeListClass item = (TreeListClass)sender; + Properties.Settings.Default[$"{item.Tag}_Expanded"] = item.IsExpanded; + } + + private void SavePlaintextButton_Click(object sender, RoutedEventArgs e) + { + try + { + System.Windows.Forms.FolderBrowserDialog openFolderDialog = new System.Windows.Forms.FolderBrowserDialog(); + openFolderDialog.Description = Loc.T("Export save files as plaintext"); + openFolderDialog.UseDescriptionForTitle = true; + System.Windows.Forms.DialogResult result = openFolderDialog.ShowDialog(); + if (result != System.Windows.Forms.DialogResult.OK) + { + return; + } + if (openFolderDialog.SelectedPath == Properties.Settings.Default.SaveFolder || openFolderDialog.SelectedPath == Save.SaveFolderPath) + { + Logger.Error(Loc.T("export_save_invalid_folder_error")); + return; + } + File.WriteAllText($@"{openFolderDialog.SelectedPath}\profile.txt", Save.GetProfileData()); + File.Copy(Save.SaveProfilePath, $@"{openFolderDialog.SelectedPath}\profile.sav", true); + foreach (var filePath in Save.WorldSaves) + { + File.WriteAllText($@"{openFolderDialog.SelectedPath}\{filePath.Substring(filePath.LastIndexOf(@"\")).Replace(".sav", ".txt")}", RemnantSave.DecompressSaveAsString(filePath)); + File.Copy(filePath, $@"{openFolderDialog.SelectedPath}\{filePath.Substring(filePath.LastIndexOf(@"\"))}", true); + } + Logger.Success(Loc.T($"Exported save files successfully to {openFolderDialog.SelectedPath}")); + } catch (Exception ex) + { + Logger.Error(Loc.T("Error exporting save files: {errorMessage}", new() { { "errorMessage", ex.Message } })); + } + } + + private void Default_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (e.PropertyName == "ShowPossibleItems" || e.PropertyName == "MissingItemColor") + { + Dispatcher.Invoke(() => + { + reloadEventGrids(); + CharacterControl_SelectionChanged(null, null); + }); + } + if (e.PropertyName == "SaveFolder") + { + Dispatcher.Invoke(() => { + Save = new(Properties.Settings.Default.SaveFolder); + Save.UpdateCharacters(); + reloadPage(); + checkAdventureTab(); + }); + } + if (e.PropertyName == "ShowCoopItems") + { + Dispatcher.Invoke(() => + { + Save.UpdateCharacters(); + reloadEventGrids(); + CharacterControl_SelectionChanged(null, null); + }); + } + + if(e.PropertyName == "Language") + { + Dispatcher.Invoke(() => + { + reloadEventGrids(); + CharacterControl_SelectionChanged(null, null); + }); + } + } + private void ListView_PreviewMouseWheel(object sender, MouseWheelEventArgs e) + { + var eBack = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta); + eBack.RoutedEvent = UIElement.MouseWheelEvent; + + var src = e.Source as ListView; + var ui = src.Parent as UIElement; + ui.RaiseEvent(eBack); + } + private void ListViewItem_Selected(object sender, RoutedEventArgs e) + { + var item = (ListViewItem)e.Source; + if (menuSrcItem != null && !item.Equals(menuSrcItem)) + { + menuSrcItem.IsSelected = false; + } + menuSrcItem = item; + } + private DataGridTemplateColumn GeneratingColumn(string strHeader, string strProperty, string strStyle, string strSortBy) + { + var stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel)); + stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Vertical); + var listView = new FrameworkElementFactory(typeof(ListView)); + + Style style = (Style)this.Resources[strStyle]; + listView.SetValue(StyleProperty, style); + listView.SetValue(ContextMenuProperty, this.Resources["CommonContextMenu"]); + listView.SetBinding(ListView.ItemsSourceProperty, + new Binding() + { + UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, + Path = new PropertyPath(strProperty), + Mode = BindingMode.OneWay + } + ); + listView.AddHandler(MouseWheelEvent, new MouseWheelEventHandler(ListView_PreviewMouseWheel), true); + + stackPanelFactory.AppendChild(listView); + + var dataTemplate = new DataTemplate + { + VisualTree = stackPanelFactory + }; + var templateColumn = new DataGridTemplateColumn + { + Header = strHeader, + CanUserSort = true, + SortMemberPath = strSortBy, + CellTemplate = dataTemplate + }; + return templateColumn; + } + #region missingItemsTextColor + private Brush _missingItemsTextColor; + public Brush missingItemsTextColor + { + get { return _missingItemsTextColor; } + set { _missingItemsTextColor = value; OnPropertyChanged("missingItemsTextColor"); } + } + #endregion + private void Data_AutoGeneratingColumn(object? sender, DataGridAutoGeneratingColumnEventArgs e) + { + var allowColumns = new List() { + "Location", + "Type", + "Name", + "MissingItems", + }; + if (Properties.Settings.Default.ShowPossibleItems) + { + allowColumns.Add("PossibleItems"); + } + if (!allowColumns.Contains(e.Column.Header)) + { + e.Cancel = true; + return; + } + + //Replace the MissingItems column with a custom template column. + if (e.PropertyName == "MissingItems") + { + e.Column = GeneratingColumn("Missing Items", "MissingItems", "lvMissingItemsStyle", "MissingItemsString"); + if (Properties.Settings.Default.MissingItemColor == "Highlight") + { + var highlight = Brushes.RoyalBlue; + missingItemsTextColor = highlight; + } else { + Brush brush = (Brush)FindResource("TextFillColorPrimaryBrush"); + missingItemsTextColor = brush; + } + } else if (e.PropertyName == "PossibleItems") { + e.Column = GeneratingColumn("Possible Items", "PossibleItems", "lvPossibleItemsStyle", "PossibleItemsString"); + } + + e.Column.Header = Loc.T(e.Column.Header.ToString()); + } + + private static string[] ModeTags = { "treeMissingNormal", "treeMissingHardcore", "treeMissingSurvival" }; + List itemModeNode = new List(); + private void CharacterControl_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + //if (CharacterControl.SelectedIndex == -1 && listCharacters.Count > 0) return; + if (CharacterControl.Items.Count > 0 && CharacterControl.SelectedIndex > -1) + { + checkAdventureTab(); + applyFilter(); + //txtMissingItems.Text = string.Join("\n", Save.Characters[CharacterControl.SelectedIndex].GetMissingItems()); + + itemModeNode.Clear(); + List[] itemNode = new List[3] { new List(), new List(), new List() }; + List[] itemChild = new List[20]; + string[] Modes = { Strings.Normal, Strings.Hardcore, Strings.Survival }; + for (int i = 0;i <= 2; i++) + { + TreeListClass item = new TreeListClass() { Name = Modes[i], Childnode = itemNode[i], Tag = ModeTags[i], IsExpanded = (bool)Properties.Settings.Default[$"{ModeTags[i]}_Expanded"] }; + item.Expanded += GameType_CollapsedExpanded; + itemModeNode.Add(item); + } + var idx = -1; + string typeNodeTag = ""; + + Save.Characters[CharacterControl.SelectedIndex].GetMissingItems().Sort(new SortCompare()); + foreach (RemnantItem rItem in Save.Characters[CharacterControl.SelectedIndex].GetMissingItems()) + { + string modeNode = ModeTags[(int)rItem.ItemMode]; + if (!typeNodeTag.Equals($"{modeNode}{rItem.RawType}")) + { + typeNodeTag = $"{modeNode}{rItem.RawType}"; + idx++; + itemChild[idx] = new List(); + bool isExpanded = true; + try + { + isExpanded = (bool)Properties.Settings.Default[$"{typeNodeTag}_Expanded"]; + } catch (Exception ex) { + Logger.Warn($"Not found properties: {typeNodeTag}_Expand"); + } + TreeListClass item = new TreeListClass() { Name = rItem.Type, Childnode = itemChild[idx], Tag = typeNodeTag, IsExpanded = isExpanded }; + item.Expanded += GameType_CollapsedExpanded; + itemNode[(int)rItem.ItemMode].Add(item); + } + itemChild[idx].Add(new TreeListClass() { Name = rItem.Name, Notes = rItem.ItemNotes, Tag = rItem }); + } + + treeMissingItems.ItemsSource = null; + treeMissingItems.ItemsSource = itemModeNode; + + foreach (TreeListClass modeNode in itemModeNode) + { + if (modeNode != null) + { + modeNode.Visibility = (modeNode.Childnode.Count == 0 ? Visibility.Collapsed : Visibility.Visible); + } + } + foreach (List categoryNode in itemNode) + { + if (categoryNode != null) + { + foreach (TreeListClass category in categoryNode) + { + category.Visibility = (category.Childnode.Count == 0 ? Visibility.Collapsed : Visibility.Visible); + } + categoryNode.Sort(); + } + } + foreach (List typeNode in itemChild) { + if (typeNode != null) { + typeNode.Sort(); + } + } + } + } + + private void checkAdventureTab() + { + Dispatcher.Invoke(() => { + if (CharacterControl.SelectedIndex > -1 && Save.Characters[CharacterControl.SelectedIndex].AdventureEvents.Count > 0) + { + tabAdventure.IsEnabled = true; + } + else + { + tabAdventure.IsEnabled = false; + if (tabAnalyzer.SelectedIndex == 1) + { + tabAnalyzer.SelectedIndex = 0; + } + } + }); + } + private void reloadPage() + { + CharacterControl.ItemsSource = null; + CharacterControl.ItemsSource = Save.Characters; + if (filteredCampaign == null) filteredCampaign = new(); + if (filteredAdventure == null) filteredAdventure = new(); + CharacterControl.SelectedIndex = 0; + CharacterControl.Items.Refresh(); + } + private void reloadEventGrids() + { + var tempDataC = filteredCampaign; + CampaignData.ItemsSource = null; + CampaignData.ItemsSource = tempDataC; + + var tempDataA = filteredAdventure; + AdventureData.ItemsSource = null; + AdventureData.ItemsSource = tempDataA; + } + + private string GetTreeListItem(TreeListClass item) + { + if (item == null) + { + return ""; + } + if (item.Tag.GetType().ToString() == "RemnantSaveGuardian.RemnantItem") return item.Name; + StringBuilder sb = new StringBuilder(); + sb.AppendLine(item.Name + ":"); + foreach (TreeListClass i in item.Childnode) + { + sb.AppendLine("\t- " + GetTreeListItem(i)); + } + return sb.ToString(); + } + + private void CommonCopyItem_Click(object sender, RoutedEventArgs e) + { + if (menuSrcItem == null) { return; } + var item = menuSrcItem.Content as RemnantItem; + Clipboard.SetDataObject(item.Name); + } + + private void CommonSearchItem_Click(object sender, RoutedEventArgs e) + { + if (menuSrcItem == null) { return; } + var lstItem = menuSrcItem.Content as RemnantItem; + if (lstItem == null) { return; } + SearchItem(lstItem); + } + + private void CopyItem_Click(object sender, RoutedEventArgs e) + { + if (treeMissingItems.SelectedItem == null) + { + return; + } + Clipboard.SetDataObject(GetTreeListItem((TreeListClass)treeMissingItems.SelectedItem)); + } + private void SearchItem_Click(object sender, RoutedEventArgs e) + { + var treeItem = (TreeListClass)treeMissingItems.SelectedItem; + var item = (RemnantItem)treeItem.Tag; + SearchItem(item); + } + private void SearchItem(RemnantItem item) + { + var itemname = item.Name; + if (!WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture.ToString().StartsWith("en")) + { + itemname = item.RawName; + var setFound = false; + if (item.RawType == "Armor") + { + var armorMatch = Regex.Match(itemname, @"\w+_(?(?:Head|Body|Gloves|Legs))_\w+"); + if (armorMatch.Success) + { + itemname = itemname.Replace($"{armorMatch.Groups["armorPart"].Value}_", ""); + setFound = true; + } + } + itemname = Loc.GameT(itemname, new() { { "locale", "en-US" } }); + if (setFound) + { + itemname += " ("; + } + } + + if (item.RawType == "Armor" && item.IsArmorSet) + { + itemname = itemname?.Substring(0, itemname.IndexOf("(")) + "Set"; + } else if (item.RawType == "Armor") + { + itemname = itemname?.Substring(0, itemname.IndexOf(" (")); + } + Process.Start("explorer.exe", $"https://remnant2.wiki.fextralife.com/{itemname}"); + } + private void ExpandAllItem_Click(object sender, RoutedEventArgs e) + { + CollapseExpandAllItems(itemModeNode, true); + } + private void CollapseAllItem_Click(object sender, RoutedEventArgs e) + { + CollapseExpandAllItems(itemModeNode, false); + } + private void CollapseExpandAllItems(List lstItems, bool bExpand) + { + foreach (TreeListClass item in lstItems) + { + item.IsExpanded = bExpand; + var child = item.Childnode; + if (child != null && child.Count > 0) + { + var node = child[0].Childnode; + if (node != null && node.Count > 0) { CollapseExpandAllItems(child, bExpand); } + } + } + } + private void treeMissingItems_ContextMenuOpening(object sender, ContextMenuEventArgs e) + { + var item = (TreeListClass)treeMissingItems.SelectedItem; + if (item != null) + { + menuMissingItemOpenWiki.Visibility = item.Tag.GetType().ToString() != "RemnantSaveGuardian.RemnantItem" ? Visibility.Collapsed : Visibility.Visible; + menuMissingItemCopy.Visibility = Visibility.Visible; + } else { + menuMissingItemOpenWiki.Visibility = Visibility.Collapsed; + menuMissingItemCopy.Visibility = Visibility.Collapsed; + } + } + + private void treeMissingItems_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + var item = sender as TreeViewItem; + if (item != null) + { + var node = (TreeListClass)item.Header; + if (node != null) { + node.IsSelected = true; + e.Handled = true; + } + } + } + + private void WorldAnalyzerFilter_TextChanged(object sender, TextChangedEventArgs e) + { + applyFilter(); + } + private bool eventPassesFilter(RemnantWorldEvent e) + { + var filter = WorldAnalyzerFilter.Text.ToLower(); + if (filter.Length == 0) + { + return true; + } + if (e.MissingItemsString.ToLower().Contains(filter)) + { + return true; + } + if (Properties.Settings.Default.ShowPossibleItems && e.PossibleItemsString.ToLower().Contains(filter)) + { + return true; + } + if (e.Name.ToLower().Contains(filter)) + { + return true; + } + return false; + } + private void applyFilter() + { + if (CharacterControl.Items.Count == 0 || CharacterControl.SelectedIndex == -1) + { + return; + } + var character = Save.Characters[CharacterControl.SelectedIndex]; + if (character == null) + { + return; + } + filteredCampaign.Clear(); + filteredCampaign.AddRange(character.CampaignEvents.FindAll(e => eventPassesFilter(e))); + filteredAdventure.Clear(); + filteredAdventure.AddRange(character.AdventureEvents.FindAll(e => eventPassesFilter(e))); + reloadEventGrids(); + } + public class SortCompare : IComparer + { + public int Compare(RemnantItem? x, RemnantItem? y) + { + if (x.ItemMode != y.ItemMode) + { + return x.ItemMode.CompareTo(y.ItemMode); + } else { + return x.RawType.CompareTo(y.RawType); + } + } + } + public class TreeListClass : IComparable, INotifyPropertyChanged + { + public delegate void EventHandler(object sender, PropertyChagedEventArgs e); + public event EventHandler Expanded; + public event PropertyChangedEventHandler PropertyChanged; + private List _childnode; + private Object _tag; + private bool _isselected; + private bool _isexpanded; + private Visibility _visibility; + public String Name { get; set; } + public String? Notes { get; set; } + public Object Tag { + get { return _tag == null ? new object() : _tag; } + set { _tag = value; } + } + public List Childnode { + get { return _childnode == null ? new List(0) : _childnode; } + set { _childnode = value; } + } + public bool IsSelected { + get { return _isselected; } + set { _isselected = value; OnPropertyChanged(); } + } + public bool IsExpanded + { + get { return _isexpanded; } + set + { + if (value != _isexpanded) + { + _isexpanded = value; + OnPropertyChanged(); + PropertyChagedEventArgs ev = new PropertyChagedEventArgs("IsExpanded", _isexpanded, value); + if (Expanded != null) + { + this.Expanded(this, ev); + } + } + } + } + public Visibility Visibility + { + get { return _visibility; } + set { _visibility = value; OnPropertyChanged(); } + } + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + if (this.PropertyChanged != null) + this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); + } + public int CompareTo(TreeListClass other) + { + return Name.CompareTo(other.Name); + } + } + public class PropertyChagedEventArgs : EventArgs + { + public PropertyChagedEventArgs(string propertyName, object oldValue, object newValue) + { + PropertyName = propertyName; + OldValue = oldValue; + NewValue = newValue; + } + public string PropertyName { get; private set; } + public object OldValue { get; private set; } + public object NewValue { get; set; } + } + } +} diff --git a/RemnantSaveGuardian/game.json b/RemnantSaveGuardian/game.json index cd836d7..810a90e 100644 --- a/RemnantSaveGuardian/game.json +++ b/RemnantSaveGuardian/game.json @@ -7,7 +7,9 @@ "Quest_Story_Empress_Zone01_Template01", "Quest_Story_Empress_Zone02_Template01", "Quest_Story_IAmLegend_Zone1_Template", - "Quest_Story_IAmLegend_Zone2_Template" + "Quest_Story_IAmLegend_Zone2_Template", + "Quest_Story_OTK_Castle", + "Quest_Story_OTK" ], "subLocations": { "Jungle": { @@ -64,6 +66,14 @@ "TalRatha": "Forgotten Prison", "Phantom": "Astropath's Respite", "StasisSiege": "Vault Of The Formless" + }, + "DLC1": { + "GardenMaze": "Pathway of the Fallen", + "Lighthouse": "Derelict Lighthouse", + "SewerChamber": "The Forgotten Commune", + "Impaler": "Glistering Cloister", + "Witch": "Sunken Haunt", + "OneTrueKing": "Palace of the One True King" } }, "injectableParents": { @@ -446,7 +456,7 @@ { "name": "/Items/Armor/Armor_Head_LodestoneCrown", "notes": "On the boat inside Kolkets locked room", - "armorSet": false + "armorSet": false }, { "name": "/Items/Trinkets/Rings/BloodTingedRing/Ring_BloodTingedRing" @@ -889,7 +899,7 @@ { "name": "/Items/Armor/Misc/Armor_Head_RedPrince", "notes": "kill with Assassins Dagger", - "armorSet": false + "armorSet": false } ], "NightWeaver": [ @@ -898,6 +908,10 @@ }, { "name": "/Items/Weapons/Melee/Special/Nightshade/Weapon_Nightshade" + }, + { + "name": "/Items/Trinkets/Rings/BitterMemento/Ring_BitterMemento", + "notes": "Offer Memoriam Medallion Key to Nightweaver's Web." } ], "FaelinFaerlin": [ @@ -1286,7 +1300,7 @@ "OilField": [ { "name": "/Items/Armor/Nerud_Pilot/Armor_Head_PilotsHelm", - "armorSet": false + "armorSet": false }, { "name": "/Items/Trinkets/Amulets/DetonationTrigger/Amulet_DetonationTrigger" @@ -1387,6 +1401,310 @@ } ] }, + "DLC1": { + "Dranception": [ + { + "name": "/Items/Weapons/Anguish/Weapon_Anguish", + "notes": "Enter the FinalDream and find the Drans in each world." + } + ], + "Amulet_BrewmastersCork": [ + { + "name": "/Items/Trinkets/Amulets/BrewmastersCork/Amulet_BrewmastersCork" + } + ], + "Amulet_BirthrightOfTheLost": [ + { + "name": "/Items/Trinkets/Amulets/BirthrightOfTheLost/Amulet_BirthrightOfTheLost" + } + ], + "Amulet_LegacyProtocol": [ + { + "name": "/Items/Trinkets/Amulets/LegacyProtocol/Amulet_LegacyProtocol" + } + ], + "Amulet_SinisterTotem": [ + { + "name": "/Items/Trinkets/Amulets/SinisterTotem/Amulet_SinisterTotem" + } + ], + "Amulet_WhisperingMarble": [ + { + "name": "/Items/Trinkets/Amulets/WhisperingMarble/Amulet_WhisperingMarble" + } + ], + "Ring_ATaeriiBooster": [ + { + "name": "/Items/Trinkets/Rings/AtaeriiBooster/Ring_ATaeriiBooster" + } + ], + "Ring_BrawlersPride": [ + { + "name": "/Items/Trinkets/Rings/BrawlersPride/Ring_BrawlersPride" + } + ], + "Ring_DriedClayRing": [ + { + "name": "/Items/Trinkets/Rings/DriedClayRing/Ring_DriedClayRing" + } + ], + "Ring_OfferingStone": [ + { + "name": "/Items/Trinkets/Rings/Offering_Stone/Ring_OfferingStone" + } + ], + "Ring_PainlessObsidian": [ + { + "name": "/Items/Trinkets/Rings/PainlessObsidian/Ring_PainlessObsidian" + } + ], + "Ring_PowerComplex": [ + { + "name": "/Items/Trinkets/Rings/PowerComplex/Ring_PowerComplex" + } + ], + "Ring_RedRingOfDeath": [ + { + "name": "/Items/Trinkets/Rings/RedRingofDeath/Ring_RedRingOfDeath" + } + ], + "Ring_RingOfTheVain": [ + { + "name": "/Items/Trinkets/Rings/RingOfTheVain/Ring_RingOfTheVain" + } + ], + "Ring_RingOfTheCastaway": [ + { + "name": "/Items/Trinkets/Rings/RingOfTheCastaway/Ring_RingOfTheCastaway" + } + ], + "Ring_ShadowOfMisery": [ + { + "name": "/Items/Trinkets/Rings/ShadowOfMisery/Ring_ShadowOfMisery" + } + ], + "Ring_SoulShard": [ + { + "name": "/Items/Trinkets/Rings/SoulShard/Ring_SoulShard" + } + ], + "Ring_WoodRing": [ + { + "name": "/Items/Trinkets/Rings/WoodRing/Ring_WoodRing" + } + ], + "BurningCity": [ + { + "name": "/Quests/Quest_Event_Dranception/Items/Quest_Item_DLC_DreamLevel", + "ignore": false, + "notes": "Use liquid escape in the Manor, then Escape the dream through the crystal." + }, + { + "name": "/Items/Trinkets/Rings/CrimsonDreamstone/Ring_CrimsonDreamstone", + "notes": "Use liquid escape in the manor." + }, + { + "name": "/Items/Trinkets/Amulets/DeathSoakedIdol/Amulet_DeathSoakedIdol" + } + ], + "Halls": [ + { + "name": "/Items/Trinkets/Rings/ShaedStone/Ring_ShaedStone", + "notes": "Shoot the invisible golden pot in the reflection you see on the mirrored floor." + } + ], + "Sewer": [ + { + "name": "/Items/Trinkets/Rings/RingOfTheCastaway/Ring_RingOfTheCastaway" + } + ], + "Impaler": [ + { + "name": "/Items/Mods/Mod_RingOfSpears/Mod_RingOfSpears" + } + ], + "Witch": [ + { + "name": "/Items/Mods/Mod_CreepingMist/Mod_CreepingMist" + } + ], + "GardenMaze": [ + { + "name": "/Items/Trinkets/Amulets/GiftOfMelancholy/Amulet_GiftOfMelancholy", + "notes": "Medallion Shaed Reward" + }, + { + "name": "/Items/Trinkets/Amulets/GiftOfEuphoria/Amulet_GiftOfEuphoria", + "notes": "Medallion Gold Reward" + }, + { + "name": "/Items/Mods/Mod_KnightGuard/Mod_KnightGuard", + "notes": "Wear the Red Prince Crown in the room on Golden Hall." + }, + { + "name": "/Items/Gems/Ranged/Prophecy/MetaGem_Prophecy" + } + + ], + "Lighthouse": [ + { + "name": "/Items/Weapons/Buster/Weapon_Sparkfire", + "notes": "Outside the lighthouse down the path, around a rock is a secret door, interact with item to get the key to open the door" + }, + { + "name": "/Items/Gems/Ranged/Sleeper/MetaGem_Sleeper" + }, + { + "name": "/Items/Trinkets/Rings/LightHouseKeepersRing/Ring_LightHouseKeepersRing" + } + ], + "SewerChamber": [ + { + "name": "/Items/Weapons/Melee/Scythe/Scythe_Ritualist/Weapon_RitualistScythe" + }, + { + "name": "/Items/Gems/Melee/Guts/MetaGem_Guts", + "notes": "Return to dran the woman after destroying both of the totems." + } + ], + "ForlornCoast": [ + { + "name": "/Items/Archetypes/Ritualist/Armor/Armor_Head_Ritualist", + "notes": "Shoot hanging body under the bridge before Nimue." + }, + { + "name": "/Items/Archetypes/Ritualist/Armor/Armor_Body_Ritualist", + "notes": "Shoot hanging body under the bridge before Nimue." + }, + { + "name": "/Items/Archetypes/Ritualist/Armor/Armor_Legs_Ritualist", + "notes": "Shoot hanging body under the bridge before Nimue." + }, + { + "name": "/Items/Archetypes/Ritualist/Armor/Armor_Gloves_Ritualist", + "notes": "Shoot hanging body under the bridge before Nimue." + } + ], + "OneTrueKingStory": [ + { + "name": "/Items/Archetypes/Ritualist/Armor/Armor_Head_Ritualist", + "notes": "Shoot hanging body under the bridge before Nimue." + }, + { + "name": "/Items/Archetypes/Ritualist/Armor/Armor_Body_Ritualist", + "notes": "Shoot hanging body under the bridge before Nimue." + }, + { + "name": "/Items/Archetypes/Ritualist/Armor/Armor_Legs_Ritualist", + "notes": "Shoot hanging body under the bridge before Nimue." + }, + { + "name": "/Items/Archetypes/Ritualist/Armor/Armor_Gloves_Ritualist", + "notes": "Shoot hanging body under the bridge before Nimue." + }, + { + "name": "/Items/Armor/RedPrinceArmor/Armor_Head_CrimsonGuard", + "notes": "Kill the one true king, give the red prince 3 coins, then return to the palace." + }, + { + "name": "/Items/Armor/RedPrinceArmor/Armor_Body_CrimsonGuard", + "notes": "Kill the one true king, give the red prince 3 coins, then return to the palace." + }, + { + "name": "/Items/Armor/RedPrinceArmor/Armor_Legs_CrimsonGuard", + "notes": "Kill the one true king, give the red prince 3 coins, then return to the palace." + }, + { + "name": "/Items/Armor/RedPrinceArmor/Armor_Gloves_CrimsonGuard", + "notes": "Kill The One True King, give the red prince 3 coins, then return to the palace." + }, + { + "name": "/Items/Trinkets/Rings/DigestedHogLure/Ring_DigestedHogLure", + "notes": "Kill all the hogs by the Anchor statue." + }, + { + "name": "/Items/Trinkets/Rings/AtonementFold/Ring_AtonementFold", + "notes": "Purchase from Leywise." + }, + { + "name": "/Items/Trinkets/Rings/WhiteGlassBead/Ring_WhiteGlassBead", + "notes": "Bring the feastmaster leftovers to Leywise." + }, + { + "name": "/Items/Traits/DarkPact/Trait_DarkPact", + "notes": "Shoot all three bells in Forlorn Coast to complete the Bells event." + }, + { + "name": "/Items/Trinkets/Amulets/IndexOfTheScribe/Amulet_IndexOfTheScribe", + "notes": "Bring the Scribes Tome back to Leywise, do NOT open the tome." + }, + { + "name": "/Items/Trinkets/Rings/BurdenOfTheDeparted/Ring_BurdenOfTheDeparted", + "notes": "Defeat The One True King while having Burden of the Divine equipped." + }, + { + "name": "/Items/Trinkets/Rings/BurdenOfTheSciolist/Ring_BurdenOfTheSciolist", + "notes": "Open the Scribes Tome and give the medallion to Leywise immediately" + }, + { + "name": "/Items/Trinkets/Rings/RingOfInfiniteDamage/Ring_RingOfInfiniteDamage", + "notes": "Open the Scribes Tome and reject the first time Leywise asks, then give the medallion to Leywise the second time he asks." + }, + { + "name": "/Items/Trinkets/Rings/BandOfTheFanatic/Ring_BandOfTheFanatic", + "notes": "Wear full Zealot armor, then speak to Preacher after his speech." + }, + { + "name": "/Items/Trinkets/Rings/BridgeWardensCrest/Ring_BridgeWardensCrest", + "notes": "Get to the top of the bridge without killing any fae, then speak to feastmaster elite." + }, + { + "name": "/Items/Relics/PaperHeart/Relic_Consumable_PaperHeart", + "notes": "Find the scribes book and get the medallion out of it, then open the door in the palace." + }, + { + "name": "/Items/Trinkets/Amulets/Cost_Of_Betrayal/Amulet_CostOfBetrayal", + "notes": "Shoot one of the dead council members bodies." + }, + { + "name": "/Items/Weapons/Melee/Special/Wrathbringer/Weapon_Wrathbringer", + "notes": "The One True King Alt kill reward" + }, + { + "name": "/Items/Weapons/Melee/Special/AbyssalHook/Weapon_AbyssalHook", + "notes": "It can be found in one of the rooms of the sewer-like area, in the manticore lair." + }, + { + "name": "/Items/Weapons/Monarch/Blueprints/Weapon_Monarch" + }, + { + "name": "/Items/Trinkets/Amulets/GiftOfTheUnbound/Amulet_GiftOfTheUnbound", + "notes": "Agree to kill Nimue, but then kill The One True King instead and return to Nimue." + }, + { + "name": "/Items/Relics/BrokenHeart/Relic_Consumable_BrokenHeart", + "notes": "Kill Nimue." + }, + { + "name": "/Items/Trinkets/Rings/JewelOfTheBeholden/Ring_JewelOfTheBeholden", + "notes": "Kill The One True King, then speak to Nimue" + }, + { + "name": "/Items/Trinkets/Rings/ElevatedRing/Ring_ElevatedRing", + "notes": "Forlorn Coast- Mournful Promenade, Use the Elevator at top to get there." + }, + { + "name": "/Items/Gems/Ranged/Dreadful/MetaGem_Dreadful", + "notes": "Dropped by Dire Fiend" + }, + { + "name": "/Items/Gems/Ranged/Maelstrom/MetaGem_Maelstrom" + }, + { + "name": "/Items/Gems/Melee/Executor/MetaGem_Executor" + } + ] + }, "Story": { "AshenWasteland": [ { @@ -1583,6 +1901,9 @@ { "name": "/Items/Weapons/Melee/Standard/Sword/Sword/Weapon_Sword" }, + { + "name": "/Items/Weapons/Melee/Scythe/Scythe/Weapon_Scythe" + }, { "name": "/Items/Weapons/Melee/Standard/Claws/RustedClaws/Weapon_Claws" }, @@ -1648,12 +1969,12 @@ "notes": "Purchased from Reggie at Ward 13 after defeating all bosses at least once." }, { - "name": "/Items/Trinkets/Rings/BrightSteelRing/Ring_BrightSteelRing", - "notes": "Purchased from Reggie at Ward 13 after completing 15 biomes on any difficulty." + "name": "/Items/Trinkets/Rings/BrightSteelRing/Ring_BrightSteelRing", + "notes": "Purchased from Reggie at Ward 13 after completing 15 biomes on any difficulty." }, { - "name": "/Items/Trinkets/Rings/DevouringLoop/Ring_DevouringLoop", - "notes": "Purchased from Reggie at Ward 13 after completing the campaign on Apocalypse difficulty." + "name": "/Items/Trinkets/Rings/DevouringLoop/Ring_DevouringLoop", + "notes": "Purchased from Reggie at Ward 13 after completing the campaign on Apocalypse difficulty." } ], "Cass": [ @@ -1845,6 +2166,12 @@ { "name": "/Items/Gems/Melee/MetaGems/WeaponLord/MetaGem_WeaponLord" }, + { + "name": "/Items/Gems/Melee/MetaGems/TaintedBlade/MetaGem_TaintedBlade" + }, + { + "name": "/Items/Gems/Melee/MetaGems/FetidWounds/MetaGem_FetidWounds" + }, { "name": "/Items/Weapons/Longguns/Special/CorruptedAphelion/Weapon_CorruptedAphelion" }, @@ -1934,6 +2261,10 @@ { "name": "/Items/Armor/Archetype/Explorer/Armor_Legs_Explorer" }, + { + "name": "/Items/Traits/Affliction/Trait_Affliction", + "notes": "Unlocked automatically for all archetypes after leveling up the Ritualist archetype to 10." + }, { "name": "/Items/Traits/Archetype/AmmoReserves/Trait_AmmoReserves", "notes": "Unlocked automatically for all archetypes after leveling up the Gunslinger archetype to 10." @@ -2056,6 +2387,10 @@ "name": "/Items/Weapons/Melee/Special/WorldsEdge/Weapon_WorldsEdge", "notes": "Purchased from Brabus at Ward 13 after completing the campaign on Apocalypse difficulty." }, + { + "name": "/Items/Trinkets/Amulets/ParticipationMedal/Amulet_ParticipationMedal", + "notes": "Die to a boss 10 times on Apocalypse difficulty." + }, { "name": "/Items/Gems/Ranged/MetaGems/BottomFeeder/MetaGem_BottomFeeder", "notes": "Random drop by aberrations" diff --git a/RemnantSaveGuardian/locales/GameStrings.Designer.cs b/RemnantSaveGuardian/locales/GameStrings.Designer.cs index 2ee9b25..b6321f2 100644 --- a/RemnantSaveGuardian/locales/GameStrings.Designer.cs +++ b/RemnantSaveGuardian/locales/GameStrings.Designer.cs @@ -150,6 +150,24 @@ public static string Amulet_AnkhOfPower { } } + /// + /// Looks up a localized string similar to Birthright Of The Lost. + /// + public static string Amulet_BirthrightOfTheLost { + get { + return ResourceManager.GetString("Amulet_BirthrightOfTheLost", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Brewmasters Cork. + /// + public static string Amulet_BrewmastersCork { + get { + return ResourceManager.GetString("Amulet_BrewmastersCork", resourceCulture); + } + } + /// /// Looks up a localized string similar to Broken Pocket Watch. /// @@ -195,6 +213,15 @@ public static string Amulet_CoreBooster { } } + /// + /// Looks up a localized string similar to Cost Of Betrayal. + /// + public static string Amulet_CostOfBetrayal { + get { + return ResourceManager.GetString("Amulet_CostOfBetrayal", resourceCulture); + } + } + /// /// Looks up a localized string similar to Daredevil's Charm. /// @@ -213,6 +240,15 @@ public static string Amulet_DeathsEmbrace { } } + /// + /// Looks up a localized string similar to Death-Soaked Idol. + /// + public static string Amulet_DeathSoakedIdol { + get { + return ResourceManager.GetString("Amulet_DeathSoakedIdol", resourceCulture); + } + } + /// /// Looks up a localized string similar to Decayed Margin. /// @@ -312,6 +348,33 @@ public static string Amulet_FullMoonCirclet { } } + /// + /// Looks up a localized string similar to Gift Of Euphoria. + /// + public static string Amulet_GiftOfEuphoria { + get { + return ResourceManager.GetString("Amulet_GiftOfEuphoria", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Gift Of Melancholy. + /// + public static string Amulet_GiftOfMelancholy { + get { + return ResourceManager.GetString("Amulet_GiftOfMelancholy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Gift Of The Unbound. + /// + public static string Amulet_GiftOfTheUnbound { + get { + return ResourceManager.GetString("Amulet_GiftOfTheUnbound", resourceCulture); + } + } + /// /// Looks up a localized string similar to Golden Ribbon. /// @@ -357,6 +420,15 @@ public static string Amulet_Hyperconductor { } } + /// + /// Looks up a localized string similar to Index Of The Scribe. + /// + public static string Amulet_IndexOfTheScribe { + get { + return ResourceManager.GetString("Amulet_IndexOfTheScribe", resourceCulture); + } + } + /// /// Looks up a localized string similar to Indignant Fetish. /// @@ -429,6 +501,15 @@ public static string Amulet_LaemirCenser { } } + /// + /// Looks up a localized string similar to Legacy Protocol. + /// + public static string Amulet_LegacyProtocol { + get { + return ResourceManager.GetString("Amulet_LegacyProtocol", resourceCulture); + } + } + /// /// Looks up a localized string similar to Leto's Amulet. /// @@ -537,6 +618,15 @@ public static string Amulet_OnyxPendulum { } } + /// + /// Looks up a localized string similar to Participation Medal. + /// + public static string Amulet_ParticipationMedal { + get { + return ResourceManager.GetString("Amulet_ParticipationMedal", resourceCulture); + } + } + /// /// Looks up a localized string similar to Range Finder. /// @@ -618,6 +708,15 @@ public static string Amulet_SilverRibbon { } } + /// + /// Looks up a localized string similar to Sinister Totem. + /// + public static string Amulet_SinisterTotem { + get { + return ResourceManager.GetString("Amulet_SinisterTotem", resourceCulture); + } + } + /// /// Looks up a localized string similar to Soul Anchor. /// @@ -699,6 +798,15 @@ public static string Amulet_WeightlessWeight { } } + /// + /// Looks up a localized string similar to Whispering Marble. + /// + public static string Amulet_WhisperingMarble { + get { + return ResourceManager.GetString("Amulet_WhisperingMarble", resourceCulture); + } + } + /// /// Looks up a localized string similar to Amulets. /// @@ -780,6 +888,15 @@ public static string Armor_Challenger { } } + /// + /// Looks up a localized string similar to Crimson Guard. + /// + public static string Armor_CrimsonGuard { + get { + return ResourceManager.GetString("Armor_CrimsonGuard", resourceCulture); + } + } + /// /// Looks up a localized string similar to Engineer. /// @@ -924,6 +1041,15 @@ public static string Armor_RedPrince { } } + /// + /// Looks up a localized string similar to Crimson Guard. + /// + public static string Armor_RedPrinceArmor { + get { + return ResourceManager.GetString("Armor_RedPrinceArmor", resourceCulture); + } + } + /// /// Looks up a localized string similar to Red Widow. /// @@ -933,6 +1059,15 @@ public static string Armor_RedWidow { } } + /// + /// Looks up a localized string similar to Zealot. + /// + public static string Armor_Ritualist { + get { + return ResourceManager.GetString("Armor_Ritualist", resourceCulture); + } + } + /// /// Looks up a localized string similar to Space Worker. /// @@ -1095,6 +1230,24 @@ public static string BrokenTomb { } } + /// + /// Looks up a localized string similar to Ethereal Manor. + /// + public static string BurningCity { + get { + return ResourceManager.GetString("BurningCity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ethereal Manor. + /// + public static string BurningCity_DLC { + get { + return ResourceManager.GetString("BurningCity_DLC", resourceCulture); + } + } + /// /// Looks up a localized string similar to Butcher's Quarter. /// @@ -1410,6 +1563,15 @@ public static string ForgottenPrison { } } + /// + /// Looks up a localized string similar to The Maze. + /// + public static string GardenMaze { + get { + return ResourceManager.GetString("GardenMaze", resourceCulture); + } + } + /// /// Looks up a localized string similar to Mutators. /// @@ -1446,6 +1608,15 @@ public static string Gunslinger { } } + /// + /// Looks up a localized string similar to Mirror Floor. + /// + public static string Halls_DLC { + get { + return ResourceManager.GetString("Halls_DLC", resourceCulture); + } + } + /// /// Looks up a localized string similar to Handler. /// @@ -1500,6 +1671,15 @@ public static string Hunter { } } + /// + /// Looks up a localized string similar to Bruin, Blade of The King. + /// + public static string Impaler { + get { + return ResourceManager.GetString("Impaler", resourceCulture); + } + } + /// /// Looks up a localized string similar to Imperial Gardens. /// @@ -1635,6 +1815,15 @@ public static string Item_HiddenContainer_Material_Engram_Summoner { } } + /// + /// Looks up a localized string similar to Ritualist. + /// + public static string Item_Material_Engram_Ritualist { + get { + return ResourceManager.GetString("Item_Material_Engram_Ritualist", resourceCulture); + } + } + /// /// Looks up a localized string similar to Kaeula's Rest. /// @@ -1671,6 +1860,15 @@ public static string LemarkDistrict { } } + /// + /// Looks up a localized string similar to . + /// + public static string Leywise { + get { + return ResourceManager.GetString("Leywise", resourceCulture); + } + } + /// /// Looks up a localized string similar to Atrophy. /// @@ -1680,6 +1878,15 @@ public static string Library { } } + /// + /// Looks up a localized string similar to Derelict Lighthouse. + /// + public static string Lighthouse { + get { + return ResourceManager.GetString("Lighthouse", resourceCulture); + } + } + /// /// Looks up a localized string similar to Weeping Angels. /// @@ -1833,6 +2040,15 @@ public static string MetaGem_Disengage { } } + /// + /// Looks up a localized string similar to Dreadful. + /// + public static string MetaGem_Dreadful { + get { + return ResourceManager.GetString("MetaGem_Dreadful", resourceCulture); + } + } + /// /// Looks up a localized string similar to Edgelord. /// @@ -1842,6 +2058,15 @@ public static string MetaGem_Edgelord { } } + /// + /// Looks up a localized string similar to Executor. + /// + public static string MetaGem_Executor { + get { + return ResourceManager.GetString("MetaGem_Executor", resourceCulture); + } + } + /// /// Looks up a localized string similar to Extender. /// @@ -1869,6 +2094,15 @@ public static string MetaGem_Feedback { } } + /// + /// Looks up a localized string similar to Fetid Wounds. + /// + public static string MetaGem_FetidWounds { + get { + return ResourceManager.GetString("MetaGem_FetidWounds", resourceCulture); + } + } + /// /// Looks up a localized string similar to Ghost Shell. /// @@ -1878,6 +2112,15 @@ public static string MetaGem_GhostShell { } } + /// + /// Looks up a localized string similar to Guts. + /// + public static string MetaGem_Guts { + get { + return ResourceManager.GetString("MetaGem_Guts", resourceCulture); + } + } + /// /// Looks up a localized string similar to Harmonizer. /// @@ -1923,6 +2166,15 @@ public static string MetaGem_Lithely { } } + /// + /// Looks up a localized string similar to Maelstrom. + /// + public static string MetaGem_Maelstrom { + get { + return ResourceManager.GetString("MetaGem_Maelstrom", resourceCulture); + } + } + /// /// Looks up a localized string similar to Misfortune. /// @@ -1959,6 +2211,15 @@ public static string MetaGem_Overdrive { } } + /// + /// Looks up a localized string similar to Prophecy. + /// + public static string MetaGem_Prophecy { + get { + return ResourceManager.GetString("MetaGem_Prophecy", resourceCulture); + } + } + /// /// Looks up a localized string similar to Refunder. /// @@ -2022,6 +2283,15 @@ public static string MetaGem_Slayer { } } + /// + /// Looks up a localized string similar to Sleeper. + /// + public static string MetaGem_Sleeper { + get { + return ResourceManager.GetString("MetaGem_Sleeper", resourceCulture); + } + } + /// /// Looks up a localized string similar to Spirit Healer. /// @@ -2067,6 +2337,15 @@ public static string MetaGem_Supercharger { } } + /// + /// Looks up a localized string similar to Tainted Blade. + /// + public static string MetaGem_TaintedBlade { + get { + return ResourceManager.GetString("MetaGem_TaintedBlade", resourceCulture); + } + } + /// /// Looks up a localized string similar to Timewave. /// @@ -2184,6 +2463,15 @@ public static string Mod_CorrosiveRounds { } } + /// + /// Looks up a localized string similar to Creeping Mist. + /// + public static string Mod_CreepingMist { + get { + return ResourceManager.GetString("Mod_CreepingMist", resourceCulture); + } + } + /// /// Looks up a localized string similar to Defrag. /// @@ -2256,6 +2544,15 @@ public static string Mod_Hotshot { } } + /// + /// Looks up a localized string similar to Knight Guard. + /// + public static string Mod_KnightGuard { + get { + return ResourceManager.GetString("Mod_KnightGuard", resourceCulture); + } + } + /// /// Looks up a localized string similar to Overflow. /// @@ -2274,6 +2571,15 @@ public static string Mod_PrismaticDriver { } } + /// + /// Looks up a localized string similar to . + /// + public static string Mod_RingOfSpears { + get { + return ResourceManager.GetString("Mod_RingOfSpears", resourceCulture); + } + } + /// /// Looks up a localized string similar to Rootlash. /// @@ -2454,6 +2760,15 @@ public static string Oink { } } + /// + /// Looks up a localized string similar to The One True King. + /// + public static string OneTrueKingStory { + get { + return ResourceManager.GetString("OneTrueKingStory", resourceCulture); + } + } + /// /// Looks up a localized string similar to Oracle's Refuge. /// @@ -2508,6 +2823,15 @@ public static string Quest_Global_TheHunterDream_Template01 { } } + /// + /// Looks up a localized string similar to Enter the Dream. + /// + public static string Quest_Item_DLC_DreamLevel { + get { + return ResourceManager.GetString("Quest_Item_DLC_DreamLevel", resourceCulture); + } + } + /// /// Looks up a localized string similar to Memory Core II. /// @@ -2553,6 +2877,15 @@ public static string Quest_Story_Empress_Zone01_Template01 { } } + /// + /// Looks up a localized string similar to Losomn: Forlorn Coast. + /// + public static string Quest_Story_OTK { + get { + return ResourceManager.GetString("Quest_Story_OTK", resourceCulture); + } + } + /// /// Looks up a localized string similar to Quests. /// @@ -2625,6 +2958,15 @@ public static string Relic_Consumable_BloomingHeart { } } + /// + /// Looks up a localized string similar to Broken Heart. + /// + public static string Relic_Consumable_BrokenHeart { + get { + return ResourceManager.GetString("Relic_Consumable_BrokenHeart", resourceCulture); + } + } + /// /// Looks up a localized string similar to Constrained Heart. /// @@ -2679,6 +3021,15 @@ public static string Relic_Consumable_LifelessHeart { } } + /// + /// Looks up a localized string similar to Paper Heart. + /// + public static string Relic_Consumable_PaperHeart { + get { + return ResourceManager.GetString("Relic_Consumable_PaperHeart", resourceCulture); + } + } + /// /// Looks up a localized string similar to Pulsing Heart. /// @@ -2877,6 +3228,15 @@ public static string Ring_AssassinsSeal { } } + /// + /// Looks up a localized string similar to Atonement Fold. + /// + public static string Ring_AtonementFold { + get { + return ResourceManager.GetString("Ring_AtonementFold", resourceCulture); + } + } + /// /// Looks up a localized string similar to Band Band. /// @@ -2895,6 +3255,15 @@ public static string Ring_BandOfAccord { } } + /// + /// Looks up a localized string similar to Band Of The Fanatic. + /// + public static string Ring_BandOfTheFanatic { + get { + return ResourceManager.GetString("Ring_BandOfTheFanatic", resourceCulture); + } + } + /// /// Looks up a localized string similar to Berserker's Crest. /// @@ -2913,6 +3282,15 @@ public static string Ring_BisectedRing { } } + /// + /// Looks up a localized string similar to Bitter Memento. + /// + public static string Ring_BitterMemento { + get { + return ResourceManager.GetString("Ring_BitterMemento", resourceCulture); + } + } + /// /// Looks up a localized string similar to Black Cat Band. /// @@ -3003,6 +3381,24 @@ public static string Ring_BraidedThorns { } } + /// + /// Looks up a localized string similar to Brawler's Pride. + /// + public static string Ring_BrawlersPride { + get { + return ResourceManager.GetString("Ring_BrawlersPride", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bridge Wardens Crest. + /// + public static string Ring_BridgeWardensCrest { + get { + return ResourceManager.GetString("Ring_BridgeWardensCrest", resourceCulture); + } + } + /// /// Looks up a localized string similar to Bright Steel Ring. /// @@ -3021,6 +3417,15 @@ public static string Ring_BurdenOfTheAudacious { } } + /// + /// Looks up a localized string similar to Burden of the Departed. + /// + public static string Ring_BurdenOfTheDeparted { + get { + return ResourceManager.GetString("Ring_BurdenOfTheDeparted", resourceCulture); + } + } + /// /// Looks up a localized string similar to Burden of the Destroyer. /// @@ -3075,6 +3480,15 @@ public static string Ring_BurdenOfTheRebel { } } + /// + /// Looks up a localized string similar to Burden Of The Sciolist. + /// + public static string Ring_BurdenOfTheSciolist { + get { + return ResourceManager.GetString("Ring_BurdenOfTheSciolist", resourceCulture); + } + } + /// /// Looks up a localized string similar to Burden of the Stargazer. /// @@ -3147,6 +3561,15 @@ public static string Ring_ConstantVariableRing { } } + /// + /// Looks up a localized string similar to Crimson Dreamstone. + /// + public static string Ring_CrimsonDreamstone { + get { + return ResourceManager.GetString("Ring_CrimsonDreamstone", resourceCulture); + } + } + /// /// Looks up a localized string similar to Dead King's Memento. /// @@ -3201,6 +3624,15 @@ public static string Ring_DevouringLoop { } } + /// + /// Looks up a localized string similar to Digested Hog Lure. + /// + public static string Ring_DigestedHogLure { + get { + return ResourceManager.GetString("Ring_DigestedHogLure", resourceCulture); + } + } + /// /// Looks up a localized string similar to Embrace of Sha'Hala. /// @@ -3246,6 +3678,15 @@ public static string Ring_DreadFont { } } + /// + /// Looks up a localized string similar to Dried Clay Ring. + /// + public static string Ring_DriedClayRing { + get { + return ResourceManager.GetString("Ring_DriedClayRing", resourceCulture); + } + } + /// /// Looks up a localized string similar to Drzyr Sniper Sigil. /// @@ -3264,6 +3705,15 @@ public static string Ring_DyingEmber { } } + /// + /// Looks up a localized string similar to Elevated Ring. + /// + public static string Ring_ElevatedRing { + get { + return ResourceManager.GetString("Ring_ElevatedRing", resourceCulture); + } + } + /// /// Looks up a localized string similar to Encrypted Loop. /// @@ -3507,6 +3957,15 @@ public static string Ring_HexWard { } } + /// + /// Looks up a localized string similar to Jewel Of The Beholden. + /// + public static string Ring_JewelOfTheBeholden { + get { + return ResourceManager.GetString("Ring_JewelOfTheBeholden", resourceCulture); + } + } + /// /// Looks up a localized string similar to Kinetic Cycle Stone. /// @@ -3516,6 +3975,15 @@ public static string Ring_KineticCycleStone { } } + /// + /// Looks up a localized string similar to Lighthouse Keeper's Ring. + /// + public static string Ring_LighthouseKeepersRing { + get { + return ResourceManager.GetString("Ring_LighthouseKeepersRing", resourceCulture); + } + } + /// /// Looks up a localized string similar to Lithic Signet. /// @@ -3597,6 +4065,15 @@ public static string Ring_MomentumDriver { } } + /// + /// Looks up a localized string similar to Offering Stone. + /// + public static string Ring_OfferingStone { + get { + return ResourceManager.GetString("Ring_OfferingStone", resourceCulture); + } + } + /// /// Looks up a localized string similar to Outcast Ring. /// @@ -3606,6 +4083,15 @@ public static string Ring_OutcastRing { } } + /// + /// Looks up a localized string similar to Painless Obsidian. + /// + public static string Ring_PainlessObsidian { + get { + return ResourceManager.GetString("Ring_PainlessObsidian", resourceCulture); + } + } + /// /// Looks up a localized string similar to Ahanae Crystal. /// @@ -3624,6 +4110,15 @@ public static string Ring_PointFocusRing { } } + /// + /// Looks up a localized string similar to Power Complex. + /// + public static string Ring_PowerComplex { + get { + return ResourceManager.GetString("Ring_PowerComplex", resourceCulture); + } + } + /// /// Looks up a localized string similar to Power Saver. /// @@ -3669,6 +4164,15 @@ public static string Ring_ReapingStone { } } + /// + /// Looks up a localized string similar to Red Ring Of Death. + /// + public static string Ring_RedRingOfDeath { + get { + return ResourceManager.GetString("Ring_RedRingOfDeath", resourceCulture); + } + } + /// /// Looks up a localized string similar to Rerouting Cable. /// @@ -3741,6 +4245,15 @@ public static string Ring_RingOfGrace { } } + /// + /// Looks up a localized string similar to Ring Of Infinite Damage. + /// + public static string Ring_RingOfInfiniteDamage { + get { + return ResourceManager.GetString("Ring_RingOfInfiniteDamage", resourceCulture); + } + } + /// /// Looks up a localized string similar to Ring of Omens. /// @@ -3777,6 +4290,15 @@ public static string Ring_RingOfTheAdmiral { } } + /// + /// Looks up a localized string similar to Ring Of The Castaway. + /// + public static string Ring_RingOfTheCastaway { + get { + return ResourceManager.GetString("Ring_RingOfTheCastaway", resourceCulture); + } + } + /// /// Looks up a localized string similar to Ring of the Forest Spirit. /// @@ -3795,6 +4317,15 @@ public static string Ring_RingOfTheRobust { } } + /// + /// Looks up a localized string similar to Ring Of The Vain. + /// + public static string Ring_RingOfTheVain { + get { + return ResourceManager.GetString("Ring_RingOfTheVain", resourceCulture); + } + } + /// /// Looks up a localized string similar to Rock of Anguish. /// @@ -3840,6 +4371,15 @@ public static string Ring_SealOfTheEmpress { } } + /// + /// Looks up a localized string similar to Shadow Of Misery. + /// + public static string Ring_ShadowOfMisery { + get { + return ResourceManager.GetString("Ring_ShadowOfMisery", resourceCulture); + } + } + /// /// Looks up a localized string similar to Shaed Bloom Crystal. /// @@ -3849,6 +4389,15 @@ public static string Ring_ShaedBloomCrystal { } } + /// + /// Looks up a localized string similar to Shaed Stone. + /// + public static string Ring_ShaedStone { + get { + return ResourceManager.GetString("Ring_ShaedStone", resourceCulture); + } + } + /// /// Looks up a localized string similar to Shard Banded Ring. /// @@ -3894,6 +4443,15 @@ public static string Ring_SoulLink { } } + /// + /// Looks up a localized string similar to Soul Shard. + /// + public static string Ring_SoulShard { + get { + return ResourceManager.GetString("Ring_SoulShard", resourceCulture); + } + } + /// /// Looks up a localized string similar to Spirit Stone. /// @@ -4074,6 +4632,15 @@ public static string Ring_WaxSealedRing { } } + /// + /// Looks up a localized string similar to White Glass Bead. + /// + public static string Ring_WhiteGlassBead { + get { + return ResourceManager.GetString("Ring_WhiteGlassBead", resourceCulture); + } + } + /// /// Looks up a localized string similar to White Pawn Stamp. /// @@ -4092,6 +4659,15 @@ public static string Ring_WindHollowCirclet { } } + /// + /// Looks up a localized string similar to Wood Ring. + /// + public static string Ring_WoodRing { + get { + return ResourceManager.GetString("Ring_WoodRing", resourceCulture); + } + } + /// /// Looks up a localized string similar to Zania's Malice. /// @@ -4128,6 +4704,15 @@ public static string RisingTides { } } + /// + /// Looks up a localized string similar to Ritualist. + /// + public static string Ritualist { + get { + return ResourceManager.GetString("Ritualist", resourceCulture); + } + } + /// /// Looks up a localized string similar to Root. /// @@ -4191,6 +4776,15 @@ public static string Sarcophagus { } } + /// + /// Looks up a localized string similar to Sentinel's Keep. + /// + public static string SentinelsKeep { + get { + return ResourceManager.GetString("SentinelsKeep", resourceCulture); + } + } + /// /// Looks up a localized string similar to The Flooded Room. /// @@ -4200,6 +4794,33 @@ public static string SewageFacility { } } + /// + /// Looks up a localized string similar to . + /// + public static string Sewer { + get { + return ResourceManager.GetString("Sewer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sewer Hole. + /// + public static string Sewer_DLC { + get { + return ResourceManager.GetString("Sewer_DLC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Befouled Altar. + /// + public static string SewerChamber { + get { + return ResourceManager.GetString("SewerChamber", resourceCulture); + } + } + /// /// Looks up a localized string similar to Shattered Gallery. /// @@ -4291,20 +4912,20 @@ public static string TerminusStation { } /// - /// Looks up a localized string similar to TheTwistedChantry. + /// Looks up a localized string similar to Astropath's Respite. /// - public static string The_Twisted_Chantry { + public static string TheAstroPathsRespite { get { - return ResourceManager.GetString("The Twisted Chantry", resourceCulture); + return ResourceManager.GetString("TheAstroPathsRespite", resourceCulture); } } /// - /// Looks up a localized string similar to Astropath's Respite. + /// Looks up a localized string similar to The Chimney. /// - public static string TheAstroPathsRespite { + public static string TheChimney { get { - return ResourceManager.GetString("TheAstroPathsRespite", resourceCulture); + return ResourceManager.GetString("TheChimney", resourceCulture); } } @@ -4569,6 +5190,15 @@ public static string Train { } } + /// + /// Looks up a localized string similar to Affliction. + /// + public static string Trait_Affliction { + get { + return ResourceManager.GetString("Trait_Affliction", resourceCulture); + } + } + /// /// Looks up a localized string similar to Ammo Reserves. /// @@ -4623,6 +5253,15 @@ public static string Trait_Bloodstream { } } + /// + /// Looks up a localized string similar to Dark Pact. + /// + public static string Trait_DarkPact { + get { + return ResourceManager.GetString("Trait_DarkPact", resourceCulture); + } + } + /// /// Looks up a localized string similar to Endurance. /// @@ -4920,6 +5559,24 @@ public static string Ward13 { } } + /// + /// Looks up a localized string similar to Abyssal Hook. + /// + public static string Weapon_AbyssalHook { + get { + return ResourceManager.GetString("Weapon_AbyssalHook", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Anguish. + /// + public static string Weapon_Anguish { + get { + return ResourceManager.GetString("Weapon_Anguish", resourceCulture); + } + } + /// /// Looks up a localized string similar to Aphelion. /// @@ -5343,6 +6000,15 @@ public static string Weapon_Meridian { } } + /// + /// Looks up a localized string similar to Monarch. + /// + public static string Weapon_Monarch { + get { + return ResourceManager.GetString("Weapon_Monarch", resourceCulture); + } + } + /// /// Looks up a localized string similar to Nebula. /// @@ -5460,6 +6126,15 @@ public static string Weapon_Revolver { } } + /// + /// Looks up a localized string similar to Ritualist Scythe. + /// + public static string Weapon_RitualistScythe { + get { + return ResourceManager.GetString("Weapon_RitualistScythe", resourceCulture); + } + } + /// /// Looks up a localized string similar to Royal Broadsword. /// @@ -5505,6 +6180,15 @@ public static string Weapon_Savior { } } + /// + /// Looks up a localized string similar to Steel Scythe. + /// + public static string Weapon_Scythe { + get { + return ResourceManager.GetString("Weapon_Scythe", resourceCulture); + } + } + /// /// Looks up a localized string similar to Service Pistol. /// @@ -5568,6 +6252,15 @@ public static string Weapon_Sorrow { } } + /// + /// Looks up a localized string similar to . + /// + public static string Weapon_Sparkfire { + get { + return ResourceManager.GetString("Weapon_Sparkfire", resourceCulture); + } + } + /// /// Looks up a localized string similar to Steel Spear. /// @@ -5685,6 +6378,15 @@ public static string Weapon_WorldsEdge { } } + /// + /// Looks up a localized string similar to Wrathbringer. + /// + public static string Weapon_Wrathbringer { + get { + return ResourceManager.GetString("Weapon_Wrathbringer", resourceCulture); + } + } + /// /// Looks up a localized string similar to Weapons. /// @@ -5712,6 +6414,24 @@ public static string WindHollow { } } + /// + /// Looks up a localized string similar to Sunken Witch. + /// + public static string Witch { + get { + return ResourceManager.GetString("Witch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (DLC1). + /// + public static string World_DLC1 { + get { + return ResourceManager.GetString("World_DLC1", resourceCulture); + } + } + /// /// Looks up a localized string similar to Earth. /// diff --git a/RemnantSaveGuardian/locales/GameStrings.resx b/RemnantSaveGuardian/locales/GameStrings.resx index d1d11ee..11698a8 100644 --- a/RemnantSaveGuardian/locales/GameStrings.resx +++ b/RemnantSaveGuardian/locales/GameStrings.resx @@ -1419,9 +1419,6 @@ Terminus Station - - TheTwistedChantry - Astropath's Respite @@ -1971,6 +1968,246 @@ Severed Hand + + Affliction + + + Ritualist + + + Abyssal Hook + + + Anguish + + + Monarch + + + Ritualist Scythe + + + + + + Steel Scythe + + + Birthright Of The Lost + + + Brewmasters Cork + + + Cost Of Betrayal + + + Death-Soaked Idol + + + Gift Of Euphoria + + + Gift Of Melancholy + + + Gift Of The Unbound + + + Index Of The Scribe + + + Legacy Protocol + + + Participation Medal + + + Sinister Totem + + + Whispering Marble + + + Crimson Guard + + + Zealot + + + Bruin, Blade of The King + + + The Maze + + + Ethereal Manor + + + Mirror Floor + + + Ethereal Manor + + + Derelict Lighthouse + + + The One True King + + + Enter the Dream + + + Losomn: Forlorn Coast + + + Broken Heart + + + Paper Heart + + + Ritualist + + + Befouled Altar + + + Sentinel's Keep + + + The Chimney + + + Sewer Hole + + + + + + Sunken Witch + + + (DLC1) + + + Crimson Guard + + + Wrathbringer + + + Creeping Mist + + + Knight Guard + + + + + + Dreadful + + + Executor + + + Fetid Wounds + + + Guts + + + Maelstrom + + + Prophecy + + + Sleeper + + + Tainted Blade + + + Atonement Fold + + + Band Of The Fanatic + + + Bitter Memento + + + Bridge Wardens Crest + + + Brawler's Pride + + + Burden of the Departed + + + Burden Of The Sciolist + + + Crimson Dreamstone + + + Digested Hog Lure + + + Dried Clay Ring + + + Elevated Ring + + + Jewel Of The Beholden + + + Lighthouse Keeper's Ring + + + Offering Stone + + + Painless Obsidian + + + Power Complex + + + Ring Of Infinite Damage + + + Ring Of The Castaway + + + Ring Of The Vain + + + Shadow Of Misery + + + Shaed Stone + + + Soul Shard + + + Wood Ring + + + Red Ring Of Death + + + White Glass Bead + + + + Bottom Feeder @@ -2022,4 +2259,7 @@ Corrupted Rune Pistol + + Dark Pact + \ No newline at end of file