├── .gitignore ├── icon.ico ├── icon.xcf ├── README.md ├── DLCMaps.tsv ├── App.config ├── DLCBosses.tsv ├── Properties ├── Settings.settings ├── Settings.Designer.cs ├── AssemblyInfo.cs ├── Resources.Designer.cs └── Resources.resx ├── App.xaml.cs ├── infusions.csv ├── BaseBosses.tsv ├── Util ├── CodeCaveOffsets.cs ├── AsmLoader.cs ├── HookManager.cs └── AsmHelper.cs ├── App.xaml ├── Selection.xaml ├── BaseMaps.tsv ├── EldenRingTool.sln ├── Selection.xaml.cs ├── SaveProfileDialog.xaml ├── StatsEditor.xaml ├── ItemSpawn.xaml ├── SaveProfileDialog.xaml.cs ├── grace_profiles.txt ├── HotkeySetupWindow.xaml ├── ashes.csv ├── StatsEditor.xaml.cs ├── ItemSpawn.xaml.cs ├── UnlockGraces.xaml ├── GoodsEvents.tsv ├── MutliSpawn.xaml ├── DLCGraces.tsv ├── EldenRingTool.csproj ├── WorldMapLegacyConvParamTrim.csv ├── Utils.cs ├── UnlockGraces.xaml.cs ├── HotkeySetupWindow.xaml.cs ├── MutliSpawn.xaml.cs ├── BaseGraces.tsv └── MainWindow.xaml /.gitignore: -------------------------------------------------------------------------------- 1 | /obj 2 | /.vs 3 | /bin 4 | -------------------------------------------------------------------------------- /icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kh0nsu/EldenRingTool/HEAD/icon.ico -------------------------------------------------------------------------------- /icon.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kh0nsu/EldenRingTool/HEAD/icon.xcf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EldenRingTool (aka ERTool) 2 | 3 | See https://ds3tool.s3.ap-southeast-2.amazonaws.com/tools.html for more details. 4 | -------------------------------------------------------------------------------- /DLCMaps.tsv: -------------------------------------------------------------------------------- 1 | ID Name 2 | 62080 Map: Gravesite Plain 3 | 62081 Map: Scadu Altus 4 | 62082 Map: Southern Shore 5 | 62083 Map: Rauh Ruins 6 | 62084 Map: Abyss 7 | 82002 Show DLC Map 8 | -------------------------------------------------------------------------------- /App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /DLCBosses.tsv: -------------------------------------------------------------------------------- 1 | ID Name 2 | 20000800 Dancing Lion 3 | 20010800 Radahn 4 | 21000850 Golden Hippo 5 | 21010800 Messmer 6 | 28000800 Midra 7 | 2044450800 Romina 8 | 2048440800 Rellana 9 | 2049480800 Gaius 10 | 2054390800 Bayle 11 | -------------------------------------------------------------------------------- /Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | namespace EldenRingTool 4 | { 5 | /// 6 | /// Interaction logic for App.xaml 7 | /// 8 | public partial class App : Application 9 | { 10 | 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /infusions.csv: -------------------------------------------------------------------------------- 1 | Name,ID,Type 2 | Standard,0,None 3 | Heavy,100,None 4 | Keen,200,None 5 | Quality,300,None 6 | Fire,400,None 7 | Flame Art,500,None 8 | Lightning,600,None 9 | Sacred,700,None 10 | Magic,800,None 11 | Cold,900,None 12 | Poison,1000,None 13 | Blood,1100,None 14 | Occult,1200,None 15 | -------------------------------------------------------------------------------- /BaseBosses.tsv: -------------------------------------------------------------------------------- 1 | ID Name 2 | 10000850 Margit 3 | 10000800 Godrick 4 | 14000800 Rennala (buggy) 5 | 1045520800 Draconic Tree Sentinel 6 | 11000850 Goldfrey (buggy) 7 | 11000800 Morgott (buggy) 8 | 1252520800 Fire Giant 9 | 13000800 Maliketh 10 | 11050850 Gideon 11 | 11050800 Godfrey / Hoarah Loux 12 | 19000800 Radagon / Elden Beast (buggy) 13 | -------------------------------------------------------------------------------- /Util/CodeCaveOffsets.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace EldenRingTool.Util 4 | { 5 | public static class CodeCaveOffsets 6 | { 7 | public static IntPtr Base; 8 | 9 | public enum ReducedTargetView 10 | { 11 | MaxDist = 0x0, 12 | Code = 0x10 13 | } 14 | 15 | public const int Rykard = 0x200; 16 | public const int InfinitePoise = 0x300; 17 | } 18 | } -------------------------------------------------------------------------------- /App.xaml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Selection.xaml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /BaseMaps.tsv: -------------------------------------------------------------------------------- 1 | ID Name 2 | 62004 Map: Center 3 | 62005 Map: SW 4 | 62006 Map: NW 5 | 62007 Map: SE 6 | 62008 Map: NE 7 | 62009 Map: N 8 | 62010 Map: Limgrave, West 9 | 62011 Map: Weeping Peninsula 10 | 62012 Map: Limgrave, East 11 | 62022 Map: Liurnia, West 12 | 62021 Map: Liurnia, North 13 | 62020 Map: Liurnia, East 14 | 62031 Map: Leyndell, Royal Capital 15 | 62030 Map: Altus Plateur 16 | 62032 Map: Mt. Gelmir 17 | 62041 Map: Dragonbarrow 18 | 62040 Map: Caelid 19 | 62052 Map: Mountaintops of the Giants, North 20 | 62051 Map: Mountaintops of the Giants, East 21 | 62050 Map: Mountaintops of the Giants, West 22 | 62063 Map: Siofra River 23 | 62062 Map: Mohgwyn Palace 24 | 62061 Map: Lake of Rot 25 | 62060 Map: Ainsel River 26 | 62064 Map: Deeprooth Depths 27 | 62103 Map: Stormfoot Catacombs 28 | 62102 Map: Fringefolk Hero's Cave 29 | 82001 Show underground 30 | -------------------------------------------------------------------------------- /EldenRingTool.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.32106.194 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EldenRingTool", "EldenRingTool.csproj", "{E9A1ED9A-498B-4F18-87B2-7E4CA61A2CCE}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {E9A1ED9A-498B-4F18-87B2-7E4CA61A2CCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {E9A1ED9A-498B-4F18-87B2-7E4CA61A2CCE}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {E9A1ED9A-498B-4F18-87B2-7E4CA61A2CCE}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {E9A1ED9A-498B-4F18-87B2-7E4CA61A2CCE}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {ED30E064-A2D1-410D-A709-7948F1B0AA0A} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | 12 | namespace EldenRingTool.Properties 13 | { 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 17 | { 18 | 19 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 20 | 21 | public static Settings Default 22 | { 23 | get 24 | { 25 | return defaultInstance; 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Util/AsmLoader.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Text.RegularExpressions; 4 | 5 | namespace EldenRingTool.Util 6 | { 7 | public static class AsmLoader 8 | { 9 | private const string BytePattern = @"^(?:[\da-f]{2} )*(?:[\da-f]{2}(?=\s|$))"; 10 | 11 | internal static byte[] GetAsmBytes(string resourceName) 12 | { 13 | string asmFile = GetResourceContent(resourceName); 14 | return ParseBytes(asmFile); 15 | } 16 | 17 | private static string GetResourceContent(string resourceName) 18 | { 19 | object resource = Properties.Resources.ResourceManager.GetObject(resourceName); 20 | return resource as string ?? 21 | throw new ArgumentException($"Resource '{resourceName}' not found or is not a string."); 22 | } 23 | 24 | private static byte[] ParseBytes(string asmFile) 25 | { 26 | return Regex.Matches(asmFile, BytePattern, RegexOptions.IgnoreCase | RegexOptions.Multiline) 27 | .Cast() 28 | .SelectMany(m => m.Value.Split(' ')) 29 | .Select(hex => Convert.ToByte(hex, 16)) 30 | .ToArray(); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /Selection.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Windows; 4 | 5 | namespace EldenRingTool 6 | { 7 | /// 8 | /// Interaction logic for Selection.xaml 9 | /// 10 | public partial class Selection : Window 11 | { 12 | Action _callback; 13 | public Selection(List items, Action callback, string name = null) 14 | { 15 | _callback = callback; 16 | InitializeComponent(); 17 | if (!string.IsNullOrWhiteSpace(name)) { Title = name; } 18 | listBox.ItemsSource = items; 19 | 20 | SetMaxHeight();//try and prevent OK button clipping off screeen 21 | DpiChanged += OnDpiChanged; 22 | } 23 | 24 | private void OnDpiChanged(object sender, DpiChangedEventArgs e) 25 | { 26 | SetMaxHeight(); 27 | } 28 | 29 | private void SetMaxHeight() 30 | { 31 | MaxHeight = SystemParameters.PrimaryScreenHeight * 0.9; 32 | } 33 | 34 | private void okClick(object sender, RoutedEventArgs e) 35 | { 36 | _callback(listBox.SelectedItem); 37 | Close(); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /SaveProfileDialog.xaml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 17 | 18 | 23 | 24 | 25 | 25 | 99 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /ItemSpawn.xaml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 0 31 | Normal 32 | Default 33 | 1 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /SaveProfileDialog.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Windows; 5 | 6 | namespace EldenRingTool 7 | { 8 | public partial class SaveProfileDialog : Window 9 | { 10 | public string SelectedProfileName { get; private set; } 11 | private readonly HashSet _existingProfiles; 12 | 13 | public SaveProfileDialog(IEnumerable existingProfiles, string windowName, string currentProfile = "") 14 | { 15 | this.Title = windowName; 16 | 17 | InitializeComponent(); 18 | _existingProfiles = new HashSet(existingProfiles); 19 | ProfileNameComboBox.ItemsSource = _existingProfiles.ToList(); 20 | 21 | if (string.Equals(currentProfile, UnlockGraces.EMPTY_PROFILE_NAME, StringComparison.OrdinalIgnoreCase)) 22 | ProfileNameComboBox.Text = string.Empty; 23 | else 24 | ProfileNameComboBox.Text = currentProfile; 25 | } 26 | 27 | private void Save_Click(object sender, RoutedEventArgs e) 28 | { 29 | string name = ProfileNameComboBox.Text.Trim(); 30 | 31 | if (string.IsNullOrWhiteSpace(name) || 32 | string.Equals(name, UnlockGraces.EMPTY_PROFILE_NAME, StringComparison.OrdinalIgnoreCase)) 33 | { 34 | string message = string.IsNullOrWhiteSpace(name) 35 | ? "Please enter a profile name." 36 | : $"'{UnlockGraces.EMPTY_PROFILE_NAME}' is reserved. Please choose a different name."; 37 | 38 | MessageBox.Show(message, "Invalid Name", MessageBoxButton.OK, MessageBoxImage.Warning); 39 | return; 40 | } 41 | 42 | if (_existingProfiles.Contains(name)) 43 | { 44 | var result = MessageBox.Show( 45 | $"A profile named '{name}' already exists. Do you want to overwrite it?", 46 | "Confirm Overwrite", 47 | MessageBoxButton.YesNo, 48 | MessageBoxImage.Question); 49 | 50 | if (result != MessageBoxResult.Yes) 51 | return; // stay in dialog 52 | } 53 | 54 | SelectedProfileName = name; 55 | DialogResult = true; 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /grace_profiles.txt: -------------------------------------------------------------------------------- 1 | All Base Game Graces:76101,76100,76111,76120,76103,76104,76105,76106,76108,76110,76113,76114,76116,76119,73002,73004,73103,73115,73100,73117,73201,71800,71801,76102,71002,71001,76118,76117,73011,73410,73412,76150,76151,76152,76153,76154,76155,76156,76162,76157,76158,76159,76160,76161,73001,73000,73101,73102,73200,71008,71003,71004,71005,71006,71007,71000,76200,76202,76201,76204,76217,76223,76222,76221,76244,76206,76203,76205,76225,76216,76224,76237,76234,76236,76219,76245,76226,76247,76218,76215,76220,76243,76242,76210,76233,76214,76231,76230,76212,76213,76232,76211,76241,76227,73106,76238,73005,73006,73105,73421,76228,76229,73202,73003,73104,73420,76235,73422,76208,76240,76207,76239,76209,73900,73901,73902,76252,76251,76250,71402,71401,71400,71403,76300,76303,76301,76306,76302,76304,76305,76307,76321,76320,76313,76308,73205,76322,73204,73118,73119,73008,73012,76350,76356,76351,73009,76352,76357,76353,73107,76354,76355,73109,73007,73013,73010,76314,73430,73432,76311,76310,76312,76309,73431,71606,71605,71604,71603,71600,71607,71601,71602,71103,71102,71101,71100,71109,71108,71107,71105,71104,73500,73502,73504,73503,73501,71125,71122,71120,71121,71123,71124,71900,76403,76405,76404,76415,76418,76402,76401,76414,76416,76400,76409,76411,73120,73015,76420,76410,73207,73121,76417,73014,73257,76419,73208,76422,73016,76406,76407,76412,76413,76454,73440,73441,73110,76452,76450,76456,76453,73460,76451,76455,73111,73451,73450,76500,76502,73020,76503,76522,76524,76523,76505,76504,76521,73122,76520,76501,76507,76509,76508,76510,76506,73018,73017,76653,73112,76550,73019,76551,76652,73211,71506,71505,71507,71508,71503,71502,71504,71500,71501,71310,71303,71304,71306,71302,71308,71309,71307,71301,71300,71305,71213,71212,71211,71240,71210,71214,71215,71219,71218,71216,71271,71224,71225,71220,71221,71226,71227,71222,71270,71223,71250,71252,71253,71251,71235,71233,71232,71230,71231,71234 2 | All DLC Graces:72000,72001,72002,72003,72010,72012,72013,72014,72015,72016,76944,76945,76943,76942,76941,76940,76913,76914,74001,74203,76912,74000,74200,74300,74301,74351,76804,76803,76800,76802,76805,76801,76812,76813,76811,76810,74100,76830,76821,76823,76822,76832,76833,76835,76831,76834,76841,74102,72200,72201,72202,72203,72204,76840,76850,76851,76852,76853,72500,74002,74101,76900,76907,76908,76909,76910,76902,76903,76916,74202,76911,76918,76917,76904,76906,76905,76861,76860,76862,76864,76863,72800,72801,72802,72803,72101,72102,72106,72107,72108,72109,72110,72111,72112,72113,72114,72116,72117,72120,76930,76931,76936,76937,76935,76960 3 | -------------------------------------------------------------------------------- /Util/HookManager.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | 5 | namespace EldenRingTool.Util 6 | { 7 | public class HookManager 8 | { 9 | private readonly ERProcess _erProcess; 10 | private readonly Dictionary _hookRegistry = new Dictionary(); 11 | 12 | private class HookData 13 | { 14 | public long OriginAddr { get; set; } 15 | public long CaveAddr { get; set; } 16 | public byte[] OriginalBytes { get; set; } 17 | } 18 | 19 | public HookManager(ERProcess erProcess) 20 | { 21 | _erProcess = erProcess; 22 | } 23 | 24 | 25 | public long InstallHook(long codeLoc, long origin, byte[] originalBytes) 26 | { 27 | byte[] hookBytes = GetHookBytes(originalBytes.Length, codeLoc, origin); 28 | _erProcess.WriteBytes((IntPtr)origin, hookBytes); 29 | _hookRegistry[codeLoc] = new HookData 30 | { 31 | CaveAddr = codeLoc, 32 | OriginAddr = origin, 33 | OriginalBytes = originalBytes 34 | }; 35 | return codeLoc; 36 | } 37 | 38 | private byte[] GetHookBytes(int originalBytesLength, long target, long origin) 39 | { 40 | byte[] hookBytes = new byte[originalBytesLength]; 41 | hookBytes[0] = 0xE9; 42 | 43 | int jumpOffset = (int)(target - (origin + 5)); 44 | byte[] offsetBytes = BitConverter.GetBytes(jumpOffset); 45 | Array.Copy(offsetBytes, 0, hookBytes, 1, 4); 46 | 47 | for (int i = 5; i < hookBytes.Length; i++) 48 | { 49 | hookBytes[i] = 0x90; 50 | } 51 | return hookBytes; 52 | } 53 | 54 | public void UninstallHook(long key) 55 | { 56 | if (!_hookRegistry.TryGetValue(key, out HookData hookToUninstall)) 57 | { 58 | return; 59 | } 60 | 61 | IntPtr originAddrPtr = (IntPtr)hookToUninstall.OriginAddr; 62 | _erProcess.WriteBytes(originAddrPtr, hookToUninstall.OriginalBytes); 63 | _hookRegistry.Remove(key); 64 | 65 | } 66 | 67 | public void ClearHooks() 68 | { 69 | _hookRegistry.Clear(); 70 | } 71 | 72 | public void UninstallAllHooks() 73 | { 74 | foreach (var key in _hookRegistry.Keys.ToList()) 75 | { 76 | UninstallHook(key); 77 | } 78 | } 79 | } 80 | } -------------------------------------------------------------------------------- /Util/AsmHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace EldenRingTool.Util 4 | { 5 | public static class AsmHelper 6 | { 7 | public static int GetRelOffset(IntPtr srcInstrAddr, IntPtr targetAddr, int instrLength = 0) 8 | => (int)(targetAddr.ToInt64() - (srcInstrAddr.ToInt64() + instrLength)); 9 | 10 | public static byte[] GetRelOffsetBytes(IntPtr srcInstrAddr, IntPtr targetAddr, int instrLength = 0) 11 | => BitConverter.GetBytes(GetRelOffset(srcInstrAddr, targetAddr, instrLength)); 12 | 13 | public static int GetRelOffset(long srcInstrAddr, long targetAddr, int instrLength = 0) 14 | => (int)(targetAddr - (srcInstrAddr + instrLength)); 15 | 16 | public static byte[] GetRelOffsetBytes(long srcInstrAddr, long targetAddr, int instrLength = 0) 17 | => BitConverter.GetBytes(GetRelOffset(srcInstrAddr, targetAddr, instrLength)); 18 | 19 | public static void WriteRelativeOffsets(byte[] bytes, 20 | (long baseAddr, long targetAddr, int size, int destinationIndex)[] offsets) 21 | { 22 | foreach (var (baseAddr, targetAddr, size, destinationIndex) in offsets) 23 | { 24 | var relativeBytes = GetRelOffsetBytes(baseAddr, targetAddr, size); 25 | Array.Copy(relativeBytes, 0, bytes, destinationIndex, 4); 26 | } 27 | } 28 | 29 | public static byte[] GetJmpOriginOffsetBytes(long hookLocation, int originalInstrLen, IntPtr customCodeEnd) 30 | => BitConverter.GetBytes((int)(hookLocation + originalInstrLen - customCodeEnd.ToInt64())); 31 | 32 | public static void WriteJumpOffsets(byte[] bytes, 33 | (long hookLocation, int originalInstrLen, IntPtr customCodeAddr, int destinationIndex)[] jumpOffsets) 34 | { 35 | foreach (var (hookLocation, originalInstrLen, customCodeAddr, destinationIndex) in jumpOffsets) 36 | { 37 | var originOffsetBytes = GetJmpOriginOffsetBytes(hookLocation, originalInstrLen, customCodeAddr + 5); 38 | Array.Copy(originOffsetBytes, 0, bytes, destinationIndex, 4); 39 | } 40 | } 41 | 42 | public static byte[] GetAbsAddressBytes(long address) 43 | => BitConverter.GetBytes(address); 44 | 45 | public static void WriteAbsoluteAddresses(byte[] bytes, (long address, int destinationIndex)[] addresses) 46 | { 47 | foreach (var (address, destinationIndex) in addresses) 48 | { 49 | var addressBytes = GetAbsAddressBytes(address); 50 | Array.Copy(addressBytes, 0, bytes, destinationIndex, 8); 51 | } 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | using System.Windows; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("EldenRingTool")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("EldenRingTool")] 13 | [assembly: AssemblyCopyright("Copyright © 2024")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | //In order to begin building localizable applications, set 23 | //CultureYouAreCodingWith in your .csproj file 24 | //inside a . For example, if you are using US english 25 | //in your source files, set the to en-US. Then uncomment 26 | //the NeutralResourceLanguage attribute below. Update the "en-US" in 27 | //the line below to match the UICulture setting in the project file. 28 | 29 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] 30 | 31 | 32 | [assembly: ThemeInfo( 33 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 34 | //(used if a resource is not found in the page, 35 | // or application resource dictionaries) 36 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 37 | //(used if a resource is not found in the page, 38 | // app, or any theme specific resource dictionaries) 39 | )] 40 | 41 | 42 | // Version information for an assembly consists of the following four values: 43 | // 44 | // Major Version 45 | // Minor Version 46 | // Build Number 47 | // Revision 48 | // 49 | // You can specify all the values or you can default the Build and Revision Numbers 50 | // by using the '*' as shown below: 51 | // [assembly: AssemblyVersion("1.0.*")] 52 | [assembly: AssemblyVersion("1.6.1.0")] 53 | [assembly: AssemblyFileVersion("1.6.1.0")] 54 | //must include all four parts. parsing a version pads the FRONT with zeroes, in some cases, not the back as you might expect. 55 | 56 | -------------------------------------------------------------------------------- /HotkeySetupWindow.xaml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 25 | 26 | 27 | 28 | 32 | 33 | 34 | 35 | 36 | 37 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 |