mirror of
https://github.com/kwsch/pk3DS.git
synced 2026-08-02 01:34:17 -05:00
247 lines
8.6 KiB
C#
247 lines
8.6 KiB
C#
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<ComboItem>();
|
|
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<int> moves = [];
|
|
List<int> 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<int>(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}");
|
|
}
|
|
} |