From 077e92005ef1d8c22801f2a9287f7bad49f23fa1 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 18 Jan 2015 21:45:22 -0800 Subject: [PATCH] BLZ & Code Changes to allow for ExeFS tools --- pk3DS/BLZ.cs | 527 ++++++++++++++++++++++++++++++++++++ pk3DS/Main.Designer.cs | 129 ++++++--- pk3DS/Main.cs | 220 ++++++++++----- pk3DS/Main.resx | 114 ++++++++ pk3DS/Subforms/EggMove.cs | 6 +- pk3DS/Subforms/Evolution.cs | 10 +- pk3DS/Subforms/LevelUp.cs | 6 +- pk3DS/Subforms/MEE.cs | 16 +- pk3DS/Subforms/Maison.cs | 17 +- pk3DS/Subforms/Moves.cs | 10 +- pk3DS/Subforms/Personal.cs | 30 +- pk3DS/Subforms/RSTE.cs | 40 ++- pk3DS/Subforms/RSWE.cs | 8 +- pk3DS/Subforms/XYWE.cs | 10 +- pk3DS/pk3DS.csproj | 1 + 15 files changed, 958 insertions(+), 186 deletions(-) create mode 100644 pk3DS/BLZ.cs diff --git a/pk3DS/BLZ.cs b/pk3DS/BLZ.cs new file mode 100644 index 0000000..faabb76 --- /dev/null +++ b/pk3DS/BLZ.cs @@ -0,0 +1,527 @@ +/*----------------------------------------------------------------------------*/ +/*-- blz.c - Bottom LZ coding for Nintendo GBA/DS --*/ +/*-- Copyright (C) 2011 CUE --*/ +/*-- --*/ +/*-- Ported to C# by Andi Badra, tweaks by Kaphotics --*/ +/*-- --*/ +/*-- This program is free software: you can redistribute it and/or modify --*/ +/*-- it under the terms of the GNU General Public License as published by --*/ +/*-- the Free Software Foundation, either version 3 of the License, or --*/ +/*-- (at your option) any later version. --*/ +/*-- --*/ +/*-- This program is distributed in the hope that it will be useful, --*/ +/*-- but WITHOUT ANY WARRANTY; without even the implied warranty of --*/ +/*-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --*/ +/*-- GNU General Public License for more details. --*/ +/*-- --*/ +/*-- You should have received a copy of the GNU General Public License --*/ +/*-- along with this program. If not, see . --*/ +/*----------------------------------------------------------------------------*/ + +using System; +using System.IO; +using System.Windows.Forms; + +namespace blz +{ + public partial class BLZCoder + { + public static void main(String[] args) + { + new BLZCoder(args); + } + + private static readonly int CMD_DECODE = 0; + private static readonly int CMD_ENCODE = 1; + + static readonly int BLZ_NORMAL = 0; + static readonly int BLZ_BEST = 1; + static readonly int BLZ_SHIFT = 1; + static readonly int BLZ_MASK = 0x80; + static readonly int BLZ_THRESHOLD = 2; + static readonly int BLZ_N = 0x1002; + static readonly int BLZ_F = 0x12; + + static readonly int BLZ_MAXIM = 0x01400000; + static readonly int RAW_MAXIM = 0x00FFFFFF; + bool arm9; + int new_len; + static void EXIT(string text) + { + Console.Write(text); + } + private ProgressBar pBar1; + private void initpBar(int max) + { + if (pBar1.InvokeRequired) + pBar1.Invoke((MethodInvoker)delegate { pBar1.Minimum = 0; pBar1.Step = 1; pBar1.Value = 0; pBar1.Maximum = max; }); + else { pBar1.Minimum = 0; pBar1.Step = 1; pBar1.Value = 0; pBar1.Maximum = max; } + } + private void setpBarPos(int pos) + { + if (pBar1.InvokeRequired) + pBar1.Invoke((MethodInvoker)delegate { pBar1.Value = pos; }); + else { pBar1.Value = pos; } + } + public BLZCoder(string[] args, ProgressBar pBar = null) + { + int cmd, mode = 0, arg; + if (pBar == null) pBar1 = new ProgressBar(); + pBar1 = pBar; + + // Title(); + + if (args == null || (args.Length != 2)) + throw new Exception("No arguments supplied to BLZ"); + + if (args[0].Equals("-d")) + cmd = CMD_DECODE; + + else if (args[0].Equals("-en") || args[0].Equals("-en9")) + { + cmd = CMD_ENCODE; + mode = BLZ_NORMAL; + } + else if (args[0].Equals("-eo") || args[0].Equals("-eo9")) + { + cmd = CMD_ENCODE; + mode = BLZ_BEST; + } + else { Console.Write("Command not supported" + Environment.NewLine); return; } + + if (args.Length < 2) + Console.Write("Filename not specified" + Environment.NewLine); + else + { + switch (cmd) + { + case 0: + for (arg = 1; arg < args.Length; arg++) + BLZ_Decode(args[arg]); + break; + case 1: + arm9 = (args[0].Length > 3 && args[0][3] == '9'); + for (arg = 1; arg < args.Length; arg++) + BLZ_Encode(args[arg], mode); + break; + } + } + + Console.Write(Environment.NewLine + "Done" + Environment.NewLine); + } + private void Save(String filename, byte[] buffer, int length) + { + Array.Resize(ref buffer, length); + try + { File.WriteAllBytes(filename, buffer); } + catch (IOException e) + { + Console.Write(Environment.NewLine + "File write error" + Environment.NewLine + e.ToString() + Environment.NewLine); + File.WriteAllBytes("blz.bin", buffer); + Console.Write(Environment.NewLine + "Wrote to 'blz.bin' instead." + Environment.NewLine); + } + } + private void BLZ_Decode(String filename) + { + try + { + Console.Write("- decoding '%s'", filename); + long startTime = System.DateTime.Now.Millisecond; + byte[] buf = File.ReadAllBytes(filename); + BLZResult result = BLZ_Decode(buf); + if (result != null) + Save(filename, result.buffer, result.length); + Console.Write(" - done, time=" + + (DateTime.Now.Millisecond - startTime) + "ms"); + Console.Write(Environment.NewLine + ""); + } + catch (IOException e) + { Console.Write(Environment.NewLine + "File read error" + Environment.NewLine + e.ToString()); } + } + private BLZResult BLZ_Decode(byte[] data) + { + byte[] pak_buffer, raw_buffer; + int pak, raw, pak_end, raw_end; + int pak_len, raw_len, len, pos, inc_len, hdr_len, enc_len, dec_len; + int flags = 0, mask; + + pak_buffer = prepareData(data); + pak_len = pak_buffer.Length - 3; + + inc_len = BitConverter.ToInt32(pak_buffer, pak_len - 4); + if (inc_len < 1) + { + Console.Write(", WARNING: not coded file!"); + enc_len = 0; + dec_len = pak_len; + pak_len = 0; + raw_len = dec_len; + } + else + { + if (pak_len < 8) + { + Console.Write(Environment.NewLine + "File has a bad header" + Environment.NewLine); + return null; + } + hdr_len = pak_buffer[pak_len - 5]; + if (hdr_len < 8 || hdr_len > 0xB) + { + Console.Write(Environment.NewLine + "Bad header length" + Environment.NewLine); + return null; + } + if (pak_len <= hdr_len) + { + Console.Write(Environment.NewLine + "Bad length" + Environment.NewLine); + return null; + } + enc_len = (int)(BitConverter.ToUInt32(pak_buffer, pak_len - 8) & 0x00FFFFFF); + dec_len = pak_len - enc_len; + pak_len = enc_len - hdr_len; + raw_len = dec_len + enc_len + inc_len; + if (raw_len > RAW_MAXIM) + { + Console.Write(Environment.NewLine + "Bad decoded length" + Environment.NewLine); + return null; + } + } + + raw_buffer = new byte[raw_len]; + + pak = 0; + raw = 0; + pak_end = dec_len + pak_len; + raw_end = raw_len; + + for (len = 0; len < dec_len; len++) + raw_buffer[raw++] = pak_buffer[pak++]; + + BLZ_Invert(pak_buffer, dec_len, pak_len); + + mask = 0; + + while (raw < raw_end) + { + if ((mask = (int)((uint)mask >> BLZ_SHIFT)) == 0) + { + if (pak == pak_end) + break; + + flags = pak_buffer[pak++]; + mask = BLZ_MASK; + } + + if ((flags & mask) == 0) + { + if (pak == pak_end) + break; + + raw_buffer[raw++] = pak_buffer[pak++]; + } + else + { + if ((pak + 1) >= pak_end) + break; + + pos = pak_buffer[pak++] << 8; + pos |= pak_buffer[pak++]; + len = (int)((uint)pos >> 12) + BLZ_THRESHOLD + 1; + if (raw + len > raw_end) + { + Console.Write(", WARNING: wrong decoded length!"); + len = raw_end - raw; + } + pos = (pos & 0xFFF) + 3; + while ((len--) > 0) + { + int charHere = raw_buffer[raw - pos]; + raw_buffer[raw++] = (byte)charHere; + } + } + } + + BLZ_Invert(raw_buffer, dec_len, raw_len - dec_len); + + raw_len = raw; + + if (raw != raw_end) + Console.Write(", WARNING: unexpected end of encoded file!"); + + return new BLZResult(raw_buffer, raw_len); + } + private BLZResult BLZ_Encode(byte[] data, int mode) + { + byte[] raw_buffer, pak_buffer, new_buffer; + int raw_len, pak_len; + + new_len = 0; + + raw_buffer = prepareData(data); + raw_len = raw_buffer.Length - 3; + + pak_buffer = null; + pak_len = BLZ_MAXIM + 1; + + new_buffer = BLZ_Code(raw_buffer, raw_len, mode); + + if (new_len < pak_len) + { + pak_buffer = new_buffer; + pak_len = new_len; + } + return new BLZResult(pak_buffer, pak_len); + } + private byte[] prepareData(byte[] data) + { + int fs = data.Length; + byte[] fb = new byte[fs + 3]; + for (int i = 0; i < fs; i++) + fb[i] = data[i]; + + return fb; + } + private void writeUnsigned(byte[] buffer, int offset, int value) + { + buffer[offset] = (byte)(value & 0xFF); + buffer[offset + 1] = (byte)((value >> 8) & 0xFF); + buffer[offset + 2] = (byte)((value >> 16) & 0xFF); + buffer[offset + 3] = (byte)((value >> 24) & 0x7F); + } + private void BLZ_Encode(String filename, int mode) + { + try + { + Console.Write(String.Format("Now encoding {0}", filename)); + var stopwatch = new System.Diagnostics.Stopwatch(); + stopwatch.Start(); + + byte[] buf = File.ReadAllBytes(filename); + BLZResult result = BLZ_Encode(buf, mode); + if (result != null) + Save(filename, result.buffer, result.length); + + stopwatch.Stop(); + Console.Write(Environment.NewLine + "Done, time elapsed = " + (stopwatch.ElapsedMilliseconds) + "ms" + Environment.NewLine); + } + catch (IOException e) + { Console.Write(Environment.NewLine + "File read error" + Environment.NewLine + e.ToString() + Environment.NewLine); } + } + private byte[] BLZ_Code(byte[] raw_buffer, int raw_len, int best) + { + byte[] pak_buffer, tmp; + int pak, raw, raw_end, flg = 0; + int pak_len, inc_len, hdr_len, enc_len, len; + int len_best, pos_best = 0, len_next, pos_next = 0, len_post, pos_post = 0; + int pak_tmp, raw_tmp, raw_new; + int mask; + + pak_tmp = 0; + raw_tmp = raw_len; + + pak_len = raw_len + ((raw_len + 7) / 8) + 11; + pak_buffer = new byte[pak_len]; + + raw_new = raw_len; + + // We don't do any of the checks here + // Presume that we actually are using an arm9 + if (arm9) + raw_new -= 0x4000; + + BLZ_Invert(raw_buffer, 0, raw_len); + + pak = 0; + raw = 0; + raw_end = raw_new; + + mask = 0; + initpBar(raw_end); + while (raw < raw_end) + { + setpBarPos(raw); + if ((mask = (int)((uint)mask >> BLZ_SHIFT)) == 0) + { + pak_buffer[(flg = pak++)] = 0; + mask = BLZ_MASK; + } + + SearchPair sl1 = SEARCH(pos_best, raw_buffer, raw, raw_end); + len_best = sl1.l; + pos_best = sl1.p; + + // LZ-CUE optimization start + if (best == BLZ_BEST) + { + if (len_best > BLZ_THRESHOLD) + { + if (raw + len_best < raw_end) + { + raw += len_best; + SearchPair sl2 = SEARCH(pos_next, raw_buffer, raw, + raw_end); + len_next = sl2.l; + pos_next = sl2.p; + raw -= (len_best - 1); + SearchPair sl3 = SEARCH(pos_post, raw_buffer, raw, + raw_end); + len_post = sl3.l; + pos_post = sl3.p; + raw--; + + if (len_next <= BLZ_THRESHOLD) + len_next = 1; + if (len_post <= BLZ_THRESHOLD) + len_post = 1; + if ((len_best + len_next) <= (1 + len_post)) + len_best = 1; + } + } + } + // LZ-CUE optimization end + pak_buffer[flg] = (byte)(pak_buffer[flg] << 1); + if (len_best > BLZ_THRESHOLD) + { + raw += len_best; + pak_buffer[flg] |= 1; + pak_buffer[pak++] = (byte)((byte)((len_best - (BLZ_THRESHOLD + 1)) << 4) | ((uint)(pos_best - 3) >> 8)); + pak_buffer[pak++] = (byte)((pos_best - 3)); + } + else + pak_buffer[pak++] = raw_buffer[raw++]; + + if (pak + raw_len - raw < pak_tmp + raw_tmp) + { + pak_tmp = pak; + raw_tmp = raw_len - raw; + } + } + + while ((mask > 0) && (mask != 1)) + { + mask = (int)((uint)mask >> BLZ_SHIFT); + pak_buffer[flg] = (byte)(pak_buffer[flg] << 1); + } + + pak_len = pak; + + BLZ_Invert(raw_buffer, 0, raw_len); + BLZ_Invert(pak_buffer, 0, pak_len); + + if (pak_tmp == 0 || (raw_len + 4 < ((pak_tmp + raw_tmp + 3) & 0xFFFFFFFC) + 8)) + { + pak = 0; + raw = 0; + raw_end = raw_len; + + while (raw < raw_end) + pak_buffer[pak] = raw_buffer[raw]; + + while ((pak & 3) > 0) + pak_buffer[pak++] = 0; + + pak_buffer[pak++] = 0; + pak_buffer[pak++] = 0; + pak_buffer[pak++] = 0; + pak_buffer[pak++] = 0; + } + else + { + tmp = new byte[raw_tmp + pak_tmp + 11]; + + for (len = 0; len < raw_tmp; len++) + tmp[len] = raw_buffer[len]; + + for (len = 0; len < pak_tmp; len++) + tmp[raw_tmp + len] = pak_buffer[len + pak_len - pak_tmp]; + + pak = 0; + pak_buffer = tmp; + + pak = raw_tmp + pak_tmp; + + enc_len = pak_tmp; + hdr_len = 8; + inc_len = raw_len - pak_tmp - raw_tmp; + + while ((pak & 3) > 0) + { + pak_buffer[pak++] = 0xFF; + hdr_len++; + } + + writeUnsigned(pak_buffer, pak, enc_len + hdr_len); + pak += 3; + pak_buffer[pak++] = (byte)hdr_len; + writeUnsigned(pak_buffer, pak, inc_len - hdr_len); + pak += 4; + } + new_len = pak; + return pak_buffer; + } + + private class SearchPair + { + public int l; + public int p; + + public SearchPair(int l, int p) + { + this.l = l; + this.p = p; + } + } + private SearchPair SEARCH(int p, byte[] raw_buffer, int raw, int raw_end) + { + int l = BLZ_THRESHOLD; + int max = (raw >= BLZ_N) ? BLZ_N : raw; + for (int pos = 3; pos <= max; pos++) + { + int len; + for (len = 0; len < BLZ_F; len++) + { + if (raw + len == raw_end) + break; + + if (len >= pos) + break; + + if (raw_buffer[raw + len] != raw_buffer[raw + len - pos]) + break; + } + + if (len > l) + { + p = pos; + if ((l = len) == BLZ_F) + break; + } + } + return new SearchPair(l, p); + } + + private class BLZResult + { + public BLZResult(byte[] raw_buffer, int raw_len) + { + this.buffer = raw_buffer; + this.length = raw_len; + } + + public byte[] buffer; + public int length; + } + private void BLZ_Invert(byte[] buffer, int offset, int length) + { + int bottom, ch; + + bottom = offset + length - 1; + + while (offset < bottom) + { + ch = buffer[offset]; + buffer[offset++] = buffer[bottom]; + buffer[bottom--] = (byte)ch; + } + } + } +} \ No newline at end of file diff --git a/pk3DS/Main.Designer.cs b/pk3DS/Main.Designer.cs index 3bd457d..91b5c2d 100644 --- a/pk3DS/Main.Designer.cs +++ b/pk3DS/Main.Designer.cs @@ -30,7 +30,7 @@ private void InitializeComponent() { this.B_Open = new System.Windows.Forms.Button(); this.TB_Path = new System.Windows.Forms.TextBox(); - this.GB_Tools = new System.Windows.Forms.GroupBox(); + this.GB_RomFS = new System.Windows.Forms.GroupBox(); this.B_Maison = new System.Windows.Forms.Button(); this.B_EggMove = new System.Windows.Forms.Button(); this.B_LevelUp = new System.Windows.Forms.Button(); @@ -48,7 +48,13 @@ private void InitializeComponent() this.L_Game = new System.Windows.Forms.Label(); this.pBar1 = new System.Windows.Forms.ProgressBar(); this.L_About = new System.Windows.Forms.Label(); - this.GB_Tools.SuspendLayout(); + this.GB_ExeFS = new System.Windows.Forms.GroupBox(); + this.B_Pickup = new System.Windows.Forms.Button(); + this.B_Mart = new System.Windows.Forms.Button(); + this.B_MoveTutor = new System.Windows.Forms.Button(); + this.B_TMHM = new System.Windows.Forms.Button(); + this.GB_RomFS.SuspendLayout(); + this.GB_ExeFS.SuspendLayout(); this.SuspendLayout(); // // B_Open @@ -57,7 +63,7 @@ private void InitializeComponent() this.B_Open.Name = "B_Open"; this.B_Open.Size = new System.Drawing.Size(75, 23); this.B_Open.TabIndex = 0; - this.B_Open.Text = "Open \'a\'"; + this.B_Open.Text = "Open Dir"; this.B_Open.UseVisualStyleBackColor = true; this.B_Open.Click += new System.EventHandler(this.B_Open_Click); // @@ -71,29 +77,29 @@ private void InitializeComponent() this.TB_Path.Size = new System.Drawing.Size(349, 20); this.TB_Path.TabIndex = 1; // - // GB_Tools + // GB_RomFS // - this.GB_Tools.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.GB_RomFS.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.GB_Tools.Controls.Add(this.B_Maison); - this.GB_Tools.Controls.Add(this.B_EggMove); - this.GB_Tools.Controls.Add(this.B_LevelUp); - this.GB_Tools.Controls.Add(this.B_StoryText); - this.GB_Tools.Controls.Add(this.B_Item); - this.GB_Tools.Controls.Add(this.B_Move); - this.GB_Tools.Controls.Add(this.B_Evolution); - this.GB_Tools.Controls.Add(this.B_Personal); - this.GB_Tools.Controls.Add(this.B_MegaEvo); - this.GB_Tools.Controls.Add(this.B_Wild); - this.GB_Tools.Controls.Add(this.B_Trainer); - this.GB_Tools.Controls.Add(this.B_GameText); - this.GB_Tools.Enabled = false; - this.GB_Tools.Location = new System.Drawing.Point(12, 67); - this.GB_Tools.Name = "GB_Tools"; - this.GB_Tools.Size = new System.Drawing.Size(430, 110); - this.GB_Tools.TabIndex = 2; - this.GB_Tools.TabStop = false; - this.GB_Tools.Text = "ROM Editing Tools"; + this.GB_RomFS.Controls.Add(this.B_Maison); + this.GB_RomFS.Controls.Add(this.B_EggMove); + this.GB_RomFS.Controls.Add(this.B_LevelUp); + this.GB_RomFS.Controls.Add(this.B_StoryText); + this.GB_RomFS.Controls.Add(this.B_Item); + this.GB_RomFS.Controls.Add(this.B_Move); + this.GB_RomFS.Controls.Add(this.B_Evolution); + this.GB_RomFS.Controls.Add(this.B_Personal); + this.GB_RomFS.Controls.Add(this.B_MegaEvo); + this.GB_RomFS.Controls.Add(this.B_Wild); + this.GB_RomFS.Controls.Add(this.B_Trainer); + this.GB_RomFS.Controls.Add(this.B_GameText); + this.GB_RomFS.Enabled = false; + this.GB_RomFS.Location = new System.Drawing.Point(12, 67); + this.GB_RomFS.Name = "GB_RomFS"; + this.GB_RomFS.Size = new System.Drawing.Size(430, 110); + this.GB_RomFS.TabIndex = 2; + this.GB_RomFS.TabStop = false; + this.GB_RomFS.Text = "RomFS Editing Tools"; // // B_Maison // @@ -259,7 +265,7 @@ private void InitializeComponent() // this.pBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.pBar1.Location = new System.Drawing.Point(12, 182); + this.pBar1.Location = new System.Drawing.Point(12, 241); this.pBar1.Name = "pBar1"; this.pBar1.Size = new System.Drawing.Size(430, 14); this.pBar1.TabIndex = 6; @@ -274,26 +280,82 @@ private void InitializeComponent() this.L_About.Text = "[A]"; this.L_About.Click += new System.EventHandler(this.L_About_Click); // + // GB_ExeFS + // + this.GB_ExeFS.Controls.Add(this.B_Pickup); + this.GB_ExeFS.Controls.Add(this.B_Mart); + this.GB_ExeFS.Controls.Add(this.B_MoveTutor); + this.GB_ExeFS.Controls.Add(this.B_TMHM); + this.GB_ExeFS.Enabled = false; + this.GB_ExeFS.Location = new System.Drawing.Point(12, 184); + this.GB_ExeFS.Name = "GB_ExeFS"; + this.GB_ExeFS.Size = new System.Drawing.Size(430, 50); + this.GB_ExeFS.TabIndex = 8; + this.GB_ExeFS.TabStop = false; + this.GB_ExeFS.Text = "ExeFS Editing Tools"; + // + // B_Pickup + // + this.B_Pickup.Location = new System.Drawing.Point(6, 19); + this.B_Pickup.Name = "B_Pickup"; + this.B_Pickup.Size = new System.Drawing.Size(100, 23); + this.B_Pickup.TabIndex = 3; + this.B_Pickup.Text = "Pickup Editor"; + this.B_Pickup.UseVisualStyleBackColor = true; + this.B_Pickup.Click += new System.EventHandler(this.B_Pickup_Click); + // + // B_Mart + // + this.B_Mart.Location = new System.Drawing.Point(218, 19); + this.B_Mart.Name = "B_Mart"; + this.B_Mart.Size = new System.Drawing.Size(100, 23); + this.B_Mart.TabIndex = 2; + this.B_Mart.Text = "Mart Editor"; + this.B_Mart.UseVisualStyleBackColor = true; + this.B_Mart.Click += new System.EventHandler(this.B_Mart_Click); + // + // B_MoveTutor + // + this.B_MoveTutor.Location = new System.Drawing.Point(324, 19); + this.B_MoveTutor.Name = "B_MoveTutor"; + this.B_MoveTutor.Size = new System.Drawing.Size(100, 23); + this.B_MoveTutor.TabIndex = 1; + this.B_MoveTutor.Text = "Move Tutor Editor"; + this.B_MoveTutor.UseVisualStyleBackColor = true; + this.B_MoveTutor.Click += new System.EventHandler(this.B_MoveTutor_Click); + // + // B_TMHM + // + this.B_TMHM.Location = new System.Drawing.Point(112, 19); + this.B_TMHM.Name = "B_TMHM"; + this.B_TMHM.Size = new System.Drawing.Size(100, 23); + this.B_TMHM.TabIndex = 0; + this.B_TMHM.Text = "TM/HM Editor"; + this.B_TMHM.UseVisualStyleBackColor = true; + this.B_TMHM.Click += new System.EventHandler(this.B_TMHM_Click); + // // Main // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(454, 202); + this.ClientSize = new System.Drawing.Size(454, 262); + this.Controls.Add(this.GB_ExeFS); this.Controls.Add(this.L_About); this.Controls.Add(this.pBar1); this.Controls.Add(this.L_Game); this.Controls.Add(this.L_Lang); this.Controls.Add(this.CB_Lang); - this.Controls.Add(this.GB_Tools); + this.Controls.Add(this.GB_RomFS); this.Controls.Add(this.TB_Path); this.Controls.Add(this.B_Open); - this.MaximumSize = new System.Drawing.Size(470, 240); - this.MinimumSize = new System.Drawing.Size(470, 240); + this.MaximumSize = new System.Drawing.Size(470, 300); + this.MinimumSize = new System.Drawing.Size(470, 300); this.Name = "Main"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "pk3DS"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.formClosing); - this.GB_Tools.ResumeLayout(false); + this.GB_RomFS.ResumeLayout(false); + this.GB_ExeFS.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -303,7 +365,7 @@ private void InitializeComponent() private System.Windows.Forms.Button B_Open; private System.Windows.Forms.TextBox TB_Path; - private System.Windows.Forms.GroupBox GB_Tools; + private System.Windows.Forms.GroupBox GB_RomFS; private System.Windows.Forms.Button B_Trainer; private System.Windows.Forms.Button B_GameText; private System.Windows.Forms.Button B_Wild; @@ -321,6 +383,11 @@ private void InitializeComponent() private System.Windows.Forms.Button B_Maison; private System.Windows.Forms.Button B_EggMove; private System.Windows.Forms.Button B_LevelUp; + private System.Windows.Forms.GroupBox GB_ExeFS; + private System.Windows.Forms.Button B_Pickup; + private System.Windows.Forms.Button B_Mart; + private System.Windows.Forms.Button B_MoveTutor; + private System.Windows.Forms.Button B_TMHM; } } diff --git a/pk3DS/Main.cs b/pk3DS/Main.cs index baa603f..7bb5d36 100644 --- a/pk3DS/Main.cs +++ b/pk3DS/Main.cs @@ -18,23 +18,25 @@ public Main() InitializeComponent(); CB_Lang.SelectedIndex = 2; // restoreGARCs(true, "gametext", "storytext", "personal", "trpoke", "trdata", "evolution", "megaevo", "levelup", "eggmove", "item", "move", "maisonpkS", "maisontrS", "maisonpkN", "maisontrN"); - this.AllowDrop = GB_Tools.AllowDrop = TB_Path.AllowDrop = true; + this.AllowDrop = GB_RomFS.AllowDrop = TB_Path.AllowDrop = true; this.DragEnter += tabMain_DragEnter; this.DragDrop += tabMain_DragDrop; - GB_Tools.DragEnter += tabMain_DragEnter; - GB_Tools.DragDrop += tabMain_DragDrop; + GB_RomFS.DragEnter += tabMain_DragEnter; + GB_RomFS.DragDrop += tabMain_DragDrop; TB_Path.DragEnter += tabMain_DragEnter; TB_Path.DragDrop += tabMain_DragDrop; if (File.Exists("config.ini")) { string path = File.ReadAllText("config.ini"); - if (path.Length > 0) openQuick(path); - + if (path.Length > 0) openQuick(path); } } - public bool oras = false; - public string ExeFS = null; + public static bool oras = false; + public static string RomFS = null; + public static string ExeFS = null; public volatile int threads = 0; + private static string[] allGARCs = { "gametext", "storytext", "personal", "trpoke", "trdata", "evolution", "megaevo", "levelup", "eggmove", "item", "move", "maisonpkS", "maisontrS", "maisonpkN", "maisontrN" }; + private void B_Open_Click(object sender, EventArgs e) { FolderBrowserDialog fbd = new FolderBrowserDialog(); @@ -43,12 +45,54 @@ private void B_Open_Click(object sender, EventArgs e) } private void openQuick(string path) { - // Check to see if the folder is romfs FileInfo fi = new FileInfo(path); - if (fi.Name.Contains("a")) + if (!Directory.Exists(path)) return; + + if (threads > 0) { Util.Alert("Please wait for all operations to finish first."); return; } + if (fi.Name.Contains("code.bin")) + { + if (fi.Length % 0x200 == 0 && (Util.Prompt(MessageBoxButtons.YesNo, "Detected Decompressed code.bin.", "Compress? File will be replaced.") == DialogResult.Yes)) + new Thread(() => { threads++; new blz.BLZCoder(new string[] { "-en", path }, pBar1); threads--; Util.Alert("Compressed!"); }).Start(); + else if (Util.Prompt(MessageBoxButtons.YesNo, "Detected Compressed code.bin.", "Decompress? File will be replaced.") == DialogResult.Yes) + new Thread(() => { threads++; new blz.BLZCoder(new string[] { "-d", path }, pBar1); threads--; Util.Alert("Decompressed!"); }).Start(); + return; + } + else + { + // Check for ROMFS/EXEFS + string[] files = Directory.GetDirectories(path); + int count = files.Length; + if (count > 2 && count > 0) return; // Only want exefs & romfs + { + // first file should be 'exe' + if (new FileInfo(files[0]).Name.Contains("exe") && Directory.Exists(files[0])) + checkIfExeFS(files[0]); + if (new FileInfo(files[count - 1]).Name.Contains("rom") && Directory.Exists(files[count - 1])) + checkIfRomFS(files[count - 1]); + + GB_RomFS.Enabled = (RomFS != null); + GB_ExeFS.Enabled = (ExeFS != null); + B_MoveTutor.Enabled = oras; // default false unless loaded + if (RomFS != null) + { L_Game.Text = (oras) ? "Game Loaded: ORAS" : "Game Loaded: XY"; TB_Path.Text = path; } + else if (ExeFS != null) + { L_Game.Text = "ExeFS loaded - no RomFS"; TB_Path.Text = path; } + else + { L_Game.Text = "No Game Loaded"; TB_Path.Text = ""; } + + changeLanguage(null, null); // Trigger Text Loading + System.Media.SystemSounds.Asterisk.Play(); + } + } + } + private bool checkIfRomFS(string path) + { + string[] top = Directory.GetDirectories(path); + FileInfo fi = new FileInfo(top[(top.Length > 1) ? 1 : 0]); + // Check to see if the folder is romfs + if (fi.Name == "a") { string[] files = Directory.GetFiles(path, "*", SearchOption.AllDirectories); - System.Media.SystemSounds.Asterisk.Play(); if (files.Length == 299) // ORAS oras = true; else if (files.Length == 301) // ORAS demo @@ -57,18 +101,34 @@ private void openQuick(string path) oras = false; else { - TB_Path.Text = ""; GB_Tools.Enabled = false; - L_Game.Text = "No Game Loaded"; - return; + RomFS = null; + oras = false; + return false; } - TB_Path.Text = path; GB_Tools.Enabled = true; - backupGARCs(false, "gametext", "storytext", "personal", "trpoke", "trdata", "evolution", "megaevo", "levelup", "eggmove", "item", "move", "maisonpkS", "maisontrS", "maisonpkN", "maisontrN"); - - L_Game.Text = (oras) ? "Game Loaded: ORAS" : "Game Loaded: XY"; - string exefs = Util.getExeFSFolder(path); - changeLanguage(null, null); // Trigger Text Loading + RomFS = path; + backupGARCs(false, allGARCs); + return true; } + RomFS = null; + oras = false; + return false; + } + private bool checkIfExeFS(string path) + { + string[] files = Directory.GetFiles(path); + if (files.Length != 3) return false; + + FileInfo fi = new FileInfo(files[0]); + if (fi.Name.Contains("code.bin")) + { + if (fi.Length % 0x200 != 0 && (Util.Prompt(MessageBoxButtons.YesNo, "Detected Compressed code.bin.", "Decompress? File will be replaced.") == DialogResult.Yes)) + new Thread(() => { threads++; new blz.BLZCoder(new string[] { "-d", path }, pBar1); threads--; Util.Alert("Decompressed!"); }).Start(); + + ExeFS = path; + return true; + } + return false; } private void tabMain_DragEnter(object sender, DragEventArgs e) { @@ -81,18 +141,18 @@ private void tabMain_DragDrop(object sender, DragEventArgs e) openQuick(path); } - // Subform Items + // RomFS Subform Items private void B_GameText_Click(object sender, EventArgs e) { new Thread(() => { string toEdit = "gametext"; string GARC = getGARCFileName(toEdit); - // threadGet(TB_Path.Text + getGARCFileName(toEdit), toEdit); // We don't need this because loading and changing language does it for us. + // threadGet(RomFS + getGARCFileName(toEdit), toEdit); // We don't need this because loading and changing language does it for us. Invoke((Action)(() => { new xytext(Directory.GetFiles(toEdit)).ShowDialog(); })); // When closed, create a new thread to set the GARC back. - threadSet(TB_Path.Text + GARC, toEdit); + threadSet(RomFS + GARC, toEdit); }).Start(); } private void B_StoryText_Click(object sender, EventArgs e) @@ -102,13 +162,13 @@ private void B_StoryText_Click(object sender, EventArgs e) { string toEdit = "storytext"; string GARC = getGARCFileName(toEdit); - threadGet(TB_Path.Text + GARC, toEdit, true, true); + threadGet(RomFS + GARC, toEdit, true, true); while (threads > 0) // Let threads complete Thread.Sleep(100); Invoke((Action)(() => { new xytext(Directory.GetFiles(toEdit)).ShowDialog(); })); // When closed, create a new thread to set the GARC back. - threadSet(TB_Path.Text + GARC, toEdit); + threadSet(RomFS + GARC, toEdit); while (threads > 0) // Let threads complete Thread.Sleep(100); if (Directory.Exists(toEdit)) Directory.Delete(toEdit, true); @@ -125,24 +185,24 @@ private void B_Maison_Click(object sender, EventArgs e) bool super = (dr == DialogResult.Yes); string mtr = (super) ? "maisontrS" : "maisontrN"; string mtrGARC = getGARCFileName(mtr); - threadGet(TB_Path.Text + mtrGARC, mtr, true, true); + threadGet(RomFS + mtrGARC, mtr, true, true); while (threads > 0) // Let threads complete Thread.Sleep(50); string mpk = (super) ? "maisonpkS" : "maisonpkN"; string mpkGARC = getGARCFileName(mpk); - threadGet(TB_Path.Text + mpkGARC, mpk, true, true); + threadGet(RomFS + mpkGARC, mpk, true, true); while (threads > 0) // Let threads complete Thread.Sleep(50); - Invoke((Action)(() => { new Maison(oras, super).ShowDialog(); })); + Invoke((Action)(() => { new Maison(super).ShowDialog(); })); - threadSet(TB_Path.Text + mtrGARC, mtr); + threadSet(RomFS + mtrGARC, mtr); while (threads > 0) // Let threads complete Thread.Sleep(100); if (Directory.Exists(mtr)) Directory.Delete(mtr, true); - threadSet(TB_Path.Text + mpkGARC, mpk); + threadSet(RomFS + mpkGARC, mpk); while (threads > 0) // Let threads complete Thread.Sleep(100); if (Directory.Exists(mpk)) Directory.Delete(mpk, true); @@ -156,13 +216,13 @@ private void B_Personal_Click(object sender, EventArgs e) { string toEdit = "personal"; string GARC = getGARCFileName(toEdit); - threadGet(TB_Path.Text + GARC, toEdit, true, true); + threadGet(RomFS + GARC, toEdit, true, true); while (threads > 0) // Let threads complete Thread.Sleep(100); - Invoke((Action)(() => { new Personal(oras).ShowDialog(); })); + Invoke((Action)(() => { new Personal().ShowDialog(); })); // When closed, create a new thread to set the GARC back. - threadSet(TB_Path.Text + GARC, toEdit); + threadSet(RomFS + GARC, toEdit); while (threads > 0) // Let threads complete Thread.Sleep(100); if (Directory.Exists(toEdit)) Directory.Delete(toEdit, true); @@ -175,31 +235,31 @@ private void B_Trainer_Click(object sender, EventArgs e) { string trdata = "trdata"; string trdataGARC = getGARCFileName(trdata); - threadGet(TB_Path.Text + trdataGARC, trdata, true, true); + threadGet(RomFS + trdataGARC, trdata, true, true); while (threads > 0) // Let threads complete Thread.Sleep(50); string trpoke = "trpoke"; string trpokeGARC = getGARCFileName(trpoke); - threadGet(TB_Path.Text + trpokeGARC, trpoke, true, true); + threadGet(RomFS + trpokeGARC, trpoke, true, true); while (threads > 0) // Let threads complete Thread.Sleep(50); string personal = "personal"; string personalGARC = getGARCFileName(personal); - threadGet(TB_Path.Text + personalGARC, personal, true, true); + threadGet(RomFS + personalGARC, personal, true, true); while (threads > 0) // Let threads complete Thread.Sleep(100); - Invoke((Action)(() => { new RSTE(oras).ShowDialog(); })); + Invoke((Action)(() => { new RSTE().ShowDialog(); })); // When closed, create a new thread to set the GARC back. - threadSet(TB_Path.Text + trdataGARC, trdata); + threadSet(RomFS + trdataGARC, trdata); while (threads > 0) // Let threads complete Thread.Sleep(100); if (Directory.Exists(trdata)) Directory.Delete(trdata, true); - threadSet(TB_Path.Text + trpokeGARC, trpoke); + threadSet(RomFS + trpokeGARC, trpoke); while (threads > 0) // Let threads complete Thread.Sleep(100); if (Directory.Exists(trpoke)) Directory.Delete(trpoke, true); @@ -212,17 +272,17 @@ private void B_Wild_Click(object sender, EventArgs e) { string encdata = "encdata"; string encdataGARC = getGARCFileName(encdata); - threadGet(TB_Path.Text + encdataGARC, encdata, true, false); + threadGet(RomFS + encdataGARC, encdata, true, false); while (threads > 0) // Let threads complete Thread.Sleep(50); if (oras) - { Invoke((Action)(() => { new RSWE(oras).ShowDialog(); })); } + { Invoke((Action)(() => { new RSWE().ShowDialog(); })); } else - { Invoke((Action)(() => { new XYWE(oras).ShowDialog(); })); } + { Invoke((Action)(() => { new XYWE().ShowDialog(); })); } // When closed, create a new thread to set the GARC back. - threadSet(TB_Path.Text + encdataGARC, encdata); + threadSet(RomFS + encdataGARC, encdata); while (threads > 0) // Let threads complete Thread.Sleep(100); if (Directory.Exists(encdata)) Directory.Delete(encdata, true); @@ -235,13 +295,13 @@ private void B_Evolution_Click(object sender, EventArgs e) { string toEdit = "evolution"; string GARC = getGARCFileName(toEdit); - threadGet(TB_Path.Text + GARC, toEdit, true, true); + threadGet(RomFS + GARC, toEdit, true, true); while (threads > 0) // Let threads complete Thread.Sleep(100); - Invoke((Action)(() => { new Evolution(oras).ShowDialog(); })); + Invoke((Action)(() => { new Evolution().ShowDialog(); })); // When closed, create a new thread to set the GARC back. - threadSet(TB_Path.Text + GARC, toEdit); + threadSet(RomFS + GARC, toEdit); while (threads > 0) // Let threads complete Thread.Sleep(100); if (Directory.Exists(toEdit)) Directory.Delete(toEdit, true); @@ -254,20 +314,20 @@ private void B_MegaEvo_Click(object sender, EventArgs e) { string megaevo = "megaevo"; string GARC = getGARCFileName(megaevo); - threadGet(TB_Path.Text + GARC, megaevo, true, true); + threadGet(RomFS + GARC, megaevo, true, true); while (threads > 0) // Let threads complete Thread.Sleep(50); string personal = "personal"; string personalGARC = getGARCFileName(personal); - threadGet(TB_Path.Text + personalGARC, personal, true, true); + threadGet(RomFS + personalGARC, personal, true, true); while (threads > 0) // Let threads complete Thread.Sleep(50); - Invoke((Action)(() => { new MEE(oras).ShowDialog(); })); + Invoke((Action)(() => { new MEE().ShowDialog(); })); // When closed, create a new thread to set the GARC back. - threadSet(TB_Path.Text + GARC, megaevo); + threadSet(RomFS + GARC, megaevo); while (threads > 0) // Let threads complete Thread.Sleep(50); if (Directory.Exists(megaevo)) Directory.Delete(megaevo, true); @@ -284,14 +344,14 @@ private void B_Move_Click(object sender, EventArgs e) { string toEdit = "move"; string GARC = getGARCFileName(toEdit); - threadGet(TB_Path.Text + GARC, toEdit, true, true); + threadGet(RomFS + GARC, toEdit, true, true); while (threads > 0) // Let threads complete Thread.Sleep(100); - Invoke((Action)(() => { new Moves(oras).ShowDialog(); })); + Invoke((Action)(() => { new Moves().ShowDialog(); })); // When closed, create a new thread to set the GARC back. - threadSet(TB_Path.Text + GARC, toEdit); + threadSet(RomFS + GARC, toEdit); while (threads > 0) // Let threads complete Thread.Sleep(100); if (Directory.Exists(toEdit)) Directory.Delete(toEdit, true); @@ -304,13 +364,13 @@ private void B_LevelUp_Click(object sender, EventArgs e) { string toEdit = "levelup"; string GARC = getGARCFileName(toEdit); - threadGet(TB_Path.Text + GARC, toEdit, true, true); + threadGet(RomFS + GARC, toEdit, true, true); while (threads > 0) // Let threads complete Thread.Sleep(100); - Invoke((Action)(() => { new LevelUp(oras).ShowDialog(); })); + Invoke((Action)(() => { new LevelUp().ShowDialog(); })); // When closed, create a new thread to set the GARC back. - threadSet(TB_Path.Text + GARC, toEdit); + threadSet(RomFS + GARC, toEdit); while (threads > 0) // Let threads complete Thread.Sleep(100); if (Directory.Exists(toEdit)) Directory.Delete(toEdit, true); @@ -323,19 +383,37 @@ private void B_EggMove_Click(object sender, EventArgs e) { string toEdit = "eggmove"; string GARC = getGARCFileName(toEdit); - threadGet(TB_Path.Text + GARC, toEdit, true, true); + threadGet(RomFS + GARC, toEdit, true, true); while (threads > 0) // Let threads complete Thread.Sleep(100); - Invoke((Action)(() => { new EggMove(oras).ShowDialog(); })); + Invoke((Action)(() => { new EggMove().ShowDialog(); })); // When closed, create a new thread to set the GARC back. - threadSet(TB_Path.Text + GARC, toEdit); + threadSet(RomFS + GARC, toEdit); while (threads > 0) // Let threads complete Thread.Sleep(100); if (Directory.Exists(toEdit)) Directory.Delete(toEdit, true); }).Start(); } + // ExeFS Subform Items + private void B_Pickup_Click(object sender, EventArgs e) + { + Util.Alert("Not implemented yet."); + } + private void B_TMHM_Click(object sender, EventArgs e) + { + Util.Alert("Not implemented yet."); + } + private void B_Mart_Click(object sender, EventArgs e) + { + Util.Alert("Not implemented yet."); + } + private void B_MoveTutor_Click(object sender, EventArgs e) + { + Util.Alert("Not implemented yet."); + } + // GARC Requests public bool getGARC(string infile, string outfolder, bool PB, bool bypassExt = false) { @@ -371,7 +449,7 @@ public void threadSet(string outfile, string infolder, bool PB = true) Thread thread = new Thread(() => setGARC(outfile, infolder, PB)); thread.Start(); threads++; } - public string getGARCFileName(string request) + public string getGARCFileName(string requestedGARC) { int lang = 0; if (CB_Lang.InvokeRequired) @@ -379,7 +457,7 @@ public string getGARCFileName(string request) else lang = CB_Lang.SelectedIndex; string ans = ""; - switch (request) + switch (requestedGARC) { case "encdata": ans = (oras) ? getFileName(0, 1, 3) : getFileName(0, 1, 2); break; case "gametext": ans = (oras) ? getFileName(0, 7, 1 + lang) : getFileName(0, 7, 2 + lang); break; @@ -406,15 +484,15 @@ public void backupGARCs(bool overwrite, params string[] g) foreach (string s in g) { string GARC = getGARCFileName(s); - string dest = "backup" + Path.DirectorySeparatorChar + s + String.Format(" (a{0})", GARC.Replace(Path.DirectorySeparatorChar.ToString(), "")); + string dest = "backup" + Path.DirectorySeparatorChar + s + String.Format(" ({0})", GARC.Replace(Path.DirectorySeparatorChar.ToString(), "")); if (overwrite || !File.Exists(dest)) - File.Copy(TB_Path.Text + GARC, dest); + File.Copy(RomFS + GARC, dest); } } - public void restoreGARCs(bool ggg, params string[] g) + public void restoreGARCs(bool oras_define, params string[] g) { - oras = ggg; - GB_Tools.Enabled = false; + oras = oras_define; + GB_RomFS.Enabled = false; foreach (string s in g) { string dest = File.ReadAllText("config.ini") + getGARCFileName(s); @@ -438,25 +516,25 @@ public bool setText(int file, string[] strings) private void changeLanguage(object sender, EventArgs e) { - if (!GB_Tools.Enabled) return; + if (!GB_RomFS.Enabled) return; // Gather the Text Language Strings - threadGet(TB_Path.Text + getGARCFileName("gametext"), "gametext", true, true); + threadGet(RomFS + getGARCFileName("gametext"), "gametext", true, true); } private string getFileName(int A, int B, int C) { - return Path.DirectorySeparatorChar + A.ToString() + Path.DirectorySeparatorChar + B.ToString() + Path.DirectorySeparatorChar + C.ToString(); + return Path.DirectorySeparatorChar + "a" + Path.DirectorySeparatorChar + A.ToString() + Path.DirectorySeparatorChar + B.ToString() + Path.DirectorySeparatorChar + C.ToString(); } private void formClosing(object sender, FormClosingEventArgs e) { this.Hide(); if (TB_Path.Text.Length > 0) File.WriteAllText("config.ini", TB_Path.Text); - if (!GB_Tools.Enabled) return; // No data/threads need to be addressed if we haven't loaded anything. + if (!GB_RomFS.Enabled) return; // No data/threads need to be addressed if we haven't loaded anything. // Set the GameText back as other forms may have edited it. try { - threadSet(TB_Path.Text + getGARCFileName("gametext"), "gametext", false); - if (Directory.Exists("personal")) threadSet(TB_Path.Text + getGARCFileName("personal"), "personal", false); + threadSet(RomFS + getGARCFileName("gametext"), "gametext", false); + if (Directory.Exists("personal")) threadSet(RomFS + getGARCFileName("personal"), "personal", false); int timeout = 0; // Time out after 7 seconds. while (threads > 0 && timeout++ < 70) Thread.Sleep(100); diff --git a/pk3DS/Main.resx b/pk3DS/Main.resx index 1af7de1..9bfb70c 100644 --- a/pk3DS/Main.resx +++ b/pk3DS/Main.resx @@ -117,4 +117,118 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + \ No newline at end of file diff --git a/pk3DS/Subforms/EggMove.cs b/pk3DS/Subforms/EggMove.cs index d0288d5..db1020d 100644 --- a/pk3DS/Subforms/EggMove.cs +++ b/pk3DS/Subforms/EggMove.cs @@ -12,13 +12,13 @@ namespace pk3DS { public partial class EggMove : Form { - public EggMove(bool oras) + public EggMove() { InitializeComponent(); files = Directory.GetFiles("eggmove"); - movelist = Main.getText((oras) ? 14 : 13); - specieslist = Main.getText((oras) ? 98 : 80); + movelist = Main.getText((Main.oras) ? 14 : 13); + specieslist = Main.getText((Main.oras) ? 98 : 80); specieslist[0] = movelist[0] = ""; Array.Resize(ref specieslist, 722); diff --git a/pk3DS/Subforms/Evolution.cs b/pk3DS/Subforms/Evolution.cs index 8e5e15d..9abf4fb 100644 --- a/pk3DS/Subforms/Evolution.cs +++ b/pk3DS/Subforms/Evolution.cs @@ -12,15 +12,15 @@ namespace pk3DS { public partial class Evolution : Form { - public Evolution(bool oras) + public Evolution() { InitializeComponent(); files = Directory.GetFiles("evolution"); - specieslist = Main.getText((oras) ? 98 : 80); - movelist = Main.getText((oras) ? 14 : 13); - itemlist = Main.getText((oras) ? 114 : 96); - typelist = Main.getText((oras) ? 18 : 17); + specieslist = Main.getText((Main.oras) ? 98 : 80); + movelist = Main.getText((Main.oras) ? 14 : 13); + itemlist = Main.getText((Main.oras) ? 114 : 96); + typelist = Main.getText((Main.oras) ? 18 : 17); specieslist[0] = movelist[0] = itemlist[0] = ""; Array.Resize(ref specieslist, 722); diff --git a/pk3DS/Subforms/LevelUp.cs b/pk3DS/Subforms/LevelUp.cs index 78b77d9..cca6429 100644 --- a/pk3DS/Subforms/LevelUp.cs +++ b/pk3DS/Subforms/LevelUp.cs @@ -12,13 +12,13 @@ namespace pk3DS { public partial class LevelUp : Form { - public LevelUp(bool oras) + public LevelUp() { InitializeComponent(); files = Directory.GetFiles("levelup"); - movelist = Main.getText((oras) ? 14 : 13); - specieslist = Main.getText((oras) ? 98 : 80); + movelist = Main.getText((Main.oras) ? 14 : 13); + specieslist = Main.getText((Main.oras) ? 98 : 80); specieslist[0] = movelist[0] = ""; Array.Resize(ref specieslist, 722); diff --git a/pk3DS/Subforms/MEE.cs b/pk3DS/Subforms/MEE.cs index 86edfdc..8582f6e 100644 --- a/pk3DS/Subforms/MEE.cs +++ b/pk3DS/Subforms/MEE.cs @@ -18,7 +18,6 @@ public partial class MEE : Form private string[] types; string[] specieslist; string[] itemlist; - bool oras = false; byte[] personalData; private GroupBox[] groupbox_spec = { }; private ComboBox[] forme_spec = { }; @@ -31,24 +30,23 @@ public partial class MEE : Form private string[][] AltForms; int entry = -1; - public MEE(bool rom_oras) //All the initial settings + public MEE() //All the initial settings { - oras = rom_oras; InitializeComponent(); CB_Species.DisplayMember = "Text"; CB_Species.ValueMember = "Value"; #region Intializations - forms = Main.getText((oras) ? 5 : 5); - itemlist = Main.getText((oras) ? 114 : 96); - specieslist = Main.getText((oras) ? 98 : 80); + forms = Main.getText((Main.oras) ? 5 : 5); + itemlist = Main.getText((Main.oras) ? 114 : 96); + specieslist = Main.getText((Main.oras) ? 98 : 80); Array.Resize(ref specieslist, 722); specieslist[0] = itemlist[0] = ""; specieslist[32] += "♂"; specieslist[29] += "♀"; - types = Main.getText((oras) ? 18 : 17); + types = Main.getText((Main.oras) ? 18 : 17); files = Directory.GetFiles("megaevo"); string[] personalList = Directory.GetFiles("personal"); personalData = File.ReadAllBytes(personalList[personalList.Length - 1]); - AltForms = Personal.getFormList(personalData, oras, specieslist, forms, types, itemlist); + AltForms = Personal.getFormList(personalData, Main.oras, specieslist, forms, types, itemlist); groupbox_spec = new GroupBox[] {GB_MEvo1,GB_MEvo2,GB_MEvo3}; item_spec = new ComboBox[] { CB_Item1, CB_Item2, CB_Item3 }; @@ -124,7 +122,7 @@ private void getEntry() { if (loaded) { - if (oras && entry == 384 && !dumping) // Current Mon is Rayquaza + if (Main.oras && entry == 384 && !dumping) // Current Mon is Rayquaza Util.Alert("Rayquaza is special and uses a different activator for its evolution. If it knows Dragon Ascent, it can Mega Evolve", "Don't edit its evolution table if you want to keep this functionality."); byte[] data = File.ReadAllBytes(files[entry]); diff --git a/pk3DS/Subforms/Maison.cs b/pk3DS/Subforms/Maison.cs index 621c9bf..02411af 100644 --- a/pk3DS/Subforms/Maison.cs +++ b/pk3DS/Subforms/Maison.cs @@ -12,22 +12,20 @@ namespace pk3DS { public partial class Maison : Form { - public Maison(bool rom_oras, bool super) + public Maison(bool super) { - oras = rom_oras; - - movelist = Main.getText((oras) ? 14 : 13); - itemlist = Main.getText((oras) ? 114 : 96); - specieslist = Main.getText((oras) ? 98 : 80); Array.Resize(ref specieslist, 722); + movelist = Main.getText((Main.oras) ? 14 : 13); + itemlist = Main.getText((Main.oras) ? 114 : 96); + specieslist = Main.getText((Main.oras) ? 98 : 80); Array.Resize(ref specieslist, 722); movelist[0] = specieslist[0] = itemlist[0] = ""; - trClass = Main.getText((oras) ? 21 : 20); - natures = Main.getText((oras) ? 51 : 47); + trClass = Main.getText((Main.oras) ? 21 : 20); + natures = Main.getText((Main.oras) ? 51 : 47); trFiles = Directory.GetFiles((super) ? "maisontrS" : "maisontrN"); pkFiles = Directory.GetFiles((super) ? "maisonpkS" : "maisonpkN"); - int trTXTFile = (oras) ? 153 : 130; + int trTXTFile = (Main.oras) ? 153 : 130; trNames = Main.getText((super) ? trTXTFile : trTXTFile + 1); Array.Resize(ref trNames, trFiles.Length); InitializeComponent(); @@ -36,7 +34,6 @@ public Maison(bool rom_oras, bool super) string[] trFiles; string[] trNames; string[] pkFiles; - bool oras = false; string[] natures; string[] movelist; string[] specieslist; diff --git a/pk3DS/Subforms/Moves.cs b/pk3DS/Subforms/Moves.cs index 92f1de7..354c2f5 100644 --- a/pk3DS/Subforms/Moves.cs +++ b/pk3DS/Subforms/Moves.cs @@ -12,23 +12,21 @@ namespace pk3DS { public partial class Moves : Form { - public Moves(bool rom_oras) + public Moves() { - oras = rom_oras; Util.unpackMini(Directory.GetFiles("move")[0], "WD"); files = Directory.GetFiles("move"); - movelist = Main.getText((oras) ? 14 : 13); - moveflavor = Main.getText((oras) ? 16 : 15); + movelist = Main.getText((Main.oras) ? 14 : 13); + moveflavor = Main.getText((Main.oras) ? 16 : 15); movelist[0] = ""; - types = Main.getText((oras) ? 18 : 17); + types = Main.getText((Main.oras) ? 18 : 17); sortedmoves = (string[])movelist.Clone(); Array.Sort(sortedmoves); InitializeComponent(); Setup(); } - bool oras; string[] types; string[] moveflavor; string[] movelist; diff --git a/pk3DS/Subforms/Personal.cs b/pk3DS/Subforms/Personal.cs index 560e032..b2ac8b4 100644 --- a/pk3DS/Subforms/Personal.cs +++ b/pk3DS/Subforms/Personal.cs @@ -12,10 +12,9 @@ namespace pk3DS { public partial class Personal : Form { - public Personal(bool rom_oras) + public Personal() { - oras = rom_oras; - entrysize = (oras) ? 0x50 : 0x40; + entrysize = (Main.oras) ? 0x50 : 0x40; InitializeComponent(); helditem_boxes = new ComboBox[] { CB_HeldItem1, CB_HeldItem2, CB_HeldItem3 }; ability_boxes = new ComboBox[] { CB_Ability1, CB_Ability2, CB_Ability3 }; @@ -25,14 +24,13 @@ public Personal(bool rom_oras) ev_boxes = new MaskedTextBox[] { TB_HPEVs, TB_ATKEVs, TB_DEFEVs, TB_SPEEVs, TB_SPAEVs, TB_SPDEVs }; paths = Directory.GetFiles("personal", "*.*", SearchOption.TopDirectoryOnly); - mode = (oras) ? "ORAS" : "XY"; + mode = (Main.oras) ? "ORAS" : "XY"; data = File.ReadAllBytes(paths[paths.Length - 1]); // Load last to data. L_Mode.Text = "Mode: " + mode; Setup(); //Turn string resources into arrays CB_Species.SelectedIndex = 1; } #region Global Variables - bool oras = false; private string[] paths = { }; private string mode = ""; @@ -78,17 +76,17 @@ public Personal(bool rom_oras) #endregion private void Setup() { - abilities = Main.getText((oras) ? 37 : 34); - moves = Main.getText((oras) ? 14 : 13); - items = Main.getText((oras) ? 114 : 96); - species = Main.getText((oras) ? 98 : 80); - natures = Main.getText((oras) ? 51 : 47); - types = Main.getText((oras) ? 18 : 17); - forms = Main.getText((oras) ? 5 : 5); + abilities = Main.getText((Main.oras) ? 37 : 34); + moves = Main.getText((Main.oras) ? 14 : 13); + items = Main.getText((Main.oras) ? 114 : 96); + species = Main.getText((Main.oras) ? 98 : 80); + natures = Main.getText((Main.oras) ? 51 : 47); + types = Main.getText((Main.oras) ? 18 : 17); + forms = Main.getText((Main.oras) ? 5 : 5); species[0] = "---"; abilities[0] = items[0] = moves[0] = ""; - AltForms = Personal.getFormList(data, oras, species, forms, types, items); - species = getPersonalEntryList(data, oras, AltForms, species); + AltForms = Personal.getFormList(data, Main.oras, species, forms, types, items); + species = getPersonalEntryList(data, Main.oras, AltForms, species); for (int i = 1; i <= 100; i++) CLB_TMHM.Items.Add("TM" + i.ToString("00")); for (int i = 1; i <= 7; i++) @@ -270,7 +268,7 @@ private void readEntry() } if (!dumping) { - int[] specForm = Personal.getSpecies(data, oras, CB_Species.SelectedIndex); + int[] specForm = Personal.getSpecies(data, Main.oras, CB_Species.SelectedIndex); string filename = "_" + specForm[0] + ((CB_Species.SelectedIndex > 721) ? "_" + (specForm[1] + 1) : ""); Bitmap rawImg = (Bitmap)Properties.Resources.ResourceManager.GetObject(filename); Bitmap bigImg = new Bitmap(rawImg.Width * 2, rawImg.Height * 2); @@ -412,7 +410,7 @@ private void B_Difficulty_Click(object sender, EventArgs e) private void B_Randomize_Click(object sender, EventArgs e) { Random rnd = new Random(); - ushort[] itemlist = (oras) ? Legal.Pouch_Items_ORAS : Legal.Pouch_Items_XY; + ushort[] itemlist = (Main.oras) ? Legal.Pouch_Items_ORAS : Legal.Pouch_Items_XY; ushort[] berrylist = Legal.Pouch_Berry_XY; Array.Resize(ref itemlist, itemlist.Length + berrylist.Length); Array.Copy(berrylist, 0, itemlist, itemlist.Length - berrylist.Length, berrylist.Length); diff --git a/pk3DS/Subforms/RSTE.cs b/pk3DS/Subforms/RSTE.cs index fd50740..39c6755 100644 --- a/pk3DS/Subforms/RSTE.cs +++ b/pk3DS/Subforms/RSTE.cs @@ -12,20 +12,19 @@ namespace pk3DS { public partial class RSTE : Form { - public RSTE(bool rom_oras) + public RSTE() { - oras = rom_oras; trdatapaths = Directory.GetFiles("trdata"); trpokepaths = Directory.GetFiles("trpoke"); - abilitylist = Main.getText((oras) ? 37 : 34); - movelist = Main.getText((oras) ? 14 : 13); - itemlist = Main.getText((oras) ? 114 : 96); - specieslist = Main.getText((oras) ? 98 : 80); + abilitylist = Main.getText((Main.oras) ? 37 : 34); + movelist = Main.getText((Main.oras) ? 14 : 13); + itemlist = Main.getText((Main.oras) ? 114 : 96); + specieslist = Main.getText((Main.oras) ? 98 : 80); Array.Resize(ref specieslist, 722); - types = Main.getText((oras) ? 18 : 17); - forms = Main.getText((oras) ? 5 : 5); - trName = Main.getText((oras) ? 22 : 21); - trClass = Main.getText((oras) ? 21 : 20); + types = Main.getText((Main.oras) ? 18 : 17); + forms = Main.getText((Main.oras) ? 5 : 5); + trName = Main.getText((Main.oras) ? 22 : 21); + trClass = Main.getText((Main.oras) ? 21 : 20); InitializeComponent(); // String Fetching #region Combo Box Arrays @@ -137,7 +136,6 @@ internal static uint rnd32() { return (uint)(rand.Next(1 << 30)) << 2 | (uint)(rand.Next(1 << 2)); } - bool oras = false; bool start = true; bool loading = true; byte[][] personal; @@ -180,7 +178,7 @@ private void refreshPKMSlotAbility(int slot) species = (indexList[species] > 0) ? indexList[species] + formnum - 1 : species; byte[] abilities = new byte[3]; - Array.Copy(personalData, ((oras) ? 0x50 : 0x40) * species + 0x18, abilities, 0, 3); + Array.Copy(personalData, ((Main.oras) ? 0x50 : 0x40) * species + 0x18, abilities, 0, 3); trpk_abil[slot].Items.Clear(); trpk_abil[slot].Items.Add("Any (1 or 2)"); trpk_abil[slot].Items.Add(abilitylist[abilities[0]] + " (1)"); @@ -318,9 +316,9 @@ private void readFile() // load trainer data tabControl1.Enabled = true; { - format = (oras) ? br.ReadUInt16() : br.ReadByte(); - CB_Trainer_Class.SelectedIndex = (oras) ? br.ReadUInt16() : br.ReadByte(); - if (oras) br.ReadUInt16(); + format = (Main.oras) ? br.ReadUInt16() : br.ReadByte(); + CB_Trainer_Class.SelectedIndex = (Main.oras) ? br.ReadUInt16() : br.ReadByte(); + if (Main.oras) br.ReadUInt16(); checkBox_Item.Checked = ((format >> 1) & 1) == 1; checkBox_Moves.Checked = ((format) & 1) == 1; @@ -384,7 +382,7 @@ private void writeFile() using (MemoryStream ms = new MemoryStream()) using (BinaryWriter bw = new BinaryWriter(ms)) { - if (oras) + if (Main.oras) { bw.Write((ushort)format); bw.Write((ushort)CB_Trainer_Class.SelectedIndex); bw.Write((ushort)0); } else { bw.Write((byte)format); bw.Write((byte)CB_Trainer_Class.SelectedIndex); } @@ -441,11 +439,11 @@ private void Setup() start = true; string[] personalList = Directory.GetFiles("personal"); personalData = File.ReadAllBytes(personalList[personalList.Length - 1]); - indexList = Personal.getPersonalIndexList(personalData, oras); + indexList = Personal.getPersonalIndexList(personalData, Main.oras); personal = new byte[personalList.Length][]; for (int i = 0; i < personalList.Length; i++) personal[i] = File.ReadAllBytes("personal" + Path.DirectorySeparatorChar + i.ToString("000") + ".bin"); - AltForms = Personal.getFormList(personalData, oras, specieslist, forms, types, itemlist); + AltForms = Personal.getFormList(personalData, Main.oras, specieslist, forms, types, itemlist); Array.Resize(ref trName, trdatapaths.Length); CB_TrainerID.Items.Clear(); @@ -561,9 +559,9 @@ private void Randomize() ushort[] items; uint rand = rnd32() % 10; if (rand < 2) // held item - items = (oras) ? Legal.Pouch_Items_ORAS : Legal.Pouch_Items_XY; + items = (Main.oras) ? Legal.Pouch_Items_ORAS : Legal.Pouch_Items_XY; else if (rand < 5) // medicine - items = (oras) ? Legal.Pouch_Medicine_ORAS : Legal.Pouch_Medicine_XY; + items = (Main.oras) ? Legal.Pouch_Medicine_ORAS : Legal.Pouch_Medicine_XY; else // berry items = Legal.Pouch_Berry_XY; CB_Prize.SelectedIndex = items[(rnd32() % items.Length)]; @@ -572,7 +570,7 @@ private void Randomize() else if (rGift) CB_Prize.SelectedIndex = 0; - ushort[] itemlist = (oras) ? Legal.Pouch_Items_ORAS : Legal.Pouch_Items_XY; + ushort[] itemlist = (Main.oras) ? Legal.Pouch_Items_ORAS : Legal.Pouch_Items_XY; itemlist = itemlist.Concat(Legal.Pouch_Berry_XY).ToArray(); int moves = trpk_m1[0].Items.Count; int itemC = itemlist.Length; diff --git a/pk3DS/Subforms/RSWE.cs b/pk3DS/Subforms/RSWE.cs index d67ff27..069684d 100644 --- a/pk3DS/Subforms/RSWE.cs +++ b/pk3DS/Subforms/RSWE.cs @@ -14,12 +14,10 @@ namespace pk3DS { public partial class RSWE : Form { - private bool oras; - public RSWE(bool rom_oras) + public RSWE() { InitializeComponent(); Console.WriteLine("Started RSWE"); - oras = rom_oras; spec = new ComboBox[] { CB_Grass1, CB_Grass2, CB_Grass3, CB_Grass4, CB_Grass5, CB_Grass6, CB_Grass7, CB_Grass8, CB_Grass9, CB_Grass10, CB_Grass11, CB_Grass12, @@ -288,7 +286,7 @@ public RSWE(bool rom_oras) private void RSWE_Load(object sender, EventArgs e) { - specieslist = Main.getText((oras) ? 98 : 80); + specieslist = Main.getText((Main.oras) ? 98 : 80); specieslist[0] = "---"; foreach (string s in formlist) @@ -318,7 +316,7 @@ private void openQuick(string[] encdata) Array.Sort(encdatapaths); this.filepaths = new string[this.encdatapaths.Length - 2]; Array.Copy(this.encdatapaths, 2, this.filepaths, 0, this.filepaths.Length); - metRS_00000 = Main.getText((oras) ? 90 : 72); + metRS_00000 = Main.getText((Main.oras) ? 90 : 72); zonedata = File.ReadAllBytes(encdatapaths[0]); decStorage = File.ReadAllBytes(encdatapaths[1]); LocationNames = new string[this.filepaths.Length]; diff --git a/pk3DS/Subforms/XYWE.cs b/pk3DS/Subforms/XYWE.cs index 60c92a4..34c96ca 100644 --- a/pk3DS/Subforms/XYWE.cs +++ b/pk3DS/Subforms/XYWE.cs @@ -14,11 +14,9 @@ namespace pk3DS { public partial class XYWE : Form { - private bool oras = false; - public XYWE(bool rom_oras) + public XYWE() { - InitializeComponent(); - oras = rom_oras; + InitializeComponent(); spec = new ComboBox[] { CB_Grass1, CB_Grass2, CB_Grass3, CB_Grass4, CB_Grass5, CB_Grass6, CB_Grass7, CB_Grass8, CB_Grass9, CB_Grass10, CB_Grass11, CB_Grass12, @@ -292,7 +290,7 @@ public XYWE(bool rom_oras) private void Load_XYWE(object sender, EventArgs e) { - specieslist = Main.getText((oras) ? 98 : 80); + specieslist = Main.getText((Main.oras) ? 98 : 80); specieslist[0] = "---"; CB_FormeList.Items.AddRange(formlist); @@ -313,7 +311,7 @@ private void openQuick(string[] encdata) Array.Sort(encdatapaths); this.filepaths = new string[this.encdatapaths.Length - 1]; Array.Copy(this.encdatapaths, 1, this.filepaths, 0, this.filepaths.Length); - metXY_00000 = Main.getText((oras) ? 90 : 72); + metXY_00000 = Main.getText((Main.oras) ? 90 : 72); zonedata = File.ReadAllBytes(encdatapaths[0]); LocationNames = new string[this.filepaths.Length]; for (int f = 0; f < filepaths.Length; f++) diff --git a/pk3DS/pk3DS.csproj b/pk3DS/pk3DS.csproj index 3e1e8d0..00f2ad4 100644 --- a/pk3DS/pk3DS.csproj +++ b/pk3DS/pk3DS.csproj @@ -50,6 +50,7 @@ + Form