mirror of
https://github.com/kwsch/NHSE.git
synced 2026-09-27 04:19:36 -05:00
Rename properties to match disassembled internal names
Revise offset values to read from the struct's location within the parent object.
This commit is contained in:
@@ -35,14 +35,14 @@ public void SetVillagers(IReadOnlyList<Villager> villagers)
|
||||
|
||||
public IReadOnlyList<Item> RecycleBin
|
||||
{
|
||||
get => Item.GetArray(Data.Slice(Offsets.RecycleBin, MainSaveOffsets.RecycleBinCount * Item.SIZE));
|
||||
set => Item.SetArray(value).CopyTo(Data, Offsets.RecycleBin);
|
||||
get => Item.GetArray(Data.Slice(Offsets.LostItemBox, MainSaveOffsets.RecycleBinCount * Item.SIZE));
|
||||
set => Item.SetArray(value).CopyTo(Data, Offsets.LostItemBox);
|
||||
}
|
||||
|
||||
public IReadOnlyList<Building> Buildings
|
||||
{
|
||||
get => Building.GetArray(Data.Slice(Offsets.Buildings, MainSaveOffsets.BuildingCount * Building.SIZE));
|
||||
set => Building.SetArray(value).CopyTo(Data, Offsets.Buildings);
|
||||
get => Building.GetArray(Data.Slice(Offsets.MainFieldStructure, MainSaveOffsets.BuildingCount * Building.SIZE));
|
||||
set => Building.SetArray(value).CopyTo(Data, Offsets.MainFieldStructure);
|
||||
}
|
||||
|
||||
public PlayerHouse GetPlayerHouse(int index)
|
||||
@@ -147,8 +147,8 @@ public void SetEventFlagLand(short[] value)
|
||||
|
||||
public TurnipStonk Turnips
|
||||
{
|
||||
get => Data.Slice(Offsets.TurnipExchange, TurnipStonk.SIZE).ToClass<TurnipStonk>();
|
||||
set => value.ToBytesClass().CopyTo(Data, Offsets.TurnipExchange);
|
||||
get => Data.Slice(Offsets.ShopKabu, TurnipStonk.SIZE).ToClass<TurnipStonk>();
|
||||
set => value.ToBytesClass().CopyTo(Data, Offsets.ShopKabu);
|
||||
}
|
||||
|
||||
public const int AcreWidth = 7 + (2 * 1); // 1 on each side cannot be traversed
|
||||
@@ -160,53 +160,53 @@ public ushort GetAcre(int index)
|
||||
{
|
||||
if ((uint)index > AcreMax)
|
||||
throw new ArgumentOutOfRangeException(nameof(index));
|
||||
return BitConverter.ToUInt16(Data, Offsets.Acres + (index * 2));
|
||||
return BitConverter.ToUInt16(Data, Offsets.OutsideField + (index * 2));
|
||||
}
|
||||
|
||||
public void SetAcre(int index, ushort value)
|
||||
{
|
||||
if ((uint)index > AcreMax)
|
||||
throw new ArgumentOutOfRangeException(nameof(index));
|
||||
BitConverter.GetBytes(value).CopyTo(Data, Offsets.Acres + (index * 2));
|
||||
BitConverter.GetBytes(value).CopyTo(Data, Offsets.OutsideField + (index * 2));
|
||||
}
|
||||
|
||||
public byte[] GetAcreBytes() => Data.Slice(Offsets.Acres, AcreSizeAll);
|
||||
public byte[] GetAcreBytes() => Data.Slice(Offsets.OutsideField, AcreSizeAll);
|
||||
|
||||
public void SetAcreBytes(byte[] data)
|
||||
{
|
||||
if (data.Length != AcreSizeAll)
|
||||
throw new ArgumentOutOfRangeException(nameof(data.Length));
|
||||
data.CopyTo(Data, Offsets.Acres);
|
||||
data.CopyTo(Data, Offsets.OutsideField);
|
||||
}
|
||||
|
||||
public TerrainTile[] GetTerrain() => TerrainTile.GetArray(Data.Slice(Offsets.Terrain, MapGrid.MapTileCount16x16 * TerrainTile.SIZE));
|
||||
public void SetTerrain(IReadOnlyList<TerrainTile> array) => TerrainTile.SetArray(array).CopyTo(Data, Offsets.Terrain);
|
||||
public TerrainTile[] GetTerrain() => TerrainTile.GetArray(Data.Slice(Offsets.LandMakingMap, MapGrid.MapTileCount16x16 * TerrainTile.SIZE));
|
||||
public void SetTerrain(IReadOnlyList<TerrainTile> array) => TerrainTile.SetArray(array).CopyTo(Data, Offsets.LandMakingMap);
|
||||
|
||||
public FieldItem[] GetFieldItems() => FieldItem.GetArray(Data.Slice(Offsets.FieldItem, MapGrid.MapTileCount32x32 * FieldItem.SIZE * 2));
|
||||
public void SetFieldItems(IReadOnlyList<FieldItem> array) => FieldItem.SetArray(array).CopyTo(Data, Offsets.FieldItem);
|
||||
|
||||
public ushort OutsideFieldTemplateUniqueId
|
||||
{
|
||||
get => BitConverter.ToUInt16(Data, Offsets.Acres + AcreSizeAll);
|
||||
set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.Acres + AcreSizeAll);
|
||||
get => BitConverter.ToUInt16(Data, Offsets.OutsideField + AcreSizeAll);
|
||||
set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.OutsideField + AcreSizeAll);
|
||||
}
|
||||
|
||||
public ushort MainFieldParamUniqueID
|
||||
{
|
||||
get => BitConverter.ToUInt16(Data, Offsets.Acres + AcreSizeAll + 2);
|
||||
set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.Acres + AcreSizeAll + 2);
|
||||
get => BitConverter.ToUInt16(Data, Offsets.OutsideField + AcreSizeAll + 2);
|
||||
set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.OutsideField + AcreSizeAll + 2);
|
||||
}
|
||||
|
||||
public uint PlazaX
|
||||
{
|
||||
get => BitConverter.ToUInt32(Data, Offsets.Acres + AcreSizeAll + 4);
|
||||
set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.Acres + AcreSizeAll + 4);
|
||||
get => BitConverter.ToUInt32(Data, Offsets.OutsideField + AcreSizeAll + 4);
|
||||
set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.OutsideField + AcreSizeAll + 4);
|
||||
}
|
||||
|
||||
public uint PlazaY
|
||||
{
|
||||
get => BitConverter.ToUInt32(Data, Offsets.Acres + AcreSizeAll + 8);
|
||||
set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.Acres + AcreSizeAll + 8);
|
||||
get => BitConverter.ToUInt32(Data, Offsets.OutsideField + AcreSizeAll + 8);
|
||||
set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.OutsideField + AcreSizeAll + 8);
|
||||
}
|
||||
|
||||
public GSaveTime LastSaved => Data.Slice(Offsets.LastSavedTime, GSaveTime.SIZE).ToStructure<GSaveTime>();
|
||||
|
||||
@@ -8,32 +8,35 @@ namespace NHSE.Core
|
||||
public abstract class MainSaveOffsets
|
||||
{
|
||||
public const int PlayerCount = 8;
|
||||
|
||||
public abstract int Villager { get; }
|
||||
public const int VillagerSize = 0x12AB0;
|
||||
public const int VillagerCount = 10;
|
||||
|
||||
public abstract int Patterns { get; }
|
||||
public const int PatternCount = 50;
|
||||
public const int BuildingCount = 46;
|
||||
public const int RecycleBinCount = 40;
|
||||
|
||||
public abstract int Animal { get; }
|
||||
|
||||
public abstract int LandMyDesign { get; }
|
||||
public abstract int PatternsPRO { get; }
|
||||
public abstract int PatternFlag { get; }
|
||||
|
||||
public abstract int Buildings { get; }
|
||||
public const int BuildingCount = 46;
|
||||
|
||||
public abstract int RecycleBin { get; }
|
||||
public const int RecycleBinCount = 40;
|
||||
|
||||
public abstract int TurnipExchange { get; }
|
||||
public abstract int MainFieldStructure { get; }
|
||||
|
||||
public abstract int EventFlagLand { get; }
|
||||
public abstract int FieldItem { get; }
|
||||
public abstract int Acres { get; }
|
||||
public abstract int Terrain { get; }
|
||||
public abstract int OutsideField { get; }
|
||||
public abstract int LandMakingMap { get; }
|
||||
public abstract int PlayerHouseList { get; }
|
||||
public abstract int NpcHouseList { get; }
|
||||
|
||||
public abstract int LastSavedTime { get; }
|
||||
public abstract int BulletinBoard { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Turnip Stalk Market
|
||||
/// </summary>
|
||||
public abstract int ShopKabu { get; }
|
||||
|
||||
public abstract int LostItemBox { get; }
|
||||
|
||||
public static MainSaveOffsets GetOffsets(FileHeaderInfo Info)
|
||||
{
|
||||
@@ -55,7 +58,7 @@ public DesignPattern ReadPattern(byte[] data, int index)
|
||||
{
|
||||
if ((uint)index >= PatternCount)
|
||||
throw new ArgumentOutOfRangeException(nameof(index));
|
||||
var v = data.Slice(Patterns + (index * DesignPattern.SIZE), DesignPattern.SIZE);
|
||||
var v = data.Slice(LandMyDesign + (index * DesignPattern.SIZE), DesignPattern.SIZE);
|
||||
return new DesignPattern(v);
|
||||
}
|
||||
|
||||
@@ -63,7 +66,7 @@ public void WritePattern(DesignPattern p, byte[] data, int index)
|
||||
{
|
||||
if ((uint)index >= PatternCount)
|
||||
throw new ArgumentOutOfRangeException(nameof(index));
|
||||
p.Data.CopyTo(data, Patterns + (index * DesignPattern.SIZE));
|
||||
p.Data.CopyTo(data, LandMyDesign + (index * DesignPattern.SIZE));
|
||||
}
|
||||
|
||||
public DesignPatternPRO ReadPatternPRO(byte[] data, int index)
|
||||
@@ -85,7 +88,7 @@ public Villager ReadVillager(byte[] data, int index)
|
||||
{
|
||||
if ((uint)index >= VillagerCount)
|
||||
throw new ArgumentOutOfRangeException(nameof(index));
|
||||
var v = data.Slice(Villager + (index * VillagerSize), VillagerSize);
|
||||
var v = data.Slice(Animal + (index * Villager.SIZE), Villager.SIZE);
|
||||
return new Villager(v);
|
||||
}
|
||||
|
||||
@@ -93,7 +96,7 @@ public void WriteVillager(Villager v, byte[] data, int index)
|
||||
{
|
||||
if ((uint)index >= VillagerCount)
|
||||
throw new ArgumentOutOfRangeException(nameof(index));
|
||||
v.Data.CopyTo(data, Villager + (index * VillagerSize));
|
||||
v.Data.CopyTo(data, Animal + (index * Villager.SIZE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,22 +5,36 @@
|
||||
/// </summary>
|
||||
public class MainSaveOffsets10 : MainSaveOffsets
|
||||
{
|
||||
public override int Villager => 0x110;
|
||||
public override int Patterns => 0x1D72F0;
|
||||
public override int PatternsPRO => Patterns + (PatternCount * DesignPattern.SIZE);
|
||||
#region GSaveLand
|
||||
public const int GSaveLandStart = 0x108;
|
||||
public override int Animal => GSaveLandStart + 0x08;
|
||||
|
||||
public override int LandMyDesign => GSaveLandStart + 0x1D71E8;
|
||||
public override int PatternsPRO => LandMyDesign + (PatternCount * DesignPattern.SIZE);
|
||||
public override int PatternFlag => PatternsPRO + (PatternCount * DesignPatternPRO.SIZE);
|
||||
|
||||
public override int EventFlagLand => FieldItem - 0x800;
|
||||
public override int FieldItem => 0x2018FC;
|
||||
public override int Terrain => Buildings - 0x24C00;
|
||||
public override int Buildings => 0x2D0EFC;
|
||||
public override int Acres => 0x2D1294;
|
||||
public override int EventFlagLand => GSaveLandStart + 0x200FF4;
|
||||
|
||||
public override int PlayerHouseList => FieldItem + 0xDAA2C;
|
||||
public override int NpcHouseList => PlayerHouseList + (PlayerCount * PlayerHouse.SIZE);
|
||||
// GSaveMainField
|
||||
public const int GSaveMainFieldStart = GSaveLandStart + 0x2017F4;
|
||||
public override int FieldItem => GSaveMainFieldStart + 0x00000;
|
||||
public override int LandMakingMap => GSaveMainFieldStart + 0xAAA00;
|
||||
public override int MainFieldStructure => GSaveMainFieldStart + 0xCF600;
|
||||
public override int OutsideField => GSaveMainFieldStart + 0xCF998;
|
||||
|
||||
public override int TurnipExchange => 0x4118C0;
|
||||
public override int RecycleBin => 0xABC000; // yep.
|
||||
public override int LastSavedTime => RecycleBin + 0x4928;
|
||||
public override int PlayerHouseList => GSaveLandStart + 0x2DBAA0;
|
||||
public override int NpcHouseList => GSaveLandStart + 0x40DAA0;
|
||||
public override int BulletinBoard => GSaveLandStart + 0x4159F8;
|
||||
|
||||
public const int GSaveShop = GSaveLandStart + 0x40ECE8;
|
||||
public override int ShopKabu => GSaveShop + 0x2AD0; // part of shop
|
||||
#endregion
|
||||
|
||||
#region GSaveLandOther
|
||||
public const int GSaveLandOtherStart = 0x4FA1E0;
|
||||
|
||||
public override int LostItemBox => GSaveLandOtherStart + 0x5C1E20;
|
||||
public override int LastSavedTime => GSaveLandOtherStart + 0x5C6748;
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -5,24 +5,36 @@
|
||||
/// </summary>
|
||||
public class MainSaveOffsets11 : MainSaveOffsets
|
||||
{
|
||||
public override int Villager => 0x120;
|
||||
public override int Patterns => 0x1D7310; // +0x20 from v1.0
|
||||
public override int PatternsPRO => Patterns + (PatternCount * DesignPattern.SIZE);
|
||||
#region GSaveLand
|
||||
public const int GSaveLandStart = 0x110;
|
||||
public override int Animal => GSaveLandStart + 0x10;
|
||||
|
||||
public override int LandMyDesign => GSaveLandStart + 0x1D7200;
|
||||
public override int PatternsPRO => LandMyDesign + (PatternCount * DesignPattern.SIZE);
|
||||
public override int PatternFlag => PatternsPRO + (PatternCount * DesignPatternPRO.SIZE);
|
||||
|
||||
public override int EventFlagLand => FieldItem - 0x800;
|
||||
public override int EventFlagLand => GSaveLandStart + 0x20100C;
|
||||
|
||||
// GSaveMainField
|
||||
public override int FieldItem => 0x20191C; // +0x20 from v1.0 // Layer 1&2, and 2*0x1500
|
||||
public override int Terrain => Buildings - 0x24C00;// +0x20 from v1.0 // LandMakingMap
|
||||
public override int Buildings => 0x2D0F1C; // +0x20 from v1.0
|
||||
public override int Acres => 0x2D12B4; // +0x20 from v1.0
|
||||
public const int GSaveMainFieldStart = GSaveLandStart + 0x20180C;
|
||||
public override int FieldItem => GSaveMainFieldStart + 0x00000;
|
||||
public override int LandMakingMap => GSaveMainFieldStart + 0xAAA00;
|
||||
public override int MainFieldStructure => GSaveMainFieldStart + 0xCF600;
|
||||
public override int OutsideField => GSaveMainFieldStart + 0xCF998;
|
||||
|
||||
public override int PlayerHouseList => FieldItem + 0xDAA2C;
|
||||
public override int NpcHouseList => PlayerHouseList + (PlayerCount * PlayerHouse.SIZE);
|
||||
public override int PlayerHouseList => GSaveLandStart + 0x2DC238;
|
||||
public override int NpcHouseList => GSaveLandStart + 0x40E238;
|
||||
public override int BulletinBoard => GSaveLandStart + 0x416190;
|
||||
|
||||
public override int TurnipExchange => 0x412060; // +0x7A0 from v1.0
|
||||
public override int RecycleBin => 0xABDE70; // +0x1E70 from v1.0
|
||||
public override int LastSavedTime => RecycleBin + 0x4958;
|
||||
public const int GSaveShop = GSaveLandStart + 0x40F480;
|
||||
public override int ShopKabu => GSaveShop + 0x2AD0; // part of shop
|
||||
#endregion
|
||||
|
||||
#region GSaveLandOther
|
||||
public const int GSaveLandOtherStart = 0x4FAA80;
|
||||
|
||||
public override int LostItemBox => GSaveLandOtherStart + 0x5C33F0;
|
||||
public override int LastSavedTime => GSaveLandOtherStart + 0x5C7D48;
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,24 +5,36 @@
|
||||
/// </summary>
|
||||
public class MainSaveOffsets12 : MainSaveOffsets
|
||||
{
|
||||
public override int Villager => 0x120;
|
||||
public override int Patterns => 0x1D7310;
|
||||
public override int PatternsPRO => Patterns + (PatternCount * DesignPattern.SIZE);
|
||||
#region GSaveLand
|
||||
public const int GSaveLandStart = 0x110;
|
||||
public override int Animal => GSaveLandStart + 0x10;
|
||||
|
||||
public override int LandMyDesign => GSaveLandStart + 0x1D7200;
|
||||
public override int PatternsPRO => LandMyDesign + (PatternCount * DesignPattern.SIZE);
|
||||
public override int PatternFlag => PatternsPRO + (PatternCount * DesignPatternPRO.SIZE);
|
||||
|
||||
public override int EventFlagLand => FieldItem - 0x800;
|
||||
public override int EventFlagLand => GSaveLandStart + 0x20100C;
|
||||
|
||||
// GSaveMainField
|
||||
public override int FieldItem => 0x20191C;
|
||||
public override int Terrain => Buildings - 0x24C00;
|
||||
public override int Buildings => 0x2D0F1C;
|
||||
public override int Acres => 0x2D12B4;
|
||||
public const int GSaveMainFieldStart = GSaveLandStart + 0x20180C;
|
||||
public override int FieldItem => GSaveMainFieldStart + 0x00000;
|
||||
public override int LandMakingMap => GSaveMainFieldStart + 0xAAA00;
|
||||
public override int MainFieldStructure => GSaveMainFieldStart + 0xCF600;
|
||||
public override int OutsideField => GSaveMainFieldStart + 0xCF998;
|
||||
|
||||
public override int PlayerHouseList => FieldItem + 0xDAA2C;
|
||||
public override int NpcHouseList => PlayerHouseList + (PlayerCount * PlayerHouse.SIZE);
|
||||
public override int PlayerHouseList => GSaveLandStart + 0x2DC238;
|
||||
public override int NpcHouseList => GSaveLandStart + 0x40E238;
|
||||
public override int BulletinBoard => GSaveLandStart + 0x416440;
|
||||
|
||||
public override int TurnipExchange => 0x412060;
|
||||
public override int RecycleBin => 0xACA0A0; // +0xC230 from v1.1
|
||||
public override int LastSavedTime => RecycleBin + 0x4958;
|
||||
public const int GSaveShop = GSaveLandStart + 0x40F480;
|
||||
public override int ShopKabu => GSaveShop + 0x2AD0; // part of shop
|
||||
#endregion
|
||||
|
||||
#region GSaveLandOther
|
||||
public const int GSaveLandOtherStart = 0x4FAD30;
|
||||
|
||||
public override int LostItemBox => GSaveLandOtherStart + 0x5CF370;
|
||||
public override int LastSavedTime => GSaveLandOtherStart + 0x5D3CC8;
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,8 @@ namespace NHSE.Core
|
||||
{
|
||||
public class Villager : IVillagerOrigin
|
||||
{
|
||||
public const int SIZE = 0x12AB0;
|
||||
|
||||
public readonly byte[] Data;
|
||||
public Villager(byte[] data) => Data = data;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user