Expose Encounter Multiplier editor

This commit is contained in:
Jelle
2022-10-18 21:18:09 +02:00
parent 9c2c54b076
commit 8a75c8a725
7 changed files with 59 additions and 19 deletions

View File

@@ -15,6 +15,7 @@ public class PokeEditor8a : IDataEditor
public TableCache<PokedexResearchTable, PokedexResearchTask> DexResearch { get; set; }
public TableCache<PokeInfoList8a, PokeInfo8a> PokeResourceList { get; set; }
public TableCache<PokeResourceTable8a, PokeModelConfig8a> PokeResourceTable { get; set; }
public TableCache<EncounterMultiplierArchive8a, EncounterMultiplier8a> EncounterRateTable { get; set; }
public void CancelEdits() { }
@@ -32,5 +33,6 @@ public void Save()
DexResearch.Save();
PokeResourceList.Save();
PokeResourceTable.Save();
EncounterRateTable.Save();
}
}

View File

@@ -1,5 +1,7 @@
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using FlatSharp.Attributes;
// ReSharper disable UnusedAutoPropertyAccessor.Global
@@ -12,7 +14,7 @@
namespace pkNX.Structures.FlatBuffers;
[FlatBufferTable, TypeConverter(typeof(ExpandableObjectConverter))]
public class EncounterMultiplerArchive8a : IFlatBufferArchive<EncounterMultiplier8a>
public class EncounterMultiplierArchive8a : IFlatBufferArchive<EncounterMultiplier8a>
{
public byte[] Write() => FlatBufferConverter.SerializeFrom(this);
@@ -20,9 +22,32 @@ public class EncounterMultiplerArchive8a : IFlatBufferArchive<EncounterMultiplie
public EncounterMultiplier8a GetEncounterMultiplier(EncounterSlot8a slot)
{
var result = Array.Find(Table, z => z.Species == slot.Species && z.Form == slot.Form);
var result = GetEntry((ushort)slot.Species, (ushort)slot.Form);
if (result == null)
throw new ArgumentException($"Invalid Encounter Slot {slot.Species} - {slot.Form}");
return result;
}
public EncounterMultiplier8a GetEntry(ushort species, ushort form)
{
return Table.FirstOrDefault(x => x.Species == species && x.Form == form) ??
new EncounterMultiplier8a { };
}
public bool HasEntry(ushort species, ushort form)
{
return Table.Any(x => x.Species == species && x.Form == form);
}
public EncounterMultiplier8a AddEntry(ushort species, ushort form)
{
Debug.Assert(!HasEntry(species, form), "The encounter rate table already contains an entry for the same species and form!");
var entry = new EncounterMultiplier8a { Species = species, Form = form };
Table = Table.Append(entry)
.OrderBy(x => x.Species)
.ThenBy(x => x.Form)
.ToArray();
return entry;
}
}

View File

@@ -16,18 +16,18 @@ public class EncounterMultiplier8a : ISlotModifierTime, ISlotModifierWeather
{
[FlatBufferItem(00)] public int Species { get; set; }
[FlatBufferItem(01)] public int Form { get; set; }
[FlatBufferItem(02)] public float TimeOfDayMultiplier_0 { get; set; }
[FlatBufferItem(03)] public float TimeOfDayMultiplier_1 { get; set; }
[FlatBufferItem(04)] public float TimeOfDayMultiplier_2 { get; set; }
[FlatBufferItem(05)] public float TimeOfDayMultiplier_3 { get; set; }
[FlatBufferItem(06)] public float WeatherMultiplier_1 { get; set; }
[FlatBufferItem(07)] public float WeatherMultiplier_2 { get; set; }
[FlatBufferItem(08)] public float WeatherMultiplier_3 { get; set; }
[FlatBufferItem(09)] public float WeatherMultiplier_4 { get; set; }
[FlatBufferItem(10)] public float WeatherMultiplier_5 { get; set; }
[FlatBufferItem(11)] public float WeatherMultiplier_6 { get; set; }
[FlatBufferItem(12)] public float WeatherMultiplier_7 { get; set; }
[FlatBufferItem(13)] public float WeatherMultiplier_8 { get; set; }
[FlatBufferItem(02)] public float TimeOfDayMultiplier_0 { get; set; } = -1;
[FlatBufferItem(03)] public float TimeOfDayMultiplier_1 { get; set; } = -1;
[FlatBufferItem(04)] public float TimeOfDayMultiplier_2 { get; set; } = -1;
[FlatBufferItem(05)] public float TimeOfDayMultiplier_3 { get; set; } = -1;
[FlatBufferItem(06)] public float WeatherMultiplier_1 { get; set; } = -1;
[FlatBufferItem(07)] public float WeatherMultiplier_2 { get; set; } = -1;
[FlatBufferItem(08)] public float WeatherMultiplier_3 { get; set; } = -1;
[FlatBufferItem(09)] public float WeatherMultiplier_4 { get; set; } = -1;
[FlatBufferItem(10)] public float WeatherMultiplier_5 { get; set; } = -1;
[FlatBufferItem(11)] public float WeatherMultiplier_6 { get; set; } = -1;
[FlatBufferItem(12)] public float WeatherMultiplier_7 { get; set; } = -1;
[FlatBufferItem(13)] public float WeatherMultiplier_8 { get; set; } = -1;
public float GetTimeMultiplier(int index) => index switch
{

View File

@@ -213,7 +213,7 @@ public static IEnumerable<string> GetUnownLinesBias(AreaInstance8a area, IReadOn
}
}
public static IEnumerable<string> GetLines(EncounterMultiplerArchive8a multiplier_archive,
public static IEnumerable<string> GetLines(EncounterMultiplierArchive8a multiplier_archive,
PokeMiscTable8a misc, string[] speciesNames,
AreaInstance8a area,
NewHugeOutbreakGroupArchive8a nhoGroup,
@@ -275,7 +275,7 @@ public static IEnumerable<string> GetUnownLinesBias(AreaInstance8a area, IReadOn
}
private static IEnumerable<string> GetTableSummary(EncounterTable8a t,
EncounterMultiplerArchive8a multiplier_archive, string[] speciesNames,
EncounterMultiplierArchive8a multiplier_archive, string[] speciesNames,
PokeMiscTable8a misc,
AreaInstance8a area,
NewHugeOutbreakGroupArchive8a nhoGroup,
@@ -310,7 +310,7 @@ public static IEnumerable<string> GetUnownLinesBias(AreaInstance8a area, IReadOn
}
private static IEnumerable<string> GetLines(IReadOnlyList<EncounterSlot8a> arr,
EncounterMultiplerArchive8a multiplier_archive, IReadOnlyList<string> speciesNames, int lvMin, int lvMax,
EncounterMultiplierArchive8a multiplier_archive, IReadOnlyList<string> speciesNames, int lvMin, int lvMax,
PokeMiscTable8a misc)
{
var dividedTables = EncounterDetail8a.GetEmpty();
@@ -365,7 +365,7 @@ public static IEnumerable<string> GetUnownLinesBias(AreaInstance8a area, IReadOn
}
}
private static void FillSlots(IEnumerable<EncounterSlot8a> arr, EncounterMultiplerArchive8a multArchive, List<EncounterDetail8a>[,] dividedTables)
private static void FillSlots(IEnumerable<EncounterSlot8a> arr, EncounterMultiplierArchive8a multArchive, List<EncounterDetail8a>[,] dividedTables)
{
var ctr = 0;
foreach (var slot in arr.OrderByDescending(sl => sl.BaseProbability))

View File

@@ -402,7 +402,7 @@ public void DumpWilds()
Dictionary<string, (string Name, int Index)> map = GetPlaceNameMap();
var multdata = ROM.GetFile(GameFile.EncounterRateTable)[0];
var multipliers = FlatBufferConverter.DeserializeFrom<EncounterMultiplerArchive8a>(multdata);
var multipliers = FlatBufferConverter.DeserializeFrom<EncounterMultiplierArchive8a>(multdata);
var miscdata = ROM.GetFile(GameFile.PokeMisc)[0];
var misc = FlatBufferConverter.DeserializeFrom<PokeMiscTable8a>(miscdata);

View File

@@ -155,6 +155,7 @@ public void EditPokemon()
DexResearch = Data.DexResearch,
PokeResourceList = new(ROM.GetFile(GameFile.PokemonResourceList)),
PokeResourceTable = new(ROM.GetFile(GameFile.PokemonResourceTable)),
EncounterRateTable = new(ROM.GetFile(GameFile.EncounterRateTable)),
};
using var form = new PokeDataUI8a(editor, ROM, Data);
form.ShowDialog();
@@ -315,6 +316,13 @@ void Randomize(IEnumerable<EventEncount8a> arr)
}
}
[EditorCallable(EditorCategory.Field)]
public void EditEncounterRate()
{
var names = ROM.GetStrings(TextName.SpeciesNames);
PopFlat<EncounterMultiplierArchive8a, EncounterMultiplier8a>(GameFile.EncounterRateTable, "Encounter Rate Editor", (z, _) => $"{names[z.Species]}{(z.Form == 0 ? "" : $"-{z.Form}")}");
}
[EditorCallable(EditorCategory.Field)]
public void EditMapViewer()
{

View File

@@ -862,6 +862,11 @@ private void CHK_IsPresentInGame_CheckedChanged(object sender, EventArgs e)
{
Editor.PokeResourceTable.Root.AddEntry(cPersonal.DexIndexNational, cPersonal.Form, 0);
}
if (!Editor.EncounterRateTable.Root.HasEntry(cPersonal.DexIndexNational, cPersonal.Form))
{
Editor.EncounterRateTable.Root.AddEntry(cPersonal.DexIndexNational, cPersonal.Form);
}
}
}