From dcae5d5da0a5aabb9b1b3b471e8babc58cc98a91 Mon Sep 17 00:00:00 2001 From: Kurt Date: Tue, 21 Aug 2018 20:00:53 -0700 Subject: [PATCH] Update move data exporting clarity #352 --- pk3DS.Core/Game/GameConfig.cs | 6 +- pk3DS.Core/Structures/Gen6/Move6.cs | 98 ------------------- pk3DS.Core/Structures/Moves/Heal.cs | 10 ++ pk3DS.Core/Structures/Moves/Move.cs | 41 ++++++++ pk3DS.Core/Structures/Moves/Move6.cs | 43 ++++++++ pk3DS.Core/Structures/Moves/Move7.cs | 51 ++++++++++ pk3DS.Core/Structures/Moves/MoveFlag6.cs | 46 +++++++++ pk3DS.Core/Structures/Moves/MoveFlag7.cs | 46 +++++++++ .../Structures/Moves/MoveFlagExtensions.cs | 15 +++ .../Structures/Moves/MoveInflictDuration.cs | 11 +++ pk3DS.Core/Structures/Moves/MoveTarget.cs | 23 +++++ pk3DS/Subforms/Gen6/MoveEditor6.cs | 2 +- pk3DS/Subforms/Gen7/MoveEditor7.cs | 2 +- 13 files changed, 291 insertions(+), 103 deletions(-) delete mode 100644 pk3DS.Core/Structures/Gen6/Move6.cs create mode 100644 pk3DS.Core/Structures/Moves/Heal.cs create mode 100644 pk3DS.Core/Structures/Moves/Move.cs create mode 100644 pk3DS.Core/Structures/Moves/Move6.cs create mode 100644 pk3DS.Core/Structures/Moves/Move7.cs create mode 100644 pk3DS.Core/Structures/Moves/MoveFlag6.cs create mode 100644 pk3DS.Core/Structures/Moves/MoveFlag7.cs create mode 100644 pk3DS.Core/Structures/Moves/MoveFlagExtensions.cs create mode 100644 pk3DS.Core/Structures/Moves/MoveInflictDuration.cs create mode 100644 pk3DS.Core/Structures/Moves/MoveTarget.cs diff --git a/pk3DS.Core/Game/GameConfig.cs b/pk3DS.Core/Game/GameConfig.cs index a314f59..8a32be6 100644 --- a/pk3DS.Core/Game/GameConfig.cs +++ b/pk3DS.Core/Game/GameConfig.cs @@ -158,12 +158,12 @@ public void InitializeMoves() { case 6: if (XY) - Moves = GARCMoves.Files.Select(file => new Move(file)).ToArray(); + Moves = GARCMoves.Files.Select(file => new Move6(file)).ToArray(); if (ORAS) - Moves = Mini.UnpackMini(GARCMoves.getFile(0), "WD").Select(file => new Move(file)).ToArray(); + Moves = Mini.UnpackMini(GARCMoves.getFile(0), "WD").Select(file => new Move6(file)).ToArray(); break; case 7: - Moves = Mini.UnpackMini(GARCMoves.getFile(0), "WD").Select(file => new Move(file)).ToArray(); + Moves = Mini.UnpackMini(GARCMoves.getFile(0), "WD").Select(file => new Move7(file)).ToArray(); break; } } diff --git a/pk3DS.Core/Structures/Gen6/Move6.cs b/pk3DS.Core/Structures/Gen6/Move6.cs deleted file mode 100644 index 1118dc4..0000000 --- a/pk3DS.Core/Structures/Gen6/Move6.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; - -namespace pk3DS.Core.Structures -{ - public class Move - { - private const int SIZE = 0x22; - private readonly byte[] Data; - public Move() => Data = new byte[SIZE]; - public Move(byte[] data) => Data = data ?? new byte[SIZE]; - public byte[] Write() => Data; - - public int Type { get => Data[0x00]; set => Data[0x00] = (byte)value; } - public int Quality { get => Data[0x01]; set => Data[0x01] = (byte)value; } - public int Category { get => Data[0x02]; set => Data[0x02] = (byte)value; } - public int Power { get => Data[0x03]; set => Data[0x03] = (byte)value; } - public int Accuracy { get => Data[0x04]; set => Data[0x04] = (byte)value; } - public int PP { get => Data[0x05]; set => Data[0x05] = (byte)value; } - public int Priority { get => Data[0x06]; set => Data[0x06] = (byte)value; } - public int HitMin { get => Data[0x07] & 0xF; set => Data[0x07] = (byte)(HitMax << 4 | value); } - public int HitMax { get => Data[0x07] >> 4; set => Data[0x07] = (byte)(value << 4 | HitMin); } - public int Inflict { get => BitConverter.ToUInt16(Data, 0x08); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x08); } - public int InflictPercent { get => Data[0x0A]; set => Data[0x0A] = (byte)value; } - public MoveInflictDuration InflictCount { get => (MoveInflictDuration)Data[0x0B]; set => Data[0x0B] = (byte)value; } - public int TurnMin { get => Data[0x0C]; set => Data[0x0C] = (byte)value; } - public int TurnMax { get => Data[0x0D]; set => Data[0x0D] = (byte)value; } - public int CritStage { get => Data[0x0E]; set => Data[0x0E] = (byte)value; } - public int Flinch { get => Data[0x0F]; set => Data[0x0F] = (byte)value; } - public int EffectSequence { get => BitConverter.ToUInt16(Data, 0x10); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x10); } - public int Recoil { get => Data[0x12]; set => Data[0x12] = (byte)value; } - public Heal Healing { get => (Heal)Data[0x13]; set => Data[0x13] = (byte)value; } - public MoveTarget Target { get => (MoveTarget)Data[0x14]; set => Data[0x14] = (byte)value; } - public int Stat1 { get => Data[0x15]; set => Data[0x15] = (byte)value; } - public int Stat2 { get => Data[0x16]; set => Data[0x16] = (byte)value; } - public int Stat3 { get => Data[0x17]; set => Data[0x17] = (byte)value; } - public int Stat1Stage { get => Data[0x18]; set => Data[0x18] = (byte)value; } - public int Stat2Stage { get => Data[0x19]; set => Data[0x19] = (byte)value; } - public int Stat3Stage { get => Data[0x1A]; set => Data[0x1A] = (byte)value; } - public int Stat1Percent { get => Data[0x1B]; set => Data[0x1B] = (byte)value; } - public int Stat2Percent { get => Data[0x1C]; set => Data[0x1C] = (byte)value; } - public int Stat3Percent { get => Data[0x1D]; set => Data[0x1D] = (byte)value; } - - public MoveFlag Flags { get => (MoveFlag)BitConverter.ToUInt32(Data, 0x1E); set => BitConverter.GetBytes((uint)value).CopyTo(Data, 0x1E); } - - public enum Heal : byte - { - None = 0, - Full = 255, - Half = 254, - Quarter = 253, - } - } - - public enum MoveInflictDuration - { - None = 0, - Permanent, - TurnCount, - Unused, - Switch, - }; - - public enum MoveTarget : byte - { - // Specific target - AnyExceptSelf, - AllyOrSelf, - Ally, - Opponent, - AllAdjacent, - AllAdjacentOpponents, - AllAllies, - Self, - All, - RandomOpponent, - - // No pkm target - SideAll, - SideOpponent, - SideSelf, - Counter, - } - - [Flags] - public enum MoveFlag : uint - { - None, - // TBD - } - - public static class MoveFlagExtensions - { - public static bool HasFlagFast(this MoveFlag value, MoveFlag flag) - { - return (value & flag) != 0; - } - } -} diff --git a/pk3DS.Core/Structures/Moves/Heal.cs b/pk3DS.Core/Structures/Moves/Heal.cs new file mode 100644 index 0000000..8e90505 --- /dev/null +++ b/pk3DS.Core/Structures/Moves/Heal.cs @@ -0,0 +1,10 @@ +namespace pk3DS.Core.Structures +{ + public enum Heal : byte + { + None = 0, + Full = 255, + Half = 254, + Quarter = 253, + } +} \ No newline at end of file diff --git a/pk3DS.Core/Structures/Moves/Move.cs b/pk3DS.Core/Structures/Moves/Move.cs new file mode 100644 index 0000000..f6c72fa --- /dev/null +++ b/pk3DS.Core/Structures/Moves/Move.cs @@ -0,0 +1,41 @@ +namespace pk3DS.Core.Structures +{ + public abstract class Move + { + protected readonly byte[] Data; + protected abstract int SIZE { get; } + protected Move(byte[] data = null) => Data = data ?? new byte[SIZE]; + + public byte[] Write() => Data; + + public abstract int Type { get; set; } + public abstract int Quality { get; set; } + public abstract int Category { get; set; } + public abstract int Power { get; set; } + public abstract int Accuracy { get; set; } + public abstract int PP { get; set; } + public abstract int Priority { get; set; } + public abstract int HitMin { get; set; } + public abstract int HitMax { get; set; } + public abstract int Inflict { get; set; } + public abstract int InflictPercent { get; set; } + public abstract MoveInflictDuration InflictCount { get; set; } + public abstract int TurnMin { get; set; } + public abstract int TurnMax { get; set; } + public abstract int CritStage { get; set; } + public abstract int Flinch { get; set; } + public abstract int EffectSequence { get; set; } + public abstract int Recoil { get; set; } + public abstract Heal Healing { get; set; } + public abstract MoveTarget Target { get; set; } + public abstract int Stat1 { get; set; } + public abstract int Stat2 { get; set; } + public abstract int Stat3 { get; set; } + public abstract int Stat1Stage { get; set; } + public abstract int Stat2Stage { get; set; } + public abstract int Stat3Stage { get; set; } + public abstract int Stat1Percent { get; set; } + public abstract int Stat2Percent { get; set; } + public abstract int Stat3Percent { get; set; } + } +} \ No newline at end of file diff --git a/pk3DS.Core/Structures/Moves/Move6.cs b/pk3DS.Core/Structures/Moves/Move6.cs new file mode 100644 index 0000000..a31c66c --- /dev/null +++ b/pk3DS.Core/Structures/Moves/Move6.cs @@ -0,0 +1,43 @@ +using System; + +namespace pk3DS.Core.Structures +{ + public class Move6 : Move + { + protected override int SIZE => 0x22; + public Move6(){} + public Move6(byte[] data = null) : base(data) { } + + public override int Type { get => Data[0x00]; set => Data[0x00] = (byte)value; } + public override int Quality { get => Data[0x01]; set => Data[0x01] = (byte)value; } + public override int Category { get => Data[0x02]; set => Data[0x02] = (byte)value; } + public override int Power { get => Data[0x03]; set => Data[0x03] = (byte)value; } + public override int Accuracy { get => Data[0x04]; set => Data[0x04] = (byte)value; } + public override int PP { get => Data[0x05]; set => Data[0x05] = (byte)value; } + public override int Priority { get => Data[0x06]; set => Data[0x06] = (byte)value; } + public override int HitMin { get => Data[0x07] & 0xF; set => Data[0x07] = (byte)(HitMax << 4 | value); } + public override int HitMax { get => Data[0x07] >> 4; set => Data[0x07] = (byte)(value << 4 | HitMin); } + public override int Inflict { get => BitConverter.ToUInt16(Data, 0x08); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x08); } + public override int InflictPercent { get => Data[0x0A]; set => Data[0x0A] = (byte)value; } + public override MoveInflictDuration InflictCount { get => (MoveInflictDuration)Data[0x0B]; set => Data[0x0B] = (byte)value; } + public override int TurnMin { get => Data[0x0C]; set => Data[0x0C] = (byte)value; } + public override int TurnMax { get => Data[0x0D]; set => Data[0x0D] = (byte)value; } + public override int CritStage { get => Data[0x0E]; set => Data[0x0E] = (byte)value; } + public override int Flinch { get => Data[0x0F]; set => Data[0x0F] = (byte)value; } + public override int EffectSequence { get => BitConverter.ToUInt16(Data, 0x10); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x10); } + public override int Recoil { get => Data[0x12]; set => Data[0x12] = (byte)value; } + public override Heal Healing { get => (Heal)Data[0x13]; set => Data[0x13] = (byte)value; } + public override MoveTarget Target { get => (MoveTarget)Data[0x14]; set => Data[0x14] = (byte)value; } + public override int Stat1 { get => Data[0x15]; set => Data[0x15] = (byte)value; } + public override int Stat2 { get => Data[0x16]; set => Data[0x16] = (byte)value; } + public override int Stat3 { get => Data[0x17]; set => Data[0x17] = (byte)value; } + public override int Stat1Stage { get => Data[0x18]; set => Data[0x18] = (byte)value; } + public override int Stat2Stage { get => Data[0x19]; set => Data[0x19] = (byte)value; } + public override int Stat3Stage { get => Data[0x1A]; set => Data[0x1A] = (byte)value; } + public override int Stat1Percent { get => Data[0x1B]; set => Data[0x1B] = (byte)value; } + public override int Stat2Percent { get => Data[0x1C]; set => Data[0x1C] = (byte)value; } + public override int Stat3Percent { get => Data[0x1D]; set => Data[0x1D] = (byte)value; } + + public MoveFlag6 Flags { get => (MoveFlag6)BitConverter.ToUInt32(Data, 0x1E); set => BitConverter.GetBytes((uint)value).CopyTo(Data, 0x1E); } + } +} diff --git a/pk3DS.Core/Structures/Moves/Move7.cs b/pk3DS.Core/Structures/Moves/Move7.cs new file mode 100644 index 0000000..2a1b8d5 --- /dev/null +++ b/pk3DS.Core/Structures/Moves/Move7.cs @@ -0,0 +1,51 @@ +using System; + +namespace pk3DS.Core.Structures +{ + + public class Move7 : Move + { + protected override int SIZE => 0x28; + public Move7() { } + public Move7(byte[] data = null) : base(data) { } + + public override int Type { get => Data[0x00]; set => Data[0x00] = (byte)value; } + public override int Quality { get => Data[0x01]; set => Data[0x01] = (byte)value; } + public override int Category { get => Data[0x02]; set => Data[0x02] = (byte)value; } + public override int Power { get => Data[0x03]; set => Data[0x03] = (byte)value; } + public override int Accuracy { get => Data[0x04]; set => Data[0x04] = (byte)value; } + public override int PP { get => Data[0x05]; set => Data[0x05] = (byte)value; } + public override int Priority { get => Data[0x06]; set => Data[0x06] = (byte)value; } + public override int HitMin { get => Data[0x07] & 0xF; set => Data[0x07] = (byte)(HitMax << 4 | value); } + public override int HitMax { get => Data[0x07] >> 4; set => Data[0x07] = (byte)(value << 4 | HitMin); } + public override int Inflict { get => BitConverter.ToUInt16(Data, 0x08); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x08); } + public override int InflictPercent { get => Data[0x0A]; set => Data[0x0A] = (byte)value; } + public override MoveInflictDuration InflictCount { get => (MoveInflictDuration)Data[0x0B]; set => Data[0x0B] = (byte)value; } + public override int TurnMin { get => Data[0x0C]; set => Data[0x0C] = (byte)value; } + public override int TurnMax { get => Data[0x0D]; set => Data[0x0D] = (byte)value; } + public override int CritStage { get => Data[0x0E]; set => Data[0x0E] = (byte)value; } + public override int Flinch { get => Data[0x0F]; set => Data[0x0F] = (byte)value; } + public override int EffectSequence { get => BitConverter.ToUInt16(Data, 0x10); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x10); } + public override int Recoil { get => Data[0x12]; set => Data[0x12] = (byte)value; } + public override Heal Healing { get => (Heal)Data[0x13]; set => Data[0x13] = (byte)value; } + public override MoveTarget Target { get => (MoveTarget)Data[0x14]; set => Data[0x14] = (byte)value; } + public override int Stat1 { get => Data[0x15]; set => Data[0x15] = (byte)value; } + public override int Stat2 { get => Data[0x16]; set => Data[0x16] = (byte)value; } + public override int Stat3 { get => Data[0x17]; set => Data[0x17] = (byte)value; } + public override int Stat1Stage { get => Data[0x18]; set => Data[0x18] = (byte)value; } + public override int Stat2Stage { get => Data[0x19]; set => Data[0x19] = (byte)value; } + public override int Stat3Stage { get => Data[0x1A]; set => Data[0x1A] = (byte)value; } + public override int Stat1Percent { get => Data[0x1B]; set => Data[0x1B] = (byte)value; } + public override int Stat2Percent { get => Data[0x1C]; set => Data[0x1C] = (byte)value; } + public override int Stat3Percent { get => Data[0x1D]; set => Data[0x1D] = (byte)value; } + + public int ZMove { get => BitConverter.ToUInt16(Data, 0x1E); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1E); } // 32 + public int ZPower { get => Data[0x20]; set => Data[0x20] = (byte)value; } // 33 + public int ZEffect { get => Data[0x21]; set => Data[0x21] = (byte)value; } // 34 + + public int Z3 { get => Data[0x22]; set => Data[0x22] = (byte)value; } // 35 + public int ZPercent { get => Data[0x23]; set => Data[0x23] = (byte)value; } // 36 + + public MoveFlag7 Flags { get => (MoveFlag7)BitConverter.ToUInt32(Data, 0x24); set => BitConverter.GetBytes((uint)value).CopyTo(Data, 0x24); } + } +} diff --git a/pk3DS.Core/Structures/Moves/MoveFlag6.cs b/pk3DS.Core/Structures/Moves/MoveFlag6.cs new file mode 100644 index 0000000..bea4909 --- /dev/null +++ b/pk3DS.Core/Structures/Moves/MoveFlag6.cs @@ -0,0 +1,46 @@ +using System; + +namespace pk3DS.Core.Structures +{ + [Flags] + public enum MoveFlag6 : uint + { + None, + + F01 = 1u << 00, + F02 = 1u << 01, + F03 = 1u << 02, + F04 = 1u << 03, + F05 = 1u << 04, + F06 = 1u << 05, + F07 = 1u << 06, + F08 = 1u << 07, + + F09 = 1u << 08, + F10 = 1u << 09, + F11 = 1u << 10, + F12 = 1u << 11, + F13 = 1u << 12, + F14 = 1u << 13, + F15 = 1u << 14, + F16 = 1u << 15, + + F17 = 1u << 16, + F18 = 1u << 17, + F19 = 1u << 18, + F20 = 1u << 19, + F21 = 1u << 20, + F22 = 1u << 21, + F23 = 1u << 22, + F24 = 1u << 23, + + F25 = 1u << 24, + F26 = 1u << 25, + F27 = 1u << 26, + F28 = 1u << 27, + F29 = 1u << 28, + F30 = 1u << 29, + F31 = 1u << 30, + F32 = 1u << 31, + } +} \ No newline at end of file diff --git a/pk3DS.Core/Structures/Moves/MoveFlag7.cs b/pk3DS.Core/Structures/Moves/MoveFlag7.cs new file mode 100644 index 0000000..3745984 --- /dev/null +++ b/pk3DS.Core/Structures/Moves/MoveFlag7.cs @@ -0,0 +1,46 @@ +using System; + +namespace pk3DS.Core.Structures +{ + [Flags] + public enum MoveFlag7 : uint + { + None, + + F01 = 1u << 00, + F02 = 1u << 01, + F03 = 1u << 02, + F04 = 1u << 03, + F05 = 1u << 04, + F06 = 1u << 05, + F07 = 1u << 06, + F08 = 1u << 07, + + F09 = 1u << 08, + F10 = 1u << 09, + F11 = 1u << 10, + F12 = 1u << 11, + F13 = 1u << 12, + F14 = 1u << 13, + F15 = 1u << 14, + F16 = 1u << 15, + + F17 = 1u << 16, + F18 = 1u << 17, + F19 = 1u << 18, + F20 = 1u << 19, + F21 = 1u << 20, + F22 = 1u << 21, + F23 = 1u << 22, + F24 = 1u << 23, + + F25 = 1u << 24, + F26 = 1u << 25, + F27 = 1u << 26, + F28 = 1u << 27, + F29 = 1u << 28, + F30 = 1u << 29, + F31 = 1u << 30, + F32 = 1u << 31, + } +} \ No newline at end of file diff --git a/pk3DS.Core/Structures/Moves/MoveFlagExtensions.cs b/pk3DS.Core/Structures/Moves/MoveFlagExtensions.cs new file mode 100644 index 0000000..74c689e --- /dev/null +++ b/pk3DS.Core/Structures/Moves/MoveFlagExtensions.cs @@ -0,0 +1,15 @@ +namespace pk3DS.Core.Structures +{ + public static class MoveFlagExtensions + { + public static bool HasFlagFast(this MoveFlag6 value, MoveFlag6 flag) + { + return (value & flag) != 0; + } + + public static bool HasFlagFast(this MoveFlag7 value, MoveFlag7 flag) + { + return (value & flag) != 0; + } + } +} \ No newline at end of file diff --git a/pk3DS.Core/Structures/Moves/MoveInflictDuration.cs b/pk3DS.Core/Structures/Moves/MoveInflictDuration.cs new file mode 100644 index 0000000..50ee270 --- /dev/null +++ b/pk3DS.Core/Structures/Moves/MoveInflictDuration.cs @@ -0,0 +1,11 @@ +namespace pk3DS.Core.Structures +{ + public enum MoveInflictDuration + { + None = 0, + Permanent, + TurnCountSwitch, + PermanentSwitch, + TurnCountNoSwitch, + }; +} \ No newline at end of file diff --git a/pk3DS.Core/Structures/Moves/MoveTarget.cs b/pk3DS.Core/Structures/Moves/MoveTarget.cs new file mode 100644 index 0000000..0a0839b --- /dev/null +++ b/pk3DS.Core/Structures/Moves/MoveTarget.cs @@ -0,0 +1,23 @@ +namespace pk3DS.Core.Structures +{ + public enum MoveTarget : byte + { + // Specific target + AnyExceptSelf, + AllyOrSelf, + Ally, + Opponent, + AllAdjacent, + AllAdjacentOpponents, + AllAllies, + Self, + All, + RandomOpponent, + + // No pkm target + SideAll, + SideOpponent, + SideSelf, + Counter, + } +} \ No newline at end of file diff --git a/pk3DS/Subforms/Gen6/MoveEditor6.cs b/pk3DS/Subforms/Gen6/MoveEditor6.cs index ddf080e..67f694e 100644 --- a/pk3DS/Subforms/Gen6/MoveEditor6.cs +++ b/pk3DS/Subforms/Gen6/MoveEditor6.cs @@ -168,7 +168,7 @@ private void SetEntry() private void B_Table_Click(object sender, EventArgs e) { - var items = files.Select(z => new Move(z)); + var items = files.Select(z => new Move6(z)); Clipboard.SetText(TableUtil.GetTable(items, movelist)); System.Media.SystemSounds.Asterisk.Play(); } diff --git a/pk3DS/Subforms/Gen7/MoveEditor7.cs b/pk3DS/Subforms/Gen7/MoveEditor7.cs index bdd2b07..25352ba 100644 --- a/pk3DS/Subforms/Gen7/MoveEditor7.cs +++ b/pk3DS/Subforms/Gen7/MoveEditor7.cs @@ -174,7 +174,7 @@ private void CloseForm(object sender, FormClosingEventArgs e) private void B_Table_Click(object sender, EventArgs e) { - var items = files.Select(z => new Move(z)); + var items = files.Select(z => new Move7(z)); Clipboard.SetText(TableUtil.GetTable(items, movelist)); System.Media.SystemSounds.Asterisk.Play(); }