pkNX/pkNX.WinForms/MainEditor/EditorSWSH.cs
Kurt 58b0597fea Sword/Shield Update
Many thanks to @SciresM and @sora10pls for assisting in this massive
update!
2019-11-15 17:00:41 -08:00

214 lines
7.6 KiB
C#

using System;
using System.IO;
using pkNX.Containers;
using pkNX.Game;
using pkNX.Structures;
namespace pkNX.WinForms.Controls
{
internal class EditorSWSH : EditorBase
{
protected internal EditorSWSH(GameManager rom) : base(rom) { }
public void EditCommon()
{
var text = ROM.GetFilteredFolder(GameFile.GameText, z => Path.GetExtension(z) == ".dat");
var config = new TextConfig(ROM.Game);
var tc = new TextContainer(text, config);
using var form = new TextEditor(tc, TextEditor.TextEditorMode.Common);
form.ShowDialog();
if (!form.Modified)
text.CancelEdits();
}
public void EditScript()
{
var text = ROM.GetFilteredFolder(GameFile.StoryText, z => Path.GetExtension(z) == ".dat");
var config = new TextConfig(ROM.Game);
var tc = new TextContainer(text, config);
using var form = new TextEditor(tc, TextEditor.TextEditorMode.Script);
form.ShowDialog();
if (!form.Modified)
text.CancelEdits();
}
public void EditTrainers()
{
var editor = new TrainerEditor
{
ReadClass = data => new TrainerClass8(data),
ReadPoke = data => new TrainerPoke8(data),
ReadTrainer = data => new TrainerData8(data),
ReadTeam = TrainerPoke8.ReadTeam,
WriteTeam = TrainerPoke8.WriteTeam,
TrainerData = ROM.GetFilteredFolder(GameFile.TrainerData),
TrainerPoke = ROM.GetFilteredFolder(GameFile.TrainerPoke),
TrainerClass = ROM.GetFilteredFolder(GameFile.TrainerClass),
};
editor.Initialize();
using var form = new BTTE(ROM, editor);
form.ShowDialog();
if (!form.Modified)
editor.CancelEdits();
else
editor.Save();
}
public void EditPokémon()
{
var editor = new PokeEditor
{
Evolve = ROM.Data.EvolutionData,
Learn = ROM.Data.LevelUpData,
Mega = ROM.Data.MegaEvolutionData,
Personal = ROM.Data.PersonalData,
TMHM = Legal.TMHM_SWSH,
};
using var form = new PokeDataUI(editor, ROM);
form.ShowDialog();
if (!form.Modified)
editor.CancelEdits();
else
editor.Save();
}
public void NotWorking_EditItems()
{
var obj = ROM.GetFilteredFolder(GameFile.ItemStats, z => new FileInfo(z).Length == 36);
var cache = new DataCache<Item>(obj)
{
Create = Item.FromBytes,
Write = item => item.Write(),
};
using var form = new GenericEditor<Item>(cache, ROM.GetStrings(TextName.ItemNames), "Item Editor");
form.ShowDialog();
if (!form.Modified)
cache.CancelEdits();
else
cache.Save();
}
public void NotWorking_EditMoves()
{
var obj = ROM[GameFile.MoveStats]; // mini
var cache = new DataCache<Move7>(obj)
{
Create = data => new Move7(data),
Write = move => move.Write(),
};
using var form = new GenericEditor<Move7>(cache, ROM.GetStrings(TextName.MoveNames), "Move Editor");
form.ShowDialog();
if (!form.Modified)
cache.CancelEdits();
else
cache.Save();
}
public void NotWorking_EditShinyRate()
{
var path = Path.Combine(ROM.PathExeFS, "main");
var data = FileMitm.ReadAllBytes(path);
var nso = new NSO(data);
var shiny = new ShinyRateSWSH(nso.DecompressedText);
if (!shiny.IsEditable)
{
WinFormsUtil.Alert("Not able to find shiny rate logic in ExeFS.");
return;
}
using var editor = new ShinyRate(shiny);
editor.ShowDialog();
if (!editor.Modified)
return;
nso.DecompressedText = shiny.Data;
FileMitm.WriteAllBytes(path, nso.Write());
}
public void NotWorking_EditTM()
{
var path = Path.Combine(ROM.PathExeFS, "main");
var data = FileMitm.ReadAllBytes(path);
var list = new TMEditorGG(data);
if (!list.Valid)
{
WinFormsUtil.Alert("Not able to find tm data in ExeFS.");
return;
}
var moves = list.GetMoves();
var allowed = Legal.GetAllowedMoves(ROM.Game, ROM.Data.MoveData.Length);
var names = ROM.GetStrings(TextName.MoveNames);
using var editor = new TMList(moves, allowed, names);
editor.ShowDialog();
if (!editor.Modified)
return;
list.SetMoves(editor.FinalMoves);
data = list.Write();
FileMitm.WriteAllBytes(path, data);
}
public void NotWorking_EditTypeChart()
{
var path = Path.Combine(ROM.PathExeFS, "main");
var data = FileMitm.ReadAllBytes(path);
var nso = new NSO(data);
byte[] pattern = // N2nn3pia9transport18UnreliableProtocolE
{
0x4E, 0x32, 0x6E, 0x6E, 0x33, 0x70, 0x69, 0x61, 0x39, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72,
0x74, 0x31, 0x38, 0x55, 0x6E, 0x72, 0x65, 0x6C, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x50, 0x72, 0x6F, 0x74,
0x6F, 0x63, 0x6F, 0x6C, 0x45, 0x00
};
int ofs = CodePattern.IndexOfBytes(nso.DecompressedRO, pattern);
if (ofs < 0)
{
WinFormsUtil.Alert("Not able to find type chart data in ExeFS.");
return;
}
ofs += pattern.Length + 0x24; // 0x5B4C0C in lgpe 1.0 RO
var cdata = new byte[18 * 18];
var types = ROM.GetStrings(TextName.Types);
Array.Copy(nso.DecompressedRO, ofs, cdata, 0, cdata.Length);
var chart = new TypeChartEditor(cdata);
using var editor = new TypeChart(chart, types);
editor.ShowDialog();
if (!editor.Modified)
return;
chart.Data.CopyTo(nso.DecompressedRO, ofs);
data = nso.Write();
FileMitm.WriteAllBytes(path, data);
}
public void EditWild_SW() => PopWildEdit("k");
public void EditWild_SH() => PopWildEdit("t");
private void PopWildEdit(string file)
{
IFileContainer fp = ROM.GetFile(GameFile.NestData);
var data_table = new GFPack(fp[0]);
var s = FlatBufferConverter.DeserializeFrom<EncounterArchive8>(data_table.GetDataFileName($"encount_symbol_{file}.bin"));
var h = FlatBufferConverter.DeserializeFrom<EncounterArchive8>(data_table.GetDataFileName($"encount_{file}.bin"));
using var form = new SSWE(ROM, s, h);
form.ShowDialog();
var sd = FlatBufferConverter.SerializeFrom(s);
var hd = FlatBufferConverter.SerializeFrom(s);
data_table.SetDataFileName($"encount_symbol_{file}.bin", sd);
data_table.SetDataFileName($"encount_{file}.bin", hd);
fp[0] = data_table.Write();
}
public void EditMasterDump()
{
using var md = new DumperSWSH((GameManagerSWSH)ROM);
md.ShowDialog();
}
}
}