From c9c30d76eea94a13a169977f7caf36156ba0755b Mon Sep 17 00:00:00 2001 From: Kurt Date: Wed, 1 Apr 2020 20:39:00 -0700 Subject: [PATCH] Add turnip exchange edits values assumedly get updated every sunday, and only take effect when you restart the game (or pass over a time threshold?) stonks --- NHSE.Core/Save/Files/MainSave.cs | 6 + NHSE.Core/Save/Offsets/MainSaveOffsets.cs | 2 + NHSE.Core/Save/Offsets/MainSaveOffsets10.cs | 1 + NHSE.Core/Save/Offsets/MainSaveOffsets11.cs | 1 + NHSE.Core/Structures/TurnipStonk.cs | 33 +++++ NHSE.WinForms/Editor.Designer.cs | 27 +++- NHSE.WinForms/Editor.cs | 8 ++ NHSE.WinForms/NHSE.WinForms.csproj | 6 + .../Subforms/SingleObjectEditor.Designer.cs | 93 ++++++++++++++ NHSE.WinForms/Subforms/SingleObjectEditor.cs | 28 ++++ .../Subforms/SingleObjectEditor.resx | 120 ++++++++++++++++++ 11 files changed, 318 insertions(+), 7 deletions(-) create mode 100644 NHSE.Core/Structures/TurnipStonk.cs create mode 100644 NHSE.WinForms/Subforms/SingleObjectEditor.Designer.cs create mode 100644 NHSE.WinForms/Subforms/SingleObjectEditor.cs create mode 100644 NHSE.WinForms/Subforms/SingleObjectEditor.resx diff --git a/NHSE.Core/Save/Files/MainSave.cs b/NHSE.Core/Save/Files/MainSave.cs index e5d37a9..5b11ebe 100644 --- a/NHSE.Core/Save/Files/MainSave.cs +++ b/NHSE.Core/Save/Files/MainSave.cs @@ -26,5 +26,11 @@ public IReadOnlyList Buildings get => Building.GetArray(Data.Slice(Offsets.Buildings, MainSaveOffsets.BuildingCount * Building.SIZE)); set => Building.SetArray(value).CopyTo(Data, Offsets.Buildings); } + + public TurnipStonk Turnips + { + get => Data.Slice(Offsets.TurnipExchange, TurnipStonk.SIZE).ToClass(); + set => value.ToBytesClass().CopyTo(Data, Offsets.TurnipExchange); + } } } \ No newline at end of file diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets.cs index c0edeb9..0189d3d 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets.cs @@ -20,6 +20,8 @@ public abstract class MainSaveOffsets public abstract int RecycleBin { get; } public const int RecycleBinCount = 40; + public abstract int TurnipExchange { get; } + public static MainSaveOffsets GetOffsets(FileHeaderInfo Info) { var rev = Info.GetKnownRevisionIndex(); diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets10.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets10.cs index e8b8d2d..a67c3e9 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets10.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets10.cs @@ -8,6 +8,7 @@ public class MainSaveOffsets10 : MainSaveOffsets public override int Villager => 0x110; public override int Patterns => 0x1D72F0; public override int Buildings => 0x2D0EFC; + public override int TurnipExchange => 0x4118C0; public override int RecycleBin => 0xABC000; // yep. } } \ No newline at end of file diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets11.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets11.cs index a1a7893..94ebb9d 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets11.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets11.cs @@ -8,6 +8,7 @@ public class MainSaveOffsets11 : MainSaveOffsets public override int Villager => 0x120; public override int Patterns => 0x1D7310; // +0x20 from v1.0 public override int Buildings => 0x2D0F1C; // +0x20 from v1.0 + public override int TurnipExchange => 0x412060; // +0x7A0 from v1.0 public override int RecycleBin => 0xABDE70; // +0x1E70 from v1.0 } } \ No newline at end of file diff --git a/NHSE.Core/Structures/TurnipStonk.cs b/NHSE.Core/Structures/TurnipStonk.cs new file mode 100644 index 0000000..a364bb3 --- /dev/null +++ b/NHSE.Core/Structures/TurnipStonk.cs @@ -0,0 +1,33 @@ +using System.Runtime.InteropServices; + +namespace NHSE.Core +{ + [StructLayout(LayoutKind.Sequential)] + public class TurnipStonk + { + public const int SIZE = sizeof(uint) * (1 + (2 * 7)); + + public uint BuyPrice { get; set; } + + public uint SellSunday1 { get; set; } + public uint SellSunday2 { get; set; } + + public uint SellMonday1 { get; set; } + public uint SellMonday2 { get; set; } + + public uint SellTuesday1 { get; set; } + public uint SellTuesday2 { get; set; } + + public uint SellWednesday1 { get; set; } + public uint SellWednesday2 { get; set; } + + public uint SellThursday1 { get; set; } + public uint SellThursday2 { get; set; } + + public uint SellFriday1 { get; set; } + public uint SellFriday2 { get; set; } + + public uint SellSaturday1 { get; set; } + public uint SellSaturday2 { get; set; } + } +} diff --git a/NHSE.WinForms/Editor.Designer.cs b/NHSE.WinForms/Editor.Designer.cs index d9a003f..c21e699 100644 --- a/NHSE.WinForms/Editor.Designer.cs +++ b/NHSE.WinForms/Editor.Designer.cs @@ -37,6 +37,7 @@ private void InitializeComponent() this.Menu_DumpDecrypted = new System.Windows.Forms.ToolStripMenuItem(); this.Menu_VerifyHashes = new System.Windows.Forms.ToolStripMenuItem(); this.Menu_LoadDecrypted = new System.Windows.Forms.ToolStripMenuItem(); + this.Menu_RAMEdit = new System.Windows.Forms.ToolStripMenuItem(); this.TC_Editors = new System.Windows.Forms.TabControl(); this.Tab_Players = new System.Windows.Forms.TabPage(); this.B_EditActivities = new System.Windows.Forms.Button(); @@ -86,7 +87,7 @@ private void InitializeComponent() this.Tab_Map = new System.Windows.Forms.TabPage(); this.B_EditBuildings = new System.Windows.Forms.Button(); this.B_RecycleBin = new System.Windows.Forms.Button(); - this.Menu_RAMEdit = new System.Windows.Forms.ToolStripMenuItem(); + this.B_EditTurnipExchange = new System.Windows.Forms.Button(); this.Menu_Editor.SuspendLayout(); this.TC_Editors.SuspendLayout(); this.Tab_Players.SuspendLayout(); @@ -179,6 +180,14 @@ private void InitializeComponent() this.Menu_LoadDecrypted.Text = "Load Decrypted"; this.Menu_LoadDecrypted.Click += new System.EventHandler(this.Menu_LoadDecrypted_Click); // + // Menu_RAMEdit + // + this.Menu_RAMEdit.Name = "Menu_RAMEdit"; + this.Menu_RAMEdit.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.H))); + this.Menu_RAMEdit.Size = new System.Drawing.Size(206, 22); + this.Menu_RAMEdit.Text = "RAM Edit"; + this.Menu_RAMEdit.Click += new System.EventHandler(this.Menu_RAMEdit_Click); + // // TC_Editors // this.TC_Editors.Controls.Add(this.Tab_Players); @@ -701,6 +710,7 @@ private void InitializeComponent() // // Tab_Map // + this.Tab_Map.Controls.Add(this.B_EditTurnipExchange); this.Tab_Map.Controls.Add(this.B_EditBuildings); this.Tab_Map.Controls.Add(this.B_RecycleBin); this.Tab_Map.Location = new System.Drawing.Point(4, 22); @@ -731,13 +741,15 @@ private void InitializeComponent() this.B_RecycleBin.UseVisualStyleBackColor = true; this.B_RecycleBin.Click += new System.EventHandler(this.B_RecycleBin_Click); // - // Menu_RAMEdit + // B_EditTurnipExchange // - this.Menu_RAMEdit.Name = "Menu_RAMEdit"; - this.Menu_RAMEdit.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.H))); - this.Menu_RAMEdit.Size = new System.Drawing.Size(206, 22); - this.Menu_RAMEdit.Text = "RAM Edit"; - this.Menu_RAMEdit.Click += new System.EventHandler(this.Menu_RAMEdit_Click); + this.B_EditTurnipExchange.Location = new System.Drawing.Point(202, 168); + this.B_EditTurnipExchange.Name = "B_EditTurnipExchange"; + this.B_EditTurnipExchange.Size = new System.Drawing.Size(92, 40); + this.B_EditTurnipExchange.TabIndex = 15; + this.B_EditTurnipExchange.Text = "Edit Turnip Exchange"; + this.B_EditTurnipExchange.UseVisualStyleBackColor = true; + this.B_EditTurnipExchange.Click += new System.EventHandler(this.B_EditTurnipExchange_Click); // // Editor // @@ -839,6 +851,7 @@ private void InitializeComponent() private System.Windows.Forms.Button B_EditBuildings; private System.Windows.Forms.Button B_EditActivities; private System.Windows.Forms.ToolStripMenuItem Menu_RAMEdit; + private System.Windows.Forms.Button B_EditTurnipExchange; } } diff --git a/NHSE.WinForms/Editor.cs b/NHSE.WinForms/Editor.cs index 267e3db..cca7f01 100644 --- a/NHSE.WinForms/Editor.cs +++ b/NHSE.WinForms/Editor.cs @@ -500,5 +500,13 @@ private void B_EditBuildings_Click(object sender, EventArgs e) if (editor.ShowDialog() == DialogResult.OK) SAV.Main.Buildings = buildings; } + + private void B_EditTurnipExchange_Click(object sender, EventArgs e) + { + var turnips = SAV.Main.Turnips; + using var editor = new SingleObjectEditor(turnips, PropertySort.NoSort); + if (editor.ShowDialog() == DialogResult.OK) + SAV.Main.Turnips = turnips; + } } } diff --git a/NHSE.WinForms/NHSE.WinForms.csproj b/NHSE.WinForms/NHSE.WinForms.csproj index cbb792d..7d1d85b 100644 --- a/NHSE.WinForms/NHSE.WinForms.csproj +++ b/NHSE.WinForms/NHSE.WinForms.csproj @@ -40,6 +40,12 @@ True Settings.settings + + Form + + + PropertyEditor.cs + Form diff --git a/NHSE.WinForms/Subforms/SingleObjectEditor.Designer.cs b/NHSE.WinForms/Subforms/SingleObjectEditor.Designer.cs new file mode 100644 index 0000000..6e529e4 --- /dev/null +++ b/NHSE.WinForms/Subforms/SingleObjectEditor.Designer.cs @@ -0,0 +1,93 @@ +namespace NHSE.WinForms +{ + partial class SingleObjectEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.B_Save = new System.Windows.Forms.Button(); + this.B_Cancel = new System.Windows.Forms.Button(); + this.PG_Item = new System.Windows.Forms.PropertyGrid(); + this.SuspendLayout(); + // + // B_Save + // + this.B_Save.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.B_Save.Location = new System.Drawing.Point(237, 378); + this.B_Save.Name = "B_Save"; + this.B_Save.Size = new System.Drawing.Size(75, 31); + this.B_Save.TabIndex = 1; + this.B_Save.Text = "Save"; + this.B_Save.UseVisualStyleBackColor = true; + this.B_Save.Click += new System.EventHandler(this.B_Save_Click); + // + // B_Cancel + // + this.B_Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.B_Cancel.Location = new System.Drawing.Point(156, 378); + this.B_Cancel.Name = "B_Cancel"; + this.B_Cancel.Size = new System.Drawing.Size(75, 31); + this.B_Cancel.TabIndex = 2; + this.B_Cancel.Text = "Cancel"; + this.B_Cancel.UseVisualStyleBackColor = true; + this.B_Cancel.Click += new System.EventHandler(this.B_Cancel_Click); + // + // PG_Item + // + this.PG_Item.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.PG_Item.Location = new System.Drawing.Point(12, 12); + this.PG_Item.Name = "PG_Item"; + this.PG_Item.PropertySort = System.Windows.Forms.PropertySort.NoSort; + this.PG_Item.Size = new System.Drawing.Size(300, 359); + this.PG_Item.TabIndex = 4; + this.PG_Item.PropertyValueChanged += new System.Windows.Forms.PropertyValueChangedEventHandler(this.PG_Item_PropertyValueChanged); + // + // SingleObjectEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(324, 421); + this.Controls.Add(this.PG_Item); + this.Controls.Add(this.B_Cancel); + this.Controls.Add(this.B_Save); + this.Icon = global::NHSE.WinForms.Properties.Resources.icon; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SingleObjectEditor"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Property Editor"; + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button B_Save; + private System.Windows.Forms.Button B_Cancel; + private System.Windows.Forms.PropertyGrid PG_Item; + } +} \ No newline at end of file diff --git a/NHSE.WinForms/Subforms/SingleObjectEditor.cs b/NHSE.WinForms/Subforms/SingleObjectEditor.cs new file mode 100644 index 0000000..0294801 --- /dev/null +++ b/NHSE.WinForms/Subforms/SingleObjectEditor.cs @@ -0,0 +1,28 @@ +using System; +using System.Windows.Forms; + +namespace NHSE.WinForms +{ + public partial class SingleObjectEditor : Form where T : class + { + public SingleObjectEditor(T obj, PropertySort sort) + { + InitializeComponent(); + DialogResult = DialogResult.Cancel; + PG_Item.PropertySort = sort; + PG_Item.SelectedObject = obj; + } + + private void B_Cancel_Click(object sender, EventArgs e) => Close(); + + private void B_Save_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + Close(); + } + + private void PG_Item_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) + { + } + } +} diff --git a/NHSE.WinForms/Subforms/SingleObjectEditor.resx b/NHSE.WinForms/Subforms/SingleObjectEditor.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/NHSE.WinForms/Subforms/SingleObjectEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file