mirror of
https://github.com/kwsch/pkNX.git
synced 2026-08-24 03:14:33 -05:00
Expose Encounter Multiplier editor
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user