From 9e40fa132f5152ab4b8c796d3b2c17cdfa305a3d Mon Sep 17 00:00:00 2001 From: Regnum <8683689+PlasticJustice@users.noreply.github.com> Date: Sat, 1 Aug 2020 11:20:13 -0500 Subject: [PATCH] Improved Pokewalker Editing (#2958) * Added PokeWalker Courses, Watts, and Steps editing * Use util method for getting bitflags * Keep old cheat method Change signature so that the default value passed is to unlock all; can pass 0 instead to lock all * Pass reference to derived sav4-type object Wev'e already type-tested once, capture the reference and pass it into the appropriate load/save methods. * Add control anchoring for window resizing Also widen the labels for localization (longer strings possibly) --- PKHeX.Core/Game/GameStrings/GameStrings.cs | 4 +- PKHeX.Core/PKHeX.Core.csproj | 16 +++ .../text/de/text_hgss_walkercourses_de.txt | 27 ++++ .../text/en/text_hgss_walkercourses_en.txt | 27 ++++ .../text/es/text_hgss_walkercourses_es.txt | 27 ++++ .../text/fr/text_hgss_walkercourses_fr.txt | 27 ++++ .../text/it/text_hgss_walkercourses_it.txt | 27 ++++ .../text/ja/text_hgss_walkercourses_ja.txt | 27 ++++ .../text/ko/text_hgss_walkercourses_ko.txt | 27 ++++ .../text/zh/text_hgss_walkercourses_zh.txt | 27 ++++ PKHeX.Core/Saves/SAV4HGSS.cs | 27 ++-- .../Save Editors/Gen4/SAV_Misc4.Designer.cs | 122 ++++++++++++++++-- .../Subforms/Save Editors/Gen4/SAV_Misc4.cs | 44 +++++-- 13 files changed, 388 insertions(+), 41 deletions(-) create mode 100644 PKHeX.Core/Resources/text/de/text_hgss_walkercourses_de.txt create mode 100644 PKHeX.Core/Resources/text/en/text_hgss_walkercourses_en.txt create mode 100644 PKHeX.Core/Resources/text/es/text_hgss_walkercourses_es.txt create mode 100644 PKHeX.Core/Resources/text/fr/text_hgss_walkercourses_fr.txt create mode 100644 PKHeX.Core/Resources/text/it/text_hgss_walkercourses_it.txt create mode 100644 PKHeX.Core/Resources/text/ja/text_hgss_walkercourses_ja.txt create mode 100644 PKHeX.Core/Resources/text/ko/text_hgss_walkercourses_ko.txt create mode 100644 PKHeX.Core/Resources/text/zh/text_hgss_walkercourses_zh.txt diff --git a/PKHeX.Core/Game/GameStrings/GameStrings.cs b/PKHeX.Core/Game/GameStrings/GameStrings.cs index 55eeb77b7..913598dac 100644 --- a/PKHeX.Core/Game/GameStrings/GameStrings.cs +++ b/PKHeX.Core/Game/GameStrings/GameStrings.cs @@ -26,7 +26,7 @@ public sealed class GameStrings : IBasicStrings public readonly string[] metSWSH_00000, metSWSH_30000, metSWSH_40000, metSWSH_60000; // Misc - public readonly string[] wallpapernames, puffs; + public readonly string[] wallpapernames, puffs, walkercourses; private readonly string lang; private readonly int LanguageIndex; @@ -103,6 +103,8 @@ public GameStrings(string l) Array.Resize(ref puffs, puffs.Length + 1); // shift all down, 0th will be 'none' -- applied later Array.Copy(puffs, 0, puffs, 1, puffs.Length - 1); + walkercourses = Get("hgss_walkercourses"); + EggName = specieslist[0]; metHGSS_00000 = Get("hgss_00000"); metHGSS_02000 = Get("hgss_02000"); diff --git a/PKHeX.Core/PKHeX.Core.csproj b/PKHeX.Core/PKHeX.Core.csproj index 7a730811c..61d793743 100644 --- a/PKHeX.Core/PKHeX.Core.csproj +++ b/PKHeX.Core/PKHeX.Core.csproj @@ -148,6 +148,7 @@ + @@ -202,6 +203,7 @@ + @@ -256,6 +258,7 @@ + @@ -310,6 +313,7 @@ + @@ -388,6 +392,7 @@ + @@ -442,6 +447,7 @@ + @@ -496,6 +502,7 @@ + @@ -798,6 +805,7 @@ + @@ -965,6 +973,7 @@ + @@ -1019,6 +1028,7 @@ + @@ -1073,6 +1083,7 @@ + @@ -1127,6 +1138,7 @@ + @@ -1205,6 +1217,7 @@ + @@ -1259,6 +1272,7 @@ + @@ -1313,6 +1327,7 @@ + @@ -1614,6 +1629,7 @@ + diff --git a/PKHeX.Core/Resources/text/de/text_hgss_walkercourses_de.txt b/PKHeX.Core/Resources/text/de/text_hgss_walkercourses_de.txt new file mode 100644 index 000000000..5393f830d --- /dev/null +++ b/PKHeX.Core/Resources/text/de/text_hgss_walkercourses_de.txt @@ -0,0 +1,27 @@ +Sattgrüne Wiese +Lauschiger Wald +Holpriger Pfad +Malerische Küste +Wohngebiet +Finstere Höhle +Tiefblauer See +Stadtrand +Ebene von Hoenn +Sonniger Strand +Vulkanpfad +Baumhaus +Gruselhöhle +Ebene von Sinnoh +Eisiger Bergpfad +Tiefer Wald +Silberner See +Stürmische Küste +Ferienpark +Stille Höhle +Ferne Ufer +Himmelsrand +Goldgelber Wald +Rallye +Spaziergang +Siegerstraße +Wiese der Treue \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/en/text_hgss_walkercourses_en.txt b/PKHeX.Core/Resources/text/en/text_hgss_walkercourses_en.txt new file mode 100644 index 000000000..92772c4e3 --- /dev/null +++ b/PKHeX.Core/Resources/text/en/text_hgss_walkercourses_en.txt @@ -0,0 +1,27 @@ +Refreshing Field +Noisy Forest +Rugged Road +Beautiful Beach +Suburban Area +Dim Cave +Blue Lake +Town Outskirts +Hoenn Field +Warm Beach +Volcano Path +Treehouse +Scary Cave +Sinnoh Field +Icy Mountain Rd. +Big Forest +White Lake +Stormy Beach +Resort +Quiet Cave +Beyond the Sea +Night Sky's Edge +Yellow Forest +Rally +Sightseeing +Winner's Path +Amity Meadow \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/es/text_hgss_walkercourses_es.txt b/PKHeX.Core/Resources/text/es/text_hgss_walkercourses_es.txt new file mode 100644 index 000000000..6bb850bc1 --- /dev/null +++ b/PKHeX.Core/Resources/text/es/text_hgss_walkercourses_es.txt @@ -0,0 +1,27 @@ +Prado Tranquilo +Bosque Murmullos +Camino Pedregoso +Costa Bella +Urbanización +Cueva Sombría +Mar Azul +Arrabal +Llano de Hoenn +Playa Cálida +Sendero Volcán +Casa del Árbol +Cueva del Terror +Llano de Sinnoh +Senda Glacial +Gran Bosque +Lago Bruma +Playa Tormenta +Zona Vacacional +Cueva Calma +Ultramar +Confín del Cielo +Bosque Amarillo +Vía Campeón +Acontecimiento +De Turismo +Campo Amistad \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/fr/text_hgss_walkercourses_fr.txt b/PKHeX.Core/Resources/text/fr/text_hgss_walkercourses_fr.txt new file mode 100644 index 000000000..5301688c9 --- /dev/null +++ b/PKHeX.Core/Resources/text/fr/text_hgss_walkercourses_fr.txt @@ -0,0 +1,27 @@ +Plaine Sereine +Bois Bruissant +Chemin Pierreux +Jolie Plage +Coin Résidentiel +Caverne Sombre +Lac Bleu +Faubourgs +Plaine de Hoenn +Plage Brûlante +Sente de Volcan +Sylvania +Grotte Terreur +Plaine Sinnoh +Pente Glaciale +Grande Forêt +Lac Brumeux +Plage Orageuse +Zone de Vacances +Grotte Calme +Chemin Victoire +Evénement +Fin du Firmament +Forêt Jaune +Mer Lointaine +Plaine Paisible +Virée en Ville \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/it/text_hgss_walkercourses_it.txt b/PKHeX.Core/Resources/text/it/text_hgss_walkercourses_it.txt new file mode 100644 index 000000000..9dbd746e5 --- /dev/null +++ b/PKHeX.Core/Resources/text/it/text_hgss_walkercourses_it.txt @@ -0,0 +1,27 @@ +Piana Tranquilla +Bosco Cicaleccio +Sentiero Impervio +Spiaggia Amena +Zona Residenziale +Caverna Penombra +Lago Turchese +Periferia +Piana di Hoenn +Spiaggia Caliente +Sentiero Focoso +Silvania +Grotta Terrore +Piana di Sinnoh +Dirupo Glaciale +Grande Foresta +Lago Bruma +Costa Tempestosa +Riviera +Grotta Pacifica +Oltremare +Confinecielo +Bosco Giallo +Evento +A spasso +Via dei Campioni +Campo Concordia \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/ja/text_hgss_walkercourses_ja.txt b/PKHeX.Core/Resources/text/ja/text_hgss_walkercourses_ja.txt new file mode 100644 index 000000000..366947620 --- /dev/null +++ b/PKHeX.Core/Resources/text/ja/text_hgss_walkercourses_ja.txt @@ -0,0 +1,27 @@ +さわやかのはら +ざわざわもり +ごつごつみち +きれいなうみべ +じゅうたくち +くらいどうくつ +あおいみずうみ +まちのはずれ +ホウエンのはら +あったかビーチ +かざんのこみち +ツリーハウス +こわいどうくつ +シンオウのはら +さむいやまみち +おおきなもり +しろいみずうみ +あれたうみべ +リゾートち +しずかどうくつ +うみのむこう +よぞらのはて +きいろのもり +イベント +おかいもの +チャンプのみち +ふれあいのはら \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/ko/text_hgss_walkercourses_ko.txt b/PKHeX.Core/Resources/text/ko/text_hgss_walkercourses_ko.txt new file mode 100644 index 000000000..63bfb57e0 --- /dev/null +++ b/PKHeX.Core/Resources/text/ko/text_hgss_walkercourses_ko.txt @@ -0,0 +1,27 @@ +상쾌한 들판 +바삭바삭 숲 +울퉁불퉁길 +아름다운 해변 +주택지 +어두운 동굴 +푸른 호수 +변두리 +호연들판 +따뜻한 비치 +화산의 좁은 길 +트리하우스 +무서운 동굴 +신오들판 +추운 산길 +커다란 숲 +하얀 호수 +거친 해변 +리조트지 +조용한 동굴 +바다 저편 +밤하늘의 끝 +노란 숲 +이벤트 +산책 +챔프의 길 +상호교류들판 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/zh/text_hgss_walkercourses_zh.txt b/PKHeX.Core/Resources/text/zh/text_hgss_walkercourses_zh.txt new file mode 100644 index 000000000..2572647a0 --- /dev/null +++ b/PKHeX.Core/Resources/text/zh/text_hgss_walkercourses_zh.txt @@ -0,0 +1,27 @@ +清爽草原 +喧闹森林 +崎岖小道 +绮丽海边 +住宅地 +黑暗洞窟 +蓝色湖泊 +城镇郊外 +丰缘之原 +温暖的沙滩 +火山小道 +树上小屋 +恐怖洞窟 +神奥之原 +寒冷山道 +大森林 +白色湖泊 +荒凉海边 +度假胜地 +安静洞窟 +海之彼岸 +夜空边际 +黄色森林 +活动事件 +购物区 +冠军之道 +交流之原 \ No newline at end of file diff --git a/PKHeX.Core/Saves/SAV4HGSS.cs b/PKHeX.Core/Saves/SAV4HGSS.cs index 7501082b3..617685888 100644 --- a/PKHeX.Core/Saves/SAV4HGSS.cs +++ b/PKHeX.Core/Saves/SAV4HGSS.cs @@ -206,28 +206,17 @@ public void PokeGearUnlockAllCallersNoTrainers() public void SetApricornCount(int i, int count) => General[0xE558 + i] = (byte)count; // Pokewalker - private const int OFS_WALKER = 0xE70C; + private const int OFS_WALKER = 0xE704; + + public uint PokewalkerSteps { get => BitConverter.ToUInt32(General, OFS_WALKER); set => SetData(General, BitConverter.GetBytes(value), OFS_WALKER); } + public uint PokewalkerWatts { get => BitConverter.ToUInt32(General, OFS_WALKER + 0x4); set => SetData(General, BitConverter.GetBytes(value), OFS_WALKER + 0x4); } public bool[] PokewalkerCoursesUnlocked { - get - { - var val = BitConverter.ToUInt32(General, OFS_WALKER); - bool[] courses = new bool[32]; - for (int i = 0; i < courses.Length; i++) - courses[i] = ((val >> i) & 1) == 1; - return courses; - } - set - { - uint val = 0; - bool[] courses = new bool[32]; - for (int i = 0; i < courses.Length; i++) - val |= value[i] ? 1u << i : 0; - SetData(General, BitConverter.GetBytes(val), OFS_WALKER); - } + get => ArrayUtil.GitBitFlagArray(General, OFS_WALKER + 0x8, 32); + set => ArrayUtil.SetBitFlagArray(General, OFS_WALKER + 0x8, value); } - public void PokewalkerCoursesUnlockAll() => SetData(General, BitConverter.GetBytes(0x07FF_FFFFu), OFS_WALKER); + public void PokewalkerCoursesSetAll(uint value = 0x07FF_FFFFu) => SetData(General, BitConverter.GetBytes(value), OFS_WALKER + 0x8); } -} \ No newline at end of file +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Misc4.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Misc4.Designer.cs index f4fd88302..2ed33022d 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Misc4.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Misc4.Designer.cs @@ -99,7 +99,13 @@ private void InitializeComponent() this.NUD_CastleRankInfo = new System.Windows.Forms.NumericUpDown(); this.L_CastleRank01 = new System.Windows.Forms.Label(); this.TAB_Walker = new System.Windows.Forms.TabPage(); - this.B_UnlockCourses = new System.Windows.Forms.Button(); + this.GB_WalkerCourses = new System.Windows.Forms.GroupBox(); + this.B_AllWalkerCourses = new System.Windows.Forms.Button(); + this.CLB_WalkerCourses = new System.Windows.Forms.CheckedListBox(); + this.NUD_Watts = new System.Windows.Forms.NumericUpDown(); + this.L_Watts = new System.Windows.Forms.Label(); + this.NUD_Steps = new System.Windows.Forms.NumericUpDown(); + this.L_Steps = new System.Windows.Forms.Label(); this.Tab_Misc = new System.Windows.Forms.TabPage(); this.B_AllSealsIllegal = new System.Windows.Forms.Button(); this.B_AllSealsLegal = new System.Windows.Forms.Button(); @@ -148,6 +154,9 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.NUD_CastleRankItem)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.NUD_CastleRankInfo)).BeginInit(); this.TAB_Walker.SuspendLayout(); + this.GB_WalkerCourses.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_Watts)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_Steps)).BeginInit(); this.Tab_Misc.SuspendLayout(); this.Tab_Poffins.SuspendLayout(); this.Tab_PokeGear.SuspendLayout(); @@ -1148,7 +1157,11 @@ private void InitializeComponent() // // TAB_Walker // - this.TAB_Walker.Controls.Add(this.B_UnlockCourses); + this.TAB_Walker.Controls.Add(this.GB_WalkerCourses); + this.TAB_Walker.Controls.Add(this.NUD_Watts); + this.TAB_Walker.Controls.Add(this.L_Watts); + this.TAB_Walker.Controls.Add(this.NUD_Steps); + this.TAB_Walker.Controls.Add(this.L_Steps); this.TAB_Walker.Location = new System.Drawing.Point(4, 22); this.TAB_Walker.Name = "TAB_Walker"; this.TAB_Walker.Padding = new System.Windows.Forms.Padding(3); @@ -1157,15 +1170,93 @@ private void InitializeComponent() this.TAB_Walker.Text = "Pokewalker"; this.TAB_Walker.UseVisualStyleBackColor = true; // - // B_UnlockCourses + // GB_WalkerCourses // - this.B_UnlockCourses.Location = new System.Drawing.Point(153, 98); - this.B_UnlockCourses.Name = "B_UnlockCourses"; - this.B_UnlockCourses.Size = new System.Drawing.Size(75, 55); - this.B_UnlockCourses.TabIndex = 0; - this.B_UnlockCourses.Text = "Unlock All Courses"; - this.B_UnlockCourses.UseVisualStyleBackColor = true; - this.B_UnlockCourses.Click += new System.EventHandler(this.B_UnlockCourses_Click); + this.GB_WalkerCourses.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.GB_WalkerCourses.Controls.Add(this.B_AllWalkerCourses); + this.GB_WalkerCourses.Controls.Add(this.CLB_WalkerCourses); + this.GB_WalkerCourses.Location = new System.Drawing.Point(3, 3); + this.GB_WalkerCourses.Name = "GB_WalkerCourses"; + this.GB_WalkerCourses.Size = new System.Drawing.Size(181, 230); + this.GB_WalkerCourses.TabIndex = 4; + this.GB_WalkerCourses.TabStop = false; + this.GB_WalkerCourses.Text = "Pokewalker Courses"; + // + // B_AllWalkerCourses + // + this.B_AllWalkerCourses.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.B_AllWalkerCourses.Location = new System.Drawing.Point(6, 195); + this.B_AllWalkerCourses.Name = "B_AllWalkerCourses"; + this.B_AllWalkerCourses.Size = new System.Drawing.Size(75, 25); + this.B_AllWalkerCourses.TabIndex = 0; + this.B_AllWalkerCourses.Text = "Check All"; + this.B_AllWalkerCourses.UseVisualStyleBackColor = true; + this.B_AllWalkerCourses.Click += new System.EventHandler(this.B_AllWalkerCourses_Click); + // + // CLB_WalkerCourses + // + this.CLB_WalkerCourses.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CLB_WalkerCourses.CheckOnClick = true; + this.CLB_WalkerCourses.FormattingEnabled = true; + this.CLB_WalkerCourses.Location = new System.Drawing.Point(6, 16); + this.CLB_WalkerCourses.Name = "CLB_WalkerCourses"; + this.CLB_WalkerCourses.Size = new System.Drawing.Size(169, 169); + this.CLB_WalkerCourses.TabIndex = 1; + // + // NUD_Watts + // + this.NUD_Watts.Location = new System.Drawing.Point(262, 6); + this.NUD_Watts.Maximum = new decimal(new int[] { + 9999999, + 0, + 0, + 0}); + this.NUD_Watts.Name = "NUD_Watts"; + this.NUD_Watts.Size = new System.Drawing.Size(64, 20); + this.NUD_Watts.TabIndex = 0; + this.NUD_Watts.Value = new decimal(new int[] { + 9999999, + 0, + 0, + 0}); + // + // L_Watts + // + this.L_Watts.Location = new System.Drawing.Point(190, 3); + this.L_Watts.Name = "L_Watts"; + this.L_Watts.Size = new System.Drawing.Size(66, 22); + this.L_Watts.TabIndex = 10; + this.L_Watts.Text = "Watts:"; + this.L_Watts.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // NUD_Steps + // + this.NUD_Steps.Location = new System.Drawing.Point(262, 38); + this.NUD_Steps.Maximum = new decimal(new int[] { + 9999999, + 0, + 0, + 0}); + this.NUD_Steps.Name = "NUD_Steps"; + this.NUD_Steps.Size = new System.Drawing.Size(64, 20); + this.NUD_Steps.TabIndex = 0; + this.NUD_Steps.Value = new decimal(new int[] { + 9999999, + 0, + 0, + 0}); + // + // L_Steps + // + this.L_Steps.Location = new System.Drawing.Point(190, 35); + this.L_Steps.Name = "L_Steps"; + this.L_Steps.Size = new System.Drawing.Size(66, 22); + this.L_Steps.TabIndex = 10; + this.L_Steps.Text = "Steps:"; + this.L_Steps.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // Tab_Misc // @@ -1291,6 +1382,9 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.NUD_CastleRankItem)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.NUD_CastleRankInfo)).EndInit(); this.TAB_Walker.ResumeLayout(false); + this.GB_WalkerCourses.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.NUD_Watts)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_Steps)).EndInit(); this.Tab_Misc.ResumeLayout(false); this.Tab_Poffins.ResumeLayout(false); this.Tab_PokeGear.ResumeLayout(false); @@ -1368,7 +1462,13 @@ private void InitializeComponent() private System.Windows.Forms.Label L_CurrentApp; private System.Windows.Forms.Label L_CurrentMap; private System.Windows.Forms.TabPage TAB_Walker; - private System.Windows.Forms.Button B_UnlockCourses; + private System.Windows.Forms.GroupBox GB_WalkerCourses; + private System.Windows.Forms.CheckedListBox CLB_WalkerCourses; + private System.Windows.Forms.Button B_AllWalkerCourses; + private System.Windows.Forms.NumericUpDown NUD_Watts; + private System.Windows.Forms.Label L_Watts; + private System.Windows.Forms.NumericUpDown NUD_Steps; + private System.Windows.Forms.Label L_Steps; private System.Windows.Forms.NumericUpDown NUD_Coin; private System.Windows.Forms.Label L_Coin; private System.Windows.Forms.TabPage Tab_Misc; diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Misc4.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Misc4.cs index fd8bfc49c..e11439af3 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Misc4.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Misc4.cs @@ -136,8 +136,10 @@ private void ReadMain() uint valBP = BitConverter.ToUInt16(SAV.General, ofsBP); NUD_BP.Value = valBP > 9999 ? 9999 : valBP; - if (SAV is SAV4Sinnoh) - ReadPoketch(); + if (SAV is SAV4Sinnoh sinnoh) + ReadPoketch(sinnoh); + if (SAV is SAV4HGSS hgss) + ReadWalker(hgss); if (ofsUGFlagCount > 0) { @@ -176,8 +178,10 @@ private void SaveMain() BitConverter.GetBytes(valFly).CopyTo(SAV.General, ofsFly); BitConverter.GetBytes((ushort)NUD_BP.Value).CopyTo(SAV.General, ofsBP); - if (SAV is SAV4Sinnoh) - SavePoketch(); + if (SAV is SAV4Sinnoh sinnoh) + SavePoketch(sinnoh); + if (SAV is SAV4HGSS hgss) + SaveWalker(hgss); if (ofsUGFlagCount > 0) BitConverter.GetBytes((BitConverter.ToUInt32(SAV.General, ofsUGFlagCount) & ~0xFFFFFu) | (uint)NUD_UGFlags.Value).CopyTo(SAV.General, ofsUGFlagCount); @@ -199,10 +203,9 @@ private void B_AllFlyDest_Click(object sender, EventArgs e) private byte[] DotArtistByte; private byte[] ColorTable; - private void ReadPoketch() + private void ReadPoketch(SAV4Sinnoh s) { string[] PoketchTitle = Enum.GetNames(typeof(PoketchApp)); - var s = (SAV4Sinnoh) SAV; CB_CurrentApp.Items.AddRange(PoketchTitle); CB_CurrentApp.SelectedIndex = s.CurrentPoketchApp; @@ -226,9 +229,8 @@ private void ReadPoketch() TAB_Main.AllowDrop = true; } - private void SavePoketch() + private void SavePoketch(SAV4Sinnoh s) { - var s = (SAV4Sinnoh)SAV; s.CurrentPoketchApp = (sbyte)CB_CurrentApp.SelectedIndex; for (int i = 0; i < CLB_Poketch.Items.Count; i++) { @@ -776,9 +778,31 @@ private void NUD_HallStreaks_ValueChanged(object sender, EventArgs e) } #endregion - private void B_UnlockCourses_Click(object sender, EventArgs e) + private void ReadWalker(SAV4HGSS s) { - ((SAV4HGSS)SAV).PokewalkerCoursesUnlockAll(); + string[] walkercourses = GameInfo.Sources.Source.walkercourses; + bool[] isChecked = s.PokewalkerCoursesUnlocked; + CLB_WalkerCourses.Items.Clear(); + for (int i = 0; i < walkercourses.Length; i++) + CLB_WalkerCourses.Items.Add(walkercourses[i], isChecked[i]); + NUD_Watts.Value = s.PokewalkerWatts; + NUD_Steps.Value = s.PokewalkerSteps; + } + + private void SaveWalker(SAV4HGSS s) + { + bool[] courses = new bool[32]; + for (int i = 0; i < CLB_WalkerCourses.Items.Count; i++) + courses[i] = CLB_WalkerCourses.GetItemChecked(i); + s.PokewalkerCoursesUnlocked = courses; + s.PokewalkerWatts = (uint)NUD_Watts.Value; + s.PokewalkerSteps = (uint)NUD_Steps.Value; + } + + private void B_AllWalkerCourses_Click(object sender, EventArgs e) + { + for (int i = 0; i < CLB_WalkerCourses.Items.Count; i++) + CLB_WalkerCourses.SetItemChecked(i, true); } private void OnBAllSealsLegalOnClick(object sender, EventArgs e)