mirror of
https://github.com/kwsch/PKHeX.git
synced 2026-05-03 12:07:07 -05:00
Make PID text entry uppercase across the program Standardize RivalTrash => RivalNameTrash, same for Rival => RivalName
622 lines
24 KiB
C#
622 lines
24 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Windows.Forms;
|
|
using PKHeX.Core;
|
|
|
|
namespace PKHeX.WinForms;
|
|
|
|
public partial class SAV_Trainer7 : Form
|
|
{
|
|
private readonly SaveFile Origin;
|
|
private readonly SAV7 SAV;
|
|
|
|
public SAV_Trainer7(SAV7 sav)
|
|
{
|
|
InitializeComponent();
|
|
WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage);
|
|
|
|
BattleStyles = WinFormsTranslator.GetEnumTranslation<PlayerBattleStyle7>(Main.CurrentLanguage);
|
|
if (SAV is not SAV7USUM)
|
|
BattleStyles = BattleStyles[..^1]; // remove Nihilist
|
|
|
|
SAV = (SAV7)(Origin = sav).Clone();
|
|
Loading = true;
|
|
if (Main.Unicode)
|
|
{
|
|
TB_OTName.Font = FontUtil.GetPKXFont();
|
|
}
|
|
|
|
B_MaxCash.Click += (_, _) => MT_Money.Text = "9,999,999";
|
|
|
|
CB_Gender.Items.Clear();
|
|
CB_Gender.Items.AddRange(Main.GenderSymbols.Take(2).ToArray()); // m/f depending on unicode selection
|
|
|
|
GetComboBoxes();
|
|
GetTextBoxes();
|
|
|
|
TrainerStats.LoadRecords(SAV, RecordLists.RecordList_7);
|
|
TrainerStats.GetToolTipText = UpdateTip;
|
|
CB_Fashion.SelectedIndex = 1;
|
|
|
|
if (SAV is SAV7USUM)
|
|
LoadUltraData();
|
|
else
|
|
TC_Editor.TabPages.Remove(Tab_Ultra);
|
|
|
|
Loading = false;
|
|
}
|
|
|
|
private readonly bool Loading;
|
|
private bool MapUpdated;
|
|
|
|
private readonly string[] BattleStyles;
|
|
|
|
private int[] FlyDestFlagOfs = null!, MapUnmaskFlagOfs = null!;
|
|
private int SkipFlag => SAV is SAV7USUM ? 4160 : 3200; // FlagMax - 768
|
|
|
|
private void GetComboBoxes()
|
|
{
|
|
var sources = GameInfo.Sources;
|
|
CB_3DSReg.InitializeBinding();
|
|
CB_3DSReg.DataSource = new BindingSource(sources.Regions, string.Empty);
|
|
CB_Language.InitializeBinding();
|
|
CB_Language.DataSource = GameInfo.LanguageDataSource(SAV.Generation, SAV.Context);
|
|
CB_AlolaTime.InitializeBinding();
|
|
CB_AlolaTime.DataSource = GetAlolaTimeList();
|
|
|
|
CB_Country.InitializeBinding();
|
|
CB_Region.InitializeBinding();
|
|
Main.SetCountrySubRegion(CB_Country, "countries");
|
|
|
|
CB_SkinColor.Items.Clear();
|
|
CB_SkinColor.Items.AddRange(WinFormsTranslator.GetEnumTranslation<PlayerSkinColor7>(Main.CurrentLanguage));
|
|
|
|
var strings = GameInfo.Strings;
|
|
L_Vivillon.Text = GameInfo.Strings.Species[(int)Species.Vivillon] + ":";
|
|
CB_Vivillon.InitializeBinding();
|
|
CB_Vivillon.DataSource = FormConverter.GetFormList((int)Species.Vivillon, strings.types, strings.forms, Main.GenderSymbols, SAV.Context);
|
|
|
|
foreach (string t in BattleStyles)
|
|
{
|
|
CB_BallThrowType.Items.Add(t);
|
|
LB_BallThrowTypeUnlocked.Items.Add(t);
|
|
LB_BallThrowTypeLearned.Items.Add(t);
|
|
}
|
|
|
|
LB_Stamps.Items.AddRange(WinFormsTranslator.GetEnumTranslation<Stamp7>(Main.CurrentLanguage));
|
|
}
|
|
|
|
private static ComboItem[] GetAlolaTimeList()
|
|
{
|
|
var alolatime_list = new ComboItem[24];
|
|
for (int i = 1; i < alolatime_list.Length; i++)
|
|
alolatime_list[i] = new ComboItem($"+{i:00} Hours", i * 60 * 60);
|
|
alolatime_list[0] = new ComboItem("Sun Time", 24 * 60 * 60);
|
|
alolatime_list[12] = new ComboItem("Moon Time", 12 * 60 * 60);
|
|
return alolatime_list;
|
|
}
|
|
|
|
private void GetTextBoxes()
|
|
{
|
|
// Get Data
|
|
CB_Game.SelectedIndex = SAV.Version - GameVersion.SN;
|
|
CB_Gender.SelectedIndex = SAV.Gender;
|
|
|
|
// Display Data
|
|
TB_OTName.Text = SAV.OT;
|
|
trainerID1.LoadIDValues(SAV, SAV.Generation);
|
|
MT_Money.Text = SAV.Money.ToString();
|
|
|
|
CB_Country.SelectedValue = (int)SAV.Country;
|
|
CB_Region.SelectedValue = (int)SAV.Region;
|
|
CB_3DSReg.SelectedValue = (int)SAV.ConsoleRegion;
|
|
CB_Language.SelectedValue = SAV.Language;
|
|
var timeA = SAV.GameTime.AlolaTime;
|
|
if (timeA == 0)
|
|
timeA = 24 * 60 * 60; // Patch up any bad times from previous program versions.
|
|
if (timeA == 9_999_999)
|
|
CB_AlolaTime.Enabled = false; // alola time doesn't exist yet
|
|
else
|
|
CB_AlolaTime.SelectedValue = (int)timeA;
|
|
|
|
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
|
|
if (CB_AlolaTime.SelectedValue is null)
|
|
CB_AlolaTime.Enabled = false;
|
|
|
|
NUD_M.Value = SAV.Situation.M;
|
|
// Sanity Check Map Coordinates
|
|
try
|
|
{
|
|
NUD_X.Value = (decimal)(SAV.Situation.X / 60.0);
|
|
NUD_Z.Value = (decimal)(SAV.Situation.Z / 60.0);
|
|
NUD_Y.Value = (decimal)(SAV.Situation.Y / 60.0);
|
|
NUD_R.Value = (decimal)(Math.Atan2(SAV.Situation.RZ, SAV.Situation.RW) * 360.0 / Math.PI);
|
|
}
|
|
catch { GB_Map.Enabled = false; }
|
|
|
|
// Load Play Time
|
|
MT_Hours.Text = SAV.PlayedHours.ToString();
|
|
MT_Minutes.Text = SAV.PlayedMinutes.ToString();
|
|
MT_Seconds.Text = SAV.PlayedSeconds.ToString();
|
|
|
|
if (SAV.Played.LastSavedDate.HasValue)
|
|
{
|
|
CAL_LastSavedDate.Value = SAV.Played.LastSavedDate.Value;
|
|
CAL_LastSavedTime.Value = SAV.Played.LastSavedDate.Value;
|
|
}
|
|
else
|
|
{
|
|
L_LastSaved.Visible = CAL_LastSavedDate.Visible = CAL_LastSavedTime.Visible = false;
|
|
}
|
|
|
|
DateUtil.GetDateTime2000(SAV.SecondsToStart, out var date, out var time);
|
|
CAL_AdventureStartDate.Value = date;
|
|
CAL_AdventureStartTime.Value = time;
|
|
|
|
DateUtil.GetDateTime2000(SAV.SecondsToFame, out date, out time);
|
|
CAL_HoFDate.Value = date;
|
|
CAL_HoFTime.Value = time;
|
|
|
|
NUD_BP.Value = Math.Min(NUD_BP.Maximum, SAV.Misc.BP);
|
|
NUD_FC.Value = Math.Min(NUD_FC.Maximum, SAV.Festa.FestaCoins);
|
|
|
|
// Poké Finder
|
|
NUD_SnapCount.Value = Math.Min(NUD_SnapCount.Maximum, SAV.PokeFinder.SnapCount);
|
|
NUD_ThumbsTotal.Value = Math.Min(NUD_ThumbsTotal.Maximum, SAV.PokeFinder.ThumbsTotalValue);
|
|
NUD_ThumbsRecord.Value = Math.Min(NUD_ThumbsRecord.Maximum, SAV.PokeFinder.ThumbsHighValue);
|
|
|
|
CB_CameraVersion.SelectedIndex = Math.Min(CB_CameraVersion.Items.Count - 1, SAV.PokeFinder.CameraVersion);
|
|
CHK_Gyro.Checked = SAV.PokeFinder.GyroFlag;
|
|
|
|
// Battle Tree
|
|
var bt = SAV.BattleTree;
|
|
NUD_RCStreak0.Value = Math.Min(NUD_RCStreak0.Maximum, bt.GetTreeStreak(0, super: false, max: false));
|
|
NUD_RCStreak1.Value = Math.Min(NUD_RCStreak1.Maximum, bt.GetTreeStreak(1, super: false, max: false));
|
|
NUD_RCStreak2.Value = Math.Min(NUD_RCStreak2.Maximum, bt.GetTreeStreak(2, super: false, max: false));
|
|
NUD_RMStreak0.Value = Math.Min(NUD_RMStreak0.Maximum, bt.GetTreeStreak(0, super: false, max: true));
|
|
NUD_RMStreak1.Value = Math.Min(NUD_RMStreak1.Maximum, bt.GetTreeStreak(1, super: false, max: true));
|
|
NUD_RMStreak2.Value = Math.Min(NUD_RMStreak2.Maximum, bt.GetTreeStreak(2, super: false, max: true));
|
|
|
|
NUD_SCStreak0.Value = Math.Min(NUD_SCStreak0.Maximum, bt.GetTreeStreak(0, super: true, max: false));
|
|
NUD_SCStreak1.Value = Math.Min(NUD_SCStreak1.Maximum, bt.GetTreeStreak(1, super: true, max: false));
|
|
NUD_SCStreak2.Value = Math.Min(NUD_SCStreak2.Maximum, bt.GetTreeStreak(2, super: true, max: false));
|
|
NUD_SMStreak0.Value = Math.Min(NUD_SMStreak0.Maximum, bt.GetTreeStreak(0, super: true, max: true));
|
|
NUD_SMStreak1.Value = Math.Min(NUD_SMStreak1.Maximum, bt.GetTreeStreak(1, super: true, max: true));
|
|
NUD_SMStreak2.Value = Math.Min(NUD_SMStreak2.Maximum, bt.GetTreeStreak(2, super: true, max: true));
|
|
|
|
CB_SkinColor.SelectedIndex = SAV.MyStatus.DressUpSkinColor;
|
|
TB_PlazaName.Text = SAV.Festa.FestivalPlazaName;
|
|
|
|
CB_Vivillon.SelectedIndex = (SAV.Misc.Vivillon < CB_Vivillon.Items.Count) ? SAV.Misc.Vivillon : -1;
|
|
NUD_DaysFromRefreshed.Value = Math.Min(NUD_DaysFromRefreshed.Maximum, SAV.Misc.DaysFromRefreshed);
|
|
|
|
if ((sbyte)SAV.MyStatus.BallThrowType >= 0 && SAV.MyStatus.BallThrowType < CB_BallThrowType.Items.Count)
|
|
CB_BallThrowType.SelectedIndex = SAV.MyStatus.BallThrowType;
|
|
|
|
if (SAV is SAV7SM)
|
|
LoadThrowTypeLists();
|
|
else
|
|
CB_BallThrowTypeListMode.Visible = LB_BallThrowTypeLearned.Visible = LB_BallThrowTypeUnlocked.Visible = false;
|
|
|
|
uint stampBits = SAV.Misc.Stamps;
|
|
for (int i = 0; i < LB_Stamps.Items.Count; i++)
|
|
LB_Stamps.SetSelected(i, (stampBits & (1 << i)) != 0);
|
|
|
|
CHK_UnlockSuperSingles.Checked = SAV.EventWork.GetEventFlag(333);
|
|
CHK_UnlockSuperDoubles.Checked = SAV.EventWork.GetEventFlag(334);
|
|
CHK_UnlockSuperMulti.Checked = SAV.EventWork.GetEventFlag(335);
|
|
|
|
CHK_UnlockMega.Checked = SAV.MyStatus.MegaUnlocked;
|
|
CHK_UnlockZMove.Checked = SAV.MyStatus.ZMoveUnlocked;
|
|
|
|
LoadMapFlyToData();
|
|
}
|
|
|
|
private void LoadThrowTypeLists()
|
|
{
|
|
const int unlockStart = 292;
|
|
const int learnedStart = 3479;
|
|
LB_BallThrowTypeUnlocked.SetSelected(0, true);
|
|
LB_BallThrowTypeUnlocked.SetSelected(1, true);
|
|
for (int i = 2; i < BattleStyles.Length; i++)
|
|
LB_BallThrowTypeUnlocked.SetSelected(i, SAV.EventWork.GetEventFlag(unlockStart + i));
|
|
|
|
LB_BallThrowTypeLearned.SetSelected(0, true);
|
|
for (int i = 1; i < BattleStyles.Length; i++)
|
|
LB_BallThrowTypeLearned.SetSelected(i, SAV.EventWork.GetEventFlag(learnedStart + i));
|
|
|
|
CB_BallThrowTypeListMode.SelectedIndex = 0;
|
|
}
|
|
|
|
private void LoadMapFlyToData()
|
|
{
|
|
var metLocationList = GameInfo.GetLocationList(GameVersion.US, EntityContext.Gen7, false);
|
|
int[] FlyDestNameIndex = [
|
|
-1,24,34,8,20,38,12,46,40,30,//Melemele
|
|
70,68,78,86,74,104,82,58,90,72,76,92,62,//Akala
|
|
132,136,138,114,118,144,130,154,140,//Ula'ula
|
|
172,184,180,174,176,156,186,//Poni
|
|
188,-1,-1,
|
|
198,202,110,204,//Beach
|
|
];
|
|
if (SAV.Version is GameVersion.UM or GameVersion.MN)
|
|
{
|
|
FlyDestNameIndex[28] = 142;
|
|
FlyDestNameIndex[36] = 178;
|
|
}
|
|
FlyDestFlagOfs = [
|
|
44,43,45,40,41,49,42,47,46,48,
|
|
50,54,39,57,51,55,59,52,58,53,61,60,56,
|
|
62,66,67,64,65,273,270,37,38,
|
|
69,74,72,71,276,73,70,
|
|
75,332,334,
|
|
331,333,335,336,
|
|
];
|
|
string[] FlyDestAltName = ["My House", "Photo Club (Hau'oli)", "Photo Club (Konikoni)"];
|
|
CLB_FlyDest.Items.Clear();
|
|
for (int i = 0, u = 0, m = FlyDestNameIndex.Length - (SAV is SAV7USUM ? 0 : 6); i < m; i++)
|
|
{
|
|
var dest = FlyDestNameIndex[i];
|
|
var name = dest < 0 ? FlyDestAltName[u++] : metLocationList.First(v => v.Value == dest).Text;
|
|
var state = SAV.EventWork.GetEventFlag(SkipFlag + FlyDestFlagOfs[i]);
|
|
CLB_FlyDest.Items.Add(name, state);
|
|
}
|
|
int[] MapUnmaskNameIndex = [
|
|
6,8,24,-1,18,-1,20,22,12,10,14,
|
|
70,50,68,52,74,54,56,58,60,72,62,64,
|
|
132,192,106,108,122,112,114,126,116,118,120,154,
|
|
172,158,160,162,164,166,168,170,
|
|
188,
|
|
198,202,110,204,
|
|
];
|
|
MapUnmaskFlagOfs = [
|
|
5,76,82,91,79,84,80,81,77,78,83,
|
|
19,10,18,11,21,12,13,14,15,20,16,17,
|
|
33,34,30,31,98,92,93,94,95,96,97,141,
|
|
173,144,145,146,147,148,149,172,
|
|
181,
|
|
409,297,32,296,
|
|
];
|
|
string[] MapUnmaskAltName = ["Melemele Sea (East)", "Melemele Sea (West)"];
|
|
CLB_MapUnmask.Items.Clear();
|
|
for (int i = 0, u = 0, m = MapUnmaskNameIndex.Length - (SAV is SAV7USUM ? 0 : 4); i < m; i++)
|
|
{
|
|
var dest = MapUnmaskNameIndex[i];
|
|
var name = dest < 0 ? MapUnmaskAltName[u++] : metLocationList.First(v => v.Value == dest).Text;
|
|
var state = SAV.EventWork.GetEventFlag(SkipFlag + MapUnmaskFlagOfs[i]);
|
|
CLB_MapUnmask.Items.Add(name, state);
|
|
}
|
|
}
|
|
|
|
private void LoadUltraData()
|
|
{
|
|
NUD_Surf0.Value = SAV.Misc.GetSurfScore(0);
|
|
NUD_Surf1.Value = SAV.Misc.GetSurfScore(1);
|
|
NUD_Surf2.Value = SAV.Misc.GetSurfScore(2);
|
|
NUD_Surf3.Value = SAV.Misc.GetSurfScore(3);
|
|
TB_RotomOT.Font = TB_OTName.Font;
|
|
TB_RotomOT.Text = SAV.FieldMenu.RotomOT;
|
|
NUD_RotomAffection.Value = Math.Min(NUD_RotomAffection.Maximum, SAV.FieldMenu.RotomAffection);
|
|
CHK_RotoLoto1.Checked = SAV.FieldMenu.RotomLoto1;
|
|
CHK_RotoLoto2.Checked = SAV.FieldMenu.RotomLoto2;
|
|
}
|
|
|
|
private void Save()
|
|
{
|
|
SaveTrainerInfo();
|
|
SavePokeFinder();
|
|
SaveBattleTree();
|
|
SaveTrainerAppearance();
|
|
SAV.Misc.DaysFromRefreshed = (byte)NUD_DaysFromRefreshed.Value;
|
|
SaveThrowType();
|
|
|
|
SAV.Festa.FestivalPlazaName = TB_PlazaName.Text;
|
|
|
|
// Vivillon
|
|
if (CB_Vivillon.SelectedIndex >= 0) SAV.Misc.Vivillon = CB_Vivillon.SelectedIndex;
|
|
|
|
SaveFlags();
|
|
|
|
if (SAV is SAV7USUM)
|
|
SaveUltraData();
|
|
}
|
|
|
|
private void SaveTrainerInfo()
|
|
{
|
|
SAV.Version = (GameVersion)(CB_Game.SelectedIndex + 30);
|
|
SAV.Gender = (byte)CB_Gender.SelectedIndex;
|
|
|
|
SAV.Money = Util.ToUInt32(MT_Money.Text);
|
|
SAV.Region = (byte)WinFormsUtil.GetIndex(CB_Region);
|
|
SAV.Country = (byte)WinFormsUtil.GetIndex(CB_Country);
|
|
SAV.ConsoleRegion = (byte)WinFormsUtil.GetIndex(CB_3DSReg);
|
|
SAV.Language = WinFormsUtil.GetIndex(CB_Language);
|
|
if (CB_AlolaTime.Enabled)
|
|
SAV.GameTime.AlolaTime = (ulong)WinFormsUtil.GetIndex(CB_AlolaTime);
|
|
|
|
if (SAV.OT != TB_OTName.Text) // only modify if changed (preserve trash bytes?)
|
|
SAV.OT = TB_OTName.Text;
|
|
|
|
// Copy Position
|
|
if (GB_Map.Enabled && MapUpdated)
|
|
{
|
|
SAV.Situation.M = (int)NUD_M.Value;
|
|
SAV.Situation.X = (float)(NUD_X.Value * 60);
|
|
SAV.Situation.Z = (float)(NUD_Z.Value * 60);
|
|
SAV.Situation.Y = (float)(NUD_Y.Value * 60);
|
|
var angle = (double)NUD_R.Value * Math.PI / 360.0;
|
|
SAV.Situation.RX = 0;
|
|
SAV.Situation.RZ = (float)Math.Sin(angle);
|
|
SAV.Situation.RY = 0;
|
|
SAV.Situation.RW = (float)Math.Cos(angle);
|
|
SAV.Situation.UpdateOverworldCoordinates();
|
|
}
|
|
|
|
// Save PlayTime
|
|
SAV.PlayedHours = ushort.Parse(MT_Hours.Text);
|
|
SAV.PlayedMinutes = ushort.Parse(MT_Minutes.Text) % 60;
|
|
SAV.PlayedSeconds = ushort.Parse(MT_Seconds.Text) % 60;
|
|
|
|
SAV.SecondsToStart = (uint)DateUtil.GetSecondsFrom2000(CAL_AdventureStartDate.Value, CAL_AdventureStartTime.Value);
|
|
SAV.SecondsToFame = (uint)DateUtil.GetSecondsFrom2000(CAL_HoFDate.Value, CAL_HoFTime.Value);
|
|
|
|
if (SAV.Played.LastSavedDate.HasValue)
|
|
SAV.Played.LastSavedDate = new DateTime(CAL_LastSavedDate.Value.Year, CAL_LastSavedDate.Value.Month, CAL_LastSavedDate.Value.Day, CAL_LastSavedTime.Value.Hour, CAL_LastSavedTime.Value.Minute, 0);
|
|
|
|
SAV.Misc.BP = (uint)NUD_BP.Value;
|
|
SAV.Festa.FestaCoins = (int)NUD_FC.Value;
|
|
}
|
|
|
|
private void SavePokeFinder()
|
|
{
|
|
SAV.PokeFinder.SnapCount = (uint)NUD_SnapCount.Value;
|
|
SAV.PokeFinder.ThumbsTotalValue = (uint)NUD_ThumbsTotal.Value;
|
|
SAV.PokeFinder.ThumbsHighValue = (uint)NUD_ThumbsRecord.Value;
|
|
|
|
SAV.PokeFinder.CameraVersion = (ushort)CB_CameraVersion.SelectedIndex;
|
|
SAV.PokeFinder.GyroFlag = CHK_Gyro.Checked;
|
|
}
|
|
|
|
private void SaveBattleTree()
|
|
{
|
|
var bt = SAV.BattleTree;
|
|
bt.SetTreeStreak((int)NUD_RCStreak0.Value, 0, super: false, max: false);
|
|
bt.SetTreeStreak((int)NUD_RCStreak1.Value, 1, super: false, max: false);
|
|
bt.SetTreeStreak((int)NUD_RCStreak2.Value, 2, super: false, max: false);
|
|
bt.SetTreeStreak((int)NUD_RMStreak0.Value, 0, super: false, max: true);
|
|
bt.SetTreeStreak((int)NUD_RMStreak1.Value, 1, super: false, max: true);
|
|
bt.SetTreeStreak((int)NUD_RMStreak2.Value, 2, super: false, max: true);
|
|
|
|
bt.SetTreeStreak((int)NUD_SCStreak0.Value, 0, super: true, max: false);
|
|
bt.SetTreeStreak((int)NUD_SCStreak1.Value, 1, super: true, max: false);
|
|
bt.SetTreeStreak((int)NUD_SCStreak2.Value, 2, super: true, max: false);
|
|
bt.SetTreeStreak((int)NUD_SMStreak0.Value, 0, super: true, max: true);
|
|
bt.SetTreeStreak((int)NUD_SMStreak1.Value, 1, super: true, max: true);
|
|
bt.SetTreeStreak((int)NUD_SMStreak2.Value, 2, super: true, max: true);
|
|
}
|
|
|
|
private void SaveTrainerAppearance()
|
|
{
|
|
// Skin changed && (gender matches || override)
|
|
byte gender = (byte)(CB_Gender.SelectedIndex & 1);
|
|
int skin = CB_SkinColor.SelectedIndex & 1;
|
|
var gStr = CB_Gender.Items[gender]!.ToString();
|
|
var sStr = CB_Gender.Items[skin]!.ToString();
|
|
|
|
if (SAV.MyStatus.DressUpSkinColor == CB_SkinColor.SelectedIndex)
|
|
return;
|
|
|
|
if (SAV.Gender == skin || DialogResult.Yes == WinFormsUtil.Prompt(MessageBoxButtons.YesNo, $"Gender-Skin mismatch:{Environment.NewLine}Gender: {gStr}, Skin: {sStr}", "Save selected Skin Color?"))
|
|
SAV.MyStatus.DressUpSkinColor = CB_SkinColor.SelectedIndex;
|
|
}
|
|
|
|
private void SaveThrowType()
|
|
{
|
|
if (CB_BallThrowType.SelectedIndex >= 0)
|
|
SAV.MyStatus.BallThrowType = (byte)CB_BallThrowType.SelectedIndex;
|
|
|
|
if (SAV is not SAV7SM) // unlock flags are in flag editor instead
|
|
return;
|
|
|
|
const int unlockStart = 292;
|
|
const int learnedStart = 3479;
|
|
for (int i = 2; i < BattleStyles.Length; i++)
|
|
SAV.EventWork.SetEventFlag(unlockStart + i, LB_BallThrowTypeUnlocked.GetSelected(i));
|
|
for (int i = 1; i < BattleStyles.Length; i++)
|
|
SAV.EventWork.SetEventFlag(learnedStart + i, LB_BallThrowTypeLearned.GetSelected(i));
|
|
}
|
|
|
|
private void SaveFlags()
|
|
{
|
|
SAV.Misc.Stamps = GetBits(LB_Stamps);
|
|
|
|
SAV.EventWork.SetEventFlag(333, CHK_UnlockSuperSingles.Checked);
|
|
SAV.EventWork.SetEventFlag(334, CHK_UnlockSuperDoubles.Checked);
|
|
SAV.EventWork.SetEventFlag(335, CHK_UnlockSuperMulti.Checked);
|
|
|
|
SAV.MyStatus.MegaUnlocked = CHK_UnlockMega.Checked;
|
|
SAV.MyStatus.ZMoveUnlocked = CHK_UnlockZMove.Checked;
|
|
|
|
for (int i = 0; i < CLB_FlyDest.Items.Count; i++)
|
|
SAV.EventWork.SetEventFlag(SkipFlag + FlyDestFlagOfs[i], CLB_FlyDest.GetItemChecked(i));
|
|
for (int i = 0; i < CLB_MapUnmask.Items.Count; i++)
|
|
SAV.EventWork.SetEventFlag(SkipFlag + MapUnmaskFlagOfs[i], CLB_MapUnmask.GetItemChecked(i));
|
|
}
|
|
|
|
private void SaveUltraData()
|
|
{
|
|
SAV.Misc.SetSurfScore(0, (int)NUD_Surf0.Value);
|
|
SAV.Misc.SetSurfScore(1, (int)NUD_Surf1.Value);
|
|
SAV.Misc.SetSurfScore(2, (int)NUD_Surf2.Value);
|
|
SAV.Misc.SetSurfScore(3, (int)NUD_Surf3.Value);
|
|
|
|
SAV.FieldMenu.RotomAffection = (ushort)NUD_RotomAffection.Value;
|
|
SAV.FieldMenu.RotomLoto1 = CHK_RotoLoto1.Checked;
|
|
SAV.FieldMenu.RotomLoto2 = CHK_RotoLoto2.Checked;
|
|
|
|
if (TB_RotomOT.Text != TB_OTName.Text // different Rotom name from OT
|
|
&& TB_OTName.Text != SAV.OT // manually changed
|
|
&& DialogResult.Yes == // wants to update
|
|
WinFormsUtil.Prompt(MessageBoxButtons.YesNo, "Rotom OT does not match OT name. Update Rotom OT name with OT name?"))
|
|
{
|
|
SAV.FieldMenu.RotomOT = TB_OTName.Text;
|
|
}
|
|
else
|
|
{
|
|
SAV.FieldMenu.RotomOT = TB_RotomOT.Text;
|
|
}
|
|
}
|
|
|
|
private static uint GetBits(ListBox listbox)
|
|
{
|
|
uint bits = 0;
|
|
for (int i = 0; i < listbox.Items.Count; i++)
|
|
{
|
|
if (listbox.GetSelected(i))
|
|
bits |= 1u << i;
|
|
}
|
|
return bits;
|
|
}
|
|
|
|
private void ClickOT(object sender, MouseEventArgs e)
|
|
{
|
|
// Special Character Form
|
|
if (ModifierKeys != Keys.Control)
|
|
return;
|
|
|
|
TrashEditor.Show(TB_OTName, SAV, SAV.MyStatus.OriginalTrainerTrash);
|
|
}
|
|
|
|
private void B_Cancel_Click(object sender, EventArgs e)
|
|
{
|
|
Close();
|
|
}
|
|
|
|
private void B_Save_Click(object sender, EventArgs e)
|
|
{
|
|
Save();
|
|
Origin.CopyChangesFrom(SAV);
|
|
Close();
|
|
}
|
|
|
|
private void Change255(object sender, EventArgs e)
|
|
{
|
|
MaskedTextBox box = (MaskedTextBox)sender;
|
|
if (box.Text.Length == 0) box.Text = "0";
|
|
if (Util.ToInt32(box.Text) > 255) box.Text = "255";
|
|
}
|
|
|
|
private void ChangeMapValue(object sender, EventArgs e)
|
|
{
|
|
if (!Loading)
|
|
MapUpdated = true;
|
|
}
|
|
|
|
private void UpdateCountry(object sender, EventArgs e)
|
|
{
|
|
int index;
|
|
if (sender is ComboBox c && (index = WinFormsUtil.GetIndex(c)) > 0)
|
|
Main.SetCountrySubRegion(CB_Region, $"sr_{index:000}");
|
|
}
|
|
|
|
private void B_Fashion_Click(object sender, EventArgs e)
|
|
{
|
|
var prompt = WinFormsUtil.Prompt(MessageBoxButtons.YesNo, "Modifying Fashion Items will clear existing fashion unlock data.", "Continue?");
|
|
if (DialogResult.Yes != prompt)
|
|
return;
|
|
|
|
// Clear Block
|
|
SAV.Fashion.Clear();
|
|
|
|
// Write Payload
|
|
|
|
switch (CB_Fashion.SelectedIndex)
|
|
{
|
|
case 0: // Base Fashion
|
|
{
|
|
SAV.Fashion.Reset();
|
|
break;
|
|
}
|
|
case 1: // Full Legal
|
|
ReadOnlySpan<byte> data1 = SAV is SAV7USUM
|
|
? SAV.Gender == 0 ? Properties.Resources.fashion_m_uu : Properties.Resources.fashion_f_uu
|
|
: SAV.Gender == 0 ? Properties.Resources.fashion_m_sm : Properties.Resources.fashion_f_sm;
|
|
SAV.Fashion.ImportPayload(data1);
|
|
break;
|
|
case 2: // Everything
|
|
ReadOnlySpan<byte> data2 = SAV is SAV7USUM
|
|
? SAV.Gender == 0 ? Properties.Resources.fashion_m_uu_illegal : Properties.Resources.fashion_f_uu_illegal
|
|
: SAV.Gender == 0 ? Properties.Resources.fashion_m_sm_illegal : Properties.Resources.fashion_f_sm_illegal;
|
|
SAV.Fashion.ImportPayload(data2);
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
System.Media.SystemSounds.Asterisk.Play();
|
|
}
|
|
|
|
private string? UpdateTip(int index)
|
|
{
|
|
switch (index)
|
|
{
|
|
case 2: // Storyline Completed Time
|
|
var seconds = DateUtil.GetSecondsFrom2000(CAL_AdventureStartDate.Value, CAL_AdventureStartTime.Value);
|
|
return DateUtil.ConvertDateValueToString(SAV.GetRecord(index), seconds);
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private void UpdateBattleStyle(object sender, EventArgs e)
|
|
{
|
|
if (CB_BallThrowTypeListMode.SelectedIndex == 0)
|
|
{
|
|
LB_BallThrowTypeUnlocked.Visible = true;
|
|
LB_BallThrowTypeLearned.Visible = false;
|
|
}
|
|
else
|
|
{
|
|
LB_BallThrowTypeUnlocked.Visible = false;
|
|
LB_BallThrowTypeLearned.Visible = true;
|
|
}
|
|
}
|
|
|
|
private void UpdateBallThrowTypeLearned(object sender, EventArgs e)
|
|
{
|
|
if (Loading)
|
|
return;
|
|
if (!LB_BallThrowTypeLearned.GetSelected(0))
|
|
LB_BallThrowTypeLearned.SetSelected(0, true);
|
|
}
|
|
|
|
private void UpdateBallThrowTypeUnlocked(object sender, EventArgs e)
|
|
{
|
|
if (Loading)
|
|
return;
|
|
for (int i = 0; i < 2; i++)
|
|
{
|
|
if (!LB_BallThrowTypeUnlocked.GetSelected(i))
|
|
LB_BallThrowTypeUnlocked.SetSelected(i, true);
|
|
}
|
|
}
|
|
|
|
private void UpdateSkinColor(object sender, EventArgs e)
|
|
{
|
|
if (Loading)
|
|
return;
|
|
CB_SkinColor.SelectedIndex = (CB_SkinColor.SelectedIndex & ~0x1) | (CB_Gender.SelectedIndex & 1);
|
|
}
|
|
|
|
private void B_AllFlyDest_Click(object sender, EventArgs e)
|
|
{
|
|
for (int i = 0; i < CLB_FlyDest.Items.Count; i++)
|
|
CLB_FlyDest.SetItemChecked(i, true);
|
|
}
|
|
|
|
private void B_AllMapUnmask_Click(object sender, EventArgs e)
|
|
{
|
|
for (int i = 0; i < CLB_MapUnmask.Items.Count; i++)
|
|
CLB_MapUnmask.SetItemChecked(i, true);
|
|
}
|
|
}
|