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:
Kurt
2020-04-30 23:13:41 -07:00
parent ca0545809c
commit 6abae6dd87
6 changed files with 120 additions and 77 deletions

View File

@@ -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>();

View File

@@ -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));
}
}
}

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -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;