Start associating NHO spawners to tables

This commit is contained in:
Kurt
2022-02-27 12:38:01 -08:00
parent a2e34d86c8
commit 014d26656f
7 changed files with 84 additions and 19 deletions

View File

@@ -17,12 +17,57 @@ public class NewHugeOutbreakGroupLotteryArchive8a : IFlatBufferArchive<NewHugeOu
public byte[] Write() => FlatBufferConverter.SerializeFrom(this);
[FlatBufferItem(0)] public NewHugeOutbreakGroupLottery8a[] Table { get; set; } = Array.Empty<NewHugeOutbreakGroupLottery8a>();
public bool IsAreaGroup(PlacementSpawner8a spawner, NewHugeOutbreakGroupArchive8a groups, ulong tableID)
{
var hash = spawner.Field_20_Value.EncounterTableID;
foreach (var t in Table)
{
if (t.LotteryGroup != hash)
continue;
foreach (var lotteryChoice in t.Table1)
{
var group = lotteryChoice.Group;
var lottery = Array.Find(groups.Table, z => z.Group == group);
if (lottery is null)
continue;
var tables = lottery.Table;
var matches = Array.Find(tables, z => z.EncounterTableID == tableID);
if (matches is not null)
return true;
}
foreach (var lotteryChoice in t.Table2)
{
var group = lotteryChoice.Group;
var lottery = Array.Find(groups.Table, z => z.Group == group);
if (lottery is null)
continue;
var tables = lottery.Table;
var matches = Array.Find(tables, z => z.EncounterTableID == tableID);
if (matches is not null)
return true;
}
foreach (var lotteryChoice in t.Table3)
{
var group = lotteryChoice.Group;
var lottery = Array.Find(groups.Table, z => z.Group == group);
if (lottery is null)
continue;
var tables = lottery.Table;
var matches = Array.Find(tables, z => z.EncounterTableID == tableID);
if (matches is not null)
return true;
}
}
return false;
}
}
[FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))]
public class NewHugeOutbreakGroupLottery8a
{
[FlatBufferItem(00)] public ulong EncounterTable { get; set; }
[FlatBufferItem(00)] public ulong LotteryGroup { get; set; }
[FlatBufferItem(01)] public NewHugeOutbreakGroupLotteryDetail8a[] Table1 { get; set; } = Array.Empty<NewHugeOutbreakGroupLotteryDetail8a>();
[FlatBufferItem(02)] public NewHugeOutbreakGroupLotteryDetail8a[] Table2 { get; set; } = Array.Empty<NewHugeOutbreakGroupLotteryDetail8a>();
[FlatBufferItem(03)] public NewHugeOutbreakGroupLotteryDetail8a[] Table3 { get; set; } = Array.Empty<NewHugeOutbreakGroupLotteryDetail8a>();

View File

@@ -22,7 +22,7 @@ public class NewHugeOutbreakGroupArchive8a : IFlatBufferArchive<NewHugeOutbreakG
[FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))]
public class NewHugeOutbreakGroup8a : IFlatBufferArchive<NewHugeOutbreakDetail8a>
{
[FlatBufferItem(00)] public ulong Field_00 { get; set; }
[FlatBufferItem(00)] public ulong Group { get; set; }
[FlatBufferItem(01)] public NewHugeOutbreakDetail8a[] Table { get; set; } = Array.Empty<NewHugeOutbreakDetail8a>();
[FlatBufferItem(02)] public ulong Field_02 { get; set; }
}
@@ -37,6 +37,6 @@ public class NewHugeOutbreakDetail8a : IHasCondition8a
[FlatBufferItem(4)] public string ConditionArg3 { get; set; } = string.Empty;
[FlatBufferItem(5)] public string ConditionArg4 { get; set; } = string.Empty;
[FlatBufferItem(6)] public string ConditionArg5 { get; set; } = string.Empty;
[FlatBufferItem(7)] public ulong Field_07 { get; set; }
[FlatBufferItem(7)] public ulong EncounterTableID { get; set; }
[FlatBufferItem(8)] public int Rate { get; set; }
}

View File

@@ -24,15 +24,15 @@ public class NewHugeOutbreakLottery8a
{
[FlatBufferItem(00)] public ulong Hash { get; set; }
[FlatBufferItem(01)] public string Field_01 { get; set; } = string.Empty;
[FlatBufferItem(02)] public int Field_02 { get; set; }
[FlatBufferItem(02)] public int OutbreakChance { get; set; }
[FlatBufferItem(03)] public int Field_03 { get; set; }
[FlatBufferItem(04)] public int Field_04 { get; set; }
[FlatBufferItem(05)] public int Field_05 { get; set; }
[FlatBufferItem(06)] public int Field_06 { get; set; }
[FlatBufferItem(07)] public int Field_07 { get; set; }
[FlatBufferItem(08)] public int Field_08 { get; set; }
[FlatBufferItem(09)] public int Field_09 { get; set; }
[FlatBufferItem(10)] public int Field_10 { get; set; }
[FlatBufferItem(07)] public int MinCountFirst { get; set; }
[FlatBufferItem(08)] public int MaxCountFirst { get; set; }
[FlatBufferItem(09)] public int MinCountSecond { get; set; }
[FlatBufferItem(10)] public int MaxCountSecond { get; set; }
[FlatBufferItem(11)] public int Field_11 { get; set; }
[FlatBufferItem(12)] public int Field_12 { get; set; }
[FlatBufferItem(13)] public int Field_13 { get; set; }

View File

@@ -176,24 +176,31 @@ public static IEnumerable<string> GetUnownLinesBias(AreaInstance8a area, IReadOn
public static IEnumerable<string> GetLines(EncounterMultiplerArchive8a multiplier_archive,
PokeMiscTable8a misc, string[] speciesNames,
AreaInstance8a area, IReadOnlyDictionary<string, (string Name, int Index)> map)
AreaInstance8a area,
NewHugeOutbreakGroupArchive8a nhoGroup,
NewHugeOutbreakGroupLotteryArchive8a nhoLottery,
IReadOnlyDictionary<string, (string Name, int Index)> map)
{
yield return $"Area: {area.AreaName}";
foreach (var enctable in area.Encounters) {
foreach (var line in GetTableSummary(enctable, multiplier_archive, speciesNames, misc, area, map))
foreach (var line in GetTableSummary(enctable, multiplier_archive, speciesNames, misc, area, nhoGroup, nhoLottery, map))
yield return $"\t{line}";
yield return string.Empty;
}
}
private static IEnumerable<string> GetUsedSpawnerSummary(EncounterTable8a t, AreaInstance8a area, IReadOnlyDictionary<string, (string Name, int Index)> valueTuples)
private static IEnumerable<string> GetUsedSpawnerSummary(EncounterTable8a t, AreaInstance8a area,
IReadOnlyDictionary<string, (string Name, int Index)> valueTuples,
NewHugeOutbreakGroupArchive8a nhoGroup,
NewHugeOutbreakGroupLotteryArchive8a nhoLottery)
{
var usedBySpawners = Array.FindAll(area.Spawners, z => z.UsesTable(t.TableID));
var usedByWormholes = Array.FindAll(area.Wormholes, z => z.UsesTable(t.TableID));
var usedByLandmarkSpawns = Array.FindAll(area.LandItems, z => z.UsesTable(t.TableID));
var usedByLandmarks = Array.FindAll(area.LandMarks, z => usedByLandmarkSpawns.Any(sz => z.UsesTable(sz.LandmarkItemSpawnTableID)));
var usedByNHO = Array.FindAll(area.Spawners, z => nhoLottery.IsAreaGroup(z, nhoGroup, t.TableID));
foreach (var s in usedBySpawners)
{
@@ -202,6 +209,13 @@ private static IEnumerable<string> GetUsedSpawnerSummary(EncounterTable8a t, Are
var p = s.Parameters;
yield return $"Spawner @ {s.NameSummary}_{s.Field_01:X16} ({p.GetConditionSummary()}) @ {p.Coordinates.ToTriple()}, {area.AreaName} = {name}";
}
foreach (var s in usedByNHO)
{
var contained = s.GetContainingLocations(area.Locations).First().PlaceName;
var name = valueTuples[contained].Name;
var p = s.Parameters;
yield return $"SpawnerNHO @ {s.NameSummary}_{s.Field_01:X16} ({p.GetConditionSummary()}) @ {p.Coordinates.ToTriple()}, {area.AreaName} = {name}";
}
foreach (var s in usedByWormholes)
{
var contained = s.GetContainingLocations(area.Locations).First().PlaceName;
@@ -223,12 +237,15 @@ private static IEnumerable<string> GetUsedSpawnerSummary(EncounterTable8a t, Are
private static IEnumerable<string> GetTableSummary(EncounterTable8a t,
EncounterMultiplerArchive8a multiplier_archive, string[] speciesNames,
PokeMiscTable8a misc,
AreaInstance8a area, IReadOnlyDictionary<string, (string Name, int Index)> valueTuples)
AreaInstance8a area,
NewHugeOutbreakGroupArchive8a nhoGroup,
NewHugeOutbreakGroupLotteryArchive8a nhoLottery,
IReadOnlyDictionary<string, (string Name, int Index)> valueTuples)
{
yield return $"{t}:";
var totalUses = 0;
foreach (var line in GetUsedSpawnerSummary(t, area, valueTuples))
foreach (var line in GetUsedSpawnerSummary(t, area, valueTuples, nhoGroup, nhoLottery))
{
totalUses++;
yield return $"\t{line}";
@@ -236,7 +253,7 @@ private static IEnumerable<string> GetUsedSpawnerSummary(EncounterTable8a t, Are
foreach (var subArea in area.SubAreas)
{
foreach (var line in GetUsedSpawnerSummary(t, subArea, valueTuples))
foreach (var line in GetUsedSpawnerSummary(t, subArea, valueTuples, nhoGroup, nhoLottery))
{
totalUses++;
yield return $"\t{line}";

View File

@@ -373,6 +373,11 @@ public void DumpWilds()
var miscdata = ROM.GetFile(GameFile.PokeMisc)[0];
var misc = FlatBufferConverter.DeserializeFrom<PokeMiscTable8a>(miscdata);
var nhoGroup_b = ROM.GetFile(GameFile.NewHugeGroup)[0];
var nhoGroup = FlatBufferConverter.DeserializeFrom<NewHugeOutbreakGroupArchive8a>(nhoGroup_b);
var nhoGroupL_b = ROM.GetFile(GameFile.NewHugeGroupLottery)[0];
var nhoGroupL = FlatBufferConverter.DeserializeFrom<NewHugeOutbreakGroupLotteryArchive8a>(nhoGroupL_b);
var resident = (GFPack)ROM.GetFile(GameFile.Resident);
var bin_settings = resident.GetDataFullPath("bin/field/resident/AreaSettings.bin");
var settings = FlatBufferConverter.DeserializeFrom<AreaSettingsTable8a>(bin_settings);
@@ -398,7 +403,7 @@ public void DumpWilds()
foreach (var areaNameList in ResidentAreaSet.AreaNames)
{
var instance = AreaInstance8a.Create(resident, areaNameList, settings);
var lines = EncounterTable8aUtil.GetLines(multipliers, misc, speciesName, instance, map).ToList();
var lines = EncounterTable8aUtil.GetLines(multipliers, misc, speciesName, instance, nhoGroup, nhoGroupL, map).ToList();
File.WriteAllLines(GetPath(wild, $"Encounters_{instance.AreaName}.txt"), lines);
var unown = EncounterTable8aUtil.GetUnownLines(instance, map).Distinct().ToList();

View File

@@ -112,9 +112,7 @@ private void OpenPath(string path)
else
OpenFile(path);
}
#pragma warning disable CA1031 // Do not catch general exception types
catch (Exception ex)
#pragma warning restore CA1031 // Do not catch general exception types
{
WinFormsUtil.Error($"Failed to open -- {path}", ex.Message);
}

View File

@@ -410,10 +410,10 @@ public void EditOutbreakDetail()
=> PopFlat<MassOutbreakTable8a, MassOutbreak8a>(GameFile.Outbreak, "Outbreak Proc Editor", z => z.WorkValueName);
public void EditNewOutbreak_Group()
=> PopFlat<NewHugeOutbreakGroupArchive8a, NewHugeOutbreakGroup8a>(GameFile.NewHugeGroup, "New Outbreak Group Editor", z => z.Field_00.ToString("X16"));
=> PopFlat<NewHugeOutbreakGroupArchive8a, NewHugeOutbreakGroup8a>(GameFile.NewHugeGroup, "New Outbreak Group Editor", z => z.Group.ToString("X16"));
public void EditNewOutbreak_GroupLottery()
=> PopFlat<NewHugeOutbreakGroupLotteryArchive8a, NewHugeOutbreakGroupLottery8a>(GameFile.NewHugeGroupLottery, "New Outbreak Group Lottery Editor", z => z.EncounterTable.ToString("X16"));
=> PopFlat<NewHugeOutbreakGroupLotteryArchive8a, NewHugeOutbreakGroupLottery8a>(GameFile.NewHugeGroupLottery, "New Outbreak Group Lottery Editor", z => z.LotteryGroup.ToString("X16"));
public void EditNewOutbreak_Lottery()
=> PopFlat<NewHugeOutbreakLotteryArchive8a, NewHugeOutbreakLottery8a>(GameFile.NewHugeLottery, "New Outbreak Lottery Editor", z => z.Hash.ToString("X16"));