Elin Decompiled Documentation EA 23.286 Nightly Patch 1
Loading...
Searching...
No Matches
ModPackage.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Linq;
5using NPOI.SS.UserModel;
6using NPOI.XSSF.UserModel;
7using UnityEngine;
8
9public class ModPackage : EMod
10{
11 public struct SheetIndex
12 {
13 public int dest;
14
15 public int old;
16 }
17
18 public IReadOnlyList<FileInfo> ParseTalkText(DirectoryInfo dir)
19 {
20 List<FileInfo> list = new List<FileInfo>();
21 FileInfo[] files = dir.GetFiles("*.xlsx", SearchOption.TopDirectoryOnly);
22 foreach (FileInfo fileInfo in files)
23 {
24 ExcelData excelData = new ExcelData(fileInfo.FullName);
25 TalkText.modList.Add(excelData);
26 talkTexts.Add(excelData);
27 list.Add(fileInfo);
28 }
29 if (list.Count > 0)
30 {
31 Debug.Log($"TalkText: {talkTexts.Count}");
32 }
33 return list;
34 }
35
36 public IReadOnlyList<FileInfo> ParseMap(DirectoryInfo dir, bool addToList = true)
37 {
38 List<FileInfo> list = new List<FileInfo>();
39 FileInfo[] files = dir.GetFiles("*.z", SearchOption.TopDirectoryOnly);
40 foreach (FileInfo fileInfo in files)
41 {
42 string key = Path.ChangeExtension(fileInfo.Name, null);
43 if (addToList)
44 {
45 MOD.listMaps.Add(fileInfo);
46 }
47 maps[key] = fileInfo;
48 list.Add(fileInfo);
49 }
50 if (list.Count > 0)
51 {
52 Debug.Log($"Map: {maps.Count}");
53 }
54 return list;
55 }
56
57 public IReadOnlyList<FileInfo> ParseMapPiece(DirectoryInfo dir, bool addToList = true)
58 {
59 List<FileInfo> list = new List<FileInfo>();
60 FileInfo[] files = dir.GetFiles("*.mp", SearchOption.TopDirectoryOnly);
61 foreach (FileInfo fileInfo in files)
62 {
63 string key = Path.ChangeExtension(fileInfo.Name, null);
64 if (addToList)
65 {
66 MOD.listPartialMaps.Add(fileInfo);
67 }
68 partialMaps[key] = fileInfo;
69 list.Add(fileInfo);
70 }
71 if (list.Count > 0)
72 {
73 Debug.Log($"PartialMap: {partialMaps.Count}");
74 }
75 return list;
76 }
77
78 public IReadOnlyList<FileInfo> ParseTextureReplace(DirectoryInfo dir)
79 {
80 List<FileInfo> list = new List<FileInfo>();
81 FileInfo[] files = dir.GetFiles("*.png", SearchOption.TopDirectoryOnly);
82 foreach (FileInfo fileInfo in files)
83 {
84 string key = Path.ChangeExtension(fileInfo.Name, null);
85 textureReplaces[key] = fileInfo;
86 list.Add(fileInfo);
87 }
88 if (list.Count > 0)
89 {
90 Debug.Log($"Texture Replace: {textureReplaces.Count}");
91 }
92 return list;
93 }
94
95 public IReadOnlyList<FileInfo> ParseTexture(DirectoryInfo dir)
96 {
97 List<FileInfo> list = new List<FileInfo>();
98 FileInfo[] files = dir.GetFiles("*.png", SearchOption.AllDirectories);
99 foreach (FileInfo fileInfo in files)
100 {
101 string key = Path.ChangeExtension(Path.GetRelativePath(dir.FullName, fileInfo.FullName).NormalizePath(), null);
102 string text = Path.ChangeExtension(fileInfo.FullName, null);
103 Dictionary<string, string> dictModItems = SpriteReplacer.dictModItems;
104 string value = (textures[key] = text);
105 dictModItems[key] = value;
106 list.Add(fileInfo);
107 }
108 if (list.Count > 0)
109 {
110 Debug.Log($"Texture: {textures.Count}");
111 }
112 return list;
113 }
114
115 public IReadOnlyList<FileInfo> ParsePortrait(DirectoryInfo dir)
116 {
117 List<FileInfo> list = new List<FileInfo>();
118 FileInfo[] files = dir.GetFiles("*.png", SearchOption.TopDirectoryOnly);
119 foreach (FileInfo fileInfo in files)
120 {
121 string name = fileInfo.Name;
122 if (name.StartsWith("BG_", StringComparison.Ordinal))
123 {
124 Portrait.modPortraitBGs.Add(fileInfo);
125 }
126 else if (name.StartsWith("BGF_", StringComparison.Ordinal))
127 {
128 Portrait.modPortraitBGFs.Add(fileInfo);
129 }
130 else if (name.EndsWith("-full.png", StringComparison.Ordinal))
131 {
132 Portrait.modFull.Add(fileInfo);
133 }
134 else if (name.EndsWith("-overlay.png", StringComparison.Ordinal))
135 {
136 Portrait.modOverlays.Add(fileInfo);
137 }
138 else
139 {
140 Portrait.modPortraits.Add(fileInfo);
141 }
142 Portrait.allIds.Add(name);
143 portraits[name] = fileInfo;
144 list.Add(fileInfo);
145 }
146 if (list.Count > 0)
147 {
148 Debug.Log($"Portrait: {portraits.Count}");
149 }
150 return list;
151 }
152
153 public void ParseLangMod(DirectoryInfo dir)
154 {
155 if (Mapping == null)
156 {
157 Mapping = new FileMapping(dir.Parent);
158 }
159 Mapping.RebuildLangModMapping(EClass.core.config?.lang ?? EClass.core.debug.langCode.ToString());
160 Lang.excelDialog = null;
161 Debug.Log("LangMod: " + string.Join(", ", Mapping.OrderedLangMods));
162 if (Mapping.SourceSheets.Count > 0)
163 {
164 Debug.Log($"Source Sheets: {Mapping.SourceSheets.Count}, {Mapping.SourceLangMod}");
165 }
166 }
167
168 public IReadOnlyList<FileInfo> ParseSound(DirectoryInfo dir)
169 {
170 List<FileInfo> list = new List<FileInfo>();
171 FileInfo[] files = dir.GetFiles("*.*", SearchOption.AllDirectories);
172 foreach (FileInfo fileInfo in files)
173 {
174 if (ModUtil.GetAudioType(fileInfo.Extension) != 0)
175 {
176 string key = Path.ChangeExtension(Path.GetRelativePath(dir.FullName, fileInfo.FullName).NormalizePath(), null);
177 Dictionary<string, FileInfo> dictionary = MOD.sounds;
178 FileInfo value = (sounds[key] = fileInfo);
179 dictionary[key] = value;
180 list.Add(fileInfo);
181 }
182 }
183 if (list.Count > 0)
184 {
185 Debug.Log($"Sound: {sounds.Count}");
186 }
187 int num = sounds.Keys.Count((string k) => k.StartsWith("BGM/"));
188 if (num > 0)
189 {
190 Debug.Log($"BGM: {num}");
191 }
192 return list;
193 }
194
195 public SortedDictionary<string, string> ExportSourceLocalizations()
196 {
197 SortedDictionary<string, string> sortedDictionary = new SortedDictionary<string, string>();
198 try
199 {
200 foreach (SourceData.BaseRow sourceRow in sourceRows)
201 {
202 foreach (KeyValuePair<string, string> item in sourceRow.ExportTexts(sourceRow.UseAlias ? "alias" : "id"))
203 {
204 item.Deconstruct(out var key, out var value);
205 string key2 = key;
206 string value2 = value;
207 sortedDictionary[key2] = value2;
208 }
209 }
210 }
211 catch (Exception arg)
212 {
213 Debug.LogError($"#source failed to export localization for {title}/{id}\n{arg}");
214 }
215 return sortedDictionary;
216 }
217
218 public void ImportSourceLocalizations(IReadOnlyDictionary<string, string> texts)
219 {
220 foreach (SourceData.BaseRow sourceRow in sourceRows)
221 {
222 sourceRow.ImportTexts(texts, sourceRow.UseAlias ? "alias" : "id");
223 }
224 }
225
226 public void ClearSourceLocalizations(string lang)
227 {
228 Mapping.RebuildLangModMapping(lang);
229 for (FileInfo fileInfo = Mapping.RelocateFile("SourceLocalization.json"); fileInfo != null; fileInfo = Mapping.RelocateFile("SourceLocalization.json"))
230 {
231 fileInfo.Delete();
232 Debug.Log("#source localization deleted " + fileInfo.ShortPath());
233 }
234 Mapping.RebuildLangModMapping(Lang.langCode);
235 }
236
237 public void AddOrUpdateLang(DirectoryInfo dir)
238 {
239 Core core = EClass.core;
240 SourceManager sources = core.sources;
241 DirectoryInfo[] directories = dir.GetDirectories();
242 foreach (DirectoryInfo directoryInfo in directories)
243 {
244 if (!directoryInfo.Name.StartsWith("_") && !TryAddLang(directoryInfo, isNew: false))
245 {
246 Debug.Log("Generating Language Mod Contents:" + directoryInfo.FullName);
247 IO.CopyDir(CorePath.packageCore + "Lang/EN", directoryInfo.FullName);
248 Directory.CreateDirectory(directoryInfo.FullName + "/Dialog");
249 IO.CopyDir(CorePath.packageCore + "Lang/_Dialog", directoryInfo.FullName + "/Dialog");
250 sources.ExportSourceTexts(directoryInfo.FullName + "/Game");
251 IO.Copy(CorePath.packageCore + "Lang/lang.ini", directoryInfo.FullName + "/");
252 TryAddLang(directoryInfo, isNew: true);
253 }
254 }
255 bool TryAddLang(DirectoryInfo dirLang, bool isNew)
256 {
257 string name = dirLang.Name;
258 FileInfo[] files = dirLang.GetFiles();
259 foreach (FileInfo fileInfo in files)
260 {
261 if (fileInfo.Name == "lang.ini")
262 {
263 LangSetting langSetting = new LangSetting(fileInfo.FullName)
264 {
265 id = name,
266 dir = dirLang.FullName + "/"
267 };
268 if (isNew)
269 {
270 langSetting.SetVersion();
271 }
272 else if ((Application.isEditor || Lang.runUpdate) && !Lang.IsBuiltin(dirLang.Name) && langSetting.GetVersion() < core.version.GetInt())
273 {
274 sources.Init();
275 Log.system = "Updated Language Files:" + Environment.NewLine + Environment.NewLine;
276 Debug.Log("Updating Language:" + langSetting.name + "/" + langSetting.GetVersion() + "/" + core.version.GetInt());
277 string text = dirLang.FullName + "/Game";
278 Directory.Move(text, text + "_temp");
279 sources.ExportSourceTexts(text);
280 sources.UpdateSourceTexts(text);
281 IO.DeleteDirectory(text + "_temp");
282 text = dirLang.FullName + "/Dialog";
283 Directory.Move(text, text + "_temp");
284 IO.CopyDir(CorePath.packageCore + "Lang/_Dialog", text);
285 UpdateDialogs(new DirectoryInfo(text), text + "_temp");
286 IO.DeleteDirectory(text + "_temp");
287 text = dirLang.FullName + "/Data";
288 IO.CopyDir(text, text + "_temp");
289 IO.Copy(CorePath.packageCore + "Lang/EN/Data/god_talk.xlsx", text);
290 IO.Copy(CorePath.packageCore + "Lang/EN/Data/chara_talk.xlsx", text);
291 UpdateTalks(new DirectoryInfo(text), text + "_temp");
292 IO.DeleteDirectory(text + "_temp");
293 langSetting.SetVersion();
294 IO.SaveText(dirLang.FullName + "/update.txt", Log.system);
295 }
296 MOD.langs[name] = langSetting;
297 return true;
298 }
299 }
300 return false;
301 }
302 }
303
304 public void UpdateDialogs(DirectoryInfo dir, string dirTemp)
305 {
306 DirectoryInfo[] directories = dir.GetDirectories();
307 foreach (DirectoryInfo directoryInfo in directories)
308 {
309 UpdateDialogs(directoryInfo, dirTemp + "/" + directoryInfo.Name);
310 }
311 FileInfo[] files = dir.GetFiles();
312 foreach (FileInfo fileInfo in files)
313 {
314 if (fileInfo.Name.EndsWith("xlsx"))
315 {
316 UpdateExcelBook(fileInfo, dirTemp, updateOnlyText: true);
317 }
318 }
319 }
320
321 public void UpdateTalks(DirectoryInfo dir, string dirTemp)
322 {
323 FileInfo[] files = dir.GetFiles();
324 foreach (FileInfo fileInfo in files)
325 {
326 if (fileInfo.Name == "god_talk.xlsx" || fileInfo.Name == "chara_talk.xlsx")
327 {
328 UpdateExcelBook(fileInfo, dirTemp, updateOnlyText: false);
329 }
330 }
331 }
332
333 public void UpdateExcelBook(FileInfo f, string dirTemp, bool updateOnlyText)
334 {
335 string path = dirTemp + "/" + f.Name;
336 if (!File.Exists(path))
337 {
338 return;
339 }
340 XSSFWorkbook xSSFWorkbook;
341 using (FileStream @is = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
342 {
343 xSSFWorkbook = new XSSFWorkbook((Stream)@is);
344 }
345 XSSFWorkbook xSSFWorkbook2;
346 using (FileStream is2 = File.Open(f.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
347 {
348 xSSFWorkbook2 = new XSSFWorkbook((Stream)is2);
349 }
350 for (int i = 0; i < xSSFWorkbook2.NumberOfSheets; i++)
351 {
352 ISheet sheetAt = xSSFWorkbook2.GetSheetAt(i);
353 ISheet sheet = xSSFWorkbook.GetSheet(sheetAt.SheetName);
354 if (sheet == null)
355 {
356 Log.system = Log.system + "Old sheet not found:" + sheetAt.SheetName + Environment.NewLine;
357 continue;
358 }
359 int num = UpdateExcelSheet(sheetAt, sheet, updateOnlyText);
360 Log.system = Log.system + ((num == 0) ? "(No Changes) " : "(Updated) ") + f.FullName + "(" + sheetAt.SheetName + ")" + Environment.NewLine;
361 if (num != 0)
362 {
363 Log.system = Log.system + num + Environment.NewLine;
364 }
365 Log.system += Environment.NewLine;
366 }
367 using FileStream stream = new FileStream(f.FullName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
368 xSSFWorkbook2.Write(stream);
369 }
370
371 public int UpdateExcelSheet(ISheet destSheet, ISheet oldSheet, bool updateOnlytext)
372 {
373 Dictionary<string, string[]> dictionary = new Dictionary<string, string[]>();
374 int num = 0;
375 int num2 = 0;
376 int num3 = 10;
377 IRow row2 = destSheet.GetRow(0);
378 IRow row3 = oldSheet.GetRow(0);
379 List<SheetIndex> list = new List<SheetIndex>();
380 int cellnum = FindField(row2, "id");
381 int cellnum2 = FindField(row3, "id");
382 for (int i = 0; i < row2.LastCellNum; i++)
383 {
384 ICell cell = row2.GetCell(i);
385 if (cell == null)
386 {
387 break;
388 }
389 string stringCellValue = cell.StringCellValue;
390 if (stringCellValue == "id" || (updateOnlytext && stringCellValue != "text"))
391 {
392 continue;
393 }
394 for (int j = 0; j < row3.LastCellNum; j++)
395 {
396 cell = row3.GetCell(j);
397 if (cell == null)
398 {
399 break;
400 }
401 if (cell.StringCellValue == stringCellValue)
402 {
403 list.Add(new SheetIndex
404 {
405 dest = i,
406 old = j
407 });
408 Debug.Log(destSheet.SheetName + "/" + stringCellValue + "/" + i + "/" + j);
409 break;
410 }
411 }
412 }
413 for (int k = 2; k <= oldSheet.LastRowNum; k++)
414 {
415 IRow row4 = oldSheet.GetRow(k);
416 if (row4 == null)
417 {
418 if (num2 >= num3)
419 {
420 break;
421 }
422 num2++;
423 continue;
424 }
425 num2 = 0;
426 ICell cell2 = row4.GetCell(cellnum2);
427 if (cell2 == null)
428 {
429 continue;
430 }
431 string text = ((cell2.CellType == CellType.Numeric) ? cell2.NumericCellValue.ToString() : cell2.StringCellValue);
432 if (text.IsEmpty())
433 {
434 continue;
435 }
436 string[] array = new string[list.Count];
437 for (int l = 0; l < list.Count; l++)
438 {
439 ICell cell3 = row4.GetCell(list[l].old);
440 if (cell3 != null)
441 {
442 string stringCellValue2 = cell3.StringCellValue;
443 if (!stringCellValue2.IsEmpty())
444 {
445 array[l] = stringCellValue2;
446 }
447 }
448 }
449 dictionary.Add(text, array);
450 }
451 num2 = 0;
452 for (int m = 2; m <= destSheet.LastRowNum; m++)
453 {
454 IRow row5 = destSheet.GetRow(m);
455 if (row5 == null)
456 {
457 if (num2 >= num3)
458 {
459 break;
460 }
461 num2++;
462 continue;
463 }
464 num2 = 0;
465 ICell cell4 = row5.GetCell(cellnum);
466 if (cell4 == null)
467 {
468 continue;
469 }
470 string text2 = ((cell4.CellType == CellType.Numeric) ? cell4.NumericCellValue.ToString() : cell4.StringCellValue);
471 if (text2.IsEmpty() || !dictionary.ContainsKey(text2))
472 {
473 continue;
474 }
475 string[] array2 = dictionary[text2];
476 for (int n = 0; n < list.Count; n++)
477 {
478 ICell cell5 = row5.GetCell(list[n].dest) ?? row5.CreateCell(list[n].dest, CellType.String);
479 if (cell5 != null)
480 {
481 cell5.SetCellValue(array2[n]);
482 cell5.SetCellType(CellType.String);
483 cell5.SetAsActiveCell();
484 num++;
485 }
486 }
487 }
488 return num;
489 static int FindField(IRow row, string id)
490 {
491 for (int num4 = 0; num4 < row.LastCellNum; num4++)
492 {
493 ICell cell6 = row.GetCell(num4);
494 if (cell6 == null)
495 {
496 break;
497 }
498 if (cell6.StringCellValue == id)
499 {
500 return num4;
501 }
502 }
503 return -1;
504 }
505 }
506}
$
Definition: ModManager.cs:85
string lang
Definition: CoreConfig.cs:585
Lang.LangCode langCode
Definition: CoreDebug.cs:114
static string packageCore
Definition: CorePath.cs:161
Definition: Core.cs:14
SourceManager sources
Definition: Core.cs:33
CoreDebug debug
Definition: Core.cs:31
CoreConfig config
Definition: Core.cs:70
Definition: EClass.cs:6
static Core core
Definition: EClass.cs:7
string name
Definition: LangSetting.cs:24
void SetVersion()
Definition: LangSetting.cs:114
int GetVersion()
Definition: LangSetting.cs:100
Definition: Lang.cs:7
static bool IsBuiltin(string id)
Definition: Lang.cs:65
static bool runUpdate
Definition: Lang.cs:25
static string langCode
Definition: Lang.cs:29
Definition: Log.cs:4
static string system
Definition: Log.cs:5
Definition: MOD.cs:7
static Dictionary< string, LangSetting > langs
Definition: MOD.cs:8
static Dictionary< string, FileInfo > sounds
Definition: MOD.cs:24
static List< FileInfo > listMaps
Definition: MOD.cs:20
static List< FileInfo > listPartialMaps
Definition: MOD.cs:22
void Add(FileInfo fi, string path=null, string prefix="")
Definition: ModItemList.cs:85
IReadOnlyList< FileInfo > ParseTalkText(DirectoryInfo dir)
Definition: ModPackage.cs:18
void UpdateDialogs(DirectoryInfo dir, string dirTemp)
Definition: ModPackage.cs:304
void ClearSourceLocalizations(string lang)
Definition: ModPackage.cs:226
SortedDictionary< string, string > ExportSourceLocalizations()
Definition: ModPackage.cs:195
void ParseLangMod(DirectoryInfo dir)
Definition: ModPackage.cs:153
void UpdateExcelBook(FileInfo f, string dirTemp, bool updateOnlyText)
Definition: ModPackage.cs:333
IReadOnlyList< FileInfo > ParseTexture(DirectoryInfo dir)
Definition: ModPackage.cs:95
void AddOrUpdateLang(DirectoryInfo dir)
Definition: ModPackage.cs:237
IReadOnlyList< FileInfo > ParseMapPiece(DirectoryInfo dir, bool addToList=true)
Definition: ModPackage.cs:57
void UpdateTalks(DirectoryInfo dir, string dirTemp)
Definition: ModPackage.cs:321
IReadOnlyList< FileInfo > ParseTextureReplace(DirectoryInfo dir)
Definition: ModPackage.cs:78
IReadOnlyList< FileInfo > ParsePortrait(DirectoryInfo dir)
Definition: ModPackage.cs:115
IReadOnlyList< FileInfo > ParseMap(DirectoryInfo dir, bool addToList=true)
Definition: ModPackage.cs:36
int UpdateExcelSheet(ISheet destSheet, ISheet oldSheet, bool updateOnlytext)
Definition: ModPackage.cs:371
IReadOnlyList< FileInfo > ParseSound(DirectoryInfo dir)
Definition: ModPackage.cs:168
void ImportSourceLocalizations(IReadOnlyDictionary< string, string > texts)
Definition: ModPackage.cs:218
static AudioType GetAudioType(string extension)
Definition: ModUtil.cs:128
static ModItemList< Sprite > modPortraitBGFs
Definition: Portrait.cs:8
static ModItemList< Sprite > modPortraitBGs
Definition: Portrait.cs:10
static ModItemList< Sprite > modOverlays
Definition: Portrait.cs:14
static ModItemList< Sprite > modPortraits
Definition: Portrait.cs:12
static HashSet< string > allIds
Definition: Portrait.cs:20
static ModItemList< Sprite > modFull
Definition: Portrait.cs:16
static Dictionary< string, string > dictModItems
static List< ExcelData > modList
Definition: TalkText.cs:5