using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Media; using System.Text; using System.Windows.Forms; using pk3DS.Core.Structures; using pk3DS.Core; using pk3DS.Core.Randomizers; using pk3DS.WinForms.Properties; namespace pk3DS.WinForms; public partial class LevelUpEditor7 : Form { public LevelUpEditor7(byte[][] infiles) { InitializeComponent(); files = infiles; string[] species = Main.Config.GetText(TextName.SpeciesNames); string[][] AltForms = Main.Config.Personal.GetFormList(species, Main.Config.MaxSpeciesID); string[] specieslist = Main.Config.Personal.GetPersonalEntryList(AltForms, species, Main.Config.MaxSpeciesID, out baseForms, out formVal); specieslist[0] = movelist[0] = ""; string[] sortedspecies = (string[])specieslist.Clone(); Array.Resize(ref sortedspecies, Main.Config.MaxSpeciesID + 1); Array.Sort(sortedspecies); SetupDGV(); var newlist = new List(); for (int i = 1; i <= Main.Config.MaxSpeciesID; i++) // add all species newlist.Add(new ComboItem { Text = sortedspecies[i], Value = Array.IndexOf(specieslist, sortedspecies[i]) }); for (int i = Main.Config.MaxSpeciesID + 1; i < specieslist.Length; i++) // add all forms newlist.Add(new ComboItem { Text = specieslist[i], Value = i }); CB_Species.DisplayMember = "Text"; CB_Species.ValueMember = "Value"; CB_Species.DataSource = newlist; CB_Species.SelectedIndex = 0; RandSettings.GetFormSettings(this, groupBox1.Controls); } private readonly byte[][] files; private int entry = -1; private readonly string[] movelist = Main.Config.GetText(TextName.MoveNames); private bool dumping; private readonly int[] baseForms, formVal; private void SetupDGV() { string[] sortedmoves = (string[])movelist.Clone(); Array.Sort(sortedmoves); var dgvLevel = new DataGridViewTextBoxColumn(); { dgvLevel.HeaderText = "Level"; dgvLevel.DisplayIndex = 0; dgvLevel.Width = 45; dgvLevel.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; } var dgvMove = new DataGridViewComboBoxColumn(); { dgvMove.HeaderText = "Move"; dgvMove.DisplayIndex = 1; for (int i = 0; i < movelist.Length; i++) dgvMove.Items.Add(sortedmoves[i]); // add only the Names dgvMove.Width = 135; dgvMove.FlatStyle = FlatStyle.Flat; } dgv.Columns.Add(dgvLevel); dgv.Columns.Add(dgvMove); } private Learnset6 pkm; private void GetList() { entry = WinFormsUtil.GetIndex(CB_Species); int s = baseForms[entry]; int f = formVal[entry]; if (entry <= Main.Config.MaxSpeciesID) s = entry; int[] specForm = [s, f]; string filename = "_" + specForm[0] + (entry > Main.Config.MaxSpeciesID ? "_" + (specForm[1] + 1) : ""); PB_MonSprite.Image = (Bitmap)Resources.ResourceManager.GetObject(filename); dgv.Rows.Clear(); byte[] input = files[entry]; if (input.Length <= 4) { files[entry] = BitConverter.GetBytes(-1); return; } pkm = new Learnset6(input); dgv.Rows.Add(pkm.Count); // Fill Entries for (int i = 0; i < pkm.Count; i++) { dgv.Rows[i].Cells[0].Value = pkm.Levels[i]; dgv.Rows[i].Cells[1].Value = movelist[pkm.Moves[i]]; } dgv.CancelEdit(); } private void SetList() { if (entry < 1 || dumping) return; List moves = []; List levels = []; for (int i = 0; i < dgv.Rows.Count - 1; i++) { int move = Array.IndexOf(movelist, dgv.Rows[i].Cells[1].Value); if (move < 1) continue; moves.Add((short)move); string level = (dgv.Rows[i].Cells[0].Value ?? 0).ToString(); _ = short.TryParse(level, out var lv); if (lv > 100) lv = 100; levels.Add(lv); } pkm.Moves = [.. moves]; pkm.Levels = [.. levels]; files[entry] = pkm.Write(); } private void ChangeEntry(object sender, EventArgs e) { SetList(); GetList(); } // Struggle, Hyperspace Fury, Dark Void private static readonly int[] usualBan = [165, 621, 464]; private void B_RandAll_Click(object sender, EventArgs e) { SetList(); var sets = files.Select(z => new Learnset6(z)).ToArray(); var banned = new List(usualBan.Concat(Legal.Z_Moves)); if (CHK_NoFixedDamage.Checked) banned.AddRange(MoveRandomizer.FixedDamageMoves); var rand = new LearnsetRandomizer(Main.Config, sets) { Expand = CHK_Expand.Checked, ExpandTo = (int)NUD_Moves.Value, Spread = CHK_Spread.Checked, SpreadTo = (int)NUD_Level.Value, STAB = CHK_STAB.Checked, STABPercent = NUD_STAB.Value, STABFirst = CHK_STAB.Checked, BannedMoves = banned, Learn4Level1 = CHK_4MovesLvl1.Checked, }; rand.Execute(); sets.Select(z => z.Write()).ToArray().CopyTo(files, 0); GetList(); WinFormsUtil.Alert("All Pokémon's Level Up Moves have been randomized!", "Press the Dump button to see the new Level Up Moves!"); } private void B_Metronome_Click(object sender, EventArgs e) { if (WinFormsUtil.Prompt(MessageBoxButtons.YesNo, "Play using Metronome Mode?", "This will modify learnsets to only have Metronome.") != DialogResult.Yes) return; // clear all data, then only assign Metronome at Lv1 for (int i = 0; i < CB_Species.Items.Count; i++) { CB_Species.SelectedIndex = i; dgv.Rows.Clear(); dgv.Rows.Add(); dgv.Rows[0].Cells[0].Value = 1; dgv.Rows[0].Cells[1].Value = movelist[118]; } CB_Species.SelectedIndex = 0; WinFormsUtil.Alert("All Pokémon now only know the move Metronome!"); } private void B_Dump_Click(object sender, EventArgs e) { if (DialogResult.Yes != WinFormsUtil.Prompt(MessageBoxButtons.YesNo, "Dump all Level Up Moves to Text File?")) return; dumping = true; string result = ""; for (int i = 0; i < CB_Species.Items.Count; i++) { CB_Species.SelectedIndex = i; // Get new Species result += "======" + Environment.NewLine + entry + " " + CB_Species.Text + Environment.NewLine + "======" + Environment.NewLine; for (int j = 0; j < dgv.Rows.Count - 1; j++) result += $"{dgv.Rows[j].Cells[0].Value} - {dgv.Rows[j].Cells[1].Value + Environment.NewLine}"; result += Environment.NewLine; } var sfd = new SaveFileDialog { FileName = "Level Up Moves.txt", Filter = "Text File|*.txt" }; SystemSounds.Asterisk.Play(); if (sfd.ShowDialog() == DialogResult.OK) { string path = sfd.FileName; File.WriteAllText(path, result, Encoding.Unicode); } dumping = false; } private void Form_Closing(object sender, FormClosingEventArgs e) { SetList(); RandSettings.SetFormSettings(this, groupBox1.Controls); } private void CHK_TypeBias_CheckedChanged(object sender, EventArgs e) { NUD_STAB.Enabled = CHK_STAB.Checked; NUD_STAB.Value = CHK_STAB.Checked ? 52 : NUD_STAB.Minimum; } public void CalcStats() // Debug Function { Move[] MoveData = Main.Config.Moves; int movectr = 0; int max = 0; int spec = 0; int stab = 0; for (int i = 0; i < Main.Config.MaxSpeciesID; i++) { byte[] movedata = files[i]; int movecount = (movedata.Length - 4) / 4; if (movecount == 65535) continue; movectr += movecount; // Average Moves if (max < movecount) { max = movecount; spec = i; } // Max Moves (and species) for (int m = 0; m < movedata.Length / 4; m++) { int move = BitConverter.ToUInt16(movedata, m * 4); if (move == 65535) { movectr--; continue; } if (Main.SpeciesStat[i].Types.Contains(MoveData[move].Type)) stab++; } } WinFormsUtil.Alert($"Moves Learned: {movectr}\r\nMost Learned: {max} @ {spec}\r\nSTAB Count: {stab}"); } }