Skip to content

Commit cb5c907

Browse files
committed
merging lots of very old stuff...
condition: greatly improved, made more robust h2h: take in decompiled scripts location from input rather than hardcode quest: completely redid quest parsing code bdatstringcollection: added reference to associated gimmick maps: added a GameData for map files and givemaps. duplicate of ExportMap, but excludes ExportCsv
1 parent d830f19 commit cb5c907

File tree

10 files changed

+736
-176
lines changed

10 files changed

+736
-176
lines changed

XbTool/XbTool.sln

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio 15
4-
VisualStudioVersion = 15.0.27130.2027
3+
# Visual Studio Version 16
4+
VisualStudioVersion = 16.0.30330.147
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XbTool", "XbTool\XbTool.csproj", "{85E9CB41-5EED-4125-BACD-C97051427B14}"
77
EndProject
88
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SaveEditor", "SaveEditor\SaveEditor.csproj", "{9C7548B6-8CF1-4CD6-A679-A90DB898D61F}"
99
EndProject
1010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BdatEditor", "BdatEditor\BdatEditor.csproj", "{A2EE0AB8-4344-4C4A-8276-8AD325ACE939}"
1111
EndProject
12+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibHac", "LibHac\src\LibHac\LibHac.csproj", "{5DA301C7-FF81-463A-BE26-98CDA79F1B06}"
13+
EndProject
1214
Global
1315
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1416
Debug|Any CPU = Debug|Any CPU
@@ -23,6 +25,10 @@ Global
2325
{9C7548B6-8CF1-4CD6-A679-A90DB898D61F}.Release|Any CPU.ActiveCfg = Release|Any CPU
2426
{A2EE0AB8-4344-4C4A-8276-8AD325ACE939}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
2527
{A2EE0AB8-4344-4C4A-8276-8AD325ACE939}.Release|Any CPU.ActiveCfg = Release|Any CPU
28+
{5DA301C7-FF81-463A-BE26-98CDA79F1B06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
29+
{5DA301C7-FF81-463A-BE26-98CDA79F1B06}.Debug|Any CPU.Build.0 = Debug|Any CPU
30+
{5DA301C7-FF81-463A-BE26-98CDA79F1B06}.Release|Any CPU.ActiveCfg = Release|Any CPU
31+
{5DA301C7-FF81-463A-BE26-98CDA79F1B06}.Release|Any CPU.Build.0 = Release|Any CPU
2632
EndGlobalSection
2733
GlobalSection(SolutionProperties) = preSolution
2834
HideSolutionNode = FALSE

XbTool/XbTool/BdatString/BdatStringCollection.cs

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Diagnostics;
44
using XbTool.Bdat;
55
using XbTool.Common;
6+
using XbTool.Gimmick;
67

78
namespace XbTool.BdatString
89
{
@@ -57,6 +58,7 @@ public class BdatStringItem
5758
public BdatStringTable Table { get; set; }
5859
public Dictionary<string, BdatStringValue> Values { get; } = new Dictionary<string, BdatStringValue>();
5960
public BdatStringValue Display { get; set; }
61+
public InfoEntry Gmk { get; set; } = null;
6062

6163
public HashSet<BdatStringItem> ReferencedBy { get; } = new HashSet<BdatStringItem>();
6264

XbTool/XbTool/Tasks.cs

+39-10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.IO;
55
using System.Linq;
66
using System.Threading.Tasks;
7+
using System.Net.Sockets;
78
using XbTool.Bdat;
89
using XbTool.BdatString;
910
using XbTool.CodeGen;
@@ -488,28 +489,56 @@ private static void GenerateDropTables(Options options)
488489

489490
private static void GiveMaps(Options options)
490491
{
491-
if (options.Input == null) throw new NullReferenceException("No input file was specified.");
492-
if (options.BdatDir == null) throw new NullReferenceException("No bdat dir was specified.");
493-
if (options.Output == null) throw new NullReferenceException("No output dir was specified.");
494-
if (options.Game != Game.XB1DE) throw new NotImplementedException("Xb Definitive Edition only.");
495-
if (!Directory.Exists(options.Input)) throw new DirectoryNotFoundException($"{options.Input} is not a valid directory.");
496-
497-
BdatStringCollection tables = GetBdatStringCollection(options);
498-
Xbde.Maps.ReadMap(tables, options);
492+
BdatStringCollection tables;
493+
if (options.Game == Game.XB2)
494+
{
495+
if (options.SdPath == null) throw new NullReferenceException("Must specify SD card path.");
496+
if (options.Output == null) throw new NullReferenceException("No output path was specified.");
497+
if (!Directory.Exists(options.SdPath)) throw new DirectoryNotFoundException($"{options.SdPath} is not a valid directory.");
498+
499+
var xb2Fs = new Xb2FileSystem(options.SdPath);
500+
501+
tables = GetBdatStringCollection(options);
502+
503+
MapInfo[] gimmicks = ReadGmk.ReadAll(xb2Fs, tables);
504+
var gmks = gimmicks.SelectMany(map => map.Gimmicks.SelectMany(gmk => gmk.Value.Info)).Where(x => x.Name == options.Input);
505+
//gmks = tables["MNU_ShopList"].Items.First(x => x.Id == 142).ReferencedBy.Where(x => x.Table.Filename == "common_gmk").Select(x => x.Gmk);
506+
var salvage = tables["ITM_TresureList"].Items.First(x => x.Id == 35007).ReferencedBy.Where(x => x.Table.Name == "FLD_SalvageItemSet");
507+
//gmks = salvage.SelectMany(x => x.ReferencedBy).Where(x => x.Table.Name == "FLD_SalvageTable").SelectMany(x => x.ReferencedBy).Where(x => x.Table.Filename == "common_gmk").Select(x=>x.Gmk);
508+
//gmks = tables["ma15a_FLD_NpcPop"].Items.Where(x => x.Id == 15178 || x.Id == 15179 || x.Id == 15180).Select(x=>x.Gmk);
509+
Directory.CreateDirectory(options.Output);
510+
ExportMap.Export(xb2Fs, gmks.ToList(), $"{options.Output}/{options.Input}");
511+
}
512+
else
513+
{
514+
if (options.Input == null) throw new NullReferenceException("No input file was specified.");
515+
if (options.BdatDir == null) throw new NullReferenceException("No bdat dir was specified.");
516+
if (options.Output == null) throw new NullReferenceException("No output dir was specified.");
517+
if (options.Game != Game.XB1DE) throw new NotImplementedException("Xb Definitive Edition only.");
518+
if (!Directory.Exists(options.Input)) throw new DirectoryNotFoundException($"{options.Input} is not a valid directory.");
519+
520+
tables = GetBdatStringCollection(options);
521+
Xbde.Maps.ReadMap(tables, options);
522+
}
499523
}
500524

501525
private static void FindInnEvents(Options options)
502526
{
503527
BdatStringCollection tables = GetBdatStringCollection(options);
504-
HeartToHeart.PrintH2Hs(tables);
528+
HeartToHeart.PrintH2Hs(tables, options.Input);
505529
//HeartToHeart.FindInnEvents(tables);
506530

507531
}
508532

509533
private static void PrintQuests(Options options)
510534
{
511535
BdatStringCollection tables = GetBdatStringCollection(options);
512-
Quest.ReadQuests(tables);
536+
var xb2Fs = new Xb2FileSystem(options.SdPath);
537+
// ReadGmk.ReadAll(xb2Fs, tables);
538+
var scriptFiles = Directory.GetFiles(options.Input).Concat(Directory.GetFiles(Path.Combine(options.Input, "../aoc"))).ToList();
539+
540+
foreach (var quest in ReadQuest.Read(tables, scriptFiles))
541+
quest.OutputQuest(xb2Fs, options.Output, scriptFiles);
513542
}
514543
}
515544
}

XbTool/XbTool/Xb2/GameData/Conditions.cs

+54-54
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@ namespace XbTool.Xb2.GameData
1111
{
1212
public static class Conditions
1313
{
14-
public static string ParseGameCond(BdatStringCollection tables, int condId)
14+
public static string ParseGameCond(BdatStringItem condition)
1515
{
16-
var condition = tables.Tables["FLD_ConditionList"].Items.FirstOrDefault(x => x.Id == condId);
1716
string s = "";
1817
for (int i = 0; i < 8; i++)
1918
{
@@ -216,35 +215,36 @@ public static string EventJudge(BdatStringCollection tables, int[] args) // EVT_
216215
return $"1bit flag {id + 0xc327} == {val}";
217216

218217
case 26:
219-
return ParseGameCond(tables, id);
218+
return ParseGameCond(tables.Tables["FLD_ConditionList"].Items.FirstOrDefault(x => x.Id == id));
220219

221220
default:
222221
break;
223222
}
224223

225224
return "";
226225
}
227-
public static void PrintEventConditions(BdatStringItem bdatEvent, IEnumerable<string> scriptFiles, IEnumerable<BdatStringItem> listEvents)
226+
public static BdatStringItem PrintEventConditions(BdatStringItem bdatEvent, IEnumerable<string> scriptFiles, IEnumerable<BdatStringItem> listEvents)
228227
{
229228
if (bdatEvent == null)
230229
Console.WriteLine("null bdat event!");
231230
else if (bdatEvent.ReferencedBy.Any(trigger => trigger.Values.ContainsKey("Title"))) // H2H - not doing probably
232231
{
233232
Console.WriteLine("H2H Event");
234233
var refItem = bdatEvent.ReferencedBy.FirstOrDefault(trigger => trigger.Values.ContainsKey("Title"));
235-
236234
}
237235
else if (bdatEvent.ReferencedBy.Any(trigger => trigger.Values.ContainsKey("NpcID"))) // NPC - done
238236
{
239237
var refItem = bdatEvent.ReferencedBy.FirstOrDefault(trigger => trigger.Values.ContainsKey("NpcID"));
240238
Console.Write("Talk to ");
241239
PrintNpcCondition(refItem);
240+
return refItem;
242241
}
243242
else if (bdatEvent.ReferencedBy.Any(trigger=>trigger.Values.ContainsKey("name"))) // EventPop - done
244243
{
245244
var refItem = bdatEvent.ReferencedBy.FirstOrDefault(trigger => trigger.Values.ContainsKey("name"));
246245
Console.Write("Trigger ");
247246
PrintEventPopConditions(refItem);
247+
return refItem;
248248

249249
}
250250
else if (bdatEvent.ReferencedBy.Any(trigger => trigger.Values.ContainsKey("QuestTitle"))) // Quest - done (maybe)
@@ -258,78 +258,78 @@ public static void PrintEventConditions(BdatStringItem bdatEvent, IEnumerable<st
258258
{
259259
Console.WriteLine("Linked Event");
260260
var refItem = bdatEvent.ReferencedBy.FirstOrDefault(trigger => trigger.Values.ContainsKey("evtName"));
261-
PrintEventConditions(refItem, scriptFiles, listEvents);
261+
return PrintEventConditions(refItem, scriptFiles, listEvents);
262262
}
263263
else // Not Found (probably scripts) - done
264264
{
265265
string scriptFile = scriptFiles.FirstOrDefault(fileName => File.ReadLines(fileName).Any(line => line.Contains($"evt_status::change(32, {bdatEvent.Id}")));
266-
Scripts script = new Scripts(scriptFile);
267-
script.PrintEventTriggerConditions($"evt_status::change(32, {bdatEvent.Id}", scriptFiles, listEvents);
266+
Scripts script = new Scripts(scriptFile, listEvents);
267+
return script.PrintEventTriggerConditions($"evt_status::change(32, {bdatEvent.Id}", scriptFiles, listEvents);
268268
}
269+
return null;
269270
}
270271

271-
private static void PrintEventPopConditions(BdatStringItem eventPop)
272+
public static void PrintEventPopConditions(BdatStringItem eventPop) => Console.WriteLine(ParseEventPopCondition(eventPop));
273+
public static void PrintNpcCondition(BdatStringItem npc) => Console.WriteLine(ParseNpcCondition(npc));
274+
275+
public static string ParseEventPopCondition(BdatStringItem eventPop)
272276
{
273-
Console.WriteLine($"Event {eventPop["name"].DisplayString}");
274-
if (eventPop["ScenarioFlagMin"].DisplayString != "" || eventPop["ScenarioFlagMax"].DisplayString != "")
275-
{
276-
Console.Write("Scenario required: ");
277-
if (eventPop["ScenarioFlagMin"].DisplayString != "")
278-
Console.Write($"{eventPop["ScenarioFlagMin"].DisplayString} <= ");
279-
Console.Write("scenarioFlag");
280-
if (eventPop["ScenarioFlagMax"].DisplayString != "")
281-
Console.Write($" <= {eventPop["ScenarioFlagMax"].DisplayString}");
282-
Console.WriteLine();
283-
}
284-
if (eventPop["QuestFlag"].Reference != null)
285-
{
286-
var questFlag = eventPop["QuestFlag"].Reference;
287-
Console.Write("Required quest progress: ");
288-
Console.Write(ParseQuestName(questFlag));
289-
Console.Write(" with progress: ");
290-
Console.WriteLine(ParseQuestProgress(int.Parse(eventPop["QuestFlagMin"].ValueString), int.Parse(eventPop["QuestFlagMax"].ValueString)));
291-
}
277+
string s = $"Event {eventPop["name"].DisplayString}\n";
278+
s += ParseScenarioItem(eventPop);
279+
s += ParseQuestItem(eventPop);
292280
if (eventPop["Condition"].DisplayString != null)
293281
{
294-
Console.Write("Condition Required: ");
295-
Console.WriteLine(ParseGameCond(eventPop.Table.Collection, int.Parse(eventPop["Condition"].DisplayString)));
282+
s += ParseGameCond(eventPop.Table.Collection.Tables["FLD_ConditionList"].Items.FirstOrDefault(x => x.Id == int.Parse(eventPop["Condition"].DisplayString))) + "\n";
296283
}
297-
Console.WriteLine();
284+
return s + "\n";
298285
}
299286

300-
private static void PrintNpcCondition(BdatStringItem npc)
287+
public static string ParseNpcCondition(BdatStringItem npc)
301288
{
302-
Console.WriteLine($"NPC {npc["NpcID"].DisplayString}");
303-
if (npc["ScenarioFlagMin"].DisplayString != "" || npc["ScenarioFlagMax"].DisplayString != "")
289+
string s = $"Speak to NPC {npc["NpcID"].DisplayString}\n";
290+
s += ParseScenarioItem(npc);
291+
s += ParseQuestItem(npc);
292+
if (npc["Condition"].DisplayString != null)
304293
{
305-
Console.Write("Scenario required: ");
306-
if (npc["ScenarioFlagMin"].DisplayString != "")
307-
Console.Write($"{npc["ScenarioFlagMin"].DisplayString} <= ");
308-
Console.Write("scenarioFlag");
309-
if (npc["ScenarioFlagMax"].DisplayString != "")
310-
Console.Write($" <= {npc["ScenarioFlagMax"].DisplayString}");
311-
Console.WriteLine();
294+
s += ParseGameCond(npc.Table.Collection.Tables["FLD_ConditionList"].Items.FirstOrDefault(x => x.Id == int.Parse(npc["Condition"].DisplayString))) + "\n";
312295
}
313-
if (npc["QuestFlag"].Reference != null)
296+
if (npc["TimeRange"].DisplayString != "")
314297
{
315-
var questFlag = npc["QuestFlag"].Reference;
316-
Console.Write("Required quest progress: ");
317-
Console.Write(ParseQuestName(questFlag));
318-
Console.Write(" with progress: ");
319-
Console.WriteLine(ParseQuestProgress(int.Parse(npc["QuestFlagMin"].ValueString), int.Parse(npc["QuestFlagMax"].ValueString)));
298+
s += $"Time of day: {npc["TimeRange"].DisplayString}\n";
320299
}
321-
if (npc["Condition"].DisplayString != null)
300+
301+
return s + "\n";
302+
}
303+
304+
public static string ParseScenarioItem(BdatStringItem itm)
305+
{
306+
string s = "";
307+
if (itm["ScenarioFlagMin"].DisplayString != "" || itm["ScenarioFlagMax"].DisplayString != "")
322308
{
323-
Console.WriteLine(ParseGameCond(npc.Table.Collection, int.Parse(npc["Condition"].DisplayString)));
309+
s += "Scenario required: ";
310+
if (itm["ScenarioFlagMin"].DisplayString != "")
311+
s += $"{itm["ScenarioFlagMin"].DisplayString} <= ";
312+
s += "scenarioFlag";
313+
if (itm["ScenarioFlagMax"].DisplayString != "")
314+
s += $" <= {itm["ScenarioFlagMax"].DisplayString}";
315+
s += "\n";
324316
}
325-
if (npc["TimeRange"].DisplayString != "")
317+
return s;
318+
}
319+
320+
public static string ParseQuestItem(BdatStringItem itm)
321+
{
322+
if (itm["QuestFlag"].Reference != null)
326323
{
327-
Console.WriteLine($"Time of day: {npc["TimeRange"].DisplayString}");
324+
var questFlag = itm["QuestFlag"].Reference;
325+
string questName = ParseQuestName(questFlag);
326+
string questProgress = ParseQuestProgress(int.Parse(itm["QuestFlagMin"].ValueString), int.Parse(itm["QuestFlagMax"].ValueString));
327+
return "Required quest progress: " + questName + " with progress: " + questProgress + "\n";
328328
}
329-
Console.WriteLine();
329+
return "";
330330
}
331331

332-
private static string ParseQuestName(BdatStringItem quest)
332+
public static string ParseQuestName(BdatStringItem quest)
333333
{
334334
if (quest["FlagPRT"].DisplayString == "")
335335
{
@@ -345,7 +345,7 @@ private static string ParseQuestName(BdatStringItem quest)
345345
}
346346
}
347347

348-
private static string ParseQuestProgress(int flagMin, int flagMax)
348+
public static string ParseQuestProgress(int flagMin, int flagMax)
349349
{
350350
string s = "";
351351
string[] options = { "Not Started", "Started", "Finished (A)", "Finished (B)" };

0 commit comments

Comments
 (0)