mirror of
https://github.com/kwsch/pkNX.git
synced 2026-09-09 02:55:21 -05:00
Start associating NHO spawners to tables
This commit is contained in:
@@ -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>();
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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}";
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
|
||||
Reference in New Issue
Block a user