Add island visitor editor

Make daily NPCs show up reliably!
This commit is contained in:
Kurt
2020-05-14 09:12:38 -07:00
parent 70155d36ef
commit ffa0d3612b
9 changed files with 83 additions and 2 deletions

View File

@@ -264,6 +264,13 @@ public uint EventPlazaLeftUpZ
set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.OutsideField + AcreSizeAll + 8);
}
public GSaveVisitorNpc Visitor
{
get => Data.ToClass<GSaveVisitorNpc>(Offsets.Visitor, GSaveVisitorNpc.SIZE);
set => value.ToBytesClass().CopyTo(Data, Offsets.Visitor);
}
public GSaveFg SaveFg
{
get => Data.ToClass<GSaveFg>(Offsets.SaveFg, GSaveFg.SIZE);

View File

@@ -34,6 +34,7 @@ public abstract class MainSaveOffsets
public abstract int NpcHouseList { get; }
public abstract int ShopKabu { get; }
public abstract int Museum { get; }
public abstract int Visitor { get; }
public abstract int SaveFg { get; }
public abstract int BulletinBoard { get; }

View File

@@ -33,6 +33,7 @@ public class MainSaveOffsets10 : MainSaveOffsets
public const int GSaveShop = GSaveLandStart + 0x40ECE8;
public override int ShopKabu => GSaveShop + 0x2AD0; // part of shop
public override int Museum => GSaveLandStart + 0x411A80;
public override int Visitor => GSaveLandStart + 0x414E84;
public override int SaveFg => GSaveLandStart + 0x4150B4;
public override int BulletinBoard => GSaveLandStart + 0x4159F8;
public override int AirportThemeColor => GSaveLandStart + 0x4F6600;

View File

@@ -33,6 +33,7 @@ public class MainSaveOffsets11 : MainSaveOffsets
public const int GSaveShop = GSaveLandStart + 0x40F480;
public override int ShopKabu => GSaveShop + 0x2AD0; // part of shop
public override int Museum => GSaveLandStart + 0x412218;
public override int Visitor => GSaveLandStart + 0x41561C;
public override int SaveFg => GSaveLandStart + 0x41584C;
public override int BulletinBoard => GSaveLandStart + 0x416190;
public override int AirportThemeColor => GSaveLandStart + 0x4F6D98;

View File

@@ -33,6 +33,7 @@ public class MainSaveOffsets12 : MainSaveOffsets
public const int GSaveShop = GSaveLandStart + 0x40F480;
public override int ShopKabu => GSaveShop + 0x2AD0; // part of shop
public override int Museum => GSaveLandStart + 0x4124C4;
public override int Visitor => GSaveLandStart + 0x4158C8;
public override int SaveFg => GSaveLandStart + 0x415AF8;
public override int BulletinBoard => GSaveLandStart + 0x416440;
public override int AirportThemeColor => GSaveLandStart + 0x4F7048;

View File

@@ -0,0 +1,51 @@
using System.ComponentModel;
using System.Runtime.InteropServices;
#pragma warning disable CS8618, CA1815, CA1819, IDE1006
namespace NHSE.Core
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class GSaveVisitorNpc
{
public const int SIZE = 0x78;
private const int Days = 7;
[field: MarshalAs(UnmanagedType.ByValArray, SizeConst = Days)]
public int[] VisitorNPC { get; set; }
public V3f CreatePos { get; set; }
public V3f _61e631dc { get; set; }
[field: MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = Days)]
public bool[] IsNormalLive { get; set; }
[field: MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = Days)]
public bool[] IsBirthdayLive { get; set; }
[field: MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] gap_42;
[field: MarshalAs(UnmanagedType.ByValArray, SizeConst = Days)]
public int[] InitSchedule { get; set; }
[field: MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = Days * 2)]
public bool[] _437619d8 { get; set; }
[field: MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] gap_6e;
public int _e2484556 {get; set; }
public int _753479b1 { get; set; }
}
// same as Vector3; not importing package
[TypeConverter(typeof(ValueTypeTypeConverter))]
public struct V3f
{
public float X { get; set; }
public float Y { get; set; }
public float Z { get; set; }
public override string ToString() => $"({X},{Y},{Z})";
}
}

View File

@@ -22,6 +22,7 @@ public class FancyMarshalTests
[Fact] public void MarshalGSaveManpu() => MarshalBytesTestS<GSavePlayerManpu>(GSavePlayerManpu.SIZE);
[Fact] public void MarshalGSavePlayerHandleName() => MarshalBytesTestS<GSavePlayerHandleName>(GSavePlayerHandleName.SIZE);
[Fact] public void MarshalGSaveFg() => MarshalBytesTest<GSaveFg>(GSaveFg.SIZE);
[Fact] public void MarshalGSaveVisitorNpc() => MarshalBytesTest<GSaveVisitorNpc>(GSaveVisitorNpc.SIZE);
private static void MarshalBytesTestS<T>(int size) where T : struct
{

View File

@@ -95,6 +95,7 @@ private void InitializeComponent()
this.PB_Player = new System.Windows.Forms.PictureBox();
this.TC_Editors = new System.Windows.Forms.TabControl();
this.B_EditMuseum_Click = new System.Windows.Forms.ToolStripMenuItem();
this.B_EditVisitors = new System.Windows.Forms.ToolStripMenuItem();
this.Menu_Editor.SuspendLayout();
this.CM_Picture.SuspendLayout();
this.Tab_Map.SuspendLayout();
@@ -340,9 +341,10 @@ private void InitializeComponent()
this.B_EditFieldItems,
this.B_EditBulletin,
this.B_EditFieldGoods,
this.B_EditMuseum_Click});
this.B_EditMuseum_Click,
this.B_EditVisitors});
this.CM_EditMap.Name = "CM_EditMap";
this.CM_EditMap.Size = new System.Drawing.Size(181, 136);
this.CM_EditMap.Size = new System.Drawing.Size(181, 158);
//
// B_EditLandFlags
//
@@ -774,6 +776,13 @@ private void InitializeComponent()
this.B_EditMuseum_Click.Text = "Edit Museum";
this.B_EditMuseum_Click.Click += new System.EventHandler(this.B_EditMuseum_Click_Click);
//
// B_EditVisitors
//
this.B_EditVisitors.Name = "B_EditVisitors";
this.B_EditVisitors.Size = new System.Drawing.Size(180, 22);
this.B_EditVisitors.Text = "Edit Visitors";
this.B_EditVisitors.Click += new System.EventHandler(this.B_EditVisitors_Click);
//
// Editor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -877,6 +886,7 @@ private void InitializeComponent()
private System.Windows.Forms.Button B_EditDesignsTailor;
private System.Windows.Forms.Button B_EditPatternFlag;
private System.Windows.Forms.ToolStripMenuItem B_EditMuseum_Click;
private System.Windows.Forms.ToolStripMenuItem B_EditVisitors;
}
}

View File

@@ -482,5 +482,13 @@ private void B_EditMuseum_Click_Click(object sender, EventArgs e)
if (editor.ShowDialog() == DialogResult.OK)
SAV.Main.Museum = museum;
}
private void B_EditVisitors_Click(object sender, EventArgs e)
{
var boxed = SAV.Main.Visitor;
using var editor = new SingleObjectEditor<object>(boxed, PropertySort.NoSort, false);
if (editor.ShowDialog() == DialogResult.OK)
SAV.Main.Visitor = boxed;
}
}
}