├── .editorconfig ├── .gitignore ├── DarkSouls3.Preprocessor ├── App.config ├── DarkSouls3.Preprocessor.csproj ├── DarkSouls3.ico ├── Preprocessor.cs ├── Properties │ └── AssemblyInfo.cs └── jp_en_filenames.txt ├── DarkSouls3.Structures ├── Analysis.cs ├── DarkSouls3.Structures.csproj ├── ExpressionParser.cs ├── Properties │ └── AssemblyInfo.cs └── Structures.cs ├── DarkSouls3.TextViewer.sln ├── DarkSouls3.TextViewer ├── App.config ├── DarkSouls3.TextViewer.csproj ├── DarkSouls3.ico ├── Program.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── TextViewer.Designer.cs ├── TextViewer.cs └── TextViewer.resx ├── LICENSE ├── README.md ├── blacklist_engUS.txt ├── docs ├── README.md ├── deletefmg.bat ├── extractbnd.bat └── extractfmg.bat ├── ds3.json └── release.bat /.editorconfig: -------------------------------------------------------------------------------- 1 | ; Top-most EditorConfig file 2 | root = true 3 | 4 | ; Windows-style newlines 5 | [*] 6 | end_of_line = CRLF 7 | 8 | ; Tab indentation 9 | [*.cs] 10 | indent_style = space 11 | tab_width = 4 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.suo 2 | bin/ 3 | obj/ 4 | .DS_Store 5 | release/ 6 | .vs/ -------------------------------------------------------------------------------- /DarkSouls3.Preprocessor/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /DarkSouls3.Preprocessor/DarkSouls3.Preprocessor.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {DCB3E626-667D-44E4-92AC-014A5D11C03B} 8 | Exe 9 | Properties 10 | DarkSouls3.Preprocessor 11 | DarkSouls3.Preprocessor 12 | v4.5 13 | 512 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | DarkSouls3.ico 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | {f9da4804-67bb-4af6-b18a-ea3ba594032c} 57 | DarkSouls3.Structures 58 | 59 | 60 | 61 | 62 | 63 | 64 | 71 | -------------------------------------------------------------------------------- /DarkSouls3.Preprocessor/DarkSouls3.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrexodia/DarkSouls3.TextViewer/8e7112e01c9583c8cadfaf1d8574e8624bf2da0b/DarkSouls3.Preprocessor/DarkSouls3.ico -------------------------------------------------------------------------------- /DarkSouls3.Preprocessor/Preprocessor.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Runtime.Serialization.Json; 6 | using System.Text; 7 | using DarkSouls3.Structures; 8 | 9 | namespace DarkSouls3.Preprocessor 10 | { 11 | static class Preprocessor 12 | { 13 | static void RenameFiles() 14 | { 15 | var jp_en = File.ReadAllLines("jp_en_filenames.txt"); 16 | var translate = jp_en.Select(t => t.Replace(".fmg", ".txt").Split('\t')).ToDictionary(split => split[0], split => split[1]); 17 | var files = Directory.EnumerateFiles(AppDomain.CurrentDomain.BaseDirectory, "*.txt", SearchOption.AllDirectories).ToArray(); 18 | foreach (var file in files) 19 | { 20 | var fname = Path.GetFileName(file); 21 | if (!translate.ContainsKey(fname)) 22 | { 23 | var dlc1name = fname.Replace("dlc2", "dlc1"); 24 | if (translate.ContainsKey(dlc1name)) 25 | translate[fname] = translate[dlc1name].Replace("dlc1", "dlc2"); 26 | else 27 | { 28 | Console.WriteLine("Skipping {0}", file); 29 | continue; 30 | } 31 | } 32 | File.Move(file, file.Replace(fname, translate[fname])); 33 | } 34 | } 35 | 36 | static void ExtractFiles() 37 | { 38 | //Register BinderTool.exe to open *.fmg files 39 | var files = Directory.EnumerateFiles(AppDomain.CurrentDomain.BaseDirectory, "*.fmg", SearchOption.AllDirectories); 40 | foreach (var file in files) 41 | System.Diagnostics.Process.Start(file); 42 | } 43 | 44 | static Dictionary ParseContainer(string file) 45 | { 46 | var lines = File.ReadAllLines(file, new UTF8Encoding(false)); 47 | var dict = new Dictionary(); 48 | foreach (var line in lines) 49 | { 50 | var split = line.Split('\t'); 51 | var trim = split[1].Replace("\\r", "\r").Replace("\\n", "\n").Replace("\\t", "\t").Trim(); 52 | if (trim.Length == 0) 53 | continue; 54 | dict[split[0]] = trim; 55 | } 56 | return dict; 57 | } 58 | 59 | static Dictionary ParseContainers(IEnumerable files) 60 | { 61 | var dict = new Dictionary(); 62 | foreach (var file in files) 63 | { 64 | var name = Path.GetFileNameWithoutExtension(file); 65 | dict.Add(name, new Container 66 | { 67 | Name = name, 68 | Content = ParseContainer(file) 69 | }); 70 | } 71 | return dict; 72 | } 73 | 74 | static void ExtractRawJson() 75 | { 76 | var languages = Directory.EnumerateDirectories(AppDomain.CurrentDomain.BaseDirectory + @"\INTERROOT_win64\msg"); 77 | var ds3text = new DarkSouls3Text(); 78 | foreach (var language in languages) 79 | { 80 | var files = Directory.EnumerateFiles(language, "*.txt", SearchOption.AllDirectories); 81 | var name = Path.GetFileName(language); 82 | ds3text.Languages.Add(name, new Language 83 | { 84 | Containers = ParseContainers(files) 85 | }); 86 | } 87 | File.WriteAllText("ds3raw.json", JSONHelper.Serialize(ds3text), new UTF8Encoding(false)); 88 | } 89 | 90 | static Container RetrieveContainer(Language lang, string key) 91 | { 92 | Container c; 93 | if (lang.Containers.TryGetValue(key, out c)) 94 | lang.Containers.Remove(key); 95 | return c; 96 | } 97 | 98 | static List RetrieveContainers(Language lang, string key) 99 | { 100 | return new List 101 | { 102 | RetrieveContainer(lang, key), 103 | RetrieveContainer(lang, key + "_dlc1"), 104 | RetrieveContainer(lang, key + "_dlc2") 105 | }; 106 | } 107 | 108 | public delegate void AssignItemValue(GenericItem item, string value); 109 | 110 | static void AssignItems(Dictionary dict, IEnumerable containers, AssignItemValue assignItemValue) 111 | { 112 | foreach (var container in containers) 113 | { 114 | if (container == null) 115 | continue; 116 | foreach (var itemIt in container.Content) 117 | { 118 | if (!dict.ContainsKey(itemIt.Key)) 119 | { 120 | var newItem = new GenericItem(); 121 | var dlcIndex = container.Name.IndexOf("_dlc", StringComparison.Ordinal); 122 | if (dlcIndex != -1) 123 | newItem.Dlc = int.Parse(container.Name[dlcIndex + "_dlc".Length].ToString()); 124 | newItem.Id = itemIt.Key; 125 | dict[itemIt.Key] = newItem; 126 | } 127 | assignItemValue(dict[itemIt.Key], itemIt.Value); 128 | } 129 | } 130 | } 131 | 132 | static Dictionary ParseGenericItems(Language lang, string prefix) 133 | { 134 | var dict = new Dictionary(); 135 | AssignItems(dict, RetrieveContainers(lang, prefix + "name"), (item, value) => item.Name = value); 136 | AssignItems(dict, RetrieveContainers(lang, prefix + "description"), (item, value) => item.Description = value); 137 | AssignItems(dict, RetrieveContainers(lang, prefix + "knowledge"), (item, value) => item.Knowledge = value); 138 | return dict; 139 | } 140 | 141 | static Dictionary ParseConversations(Language lang) 142 | { 143 | var dict = new Dictionary(); 144 | var containers = RetrieveContainers(lang, "Conversation"); 145 | foreach (var container in containers) 146 | { 147 | if (container == null) 148 | continue; 149 | var keys = container.Content.Keys.Where(id => !container.Content[id].Equals("(dummyText)")).Select(s => int.Parse(s)).ToArray(); 150 | Array.Sort(keys); 151 | if (keys.Length == 0) 152 | continue; 153 | for (var i = 0; i < keys.Length; ) 154 | { 155 | var id = keys[i]; 156 | var prevId = id; 157 | var builder = new StringBuilder(); 158 | builder.Append(container.Content[keys[i].ToString()]); 159 | i++; 160 | for (; i < keys.Length && keys[i] == prevId + 1; i++) 161 | { 162 | prevId++; 163 | builder.Append('\n'); 164 | builder.Append(container.Content[keys[i].ToString()]); 165 | } 166 | var conversation = new Conversation 167 | { 168 | Id = id.ToString(), 169 | Text = builder.ToString() 170 | }; 171 | var dlcIndex = container.Name.IndexOf("_dlc", StringComparison.Ordinal); 172 | if (dlcIndex != -1) 173 | conversation.Dlc = int.Parse(container.Name[dlcIndex + "_dlc".Length].ToString()); 174 | dict.Add(conversation.Id, conversation); 175 | } 176 | } 177 | return dict; 178 | } 179 | 180 | static void ExtractJson() 181 | { 182 | var ds3raw = JSONHelper.Deserialize(File.ReadAllText("ds3raw.json", new UTF8Encoding(false))); 183 | foreach (var langIt in ds3raw.Languages) 184 | { 185 | var lang = langIt.Value; 186 | lang.Accessory = ParseGenericItems(lang, "Accessories "); 187 | lang.Armor = ParseGenericItems(lang, "Armor "); 188 | lang.Item = ParseGenericItems(lang, "Item "); 189 | lang.Magic = ParseGenericItems(lang, "Magic "); 190 | lang.Weapon = ParseGenericItems(lang, "Weapon "); 191 | lang.Conversations = ParseConversations(lang); 192 | } 193 | File.WriteAllText("ds3.json", JSONHelper.Serialize(ds3raw), new UTF8Encoding(false)); 194 | } 195 | 196 | static void Main(string[] args) 197 | { 198 | RenameFiles(); 199 | ExtractRawJson(); 200 | ExtractJson(); 201 | Console.WriteLine("done"); 202 | } 203 | } 204 | } 205 | -------------------------------------------------------------------------------- /DarkSouls3.Preprocessor/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 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("TranslateFiles")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("TranslateFiles")] 13 | [assembly: AssemblyCopyright("Copyright © Duncan Ogilvie 2016")] 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 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("89afd36a-1272-40da-a68e-40e4b0425bda")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.1.0.0")] 36 | [assembly: AssemblyFileVersion("1.1.0.0")] 37 | -------------------------------------------------------------------------------- /DarkSouls3.Preprocessor/jp_en_filenames.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrexodia/DarkSouls3.TextViewer/8e7112e01c9583c8cadfaf1d8574e8624bf2da0b/DarkSouls3.Preprocessor/jp_en_filenames.txt -------------------------------------------------------------------------------- /DarkSouls3.Structures/Analysis.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace DarkSouls3.Structures 8 | { 9 | public class Analysis 10 | { 11 | private readonly Dictionary _nodeSet = new Dictionary(); 12 | private readonly string[] _blacklist; 13 | 14 | public Analysis(string[] blacklist) 15 | { 16 | _blacklist = blacklist ?? new string[0]; 17 | } 18 | 19 | public IEnumerable SplitText(string text) 20 | { 21 | foreach (var s in text.Split(new char[] { ' ', ',', '.', ';', ':', '\'', '"', '-', '?', '!', '\n', '\r', '\u2026', '/' })) 22 | { 23 | if (s.Length <= 2 || s.Contains('+') || s.Count(char.IsDigit) != 0 || _blacklist.Contains(s)) 24 | continue; 25 | yield return s; 26 | } 27 | } 28 | 29 | public void AddText(string text) 30 | { 31 | foreach (var s in SplitText(text)) 32 | { 33 | var count = _nodeSet.ContainsKey(s) ? _nodeSet[s] : 0; 34 | _nodeSet[s] = count + 1; 35 | } 36 | } 37 | 38 | private readonly List _nodeList = new List(); 39 | private readonly Dictionary _nodeIndex = new Dictionary(); 40 | private int[,] _edges; 41 | 42 | public void Prepare() 43 | { 44 | foreach (var n in _nodeSet) 45 | _nodeList.Add(n.Key); 46 | _nodeSet.Clear(); 47 | for (var i = 0; i < _nodeList.Count; i++) 48 | _nodeIndex[_nodeList[i]] = i; 49 | _edges = new int[_nodeList.Count, _nodeList.Count]; 50 | } 51 | 52 | public void ConnectText(string text) 53 | { 54 | var split = SplitText(text).ToList(); 55 | for (var i = 0; i < split.Count; i++) 56 | for (var j = i + 1; j < split.Count; j++) 57 | { 58 | var idxi = _nodeIndex[split[i]]; 59 | var idxj = _nodeIndex[split[j]]; 60 | _edges[idxi, idxj]++; 61 | _edges[idxj, idxi]++; 62 | } 63 | } 64 | 65 | public string ToDot() 66 | { 67 | var result = new StringBuilder(); 68 | result.AppendLine("graph G {"); 69 | foreach (var node in _nodeList) 70 | result.AppendFormat(" {0}\n", node); 71 | result.AppendLine(); 72 | 73 | var w = _edges.GetLength(0); 74 | var nedges = new bool[w, w]; 75 | for (var i = 0; i < w; i++) 76 | for (var j = 0; j < w; j++) 77 | nedges[i, j] = _edges[i, j] > 0; 78 | for (var i = 0; i < w; i++) 79 | for (var j = 0; j < w; j++) 80 | if (nedges[i, j] && i != j) 81 | { 82 | nedges[j, i] = false; 83 | nedges[i, j] = false; 84 | result.AppendFormat(" {0} -- {1} [weight={2}];\n", _nodeList[i], _nodeList[j], _edges[i, j]); 85 | } 86 | 87 | result.AppendLine(); 88 | result.AppendLine("}"); 89 | return result.ToString(); 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /DarkSouls3.Structures/DarkSouls3.Structures.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {F9DA4804-67BB-4AF6-B18A-EA3BA594032C} 8 | Library 9 | Properties 10 | DarkSouls3.Structures 11 | DarkSouls3.Structures 12 | v4.5 13 | 512 14 | 15 | 16 | true 17 | full 18 | false 19 | bin\Debug\ 20 | DEBUG;TRACE 21 | prompt 22 | 4 23 | 24 | 25 | pdbonly 26 | true 27 | bin\Release\ 28 | TRACE 29 | prompt 30 | 4 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 56 | -------------------------------------------------------------------------------- /DarkSouls3.Structures/ExpressionParser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace DarkSouls3.Structures 8 | { 9 | public class ExpressionParser 10 | { 11 | class Token 12 | { 13 | public enum Type 14 | { 15 | Data, 16 | OpenBracket, 17 | CloseBracket, 18 | OperatorNot, 19 | OperatorAnd, 20 | OperatorOr 21 | } 22 | 23 | public enum Associativity 24 | { 25 | LeftToRight, 26 | RightToLeft, 27 | Unspecified 28 | } 29 | 30 | public override string ToString() 31 | { 32 | return string.Format("[data=\"{0}\", type={1}]", data, type); 33 | } 34 | 35 | public string data { get; private set; } 36 | public Type type { get; private set; } 37 | 38 | public Token(string data, Type type) 39 | { 40 | this.data = data; 41 | this.type = type; 42 | } 43 | 44 | public Associativity Assoc 45 | { 46 | get 47 | { 48 | switch (type) 49 | { 50 | case Type.OperatorNot: 51 | return Associativity.RightToLeft; 52 | case Type.OperatorAnd: 53 | case Type.OperatorOr: 54 | return Associativity.LeftToRight; 55 | default: 56 | return Associativity.Unspecified; 57 | } 58 | } 59 | } 60 | 61 | public int Precedence 62 | { 63 | get 64 | { 65 | switch (type) 66 | { 67 | case Type.OperatorNot: 68 | return 7; 69 | case Type.OperatorAnd: 70 | return 3; 71 | case Type.OperatorOr: 72 | return 1; 73 | default: 74 | return 0; 75 | } 76 | } 77 | } 78 | 79 | public bool IsOperator 80 | { 81 | get { return type != Type.Data && type != Type.OpenBracket && type != Type.CloseBracket; } 82 | } 83 | } 84 | 85 | private readonly List _tokens = new List(); 86 | private Token[] _prefixTokens; 87 | private string _curToken = ""; 88 | 89 | public ExpressionParser(string expression) 90 | { 91 | tokenize(expression); 92 | shuntingYard(); 93 | } 94 | 95 | private bool isUnaryOperator() 96 | { 97 | if (_curToken.Length != 0) 98 | return false; 99 | if (_tokens.Count == 0) 100 | return true; 101 | var lastToken = _tokens[_tokens.Count - 1]; 102 | return lastToken.IsOperator; 103 | } 104 | 105 | private void tokenize(string expression) 106 | { 107 | foreach (var ch in expression) 108 | { 109 | switch (ch) 110 | { 111 | case '(': 112 | addOperatorToken(ch, Token.Type.OpenBracket); 113 | break; 114 | case ')': 115 | addOperatorToken(ch, Token.Type.CloseBracket); 116 | break; 117 | case '~': 118 | addOperatorToken(ch, Token.Type.OperatorNot); 119 | break; 120 | case '&': 121 | addOperatorToken(ch, Token.Type.OperatorAnd); 122 | break; 123 | case '|': 124 | addOperatorToken(ch, Token.Type.OperatorOr); 125 | break; 126 | default: 127 | _curToken += ch; 128 | break; 129 | } 130 | } 131 | if (_curToken.Length != 0) 132 | _tokens.Add(new Token(_curToken, Token.Type.Data)); 133 | } 134 | 135 | private void shuntingYard() 136 | { 137 | //Implementation of Dijkstra's Shunting-yard algorithm 138 | var queue = new Queue(_tokens.Count); 139 | var stack = new Stack(_tokens.Count); 140 | foreach (var token in _tokens) 141 | { 142 | switch (token.type) 143 | { 144 | case Token.Type.Data: 145 | queue.Enqueue(token); 146 | break; 147 | case Token.Type.OpenBracket: 148 | stack.Push(token); 149 | break; 150 | case Token.Type.CloseBracket: 151 | while (true) 152 | { 153 | if (stack.Count == 0) //empty stack = bracket mismatch 154 | throw new Exception("Mismatched parentheses"); 155 | var curToken = stack.Pop(); 156 | if (curToken.type == Token.Type.OpenBracket) 157 | break; 158 | queue.Enqueue(curToken); 159 | } 160 | break; 161 | default: //operator 162 | var o1 = token; 163 | while (stack.Count != 0) 164 | { 165 | var o2 = stack.Peek(); 166 | if (o2.IsOperator && 167 | (o1.Assoc == Token.Associativity.LeftToRight && o1.Precedence <= o2.Precedence) || 168 | (o1.Assoc == Token.Associativity.RightToLeft && o1.Precedence < o2.Precedence)) 169 | { 170 | queue.Enqueue(stack.Pop()); 171 | } 172 | else 173 | break; 174 | } 175 | stack.Push(o1); 176 | break; 177 | } 178 | } 179 | while (stack.Count != 0) 180 | { 181 | var curToken = stack.Pop(); 182 | if (curToken.type == Token.Type.OpenBracket || curToken.type == Token.Type.CloseBracket) 183 | throw new Exception("Mismatched parentheses"); 184 | queue.Enqueue(curToken); 185 | } 186 | _prefixTokens = queue.ToArray(); 187 | } 188 | 189 | private void addOperatorToken(char ch, Token.Type type) 190 | { 191 | if (_curToken.Length > 0) 192 | { 193 | _tokens.Add(new Token(_curToken, Token.Type.Data)); 194 | _curToken = ""; 195 | } 196 | _tokens.Add(new Token(ch.ToString(), type)); 197 | } 198 | 199 | public void Print() 200 | { 201 | if (_prefixTokens == null) 202 | return; 203 | foreach (var token in _prefixTokens) 204 | Console.WriteLine(token); 205 | } 206 | 207 | private void operation(Token.Type type, bool op1, bool op2, out bool result) 208 | { 209 | result = false; 210 | switch (type) 211 | { 212 | case Token.Type.OperatorNot: 213 | result = !op1; 214 | break; 215 | case Token.Type.OperatorAnd: 216 | result = op1 & op2; 217 | break; 218 | case Token.Type.OperatorOr: 219 | result = op1 | op2; 220 | break; 221 | default: 222 | break; 223 | } 224 | } 225 | 226 | public delegate bool Evaluate(string value); 227 | 228 | public bool Calculate(Evaluate eval) 229 | { 230 | if (_prefixTokens == null) 231 | throw new Exception("No tokens to process"); 232 | var stack = new Stack(_prefixTokens.Length); 233 | foreach (var token in _prefixTokens) 234 | { 235 | if (token.IsOperator) 236 | { 237 | switch (token.type) 238 | { 239 | case Token.Type.OperatorNot: 240 | { 241 | if (stack.Count < 1) 242 | throw new Exception("Not enough operands"); 243 | var op1 = stack.Pop(); 244 | bool result; 245 | operation(token.type, op1, false, out result); 246 | stack.Push(result); 247 | } 248 | break; 249 | 250 | case Token.Type.OperatorAnd: 251 | case Token.Type.OperatorOr: 252 | { 253 | if (stack.Count < 2) 254 | throw new Exception("Not enough operands"); 255 | var op2 = stack.Pop(); 256 | var op1 = stack.Pop(); 257 | bool result; 258 | operation(token.type, op1, op2, out result); 259 | stack.Push(result); 260 | } 261 | break; 262 | 263 | default: //do nothing 264 | break; 265 | } 266 | } 267 | else 268 | stack.Push(eval(token.data)); 269 | } 270 | if (stack.Count == 0) 271 | return true; 272 | return stack.Pop(); 273 | } 274 | } 275 | } -------------------------------------------------------------------------------- /DarkSouls3.Structures/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 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("Structures")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Structures")] 13 | [assembly: AssemblyCopyright("Copyright © Duncan Ogilvie 2016")] 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 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("28f72ed3-fa0f-4bad-8370-50ec7b6a1a75")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.1.0.0")] 36 | [assembly: AssemblyFileVersion("1.1.0.0")] 37 | -------------------------------------------------------------------------------- /DarkSouls3.Structures/Structures.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq.Expressions; 5 | using System.Runtime.Serialization; 6 | using System.Runtime.Serialization.Json; 7 | using System.Text; 8 | 9 | namespace DarkSouls3.Structures 10 | { 11 | [DataContract] 12 | public class GenericItem 13 | { 14 | [DataMember(Name = "id", Order = 0)] 15 | public string Id; 16 | 17 | [DataMember(Name = "dlc", Order = 1)] 18 | public int Dlc = 0; 19 | 20 | [DataMember(Name = "name", Order = 2)] 21 | public string Name = ""; 22 | 23 | [DataMember(Name = "description", Order = 3)] 24 | public string Description = ""; 25 | 26 | [DataMember(Name = "knowledge", Order = 4)] 27 | public string Knowledge = ""; 28 | 29 | public override string ToString() 30 | { 31 | return Name.Length == 0 ? Id : Name; 32 | } 33 | } 34 | 35 | [DataContract] 36 | public class Container 37 | { 38 | [DataMember(Name = "name")] 39 | public string Name; 40 | 41 | [DataMember(Name = "content")] 42 | public Dictionary Content = new Dictionary(); 43 | 44 | public override string ToString() 45 | { 46 | return Name; 47 | } 48 | } 49 | 50 | [DataContract] 51 | public class Conversation 52 | { 53 | [DataMember(Name = "id")] 54 | public string Id; 55 | 56 | [DataMember(Name = "text")] 57 | public string Text; 58 | 59 | [DataMember(Name = "dlc")] 60 | public int Dlc = 0; 61 | 62 | public override string ToString() 63 | { 64 | var split = Text.Split('\n')[0].Split(' '); 65 | var quote = new StringBuilder(); 66 | quote.Append(split[0]); 67 | for (var i = 1; i < split.Length && quote.Length < 15; i++) 68 | { 69 | quote.Append(' '); 70 | quote.Append(split[i]); 71 | } 72 | if (quote.Length < Text.Length && !quote.ToString().EndsWith("...")) 73 | quote.Append("..."); 74 | return string.Format("{0} \"{1}\"", Id, quote); 75 | } 76 | } 77 | 78 | [DataContract] 79 | public class Language 80 | { 81 | [DataMember(Name = "accessory")] 82 | public Dictionary Accessory = new Dictionary(); 83 | 84 | [DataMember(Name = "armor")] 85 | public Dictionary Armor = new Dictionary(); 86 | 87 | [DataMember(Name = "item")] 88 | public Dictionary Item = new Dictionary(); 89 | 90 | [DataMember(Name = "magic")] 91 | public Dictionary Magic = new Dictionary(); 92 | 93 | [DataMember(Name = "weapon")] 94 | public Dictionary Weapon = new Dictionary(); 95 | 96 | [DataMember(Name = "conversations")] 97 | public Dictionary Conversations = new Dictionary(); 98 | 99 | [DataMember(Name = "containers")] 100 | public Dictionary Containers = new Dictionary(); 101 | } 102 | 103 | [DataContract] 104 | public class DarkSouls3Text 105 | { 106 | [DataMember(Name = "languages")] 107 | public Dictionary Languages = new Dictionary(); 108 | } 109 | 110 | public static class JSONHelper 111 | { 112 | public static string Serialize(T obj) 113 | { 114 | var serializer = new DataContractJsonSerializer(obj.GetType(), new DataContractJsonSerializerSettings 115 | { 116 | UseSimpleDictionaryFormat = true 117 | }); 118 | MemoryStream ms = new MemoryStream(); 119 | serializer.WriteObject(ms, obj); 120 | string retVal = Encoding.UTF8.GetString(ms.ToArray()); 121 | ms.Dispose(); 122 | return retVal; 123 | } 124 | 125 | public static T Deserialize(string json) 126 | { 127 | T obj = Activator.CreateInstance(); 128 | MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)); 129 | var serializer = new DataContractJsonSerializer(obj.GetType(), new DataContractJsonSerializerSettings 130 | { 131 | UseSimpleDictionaryFormat = true 132 | }); 133 | obj = (T)serializer.ReadObject(ms); 134 | ms.Close(); 135 | ms.Dispose(); 136 | return obj; 137 | } 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /DarkSouls3.TextViewer.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.40629.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DarkSouls3.Preprocessor", "DarkSouls3.Preprocessor\DarkSouls3.Preprocessor.csproj", "{DCB3E626-667D-44E4-92AC-014A5D11C03B}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DarkSouls3.Structures", "DarkSouls3.Structures\DarkSouls3.Structures.csproj", "{F9DA4804-67BB-4AF6-B18A-EA3BA594032C}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DarkSouls3.TextViewer", "DarkSouls3.TextViewer\DarkSouls3.TextViewer.csproj", "{C5E2C7E7-F281-485A-AF38-963DF1BD5F07}" 11 | EndProject 12 | Global 13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 14 | Debug|Any CPU = Debug|Any CPU 15 | Release|Any CPU = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {DCB3E626-667D-44E4-92AC-014A5D11C03B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {DCB3E626-667D-44E4-92AC-014A5D11C03B}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {DCB3E626-667D-44E4-92AC-014A5D11C03B}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {DCB3E626-667D-44E4-92AC-014A5D11C03B}.Release|Any CPU.Build.0 = Release|Any CPU 22 | {F9DA4804-67BB-4AF6-B18A-EA3BA594032C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 23 | {F9DA4804-67BB-4AF6-B18A-EA3BA594032C}.Debug|Any CPU.Build.0 = Debug|Any CPU 24 | {F9DA4804-67BB-4AF6-B18A-EA3BA594032C}.Release|Any CPU.ActiveCfg = Release|Any CPU 25 | {F9DA4804-67BB-4AF6-B18A-EA3BA594032C}.Release|Any CPU.Build.0 = Release|Any CPU 26 | {C5E2C7E7-F281-485A-AF38-963DF1BD5F07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 27 | {C5E2C7E7-F281-485A-AF38-963DF1BD5F07}.Debug|Any CPU.Build.0 = Debug|Any CPU 28 | {C5E2C7E7-F281-485A-AF38-963DF1BD5F07}.Release|Any CPU.ActiveCfg = Release|Any CPU 29 | {C5E2C7E7-F281-485A-AF38-963DF1BD5F07}.Release|Any CPU.Build.0 = Release|Any CPU 30 | EndGlobalSection 31 | GlobalSection(SolutionProperties) = preSolution 32 | HideSolutionNode = FALSE 33 | EndGlobalSection 34 | EndGlobal 35 | -------------------------------------------------------------------------------- /DarkSouls3.TextViewer/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /DarkSouls3.TextViewer/DarkSouls3.TextViewer.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {C5E2C7E7-F281-485A-AF38-963DF1BD5F07} 8 | WinExe 9 | Properties 10 | DarkSouls3.TextViewer 11 | DarkSouls3.TextViewer 12 | v4.5 13 | 512 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | DarkSouls3.ico 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | Form 52 | 53 | 54 | TextViewer.cs 55 | 56 | 57 | 58 | 59 | TextViewer.cs 60 | 61 | 62 | ResXFileCodeGenerator 63 | Resources.Designer.cs 64 | Designer 65 | 66 | 67 | True 68 | Resources.resx 69 | True 70 | 71 | 72 | SettingsSingleFileGenerator 73 | Settings.Designer.cs 74 | 75 | 76 | True 77 | Settings.settings 78 | True 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | {f9da4804-67bb-4af6-b18a-ea3ba594032c} 87 | DarkSouls3.Structures 88 | 89 | 90 | 91 | 92 | 93 | 94 | 101 | -------------------------------------------------------------------------------- /DarkSouls3.TextViewer/DarkSouls3.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrexodia/DarkSouls3.TextViewer/8e7112e01c9583c8cadfaf1d8574e8624bf2da0b/DarkSouls3.TextViewer/DarkSouls3.ico -------------------------------------------------------------------------------- /DarkSouls3.TextViewer/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace DarkSouls3.TextViewer 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// The main entry point for the application. 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.EnableVisualStyles(); 18 | Application.SetCompatibleTextRenderingDefault(false); 19 | Application.Run(new DarkSouls3TextViewer()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /DarkSouls3.TextViewer/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 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("DarkSouls3TextViewer")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("DarkSouls3TextViewer")] 13 | [assembly: AssemblyCopyright("Copyright © Duncan Ogilvie 2016")] 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 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("ac9a26c0-85f1-4a2c-892e-b08748a8b682")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.1.0.0")] 36 | [assembly: AssemblyFileVersion("1.1.0.0")] 37 | -------------------------------------------------------------------------------- /DarkSouls3.TextViewer/Properties/Resources.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 | namespace DarkSouls3.TextViewer.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DarkSouls3.TextViewer.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /DarkSouls3.TextViewer/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /DarkSouls3.TextViewer/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 | namespace DarkSouls3.TextViewer.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /DarkSouls3.TextViewer/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /DarkSouls3.TextViewer/TextViewer.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace DarkSouls3.TextViewer 2 | { 3 | partial class DarkSouls3TextViewer 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.buttonLoadData = new System.Windows.Forms.Button(); 32 | this.tabControlMain = new System.Windows.Forms.TabControl(); 33 | this.tabPageItems = new System.Windows.Forms.TabPage(); 34 | this.splitContainerItems = new System.Windows.Forms.SplitContainer(); 35 | this.checkedListBoxItems = new System.Windows.Forms.CheckedListBox(); 36 | this.listBoxItems = new System.Windows.Forms.ListBox(); 37 | this.webBrowserItem = new System.Windows.Forms.WebBrowser(); 38 | this.tabPageConversations = new System.Windows.Forms.TabPage(); 39 | this.splitContainerConversations = new System.Windows.Forms.SplitContainer(); 40 | this.listBoxConversations = new System.Windows.Forms.ListBox(); 41 | this.webBrowserConversation = new System.Windows.Forms.WebBrowser(); 42 | this.tabPageContainers = new System.Windows.Forms.TabPage(); 43 | this.splitContainerContainers = new System.Windows.Forms.SplitContainer(); 44 | this.splitContainerContainerLists = new System.Windows.Forms.SplitContainer(); 45 | this.listBoxContainers = new System.Windows.Forms.ListBox(); 46 | this.listBoxContainerContent = new System.Windows.Forms.ListBox(); 47 | this.webBrowserContainer = new System.Windows.Forms.WebBrowser(); 48 | this.tabPageAnalysis = new System.Windows.Forms.TabPage(); 49 | this.linkLabelGephi = new System.Windows.Forms.LinkLabel(); 50 | this.buttonGraph = new System.Windows.Forms.Button(); 51 | this.comboBoxLanguage = new System.Windows.Forms.ComboBox(); 52 | this.labelLanguage = new System.Windows.Forms.Label(); 53 | this.textBoxFilter = new System.Windows.Forms.TextBox(); 54 | this.labelFilter = new System.Windows.Forms.Label(); 55 | this.buttonApply = new System.Windows.Forms.Button(); 56 | this.buttonHelp = new System.Windows.Forms.Button(); 57 | this.linkBonfireSideChat = new System.Windows.Forms.LinkLabel(); 58 | this.linkLabelCreatedBy = new System.Windows.Forms.LinkLabel(); 59 | this.tabControlMain.SuspendLayout(); 60 | this.tabPageItems.SuspendLayout(); 61 | ((System.ComponentModel.ISupportInitialize)(this.splitContainerItems)).BeginInit(); 62 | this.splitContainerItems.Panel1.SuspendLayout(); 63 | this.splitContainerItems.Panel2.SuspendLayout(); 64 | this.splitContainerItems.SuspendLayout(); 65 | this.tabPageConversations.SuspendLayout(); 66 | ((System.ComponentModel.ISupportInitialize)(this.splitContainerConversations)).BeginInit(); 67 | this.splitContainerConversations.Panel1.SuspendLayout(); 68 | this.splitContainerConversations.Panel2.SuspendLayout(); 69 | this.splitContainerConversations.SuspendLayout(); 70 | this.tabPageContainers.SuspendLayout(); 71 | ((System.ComponentModel.ISupportInitialize)(this.splitContainerContainers)).BeginInit(); 72 | this.splitContainerContainers.Panel1.SuspendLayout(); 73 | this.splitContainerContainers.Panel2.SuspendLayout(); 74 | this.splitContainerContainers.SuspendLayout(); 75 | ((System.ComponentModel.ISupportInitialize)(this.splitContainerContainerLists)).BeginInit(); 76 | this.splitContainerContainerLists.Panel1.SuspendLayout(); 77 | this.splitContainerContainerLists.Panel2.SuspendLayout(); 78 | this.splitContainerContainerLists.SuspendLayout(); 79 | this.tabPageAnalysis.SuspendLayout(); 80 | this.SuspendLayout(); 81 | // 82 | // buttonLoadData 83 | // 84 | this.buttonLoadData.Location = new System.Drawing.Point(12, 12); 85 | this.buttonLoadData.Name = "buttonLoadData"; 86 | this.buttonLoadData.Size = new System.Drawing.Size(75, 23); 87 | this.buttonLoadData.TabIndex = 0; 88 | this.buttonLoadData.Text = "Load data"; 89 | this.buttonLoadData.UseVisualStyleBackColor = true; 90 | this.buttonLoadData.Click += new System.EventHandler(this.buttonLoadData_Click); 91 | // 92 | // tabControlMain 93 | // 94 | this.tabControlMain.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 95 | | System.Windows.Forms.AnchorStyles.Left) 96 | | System.Windows.Forms.AnchorStyles.Right))); 97 | this.tabControlMain.Controls.Add(this.tabPageItems); 98 | this.tabControlMain.Controls.Add(this.tabPageConversations); 99 | this.tabControlMain.Controls.Add(this.tabPageContainers); 100 | this.tabControlMain.Controls.Add(this.tabPageAnalysis); 101 | this.tabControlMain.Location = new System.Drawing.Point(12, 41); 102 | this.tabControlMain.Name = "tabControlMain"; 103 | this.tabControlMain.SelectedIndex = 0; 104 | this.tabControlMain.Size = new System.Drawing.Size(902, 420); 105 | this.tabControlMain.TabIndex = 1; 106 | // 107 | // tabPageItems 108 | // 109 | this.tabPageItems.Controls.Add(this.splitContainerItems); 110 | this.tabPageItems.Location = new System.Drawing.Point(4, 22); 111 | this.tabPageItems.Name = "tabPageItems"; 112 | this.tabPageItems.Padding = new System.Windows.Forms.Padding(3); 113 | this.tabPageItems.Size = new System.Drawing.Size(894, 394); 114 | this.tabPageItems.TabIndex = 0; 115 | this.tabPageItems.Text = "Items"; 116 | this.tabPageItems.UseVisualStyleBackColor = true; 117 | // 118 | // splitContainerItems 119 | // 120 | this.splitContainerItems.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 121 | | System.Windows.Forms.AnchorStyles.Left) 122 | | System.Windows.Forms.AnchorStyles.Right))); 123 | this.splitContainerItems.Location = new System.Drawing.Point(0, 0); 124 | this.splitContainerItems.Name = "splitContainerItems"; 125 | // 126 | // splitContainerItems.Panel1 127 | // 128 | this.splitContainerItems.Panel1.Controls.Add(this.checkedListBoxItems); 129 | this.splitContainerItems.Panel1.Controls.Add(this.listBoxItems); 130 | // 131 | // splitContainerItems.Panel2 132 | // 133 | this.splitContainerItems.Panel2.Controls.Add(this.webBrowserItem); 134 | this.splitContainerItems.Size = new System.Drawing.Size(894, 394); 135 | this.splitContainerItems.SplitterDistance = 250; 136 | this.splitContainerItems.TabIndex = 0; 137 | // 138 | // checkedListBoxItems 139 | // 140 | this.checkedListBoxItems.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 141 | | System.Windows.Forms.AnchorStyles.Right))); 142 | this.checkedListBoxItems.CheckOnClick = true; 143 | this.checkedListBoxItems.FormattingEnabled = true; 144 | this.checkedListBoxItems.Items.AddRange(new object[] { 145 | "Accessory", 146 | "Armor", 147 | "Item", 148 | "Magic", 149 | "Weapon"}); 150 | this.checkedListBoxItems.Location = new System.Drawing.Point(6, 6); 151 | this.checkedListBoxItems.Name = "checkedListBoxItems"; 152 | this.checkedListBoxItems.Size = new System.Drawing.Size(241, 79); 153 | this.checkedListBoxItems.TabIndex = 2; 154 | // 155 | // listBoxItems 156 | // 157 | this.listBoxItems.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 158 | | System.Windows.Forms.AnchorStyles.Left) 159 | | System.Windows.Forms.AnchorStyles.Right))); 160 | this.listBoxItems.FormattingEnabled = true; 161 | this.listBoxItems.HorizontalScrollbar = true; 162 | this.listBoxItems.Location = new System.Drawing.Point(6, 85); 163 | this.listBoxItems.Name = "listBoxItems"; 164 | this.listBoxItems.Size = new System.Drawing.Size(241, 303); 165 | this.listBoxItems.TabIndex = 1; 166 | // 167 | // webBrowserItem 168 | // 169 | this.webBrowserItem.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 170 | | System.Windows.Forms.AnchorStyles.Left) 171 | | System.Windows.Forms.AnchorStyles.Right))); 172 | this.webBrowserItem.Location = new System.Drawing.Point(3, 0); 173 | this.webBrowserItem.MinimumSize = new System.Drawing.Size(20, 20); 174 | this.webBrowserItem.Name = "webBrowserItem"; 175 | this.webBrowserItem.Size = new System.Drawing.Size(637, 394); 176 | this.webBrowserItem.TabIndex = 0; 177 | // 178 | // tabPageConversations 179 | // 180 | this.tabPageConversations.Controls.Add(this.splitContainerConversations); 181 | this.tabPageConversations.Location = new System.Drawing.Point(4, 22); 182 | this.tabPageConversations.Name = "tabPageConversations"; 183 | this.tabPageConversations.Padding = new System.Windows.Forms.Padding(3); 184 | this.tabPageConversations.Size = new System.Drawing.Size(894, 394); 185 | this.tabPageConversations.TabIndex = 1; 186 | this.tabPageConversations.Text = "Conversations"; 187 | this.tabPageConversations.UseVisualStyleBackColor = true; 188 | // 189 | // splitContainerConversations 190 | // 191 | this.splitContainerConversations.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 192 | | System.Windows.Forms.AnchorStyles.Left) 193 | | System.Windows.Forms.AnchorStyles.Right))); 194 | this.splitContainerConversations.Location = new System.Drawing.Point(0, 0); 195 | this.splitContainerConversations.Name = "splitContainerConversations"; 196 | // 197 | // splitContainerConversations.Panel1 198 | // 199 | this.splitContainerConversations.Panel1.Controls.Add(this.listBoxConversations); 200 | // 201 | // splitContainerConversations.Panel2 202 | // 203 | this.splitContainerConversations.Panel2.Controls.Add(this.webBrowserConversation); 204 | this.splitContainerConversations.Size = new System.Drawing.Size(894, 394); 205 | this.splitContainerConversations.SplitterDistance = 250; 206 | this.splitContainerConversations.TabIndex = 0; 207 | // 208 | // listBoxConversations 209 | // 210 | this.listBoxConversations.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 211 | | System.Windows.Forms.AnchorStyles.Left) 212 | | System.Windows.Forms.AnchorStyles.Right))); 213 | this.listBoxConversations.FormattingEnabled = true; 214 | this.listBoxConversations.HorizontalScrollbar = true; 215 | this.listBoxConversations.Location = new System.Drawing.Point(6, 6); 216 | this.listBoxConversations.Name = "listBoxConversations"; 217 | this.listBoxConversations.Size = new System.Drawing.Size(241, 381); 218 | this.listBoxConversations.TabIndex = 0; 219 | // 220 | // webBrowserConversation 221 | // 222 | this.webBrowserConversation.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 223 | | System.Windows.Forms.AnchorStyles.Left) 224 | | System.Windows.Forms.AnchorStyles.Right))); 225 | this.webBrowserConversation.Location = new System.Drawing.Point(3, 0); 226 | this.webBrowserConversation.MinimumSize = new System.Drawing.Size(20, 20); 227 | this.webBrowserConversation.Name = "webBrowserConversation"; 228 | this.webBrowserConversation.Size = new System.Drawing.Size(637, 394); 229 | this.webBrowserConversation.TabIndex = 0; 230 | // 231 | // tabPageContainers 232 | // 233 | this.tabPageContainers.Controls.Add(this.splitContainerContainers); 234 | this.tabPageContainers.Location = new System.Drawing.Point(4, 22); 235 | this.tabPageContainers.Name = "tabPageContainers"; 236 | this.tabPageContainers.Padding = new System.Windows.Forms.Padding(3); 237 | this.tabPageContainers.Size = new System.Drawing.Size(894, 394); 238 | this.tabPageContainers.TabIndex = 2; 239 | this.tabPageContainers.Text = "Containers"; 240 | this.tabPageContainers.UseVisualStyleBackColor = true; 241 | // 242 | // splitContainerContainers 243 | // 244 | this.splitContainerContainers.Dock = System.Windows.Forms.DockStyle.Fill; 245 | this.splitContainerContainers.Location = new System.Drawing.Point(3, 3); 246 | this.splitContainerContainers.Name = "splitContainerContainers"; 247 | // 248 | // splitContainerContainers.Panel1 249 | // 250 | this.splitContainerContainers.Panel1.Controls.Add(this.splitContainerContainerLists); 251 | // 252 | // splitContainerContainers.Panel2 253 | // 254 | this.splitContainerContainers.Panel2.Controls.Add(this.webBrowserContainer); 255 | this.splitContainerContainers.Size = new System.Drawing.Size(888, 388); 256 | this.splitContainerContainers.SplitterDistance = 416; 257 | this.splitContainerContainers.TabIndex = 0; 258 | // 259 | // splitContainerContainerLists 260 | // 261 | this.splitContainerContainerLists.Dock = System.Windows.Forms.DockStyle.Fill; 262 | this.splitContainerContainerLists.Location = new System.Drawing.Point(0, 0); 263 | this.splitContainerContainerLists.Name = "splitContainerContainerLists"; 264 | // 265 | // splitContainerContainerLists.Panel1 266 | // 267 | this.splitContainerContainerLists.Panel1.Controls.Add(this.listBoxContainers); 268 | // 269 | // splitContainerContainerLists.Panel2 270 | // 271 | this.splitContainerContainerLists.Panel2.Controls.Add(this.listBoxContainerContent); 272 | this.splitContainerContainerLists.Size = new System.Drawing.Size(416, 388); 273 | this.splitContainerContainerLists.SplitterDistance = 202; 274 | this.splitContainerContainerLists.TabIndex = 0; 275 | // 276 | // listBoxContainers 277 | // 278 | this.listBoxContainers.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 279 | | System.Windows.Forms.AnchorStyles.Left) 280 | | System.Windows.Forms.AnchorStyles.Right))); 281 | this.listBoxContainers.FormattingEnabled = true; 282 | this.listBoxContainers.HorizontalScrollbar = true; 283 | this.listBoxContainers.Location = new System.Drawing.Point(3, 3); 284 | this.listBoxContainers.Name = "listBoxContainers"; 285 | this.listBoxContainers.Size = new System.Drawing.Size(196, 381); 286 | this.listBoxContainers.TabIndex = 0; 287 | // 288 | // listBoxContainerContent 289 | // 290 | this.listBoxContainerContent.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 291 | | System.Windows.Forms.AnchorStyles.Left) 292 | | System.Windows.Forms.AnchorStyles.Right))); 293 | this.listBoxContainerContent.FormattingEnabled = true; 294 | this.listBoxContainerContent.Location = new System.Drawing.Point(3, 3); 295 | this.listBoxContainerContent.Name = "listBoxContainerContent"; 296 | this.listBoxContainerContent.Size = new System.Drawing.Size(204, 381); 297 | this.listBoxContainerContent.TabIndex = 0; 298 | // 299 | // webBrowserContainer 300 | // 301 | this.webBrowserContainer.Dock = System.Windows.Forms.DockStyle.Fill; 302 | this.webBrowserContainer.Location = new System.Drawing.Point(0, 0); 303 | this.webBrowserContainer.MinimumSize = new System.Drawing.Size(20, 20); 304 | this.webBrowserContainer.Name = "webBrowserContainer"; 305 | this.webBrowserContainer.Size = new System.Drawing.Size(468, 388); 306 | this.webBrowserContainer.TabIndex = 0; 307 | // 308 | // tabPageAnalysis 309 | // 310 | this.tabPageAnalysis.Controls.Add(this.linkLabelGephi); 311 | this.tabPageAnalysis.Controls.Add(this.buttonGraph); 312 | this.tabPageAnalysis.Location = new System.Drawing.Point(4, 22); 313 | this.tabPageAnalysis.Name = "tabPageAnalysis"; 314 | this.tabPageAnalysis.Padding = new System.Windows.Forms.Padding(3); 315 | this.tabPageAnalysis.Size = new System.Drawing.Size(894, 394); 316 | this.tabPageAnalysis.TabIndex = 3; 317 | this.tabPageAnalysis.Text = "Analysis"; 318 | this.tabPageAnalysis.UseVisualStyleBackColor = true; 319 | // 320 | // linkLabelGephi 321 | // 322 | this.linkLabelGephi.AutoSize = true; 323 | this.linkLabelGephi.Location = new System.Drawing.Point(88, 12); 324 | this.linkLabelGephi.Name = "linkLabelGephi"; 325 | this.linkLabelGephi.Size = new System.Drawing.Size(201, 13); 326 | this.linkLabelGephi.TabIndex = 1; 327 | this.linkLabelGephi.TabStop = true; 328 | this.linkLabelGephi.Text = "You can use Gephi to visualize graph.dot"; 329 | this.linkLabelGephi.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelGephi_LinkClicked); 330 | // 331 | // buttonGraph 332 | // 333 | this.buttonGraph.Location = new System.Drawing.Point(7, 7); 334 | this.buttonGraph.Name = "buttonGraph"; 335 | this.buttonGraph.Size = new System.Drawing.Size(75, 23); 336 | this.buttonGraph.TabIndex = 0; 337 | this.buttonGraph.Text = "Graph"; 338 | this.buttonGraph.UseVisualStyleBackColor = true; 339 | this.buttonGraph.Click += new System.EventHandler(this.buttonGraph_Click); 340 | // 341 | // comboBoxLanguage 342 | // 343 | this.comboBoxLanguage.FormattingEnabled = true; 344 | this.comboBoxLanguage.Location = new System.Drawing.Point(157, 14); 345 | this.comboBoxLanguage.Name = "comboBoxLanguage"; 346 | this.comboBoxLanguage.Size = new System.Drawing.Size(58, 21); 347 | this.comboBoxLanguage.TabIndex = 2; 348 | // 349 | // labelLanguage 350 | // 351 | this.labelLanguage.AutoSize = true; 352 | this.labelLanguage.Location = new System.Drawing.Point(93, 17); 353 | this.labelLanguage.Name = "labelLanguage"; 354 | this.labelLanguage.Size = new System.Drawing.Size(58, 13); 355 | this.labelLanguage.TabIndex = 3; 356 | this.labelLanguage.Text = "Language:"; 357 | // 358 | // textBoxFilter 359 | // 360 | this.textBoxFilter.Location = new System.Drawing.Point(259, 14); 361 | this.textBoxFilter.Name = "textBoxFilter"; 362 | this.textBoxFilter.Size = new System.Drawing.Size(272, 20); 363 | this.textBoxFilter.TabIndex = 4; 364 | // 365 | // labelFilter 366 | // 367 | this.labelFilter.AutoSize = true; 368 | this.labelFilter.Location = new System.Drawing.Point(221, 17); 369 | this.labelFilter.Name = "labelFilter"; 370 | this.labelFilter.Size = new System.Drawing.Size(32, 13); 371 | this.labelFilter.TabIndex = 5; 372 | this.labelFilter.Text = "Filter:"; 373 | // 374 | // buttonApply 375 | // 376 | this.buttonApply.Location = new System.Drawing.Point(537, 12); 377 | this.buttonApply.Name = "buttonApply"; 378 | this.buttonApply.Size = new System.Drawing.Size(75, 23); 379 | this.buttonApply.TabIndex = 6; 380 | this.buttonApply.Text = "Apply"; 381 | this.buttonApply.UseVisualStyleBackColor = true; 382 | this.buttonApply.Click += new System.EventHandler(this.buttonApply_Click); 383 | // 384 | // buttonHelp 385 | // 386 | this.buttonHelp.Location = new System.Drawing.Point(618, 12); 387 | this.buttonHelp.Name = "buttonHelp"; 388 | this.buttonHelp.Size = new System.Drawing.Size(75, 23); 389 | this.buttonHelp.TabIndex = 7; 390 | this.buttonHelp.Text = "Help!"; 391 | this.buttonHelp.UseVisualStyleBackColor = true; 392 | this.buttonHelp.Click += new System.EventHandler(this.buttonHelp_Click); 393 | // 394 | // linkBonfireSideChat 395 | // 396 | this.linkBonfireSideChat.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 397 | this.linkBonfireSideChat.AutoSize = true; 398 | this.linkBonfireSideChat.Location = new System.Drawing.Point(766, 9); 399 | this.linkBonfireSideChat.Name = "linkBonfireSideChat"; 400 | this.linkBonfireSideChat.Size = new System.Drawing.Size(148, 13); 401 | this.linkBonfireSideChat.TabIndex = 8; 402 | this.linkBonfireSideChat.TabStop = true; 403 | this.linkBonfireSideChat.Text = "Dedicated to Bonfireside Chat"; 404 | this.linkBonfireSideChat.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkBonfireSideChat_LinkClicked); 405 | // 406 | // linkLabelCreatedBy 407 | // 408 | this.linkLabelCreatedBy.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 409 | this.linkLabelCreatedBy.AutoSize = true; 410 | this.linkLabelCreatedBy.Location = new System.Drawing.Point(780, 25); 411 | this.linkLabelCreatedBy.Name = "linkLabelCreatedBy"; 412 | this.linkLabelCreatedBy.Size = new System.Drawing.Size(134, 13); 413 | this.linkLabelCreatedBy.TabIndex = 9; 414 | this.linkLabelCreatedBy.TabStop = true; 415 | this.linkLabelCreatedBy.Text = "Created by Duncan Ogilvie"; 416 | this.linkLabelCreatedBy.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelCreatedBy_LinkClicked); 417 | // 418 | // DarkSouls3TextViewer 419 | // 420 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 421 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 422 | this.ClientSize = new System.Drawing.Size(926, 473); 423 | this.Controls.Add(this.linkLabelCreatedBy); 424 | this.Controls.Add(this.linkBonfireSideChat); 425 | this.Controls.Add(this.buttonHelp); 426 | this.Controls.Add(this.buttonApply); 427 | this.Controls.Add(this.labelFilter); 428 | this.Controls.Add(this.textBoxFilter); 429 | this.Controls.Add(this.labelLanguage); 430 | this.Controls.Add(this.comboBoxLanguage); 431 | this.Controls.Add(this.tabControlMain); 432 | this.Controls.Add(this.buttonLoadData); 433 | this.Name = "DarkSouls3TextViewer"; 434 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 435 | this.Text = "Dark Souls 3 Text Viewer"; 436 | this.tabControlMain.ResumeLayout(false); 437 | this.tabPageItems.ResumeLayout(false); 438 | this.splitContainerItems.Panel1.ResumeLayout(false); 439 | this.splitContainerItems.Panel2.ResumeLayout(false); 440 | ((System.ComponentModel.ISupportInitialize)(this.splitContainerItems)).EndInit(); 441 | this.splitContainerItems.ResumeLayout(false); 442 | this.tabPageConversations.ResumeLayout(false); 443 | this.splitContainerConversations.Panel1.ResumeLayout(false); 444 | this.splitContainerConversations.Panel2.ResumeLayout(false); 445 | ((System.ComponentModel.ISupportInitialize)(this.splitContainerConversations)).EndInit(); 446 | this.splitContainerConversations.ResumeLayout(false); 447 | this.tabPageContainers.ResumeLayout(false); 448 | this.splitContainerContainers.Panel1.ResumeLayout(false); 449 | this.splitContainerContainers.Panel2.ResumeLayout(false); 450 | ((System.ComponentModel.ISupportInitialize)(this.splitContainerContainers)).EndInit(); 451 | this.splitContainerContainers.ResumeLayout(false); 452 | this.splitContainerContainerLists.Panel1.ResumeLayout(false); 453 | this.splitContainerContainerLists.Panel2.ResumeLayout(false); 454 | ((System.ComponentModel.ISupportInitialize)(this.splitContainerContainerLists)).EndInit(); 455 | this.splitContainerContainerLists.ResumeLayout(false); 456 | this.tabPageAnalysis.ResumeLayout(false); 457 | this.tabPageAnalysis.PerformLayout(); 458 | this.ResumeLayout(false); 459 | this.PerformLayout(); 460 | 461 | } 462 | 463 | #endregion 464 | 465 | private System.Windows.Forms.Button buttonLoadData; 466 | private System.Windows.Forms.TabControl tabControlMain; 467 | private System.Windows.Forms.TabPage tabPageItems; 468 | private System.Windows.Forms.TabPage tabPageConversations; 469 | private System.Windows.Forms.TabPage tabPageContainers; 470 | private System.Windows.Forms.SplitContainer splitContainerItems; 471 | private System.Windows.Forms.ListBox listBoxItems; 472 | private System.Windows.Forms.WebBrowser webBrowserItem; 473 | private System.Windows.Forms.CheckedListBox checkedListBoxItems; 474 | private System.Windows.Forms.ComboBox comboBoxLanguage; 475 | private System.Windows.Forms.Label labelLanguage; 476 | private System.Windows.Forms.SplitContainer splitContainerConversations; 477 | private System.Windows.Forms.ListBox listBoxConversations; 478 | private System.Windows.Forms.WebBrowser webBrowserConversation; 479 | private System.Windows.Forms.SplitContainer splitContainerContainers; 480 | private System.Windows.Forms.SplitContainer splitContainerContainerLists; 481 | private System.Windows.Forms.ListBox listBoxContainers; 482 | private System.Windows.Forms.ListBox listBoxContainerContent; 483 | private System.Windows.Forms.WebBrowser webBrowserContainer; 484 | private System.Windows.Forms.TextBox textBoxFilter; 485 | private System.Windows.Forms.Label labelFilter; 486 | private System.Windows.Forms.Button buttonApply; 487 | private System.Windows.Forms.Button buttonHelp; 488 | private System.Windows.Forms.LinkLabel linkBonfireSideChat; 489 | private System.Windows.Forms.TabPage tabPageAnalysis; 490 | private System.Windows.Forms.Button buttonGraph; 491 | private System.Windows.Forms.LinkLabel linkLabelCreatedBy; 492 | private System.Windows.Forms.LinkLabel linkLabelGephi; 493 | } 494 | } 495 | 496 | -------------------------------------------------------------------------------- /DarkSouls3.TextViewer/TextViewer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Drawing; 4 | using System.Drawing.Text; 5 | using System.Globalization; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Windows.Forms; 9 | using System.IO; 10 | using DarkSouls3.Structures; 11 | 12 | namespace DarkSouls3.TextViewer 13 | { 14 | public partial class DarkSouls3TextViewer : Form 15 | { 16 | private DarkSouls3Text _ds3; 17 | private string _lang; 18 | private ExpressionParser _filter; 19 | private CultureInfo _culture; 20 | 21 | public DarkSouls3TextViewer() 22 | { 23 | InitializeComponent(); 24 | Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); 25 | tabControlMain.TabPages.Remove(tabPageAnalysis); 26 | Load += DarkSouls3TextViewer_Load; 27 | comboBoxLanguage.SelectedIndexChanged += comboBoxLanguage_SelectedIndexChanged; 28 | checkedListBoxItems.SelectedIndexChanged += checkedListBoxItems_SelectedIndexChanged; 29 | listBoxItems.SelectedIndexChanged += listBoxItems_SelectedIndexChanged; 30 | listBoxConversations.SelectedIndexChanged += listBoxConversations_SelectedIndexChanged; 31 | listBoxContainers.SelectedIndexChanged += listBoxContainers_SelectedIndexChanged; 32 | listBoxContainerContent.SelectedIndexChanged += listBoxContainerContent_SelectedIndexChanged; 33 | AcceptButton = buttonApply; 34 | try 35 | { 36 | LoadMatisseProFont(); 37 | } 38 | catch 39 | { 40 | } 41 | 42 | for (var i = 0; i < checkedListBoxItems.Items.Count; i++) 43 | checkedListBoxItems.SetItemChecked(i, true); 44 | 45 | loadData("ds3.json"); 46 | } 47 | 48 | void DarkSouls3TextViewer_Load(object sender, EventArgs e) 49 | { 50 | listBoxConversations.Font = new Font("FOT-Matisse ProN M", 8.25f); 51 | } 52 | 53 | CultureInfo ToCulture(string dsLang) 54 | { 55 | if (dsLang.Length == 5) 56 | { 57 | try 58 | { 59 | return CultureInfo.GetCultureInfo(dsLang.Substring(0, 2) + "-" + dsLang.Substring(3, 2)); 60 | } 61 | catch 62 | { 63 | return CultureInfo.CurrentCulture; 64 | } 65 | } 66 | return CultureInfo.CurrentCulture; 67 | } 68 | 69 | void comboBoxLanguage_SelectedIndexChanged(object sender, EventArgs e) 70 | { 71 | _lang = comboBoxLanguage.SelectedItem.ToString(); 72 | _culture = ToCulture(_lang); 73 | refreshLists(); 74 | } 75 | 76 | void checkedListBoxItems_SelectedIndexChanged(object sender, EventArgs e) 77 | { 78 | updateItemList(); 79 | } 80 | 81 | void listBoxContainers_SelectedIndexChanged(object sender, EventArgs e) 82 | { 83 | var container = (Container) listBoxContainers.SelectedItem; 84 | var data = new List(); 85 | try 86 | { 87 | listBoxContainerContent.DataSource = 88 | container.Content.Where(MatchesFilter) 89 | .Select(it => new ContainerContent(it.Key, it.Value)) 90 | .ToArray(); 91 | } 92 | catch (Exception ex) 93 | { 94 | MessageBox.Show(ex.Message, "Filter error"); 95 | } 96 | } 97 | 98 | private void LoadMatisseProFont() 99 | { 100 | var fontFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FOT-MatissePro-DB.otf"); 101 | if (!File.Exists(fontFile)) 102 | return; 103 | var myFonts = new PrivateFontCollection(); 104 | myFonts.AddFontFile(fontFile); 105 | } 106 | 107 | void refreshLists() 108 | { 109 | updateItemList(); 110 | updateConversationList(); 111 | updateContainerList(); 112 | } 113 | 114 | void updateItemList() 115 | { 116 | webBrowserItem.DocumentText = ""; 117 | var items = new List(); 118 | var lang = _ds3.Languages[_lang]; 119 | foreach (var item in checkedListBoxItems.CheckedItems) 120 | { 121 | switch (item.ToString()) 122 | { 123 | case "Accessory": 124 | items.AddRange(lang.Accessory.Values.Select(i => new ViewerItem("Accessory", i))); 125 | break; 126 | case "Armor": 127 | items.AddRange(lang.Armor.Values.Select(i => new ViewerItem("Armor", i))); 128 | break; 129 | case "Item": 130 | items.AddRange(lang.Item.Values.Select(i => new ViewerItem("Item", i))); 131 | break; 132 | case "Magic": 133 | items.AddRange(lang.Magic.Values.Select(i => new ViewerItem("Magic", i))); 134 | break; 135 | case "Weapon": 136 | items.AddRange(lang.Weapon.Values.Select(i => new ViewerItem("Weapon", i))); 137 | break; 138 | default: 139 | throw new NotImplementedException(); 140 | } 141 | } 142 | try 143 | { 144 | listBoxItems.DataSource = items.Where(MatchesFilter).OrderBy(item => item.Item.Name).ToArray(); 145 | } 146 | catch (Exception ex) 147 | { 148 | MessageBox.Show(ex.Message, "Filter error"); 149 | } 150 | } 151 | 152 | void updateConversationList() 153 | { 154 | webBrowserConversation.DocumentText = ""; 155 | var lang = _ds3.Languages[_lang]; 156 | try 157 | { 158 | listBoxConversations.DataSource = lang.Conversations.Values.Where(MatchesFilter).ToArray(); 159 | } 160 | catch (Exception ex) 161 | { 162 | MessageBox.Show(ex.Message, "Filter error"); 163 | } 164 | } 165 | 166 | void updateContainerList() 167 | { 168 | webBrowserContainer.DocumentText = ""; 169 | var lang = _ds3.Languages[_lang]; 170 | listBoxContainerContent.DataSource = new object[0]; 171 | try 172 | { 173 | listBoxContainers.DataSource = lang.Containers.Values.Where(MatchesFilter).ToArray(); 174 | } 175 | catch (Exception ex) 176 | { 177 | MessageBox.Show(ex.Message, "Filter error"); 178 | } 179 | } 180 | 181 | string EscapeHtml(string s) 182 | { 183 | return s.Replace("&", "&") 184 | .Replace("<", "<") 185 | .Replace(">", ">") 186 | .Replace("\"", """) 187 | .Replace("\n", "
"); 188 | } 189 | 190 | void listBoxContainerContent_SelectedIndexChanged(object sender, EventArgs e) 191 | { 192 | var item = (ContainerContent) listBoxContainerContent.SelectedItem; 193 | var template = @" 194 | 195 | 198 | 199 | 200 |

{0}

201 |

{1}

202 | "; 203 | webBrowserContainer.DocumentText = string.Format(template, 204 | item.Id, 205 | EscapeHtml(item.Text)); 206 | } 207 | 208 | void listBoxConversations_SelectedIndexChanged(object sender, EventArgs e) 209 | { 210 | var item = (Conversation) listBoxConversations.SelectedItem; 211 | var template = @" 212 | 213 | 217 | 218 | 219 |

{0}

220 |

{1}

221 |

{{{0}}} dlc{2}

222 | "; 223 | webBrowserConversation.DocumentText = string.Format(template, 224 | item.Id, 225 | EscapeHtml(item.Text), 226 | item.Dlc); 227 | } 228 | 229 | void listBoxItems_SelectedIndexChanged(object sender, EventArgs e) 230 | { 231 | var item = (ViewerItem) listBoxItems.SelectedItem; 232 | var template = @" 233 | 234 | 238 | 239 | 240 |

{0}

241 |

{1}

242 |

{2}

243 |

{{{3}}} {{{4}}} dlc{5}

244 | "; 245 | webBrowserItem.DocumentText = string.Format(template, 246 | item, 247 | EscapeHtml(item.Item.Description), 248 | EscapeHtml(item.Item.Knowledge), 249 | item.Parent, 250 | item.Item.Id, 251 | item.Item.Dlc); 252 | } 253 | 254 | private void enableControls(bool enabled) 255 | { 256 | tabControlMain.Enabled = enabled; 257 | comboBoxLanguage.Enabled = enabled; 258 | textBoxFilter.Enabled = enabled; 259 | buttonApply.Enabled = enabled; 260 | buttonHelp.Enabled = enabled; 261 | } 262 | 263 | private bool loadData(string filename) 264 | { 265 | try 266 | { 267 | _ds3 = JSONHelper.Deserialize(File.ReadAllText(filename, new UTF8Encoding(false))); 268 | enableControls(true); 269 | } 270 | catch 271 | { 272 | enableControls(false); 273 | return false; 274 | } 275 | comboBoxLanguage.Items.AddRange(_ds3.Languages.Keys.ToArray()); 276 | if (comboBoxLanguage.Items.Count > 1) 277 | comboBoxLanguage.SelectedIndex = 1; //engUS 278 | return true; 279 | } 280 | 281 | private void buttonLoadData_Click(object sender, EventArgs e) 282 | { 283 | var dialog = new OpenFileDialog 284 | { 285 | Filter = "JSON Files (*.json)|*.json", 286 | FileName = "ds3.json", 287 | InitialDirectory = AppDomain.CurrentDomain.BaseDirectory, 288 | Title = "Select JSON" 289 | }; 290 | if (dialog.ShowDialog() != DialogResult.OK) 291 | return; 292 | if (loadData(dialog.FileName)) 293 | MessageBox.Show("Data loaded!", "OK", MessageBoxButtons.OK, MessageBoxIcon.Information); 294 | else 295 | MessageBox.Show("Failed to load data...", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 296 | } 297 | 298 | bool MatchesFilter(string text, string filter) 299 | { 300 | return _culture.CompareInfo.IndexOf(text, filter, CompareOptions.IgnoreCase) >= 0; 301 | } 302 | 303 | bool MatchesFilter(string text) 304 | { 305 | if (_filter == null) 306 | return true; 307 | return _filter.Calculate(filter => MatchesFilter(text, filter)); 308 | } 309 | 310 | bool MatchesFilter(GenericItem item, string parent = "") 311 | { 312 | var builder = new StringBuilder(); 313 | if (parent.Length > 0) 314 | builder.AppendFormat("{{{0}}}", parent); 315 | builder.AppendFormat("{{{0}}}", item.Id); 316 | builder.AppendFormat("dlc{0}", item.Dlc); 317 | builder.AppendLine(); 318 | builder.Append(item.Name.Replace("\n", " ")); 319 | builder.Append(item.Description.Replace("\n", " ")); 320 | builder.Append(item.Knowledge.Replace("\n", " ")); 321 | return MatchesFilter(builder.ToString()); 322 | } 323 | 324 | bool MatchesFilter(ViewerItem item) 325 | { 326 | return MatchesFilter(item.Item, item.Parent); 327 | } 328 | 329 | bool MatchesFilter(Conversation conversation) 330 | { 331 | var builder = new StringBuilder(); 332 | builder.AppendFormat("{{{0}}}", conversation.Id); 333 | builder.AppendFormat("dlc{0}", conversation.Dlc); 334 | builder.AppendLine(); 335 | builder.Append(conversation.Text.Replace("\n", " ")); 336 | return MatchesFilter(builder.ToString()); 337 | } 338 | 339 | bool MatchesFilter(KeyValuePair it) 340 | { 341 | var builder = new StringBuilder(); 342 | builder.AppendFormat("{{{0}}}", it.Key); 343 | builder.AppendLine(); 344 | builder.Append(it.Value.Replace("\n", " ")); 345 | return MatchesFilter(builder.ToString()); 346 | } 347 | 348 | bool MatchesFilter(Container container) 349 | { 350 | foreach (var c in container.Content) 351 | if (MatchesFilter(c)) 352 | return true; 353 | return false; 354 | } 355 | 356 | private void buttonApply_Click(object sender, EventArgs e) 357 | { 358 | try 359 | { 360 | _filter = new ExpressionParser(textBoxFilter.Text); 361 | _filter.Calculate(str => true); 362 | } 363 | catch (Exception ex) 364 | { 365 | MessageBox.Show(ex.Message, "Invalid filter!", MessageBoxButtons.OK, MessageBoxIcon.Error); 366 | return; 367 | } 368 | refreshLists(); 369 | } 370 | 371 | private void buttonHelp_Click(object sender, EventArgs e) 372 | { 373 | MessageBox.Show(@"Dark Souls 3 Text Viewer 374 | This tool helps you view all in-game text of Dark Souls 3. 375 | 376 | Filters 377 | You can use filters to find relevant information. Text 378 | is compared case-insensitive and you can combine 379 | multiple filters with operators & (AND) | (OR) ~ (NOT). 380 | 381 | - Identifiers can be found with '{id}' 382 | - DLC version can be found with 'dlcN' 383 | - Item type can be found with '{type}' 384 | 385 | Operators are evaluated in the following order: 386 | 387 | 1. Parentheses 388 | 2. NOT 389 | 3. AND 390 | 4. OR 391 | 392 | Examples 393 | Filter: aldrich|deep 394 | Effect: Everything containing 'aldrich' or 'deep' 395 | 396 | Filter: god&swamp 397 | Effect: Everything containing 'god' and 'swamp' 398 | 399 | Filter: aldrich&deep|children 400 | Effect: With braces: aldrich&(deep|children) 401 | 402 | Filter: {1200} 403 | Effect: Matches text with ID 1200 404 | 405 | Filter: magic&~{Magic} 406 | Effect: All non-{Magic} items containing 'magic'", "Help"); 407 | } 408 | 409 | private void linkBonfireSideChat_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 410 | { 411 | System.Diagnostics.Process.Start("http://www.bonfireside.chat"); 412 | } 413 | 414 | private void buttonGraph_Click(object sender, EventArgs e) 415 | { 416 | string[] blacklist; 417 | var file = "blacklist_" + comboBoxLanguage.SelectedItem + ".txt"; 418 | try 419 | { 420 | blacklist = File.ReadAllLines(file); 421 | } 422 | catch 423 | { 424 | MessageBox.Show("Could not find " + file); 425 | blacklist = null; 426 | } 427 | var analysis = new Analysis(blacklist); 428 | var items = new List(); 429 | var builder = new StringBuilder(); 430 | foreach (var it in listBoxItems.Items) 431 | { 432 | builder.Clear(); 433 | var item = (ViewerItem) it; 434 | builder.AppendLine(item.Item.Name); 435 | builder.AppendLine(item.Item.Description); 436 | builder.AppendLine(item.Item.Knowledge); 437 | items.Add(builder.ToString().ToLower(_culture)); 438 | } 439 | MessageBox.Show("Built items!"); 440 | foreach (var item in items) 441 | analysis.AddText(item); 442 | MessageBox.Show("Built nodes!"); 443 | analysis.Prepare(); 444 | MessageBox.Show("Prepared matrix!"); 445 | foreach(var item in items) 446 | analysis.ConnectText(item); 447 | MessageBox.Show("Connected items!"); 448 | File.WriteAllText("graph.dot", analysis.ToDot()); 449 | MessageBox.Show("Done!"); 450 | } 451 | 452 | private void linkLabelCreatedBy_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 453 | { 454 | System.Diagnostics.Process.Start("https://github.com/mrexodia/DarkSouls3.TextViewer"); 455 | } 456 | 457 | private void linkLabelGephi_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 458 | { 459 | System.Diagnostics.Process.Start("https://gephi.org"); 460 | } 461 | } 462 | 463 | public class ContainerContent 464 | { 465 | public string Id; 466 | public string Text; 467 | 468 | public ContainerContent(string id, string text) 469 | { 470 | Id = id; 471 | Text = text; 472 | } 473 | 474 | public override string ToString() 475 | { 476 | var split = Text.Split('\n')[0].Split(' '); 477 | var quote = new StringBuilder(); 478 | quote.Append(split[0]); 479 | for (var i = 1; i < split.Length && quote.Length < 20; i++) 480 | { 481 | quote.Append(' '); 482 | quote.Append(split[i]); 483 | } 484 | if (quote.Length < Text.Length && !quote.ToString().EndsWith("...")) 485 | quote.Append("..."); 486 | return string.Format("{0} \"{1}\"", Id, quote); 487 | } 488 | } 489 | 490 | public class ViewerItem 491 | { 492 | public string Parent; 493 | public GenericItem Item; 494 | 495 | public ViewerItem(string parent, GenericItem item) 496 | { 497 | Parent = parent; 498 | Item = item; 499 | } 500 | 501 | public override string ToString() 502 | { 503 | return Item.ToString(); 504 | } 505 | } 506 | } 507 | -------------------------------------------------------------------------------- /DarkSouls3.TextViewer/TextViewer.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Duncan Ogilvie 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dark Souls 3 Text Viewer 2 | 3 | [![Build status](https://ci.appveyor.com/api/projects/status/o21nv9fo35iuqjy2?svg=true)](https://ci.appveyor.com/project/mrexodia/darksouls3-textviewer) 4 | 5 | This tool helps you view all in-game text of [Dark Souls 3](https://www.darksouls3.com). 6 | 7 | **Disclaimer**: The contents of the `ds3.json` file are derived from the Dark Souls 3 game files owned by [From Software](http://www.fromsoftware.jp). They are extracted for research purposes and there will be no commercial usage. 8 | 9 | ![screenshot](https://i.imgur.com/E0XuU2Y.png) 10 | 11 | ## Download 12 | 13 | You can find a snapshot of the latest commit [here](https://ci.appveyor.com/project/mrexodia/darksouls3-textviewer/build/artifacts). Signed, more stable versions can be found [here](https://github.com/mrexodia/DarkSouls3.TextViewer/releases) 14 | 15 | ## Filters 16 | 17 | You can use filters to find relevant information. Text is compared case-insensitive and you can combine multiple filters with operators & (AND) | (OR) ~ (NOT). 18 | 19 | - Identifiers can be found with '{id}' 20 | - DLC version can be found with 'dlcN' 21 | - Item type can be found with '{type}' 22 | 23 | Operators are evaluated in the following order: 24 | 25 | 1. Parentheses 26 | 2. NOT 27 | 3. AND 28 | 4. OR 29 | 30 | ``` 31 | a|(b&c|~d) = a|((b&c)|(~d)) 32 | ``` 33 | 34 | ### Examples 35 | 36 | - Filter: `aldrich|deep` 37 | - Effect: Everything containing 'aldrich' or 'deep' 38 | 39 | 40 | - Filter: `god&swamp` 41 | - Effect: Everything containing 'god' and 'swamp' 42 | 43 | 44 | - Filter: `aldrich&deep|children` 45 | - Effect: With braces: aldrich&(deep|children) 46 | 47 | 48 | - Filter: `{1200}` 49 | - Effect: Matches text with ID 1200 50 | 51 | 52 | - Filter: `magic&~{Magic}` 53 | - Effect: All non-{Magic} items containing 'magic' -------------------------------------------------------------------------------- /blacklist_engUS.txt: -------------------------------------------------------------------------------- 1 | after 2 | again 3 | against 4 | all 5 | along 6 | also 7 | and 8 | any 9 | are 10 | became 11 | become 12 | been 13 | boost 14 | boosts 15 | but 16 | can 17 | day 18 | def 19 | did 20 | else 21 | enter 22 | even 23 | ever 24 | few 25 | for 26 | from 27 | great 28 | had 29 | has 30 | have 31 | her 32 | hers 33 | him 34 | his 35 | increases 36 | instantly 37 | into 38 | its 39 | know 40 | known 41 | led 42 | like 43 | made 44 | many 45 | more 46 | most 47 | much 48 | not 49 | now 50 | once 51 | one 52 | only 53 | other 54 | out 55 | over 56 | remain 57 | remains 58 | said 59 | say 60 | see 61 | she 62 | since 63 | skill 64 | still 65 | tell 66 | tells 67 | than 68 | that 69 | the 70 | their 71 | them 72 | then 73 | there 74 | these 75 | they 76 | this 77 | those 78 | though 79 | thus 80 | too 81 | took 82 | until 83 | upon 84 | use 85 | used 86 | very 87 | was 88 | were 89 | what 90 | when 91 | where 92 | which 93 | while 94 | who 95 | whom 96 | will 97 | with 98 | wore 99 | would 100 | yet -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # How to extract the required files from the game? 2 | 3 | 1. Get [BinderTool](https://github.com/Atvaark/BinderTool) and put it in your `PATH` environment variable. 4 | 2. `BinderTool.exe Data1.bdt data`. 5 | 3. Copy the folders from `data\msg` in a separate folder. 6 | 4. Run `extractbnd.bat` from that folder. 7 | 5. Run `extractfmg.bat` from that folder. 8 | 6. Run `deletefmg.bat` from that folder. 9 | 7. Run `DarkSouls3.Preprocessor` to properly extract the textual data to JSON. -------------------------------------------------------------------------------- /docs/deletefmg.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | cd INTERROOT_win64 3 | for /R %%i in (*.fmg) do del "%%i" -------------------------------------------------------------------------------- /docs/extractbnd.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | for /r %%i in (*.msgbnd) do BinderTool.exe "%%i" . -------------------------------------------------------------------------------- /docs/extractfmg.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | cd INTERROOT_win64 3 | for /R %%i in (*.fmg) do BinderTool.exe "%%i" -------------------------------------------------------------------------------- /release.bat: -------------------------------------------------------------------------------- 1 | rmdir /S /Q release 2 | mkdir release 3 | copy DarkSouls3.TextViewer\bin\Release\DarkSouls3.TextViewer.exe release\ 4 | copy DarkSouls3.TextViewer\bin\Release\DarkSouls3.Structures.dll release\ 5 | copy ds3.json release\ --------------------------------------------------------------------------------