diff --git a/NHSE.Core/Editing/Batch/ItemMutator.cs b/NHSE.Core/Editing/Batch/ItemMutator.cs index bfa3c35..2c7af56 100644 --- a/NHSE.Core/Editing/Batch/ItemMutator.cs +++ b/NHSE.Core/Editing/Batch/ItemMutator.cs @@ -7,7 +7,7 @@ namespace NHSE.Core; -public class ItemMutator : BatchMutator +public sealed class ItemMutator : BatchMutator { public readonly ItemReflection Reflect = ItemReflection.Default; private const char CONST_POINTER = '*'; diff --git a/NHSE.Core/Editing/Batch/ItemProcessor.cs b/NHSE.Core/Editing/Batch/ItemProcessor.cs index fb8dcae..5b54b48 100644 --- a/NHSE.Core/Editing/Batch/ItemProcessor.cs +++ b/NHSE.Core/Editing/Batch/ItemProcessor.cs @@ -4,7 +4,7 @@ namespace NHSE.Core; -public class ItemProcessor(BatchMutator mut) : BatchProcessor(mut) +public sealed class ItemProcessor(BatchMutator mut) : BatchProcessor(mut) { protected override bool CanModify(Item item) => true; protected override bool Finalize(Item item) => true; diff --git a/NHSE.Core/Editing/Batch/ItemReflection.cs b/NHSE.Core/Editing/Batch/ItemReflection.cs index 24aecc6..eee580b 100644 --- a/NHSE.Core/Editing/Batch/ItemReflection.cs +++ b/NHSE.Core/Editing/Batch/ItemReflection.cs @@ -5,7 +5,7 @@ namespace NHSE.Core; -public class ItemReflection +public sealed class ItemReflection { public static ItemReflection Default { get; } = new(); diff --git a/NHSE.Core/Save/Meta/HorizonSave.cs b/NHSE.Core/Save/Meta/HorizonSave.cs index 1719c88..880ff67 100644 --- a/NHSE.Core/Save/Meta/HorizonSave.cs +++ b/NHSE.Core/Save/Meta/HorizonSave.cs @@ -11,11 +11,10 @@ namespace NHSE.Core; /// Creates a HorizonSave from a file provider. /// /// Provider for reading/writing save files. -public class HorizonSave(ISaveFileProvider provider) +public sealed class HorizonSave(ISaveFileProvider provider) { public readonly MainSave Main = new(provider); - public readonly Player[] Players = Player.ReadMany(provider); - private readonly ISaveFileProvider Provider = provider; + public readonly IReadOnlyList Players = Player.ReadMany(provider); public override string ToString() => $"{Players[0].Personal.TownName} - {Players[0]}"; @@ -57,7 +56,7 @@ public void Save(uint seed) pair.Save(seed); } } - Provider.Flush(); + provider.Flush(); } /// diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets10.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets10.cs index 19d496b..fbd189a 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets10.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets10.cs @@ -5,7 +5,7 @@ namespace NHSE.Core; /// /// /// -public class MainSaveOffsets10 : MainSaveOffsets +public sealed class MainSaveOffsets10 : MainSaveOffsets { #region GSaveLand public const int GSaveLandStart = 0x108; diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets11.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets11.cs index f954718..bd7da08 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets11.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets11.cs @@ -5,7 +5,7 @@ namespace NHSE.Core; /// /// /// -public class MainSaveOffsets11 : MainSaveOffsets +public sealed class MainSaveOffsets11 : MainSaveOffsets { #region GSaveLand public const int GSaveLandStart = 0x110; diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets110.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets110.cs index 6340b54..826f82e 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets110.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets110.cs @@ -5,7 +5,7 @@ namespace NHSE.Core; /// /// /// -public class MainSaveOffsets110 : MainSaveOffsets +public sealed class MainSaveOffsets110 : MainSaveOffsets { public override int PatternCount => PatternCount2; diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets111.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets111.cs index 6e43ae7..5fbf02e 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets111.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets111.cs @@ -6,7 +6,7 @@ namespace NHSE.Core; /// /// /// Same as -public class MainSaveOffsets111 : MainSaveOffsets +public sealed class MainSaveOffsets111 : MainSaveOffsets { public override int PatternCount => PatternCount2; diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets12.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets12.cs index bf0495c..6b601a0 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets12.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets12.cs @@ -5,7 +5,7 @@ namespace NHSE.Core; /// /// /// -public class MainSaveOffsets12 : MainSaveOffsets +public sealed class MainSaveOffsets12 : MainSaveOffsets { #region GSaveLand public const int GSaveLandStart = 0x110; diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets13.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets13.cs index 67a04fb..470d019 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets13.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets13.cs @@ -5,7 +5,7 @@ namespace NHSE.Core; /// /// /// -public class MainSaveOffsets13 : MainSaveOffsets +public sealed class MainSaveOffsets13 : MainSaveOffsets { #region GSaveLand public const int GSaveLandStart = 0x110; diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets14.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets14.cs index 1036468..9e74380 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets14.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets14.cs @@ -5,7 +5,7 @@ namespace NHSE.Core; /// /// /// -public class MainSaveOffsets14 : MainSaveOffsets +public sealed class MainSaveOffsets14 : MainSaveOffsets { #region GSaveLand public const int GSaveLandStart = 0x110; diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets15.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets15.cs index 0d8a50a..28bfcee 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets15.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets15.cs @@ -5,7 +5,7 @@ namespace NHSE.Core; /// /// /// -public class MainSaveOffsets15 : MainSaveOffsets +public sealed class MainSaveOffsets15 : MainSaveOffsets { #region GSaveLand public const int GSaveLandStart = 0x110; diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets16.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets16.cs index d43af7f..767685b 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets16.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets16.cs @@ -5,7 +5,7 @@ namespace NHSE.Core; /// /// /// -public class MainSaveOffsets16 : MainSaveOffsets +public sealed class MainSaveOffsets16 : MainSaveOffsets { #region GSaveLand public const int GSaveLandStart = 0x110; diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets17.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets17.cs index 230a574..6d6963f 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets17.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets17.cs @@ -5,7 +5,7 @@ namespace NHSE.Core; /// /// /// -public class MainSaveOffsets17 : MainSaveOffsets +public sealed class MainSaveOffsets17 : MainSaveOffsets { #region GSaveLand public const int GSaveLandStart = 0x110; diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets18.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets18.cs index 0229ca0..98165cc 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets18.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets18.cs @@ -6,7 +6,7 @@ namespace NHSE.Core; /// /// /// Same as . -public class MainSaveOffsets18 : MainSaveOffsets +public sealed class MainSaveOffsets18 : MainSaveOffsets { #region GSaveLand public const int GSaveLandStart = 0x110; diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets19.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets19.cs index 78540c2..d8cde20 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets19.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets19.cs @@ -5,7 +5,7 @@ namespace NHSE.Core; /// /// /// -public class MainSaveOffsets19 : MainSaveOffsets +public sealed class MainSaveOffsets19 : MainSaveOffsets { public override int PatternCount => PatternCount2; diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets20.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets20.cs index b8c7c39..8fb7765 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets20.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets20.cs @@ -6,7 +6,7 @@ namespace NHSE.Core; /// /// /// Same as -public class MainSaveOffsets20 : MainSaveOffsets +public sealed class MainSaveOffsets20 : MainSaveOffsets { public override int PatternCount => PatternCount2; diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets30.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets30.cs index 0d1720a..9f49a27 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets30.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets30.cs @@ -5,7 +5,7 @@ namespace NHSE.Core; /// /// /// -public class MainSaveOffsets30 : MainSaveOffsets +public sealed class MainSaveOffsets30 : MainSaveOffsets { public override int PatternCount => PatternCount2; diff --git a/NHSE.Core/Structures/Building/Building.cs b/NHSE.Core/Structures/Building/Building.cs index 92b4e16..3975db1 100644 --- a/NHSE.Core/Structures/Building/Building.cs +++ b/NHSE.Core/Structures/Building/Building.cs @@ -8,7 +8,7 @@ namespace NHSE.Core; /// Interact-able structure that can be entered by the player. /// [StructLayout(LayoutKind.Explicit, Size = SIZE, Pack = 1)] -public class Building +public sealed class Building { public const int SIZE = 0x14; diff --git a/NHSE.Core/Structures/Building/BuildingType.cs b/NHSE.Core/Structures/Building/BuildingType.cs index 6618d65..aa01b05 100644 --- a/NHSE.Core/Structures/Building/BuildingType.cs +++ b/NHSE.Core/Structures/Building/BuildingType.cs @@ -35,4 +35,6 @@ public enum BuildingType : ushort Incline = 27, ReddsTreasureTrawler = 28, Studio = 29, + + Hotel = 42, } \ No newline at end of file diff --git a/NHSE.Core/Structures/Designs/DesignPattern.cs b/NHSE.Core/Structures/Designs/DesignPattern.cs index 19e5c41..86de1df 100644 --- a/NHSE.Core/Structures/Designs/DesignPattern.cs +++ b/NHSE.Core/Structures/Designs/DesignPattern.cs @@ -6,7 +6,7 @@ namespace NHSE.Core; /// /// Simple design pattern /// -public class DesignPattern(Memory Raw) : IVillagerOrigin +public sealed class DesignPattern(Memory Raw) : IVillagerOrigin { public const int Width = 32; public const int Height = 32; diff --git a/NHSE.Core/Structures/Designs/DesignPatternPRO.cs b/NHSE.Core/Structures/Designs/DesignPatternPRO.cs index 084cb16..02779ff 100644 --- a/NHSE.Core/Structures/Designs/DesignPatternPRO.cs +++ b/NHSE.Core/Structures/Designs/DesignPatternPRO.cs @@ -6,7 +6,7 @@ namespace NHSE.Core; /// /// Advanced design pattern with 4 sheets arranged in a square. /// -public class DesignPatternPRO(Memory Raw) : IVillagerOrigin +public sealed class DesignPatternPRO(Memory Raw) : IVillagerOrigin { public const int Width = 32; public const int Height = 32; diff --git a/NHSE.Core/Structures/GameFileDumper.cs b/NHSE.Core/Structures/GameFileDumper.cs index a68ba0d..9481c57 100644 --- a/NHSE.Core/Structures/GameFileDumper.cs +++ b/NHSE.Core/Structures/GameFileDumper.cs @@ -75,7 +75,7 @@ public static void DumpPlayerHouses(this IReadOnlyList houses, IRe /// Path to dump to public static void DumpPlayerHouses(this HorizonSave sav, string path) { - var count = Math.Min(sav.Players.Length, MainSaveOffsets.PlayerCount); + var count = Math.Min(sav.Players.Count, MainSaveOffsets.PlayerCount); for (int i = 0; i < count; i++) { var p = sav.Players[i]; diff --git a/NHSE.Core/Structures/Item/ItemArrayEditor.cs b/NHSE.Core/Structures/Item/ItemArrayEditor.cs index 0b08a85..0f5ef11 100644 --- a/NHSE.Core/Structures/Item/ItemArrayEditor.cs +++ b/NHSE.Core/Structures/Item/ItemArrayEditor.cs @@ -3,10 +3,9 @@ namespace NHSE.Core; -public class ItemArrayEditor where T : Item, ICopyableItem +public sealed record ItemArrayEditor(IReadOnlyList Items) + where T : Item, ICopyableItem { - public readonly IReadOnlyList Items; - public ItemArrayEditor(IReadOnlyList items) => Items = items; public int ItemSize => Items[0].Size; public int TotalSize => Items.Count * ItemSize; diff --git a/NHSE.Core/Structures/Item/Remake/ItemRemakeInfo.cs b/NHSE.Core/Structures/Item/Remake/ItemRemakeInfo.cs index 06da87a..caa5c5c 100644 --- a/NHSE.Core/Structures/Item/Remake/ItemRemakeInfo.cs +++ b/NHSE.Core/Structures/Item/Remake/ItemRemakeInfo.cs @@ -5,38 +5,19 @@ namespace NHSE.Core; /// /// Metadata for an item's customization permissions /// -public class ItemRemakeInfo +public sealed record ItemRemakeInfo( + short Index, + ushort ItemUniqueID, + sbyte ReBodyPatternNum, + byte[] ReBodyPatternColors0, + byte[] ReBodyPatternColors1, + byte[] ReFabricPatternColors0, + byte[] ReFabricPatternColors1, + bool ReFabricPattern0VisibleOff) { public const int BodyColorCountMax = 8; public const int NoColor = (int)ItemCustomColor.None; // 14 - public readonly short Index; - public readonly ushort ItemUniqueID; - public readonly sbyte ReBodyPatternNum; // count of body colors - - public readonly byte[] ReBodyPatternColors0; - public readonly byte[] ReBodyPatternColors1; - - public readonly byte[] ReFabricPatternColors0; - public readonly byte[] ReFabricPatternColors1; - - public readonly bool ReFabricPattern0VisibleOff; - - public ItemRemakeInfo(short index, ushort id, sbyte count, byte[] bc0, byte[] bc1, byte[] fc0, byte[] fc1, bool fp0) - { - Index = index; - ItemUniqueID = id; - ReBodyPatternNum = count; - - ReBodyPatternColors0 = bc0; - ReBodyPatternColors1 = bc1; - - ReFabricPatternColors0 = fc0; - ReFabricPatternColors1 = fc1; - - ReFabricPattern0VisibleOff = fp0; - } - private const string Invalid = nameof(Invalid); public bool HasBodyColor(int variant) => ReBodyPatternColors0[variant] != NoColor || ReBodyPatternColors1[variant] != NoColor; diff --git a/NHSE.Core/Structures/Map/Managers/FieldItemManager.cs b/NHSE.Core/Structures/Map/Managers/FieldItemManager.cs index ee847ee..676a004 100644 --- a/NHSE.Core/Structures/Map/Managers/FieldItemManager.cs +++ b/NHSE.Core/Structures/Map/Managers/FieldItemManager.cs @@ -6,7 +6,7 @@ namespace NHSE.Core; /// /// Manages the data for the player's outside overworld. /// -public class FieldItemManager +public sealed class FieldItemManager { /// /// Base layer of items diff --git a/NHSE.Core/Structures/Map/Managers/RoomItemManager.cs b/NHSE.Core/Structures/Map/Managers/RoomItemManager.cs index 173a671..c333fe2 100644 --- a/NHSE.Core/Structures/Map/Managers/RoomItemManager.cs +++ b/NHSE.Core/Structures/Map/Managers/RoomItemManager.cs @@ -4,7 +4,7 @@ namespace NHSE.Core; -public class RoomItemManager +public sealed class RoomItemManager { public readonly RoomItemLayer[] Layers; diff --git a/NHSE.Core/Structures/Map/Terrain/TerrainTile.cs b/NHSE.Core/Structures/Map/Terrain/TerrainTile.cs index 545f292..a9631e6 100644 --- a/NHSE.Core/Structures/Map/Terrain/TerrainTile.cs +++ b/NHSE.Core/Structures/Map/Terrain/TerrainTile.cs @@ -9,7 +9,7 @@ namespace NHSE.Core; /// Represents a Terraform-able terrain tile. /// [StructLayout(LayoutKind.Sequential)] -public class TerrainTile +public sealed class TerrainTile { // tile[2] (u16 model, u16 variation, u16 angle) // u16 elevation diff --git a/NHSE.Core/Structures/Misc/GSaveFg.cs b/NHSE.Core/Structures/Misc/GSaveFg.cs index 19b1bf3..26829a5 100644 --- a/NHSE.Core/Structures/Misc/GSaveFg.cs +++ b/NHSE.Core/Structures/Misc/GSaveFg.cs @@ -4,7 +4,7 @@ namespace NHSE.Core; [StructLayout(LayoutKind.Sequential, Pack = 4)] -public class GSaveFg +public sealed class GSaveFg { public const int SIZE = 0x928; private const int _7b9816fbCount = 0x900; diff --git a/NHSE.Core/Structures/Misc/GSaveVisitorNpc.cs b/NHSE.Core/Structures/Misc/GSaveVisitorNpc.cs index 4ab8d5f..03b56c0 100644 --- a/NHSE.Core/Structures/Misc/GSaveVisitorNpc.cs +++ b/NHSE.Core/Structures/Misc/GSaveVisitorNpc.cs @@ -5,7 +5,7 @@ namespace NHSE.Core; [StructLayout(LayoutKind.Sequential, Pack = 1)] -public class GSaveVisitorNpc +public sealed class GSaveVisitorNpc { public const int SIZE = 0x78; private const int Days = 7; @@ -46,7 +46,7 @@ public struct V3f public float Y { get; set; } public float Z { get; set; } - public override string ToString() => $"({X},{Y},{Z})"; + public readonly override string ToString() => $"({X},{Y},{Z})"; } public enum VisitorNPC diff --git a/NHSE.Core/Structures/Misc/MapManager.cs b/NHSE.Core/Structures/Misc/MapManager.cs index ba4d6cb..85e6a6e 100644 --- a/NHSE.Core/Structures/Misc/MapManager.cs +++ b/NHSE.Core/Structures/Misc/MapManager.cs @@ -2,7 +2,7 @@ namespace NHSE.Core; -public class MapManager(MainSave sav) : MapTerrainStructure(sav) +public sealed class MapManager(MainSave sav) : MapTerrainStructure(sav) { public readonly FieldItemManager Items = new(sav); @@ -11,7 +11,7 @@ public class MapManager(MainSave sav) : MapTerrainStructure(sav) public FieldItemLayer CurrentLayer => MapLayer == 0 ? Items.Layer1 : Items.Layer2; } -public class MapTerrainStructure(MainSave sav) +public abstract class MapTerrainStructure(MainSave sav) { public readonly TerrainLayer Terrain = new(sav.GetTerrainTiles(), sav.GetAcreBytes()); public readonly IReadOnlyList Buildings = sav.Buildings; diff --git a/NHSE.Core/Structures/Misc/MapView.cs b/NHSE.Core/Structures/Misc/MapView.cs index 1901960..d016051 100644 --- a/NHSE.Core/Structures/Misc/MapView.cs +++ b/NHSE.Core/Structures/Misc/MapView.cs @@ -2,25 +2,19 @@ namespace NHSE.Core; -public class MapView +public abstract class MapView(MapManager m, int scale = 16) { private const int ViewInterval = 2; - public readonly MapManager Map; + public readonly MapManager Map = m; public int MapScale { get; } = 1; - public int AcreScale { get; } + public int AcreScale { get; } = scale; public int TerrainScale => AcreScale * 2; // Top Left Anchor Coordinates public int X { get; set; } public int Y { get; set; } - protected MapView(MapManager m, int scale = 16) - { - AcreScale = scale; - Map = m; - } - public bool CanUp => Y != 0; public bool CanDown => Y < Map.CurrentLayer.TileInfo.TotalHeight - Map.CurrentLayer.TileInfo.ViewHeight; public bool CanLeft => X != 0; diff --git a/NHSE.Core/Structures/Misc/Museum.cs b/NHSE.Core/Structures/Misc/Museum.cs index 3285372..ead6874 100644 --- a/NHSE.Core/Structures/Misc/Museum.cs +++ b/NHSE.Core/Structures/Misc/Museum.cs @@ -4,15 +4,12 @@ namespace NHSE.Core; -public class Museum +public sealed class Museum(Memory raw) { public const int SIZE = 0x3404; public const int EntryCount = 1024; - public readonly Memory Raw; - public Span Data => Raw.Span; - - public Museum(Memory data) => Raw = data; + public Span Data => raw.Span; public int MuseumLevel { diff --git a/NHSE.Core/Structures/Misc/MuseumEditor.cs b/NHSE.Core/Structures/Misc/MuseumEditor.cs index 15a21f3..08758d0 100644 --- a/NHSE.Core/Structures/Misc/MuseumEditor.cs +++ b/NHSE.Core/Structures/Misc/MuseumEditor.cs @@ -5,27 +5,17 @@ namespace NHSE.Core; -public class MuseumEditor +public sealed record MuseumEditor(Museum Museum) { - public readonly Museum Museum; - public readonly GSaveDate[] Dates; - public readonly Item[] Items; - public readonly byte[] Players; - - public MuseumEditor(Museum museum) - { - Museum = museum; - Dates = museum.GetDates(); - Items = museum.GetItems(); - Players = museum.GetPlayers(); - } + public readonly GSaveDate[] Dates = Museum.GetDates(); + public readonly Item[] Items = Museum.GetItems(); + public readonly byte[] Players = Museum.GetPlayers(); public void Save() { - var museum = Museum; - museum.SetDates(Dates); - museum.SetItems(Items); - museum.SetPlayers(Players); + Museum.SetDates(Dates); + Museum.SetItems(Items); + Museum.SetPlayers(Players); } public IEnumerable GetDonationSummary(GameStrings str) diff --git a/NHSE.Core/Structures/Misc/RecipeBook.cs b/NHSE.Core/Structures/Misc/RecipeBook.cs index e88b131..2c42f34 100644 --- a/NHSE.Core/Structures/Misc/RecipeBook.cs +++ b/NHSE.Core/Structures/Misc/RecipeBook.cs @@ -3,16 +3,14 @@ namespace NHSE.Core; -public class RecipeBook +public sealed class RecipeBook(Memory raw) { private const int BitFlagArraySize = 0x100; private const int BitFlagArrayCount = 4; public const int SIZE = BitFlagArraySize * BitFlagArrayCount; public const ushort RecipeCount = BitFlagArraySize * 8; - private readonly Memory Raw; - private Span Data => Raw.Span; - public RecipeBook(Memory raw) => Raw = raw; + private Span Data => raw.Span; public void Save(Span data) => Data.CopyTo(data); diff --git a/NHSE.Core/Structures/Misc/ValueTypeTypeConverter.cs b/NHSE.Core/Structures/Misc/ValueTypeTypeConverter.cs index dfca493..ba0f7c9 100644 --- a/NHSE.Core/Structures/Misc/ValueTypeTypeConverter.cs +++ b/NHSE.Core/Structures/Misc/ValueTypeTypeConverter.cs @@ -7,7 +7,7 @@ namespace NHSE.Core; /// /// Used for allowing a struct to be mutated in a PropertyGrid. /// -public class ValueTypeTypeConverter : ExpandableObjectConverter +public sealed class ValueTypeTypeConverter : ExpandableObjectConverter { public override bool GetCreateInstanceSupported(ITypeDescriptorContext? context) => true; diff --git a/NHSE.Core/Structures/Records/LifeSupportAchievement.cs b/NHSE.Core/Structures/Records/LifeSupportAchievement.cs index f946234..565c41c 100644 --- a/NHSE.Core/Structures/Records/LifeSupportAchievement.cs +++ b/NHSE.Core/Structures/Records/LifeSupportAchievement.cs @@ -6,51 +6,24 @@ namespace NHSE.Core; /// /// Multi-milestone definition for tracking game-play achievements. /// -public class LifeSupportAchievement : INamedValue +public sealed record LifeSupportAchievement( + ushort Index, + byte AchievementCount, + uint Threshold1, + uint Threshold2, + uint Threshold3, + uint Threshold4, + uint Threshold5, + short FlagLand, + short FlagPlayer, + string Name) + : INamedValue { /// /// Amount of milestones an achievement can have. /// public const int MilestoneMax = 6; - public readonly short FlagLand; - public readonly short FlagPlayer; - - public ushort Index { get; } - public string Name { get; } - - /// Total number of milestones for this achievement type. - public readonly int AchievementCount; - - /// First Milestone's Satisfaction Threshold - public readonly uint Threshold1; - - /// Second Milestone's Satisfaction Threshold - public readonly uint Threshold2; - - /// Third Milestone's Satisfaction Threshold - public readonly uint Threshold3; - - /// Fourth Milestone's Satisfaction Threshold - public readonly uint Threshold4; - - /// Fifth Milestone's Satisfaction Threshold - public readonly uint Threshold5; - - public LifeSupportAchievement(ushort index, byte max, uint t1, uint t2, uint t3, uint t4, uint t5, short land, short player, string name) - { - Index = index; - AchievementCount = max; - Threshold1 = t1; - Threshold2 = t2; - Threshold3 = t3; - Threshold4 = t4; - Threshold5 = t5; - FlagLand = land; - FlagPlayer = player; - Name = name; - } - public uint MaxThreshold => Math.Max(Threshold1, Math.Max(Threshold2, Math.Max(Threshold3, Math.Max(Threshold4, Threshold5)))); /// diff --git a/NHSE.Core/Structures/TurnipStonk.cs b/NHSE.Core/Structures/TurnipStonk.cs index a54435a..5f8fa08 100644 --- a/NHSE.Core/Structures/TurnipStonk.cs +++ b/NHSE.Core/Structures/TurnipStonk.cs @@ -4,7 +4,7 @@ namespace NHSE.Core; [StructLayout(LayoutKind.Sequential, Size = SIZE)] -public class TurnipStonk // GSaveShopKabu +public sealed class TurnipStonk // GSaveShopKabu { public const int SIZE = 0x44; diff --git a/NHSE.Core/Structures/Villager/GSaveMemory.cs b/NHSE.Core/Structures/Villager/GSaveMemory.cs index 7129c39..c8c0456 100644 --- a/NHSE.Core/Structures/Villager/GSaveMemory.cs +++ b/NHSE.Core/Structures/Villager/GSaveMemory.cs @@ -3,14 +3,11 @@ namespace NHSE.Core; -public class GSaveMemory : IVillagerOrigin +public sealed class GSaveMemory(Memory raw) : IVillagerOrigin { public const int SIZE = 0x5F0; - public readonly Memory Raw; - public Span Data => Raw.Span; - - public GSaveMemory(Memory data) => Raw = data; + public Span Data => raw.Span; public GSavePlayerId PlayerId { diff --git a/NHSE.Core/Structures/Villager/PlayerHouse1.cs b/NHSE.Core/Structures/Villager/PlayerHouse1.cs index d8f304e..06c34b5 100644 --- a/NHSE.Core/Structures/Villager/PlayerHouse1.cs +++ b/NHSE.Core/Structures/Villager/PlayerHouse1.cs @@ -4,15 +4,12 @@ namespace NHSE.Core; -public class PlayerHouse1 : IPlayerHouse +public class PlayerHouse1(Memory raw) : IPlayerHouse { public const int SIZE = 0x26400; public virtual string Extension => "nhph"; - public readonly Memory Raw; - public Span Data => Raw.Span; - - public PlayerHouse1(Memory data) => Raw = data; + public Span Data => raw.Span; public byte[] Write() => Data.ToArray(); diff --git a/NHSE.Core/Structures/Villager/PlayerHouse2.cs b/NHSE.Core/Structures/Villager/PlayerHouse2.cs index 4144380..13dccd8 100644 --- a/NHSE.Core/Structures/Villager/PlayerHouse2.cs +++ b/NHSE.Core/Structures/Villager/PlayerHouse2.cs @@ -2,13 +2,11 @@ namespace NHSE.Core; -public class PlayerHouse2 : PlayerHouse1 +public sealed class PlayerHouse2(Memory raw) : PlayerHouse1(raw) { public new const int SIZE = 0x28A28; public override string Extension => "nhph2"; - public PlayerHouse2(Memory data) : base(data) { } - public override IPlayerRoom GetRoom(int roomIndex) { if ((uint)roomIndex >= MaxRoom) diff --git a/NHSE.Core/Structures/Villager/PlayerRoom2.cs b/NHSE.Core/Structures/Villager/PlayerRoom2.cs index 819a96f..277ead6 100644 --- a/NHSE.Core/Structures/Villager/PlayerRoom2.cs +++ b/NHSE.Core/Structures/Villager/PlayerRoom2.cs @@ -4,10 +4,10 @@ namespace NHSE.Core; -public class PlayerRoom2(Memory raw) : PlayerRoom1(raw) +public sealed class PlayerRoom2(Memory raw) : PlayerRoom1(raw) { public new const int SIZE = 0x6C24; - public new virtual string Extension => "nhpr2"; + public override string Extension => "nhpr2"; /* s_665e9093 ExtraEffectLayerList[2]; // @0x65c8 size 0x320, align 2 @@ -47,7 +47,7 @@ public GSaveMusicBoxInfo MusicBoxInfo // 3 bytes padding - public s_e13a81f4 _cfb139b9 + public s_e13a81f4 Unk_cfb139b9 { get => Data.Slice(0x6C10, s_e13a81f4.SIZE).ToStructure(); set => value.ToBytes().CopyTo(Data[0x6C10..]); diff --git a/NHSE.Core/Structures/Villager/Villager1.cs b/NHSE.Core/Structures/Villager/Villager1.cs index b298c32..6f24c14 100644 --- a/NHSE.Core/Structures/Villager/Villager1.cs +++ b/NHSE.Core/Structures/Villager/Villager1.cs @@ -8,14 +8,12 @@ namespace NHSE.Core; /// /// Villager object format from 1.0 to update 1.4 /// -public sealed class Villager1 : IVillager +public sealed class Villager1(Memory raw) : IVillager { public const int SIZE = 0x12AB0; public string Extension => "nhv"; - public readonly Memory Raw; - public Span Data => Raw.Span; - public Villager1(Memory data) => Raw = data; + public Span Data => raw.Span; public byte[] Write() => Data.ToArray(); public byte Species { get => Data[0]; set => Data[0] = value; } @@ -34,7 +32,7 @@ public GSaveMemory GetMemory(int index) if ((uint) index >= PlayerMemoryCount) throw new ArgumentOutOfRangeException(nameof(index)); - var bytes = Raw.Slice(0x4 + (index * GSaveMemory.SIZE), GSaveMemory.SIZE); + var bytes = raw.Slice(0x4 + (index * GSaveMemory.SIZE), GSaveMemory.SIZE); return new GSaveMemory(bytes); } @@ -115,7 +113,7 @@ public GSaveRoomFloorWall Room public DesignPatternPRO Design { - get => new(Raw.Slice(0x12128, DesignPatternPRO.SIZE)); + get => new(raw.Slice(0x12128, DesignPatternPRO.SIZE)); set => value.Data.CopyTo(Data[0x12128..]); } diff --git a/NHSE.Core/Structures/Villager/VillagerHouse1.cs b/NHSE.Core/Structures/Villager/VillagerHouse1.cs index 9318c37..56bb9eb 100644 --- a/NHSE.Core/Structures/Villager/VillagerHouse1.cs +++ b/NHSE.Core/Structures/Villager/VillagerHouse1.cs @@ -3,15 +3,13 @@ namespace NHSE.Core; -public class VillagerHouse1 : IVillagerHouse +public class VillagerHouse1(Memory raw) : IVillagerHouse { public const int SIZE = 0x1D4; public const int ItemCount = 36; public virtual string Extension => "nhvh"; - public readonly Memory Raw; - public VillagerHouse1(Memory raw) => Raw = raw; - public Span Data => Raw.Span; + public Span Data => raw.Span; public byte[] Write() => Data.ToArray(); diff --git a/NHSE.Core/Structures/Villager/VillagerHouse2.cs b/NHSE.Core/Structures/Villager/VillagerHouse2.cs index 29cc5bb..cac3f34 100644 --- a/NHSE.Core/Structures/Villager/VillagerHouse2.cs +++ b/NHSE.Core/Structures/Villager/VillagerHouse2.cs @@ -5,13 +5,11 @@ namespace NHSE.Core; -public class VillagerHouse2 : VillagerHouse1 +public sealed class VillagerHouse2(Memory raw) : VillagerHouse1(raw) { public new const int SIZE = 0x12E8; public override string Extension => "nhvh2"; - public VillagerHouse2(Memory data) : base(data) { } - // 0x1D4-0x12DB -- 0x1108 sized structure // 0x12DC -- 8 byte item // 0x12E4 -- 1 byte diff --git a/NHSE.Core/Util/ComboItem.cs b/NHSE.Core/Util/ComboItem.cs index bdc154b..0920d4b 100644 --- a/NHSE.Core/Util/ComboItem.cs +++ b/NHSE.Core/Util/ComboItem.cs @@ -6,7 +6,7 @@ namespace NHSE.Core; /// /// Key Value pair for a displayed and underlying value. /// -public record ComboItem(string Text, int Value); +public sealed record ComboItem(string Text, int Value); public static class ComboItemUtil { @@ -25,10 +25,10 @@ public static List GetArray(ReadOnlySpan items) return result; } - public static List GetArray(Type t) where T : struct, IFormattable + public static List GetArray() where T : struct, Enum, IFormattable { - var names = Enum.GetNames(t); - var values = (T[])Enum.GetValues(t); + var names = Enum.GetNames(); + var values = Enum.GetValues(); var acres = new List(names.Length); for (int i = 0; i < names.Length; i++) diff --git a/NHSE.Injection/Injector/AutoInjector.cs b/NHSE.Injection/Injector/AutoInjector.cs index d17713c..55bf2df 100644 --- a/NHSE.Injection/Injector/AutoInjector.cs +++ b/NHSE.Injection/Injector/AutoInjector.cs @@ -3,12 +3,8 @@ namespace NHSE.Injection; -public class AutoInjector +public sealed record AutoInjector(IDataInjector Injector, Action DoRead, Action DoWrite) { - public readonly IDataInjector Injector; - private readonly Action AfterRead; - private readonly Action AfterWrite; - public bool AutoInjectEnabled { private get; set; } public bool ValidateEnabled @@ -17,13 +13,6 @@ public bool ValidateEnabled set => Injector.ValidateEnabled = value; } - public AutoInjector(IDataInjector inj, Action read, Action write) - { - Injector = inj; - AfterRead = read; - AfterWrite = write; - } - public void Validate() => Injector.Validate(); public InjectionResult Read(bool force = false) @@ -34,7 +23,7 @@ public InjectionResult Read(bool force = false) try { var result = Injector.Read(); - AfterRead(result); + DoRead(result); return result; } catch (IndexOutOfRangeException ex) @@ -51,7 +40,7 @@ public InjectionResult Write(bool force = false) try { var result = Injector.Write(); - AfterWrite(result); + DoWrite(result); return result; } catch (IndexOutOfRangeException ex) diff --git a/NHSE.Injection/PocketInjector.cs b/NHSE.Injection/PocketInjector.cs index b8d1ad7..7a0543f 100644 --- a/NHSE.Injection/PocketInjector.cs +++ b/NHSE.Injection/PocketInjector.cs @@ -1,35 +1,27 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using NHSE.Core; namespace NHSE.Injection; -public class PocketInjector : IDataInjector +public sealed class PocketInjector(IReadOnlyList items, IRAMReadWriter bot) : IDataInjector { - private readonly IReadOnlyList Items; - private readonly IRAMReadWriter Bot; - public bool Connected => Bot.Connected; + public bool Connected => bot.Connected; + private byte[]? LastData { get; set; } public uint WriteOffset { private get; set; } public bool ValidateEnabled { get; set; } = true; public bool SpoofInventoryWrite { get; set; } - private static readonly Item DroppableOnlyItem = new(0x9C9); // Gold nugget - public PocketInjector(IReadOnlyList items, IRAMReadWriter bot) - { - Items = items; - Bot = bot; - } + private static readonly Item DroppableOnlyItem = new(0x9C9); // Gold nugget public bool ReadValidate(out byte[] data) { PlayerItemSet.GetOffsetLength(WriteOffset, out var offset, out var size); - data = Bot.ReadBytes(offset, size); + data = bot.ReadBytes(offset, size); return Validate(data); } - private byte[]? LastData; - public InjectionResult Read() { if (!ReadValidate(out var data)) @@ -38,7 +30,7 @@ public InjectionResult Read() if (LastData?.SequenceEqual(data) == true) return InjectionResult.Same; - PlayerItemSet.ReadPlayerInventory(data, Items); + PlayerItemSet.ReadPlayerInventory(data, items); LastData = data; @@ -52,9 +44,9 @@ public InjectionResult Write() var orig = (byte[])data.Clone(); - var items = !SpoofInventoryWrite ? Items : Enumerable.Repeat(DroppableOnlyItem, Items.Count).ToArray(); + var items1 = !SpoofInventoryWrite ? items : Enumerable.Repeat(DroppableOnlyItem, items.Count).ToArray(); - PlayerItemSet.WritePlayerInventory(data, items); + PlayerItemSet.WritePlayerInventory(data, items1); if (data.SequenceEqual(orig)) return InjectionResult.Same; @@ -63,7 +55,7 @@ public InjectionResult Write() if (size != data.Length) return InjectionResult.FailBadSize; - Bot.WriteBytes(data, offset); + bot.WriteBytes(data, offset); LastData = data; diff --git a/NHSE.Injection/SysBot/SysBot.cs b/NHSE.Injection/SysBot/SysBot.cs index bd9a5c7..d7ed295 100644 --- a/NHSE.Injection/SysBot/SysBot.cs +++ b/NHSE.Injection/SysBot/SysBot.cs @@ -3,7 +3,7 @@ namespace NHSE.Injection; -public class SysBot : IRAMReadWriter +public sealed class SysBot : IRAMReadWriter { public string IP = "192.168.1.65"; public int Port = 6000; diff --git a/NHSE.Injection/SysBot/USBBot.cs b/NHSE.Injection/SysBot/USBBot.cs index fee0a6d..fb891db 100644 --- a/NHSE.Injection/SysBot/USBBot.cs +++ b/NHSE.Injection/SysBot/USBBot.cs @@ -6,7 +6,7 @@ namespace NHSE.Injection; -public class USBBot : IRAMReadWriter +public sealed class USBBot : IRAMReadWriter { private UsbDevice? SwDevice; private UsbEndpointReader? reader; diff --git a/NHSE.Parsing/BCSV/BCSV.cs b/NHSE.Parsing/BCSV/BCSV.cs index 575efe1..2e3b59b 100644 --- a/NHSE.Parsing/BCSV/BCSV.cs +++ b/NHSE.Parsing/BCSV/BCSV.cs @@ -7,7 +7,7 @@ namespace NHSE.Parsing; -public class BCSV +public sealed class BCSV { public static readonly BCSVEnumDictionary EnumLookup = new(Resources.specs_130.Split('\n')); public static bool DecodeColumnNames { private get; set; } = true; diff --git a/NHSE.Parsing/BCSV/BCSVEnumDictionary.cs b/NHSE.Parsing/BCSV/BCSVEnumDictionary.cs index abceb75..09457f4 100644 --- a/NHSE.Parsing/BCSV/BCSVEnumDictionary.cs +++ b/NHSE.Parsing/BCSV/BCSVEnumDictionary.cs @@ -5,9 +5,9 @@ namespace NHSE.Parsing; -public class BCSVEnumDictionary +public sealed class BCSVEnumDictionary { - private readonly Dictionary Lookup = []; + private readonly Dictionary _lookup = []; public BCSVEnumDictionary(IEnumerable lines) { @@ -35,7 +35,7 @@ private void AddColumnName(string trim) var slice = value.AsSpan(2, value.Length - 3); var hex = StringUtil.GetHexValue(slice); - if (Lookup.TryGetValue(hex, out var exist)) + if (_lookup.TryGetValue(hex, out var exist)) { if (exist == name) return; @@ -43,7 +43,7 @@ private void AddColumnName(string trim) return; } - Lookup.Add(hex, name); + _lookup.Add(hex, name); } private void AddEnumName(string trim) @@ -56,7 +56,7 @@ private void AddEnumName(string trim) return; var hash = CRC32.Compute(text); - if (Lookup.TryGetValue(hash, out var exist)) + if (_lookup.TryGetValue(hash, out var exist)) { if (exist == text) return; @@ -64,10 +64,10 @@ private void AddEnumName(string trim) return; } - Lookup.Add(hash, text); + _lookup.Add(hash, text); } - public IEnumerable Dump() => Lookup.Select(z => $"{z.Key:X8}\t{z.Value}"); + public IEnumerable Dump() => _lookup.Select(z => $"{z.Key:X8}\t{z.Value}"); - public string this[uint key] => Lookup.TryGetValue(key, out var val) ? val : $"0x{key:X8}"; + public string this[uint key] => _lookup.TryGetValue(key, out var val) ? val : $"0x{key:X8}"; } \ No newline at end of file diff --git a/NHSE.Parsing/BCSV/BCSVFieldParam.cs b/NHSE.Parsing/BCSV/BCSVFieldParam.cs index d030116..d362f58 100644 --- a/NHSE.Parsing/BCSV/BCSVFieldParam.cs +++ b/NHSE.Parsing/BCSV/BCSVFieldParam.cs @@ -1,16 +1,6 @@ namespace NHSE.Parsing; -public class BCSVFieldParam +public sealed record BCSVFieldParam(uint ColumnKey, int Offset, int Index) { public const int SIZE = 8; - public readonly uint ColumnKey; - public readonly int Offset; - public readonly int Index; - - public BCSVFieldParam(uint key, int offset, int index) - { - ColumnKey = key; - Offset = offset; - Index = index; - } } \ No newline at end of file diff --git a/NHSE.Parsing/GameMSBTDumper.cs b/NHSE.Parsing/GameMSBTDumper.cs index ef52428..a2c322d 100644 --- a/NHSE.Parsing/GameMSBTDumper.cs +++ b/NHSE.Parsing/GameMSBTDumper.cs @@ -14,7 +14,7 @@ public static class GameMSBTDumper /// Destination folder where the dumps will be saved. /// Convert all files to CSV for easy viewing. /// Delimiter when exporting the files - public static void UpdateDumps(string root, string dest, bool csv = true, char delim = '\t') + public static void UpdateDumps(string root, string dest, bool csv = false, char delim = '\t') { if (csv) UpdateCSV(root, Path.Combine(dest, "csv"), delim); diff --git a/NHSE.Parsing/MSBT/LBL1.cs b/NHSE.Parsing/MSBT/LBL1.cs index 84ffb24..a19710c 100644 --- a/NHSE.Parsing/MSBT/LBL1.cs +++ b/NHSE.Parsing/MSBT/LBL1.cs @@ -2,7 +2,7 @@ namespace NHSE.Parsing; -public class LBL1() : MSBTSection(string.Empty, []) +public sealed class LBL1() : MSBTSection(string.Empty, []) { public uint NumberOfGroups; diff --git a/NHSE.Parsing/MSBT/MSBT.cs b/NHSE.Parsing/MSBT/MSBT.cs index 5053bb3..d9dfe23 100644 --- a/NHSE.Parsing/MSBT/MSBT.cs +++ b/NHSE.Parsing/MSBT/MSBT.cs @@ -5,7 +5,7 @@ namespace NHSE.Parsing; -public class MSBT +public sealed class MSBT { public readonly MSBTHeader Header; public readonly LBL1 LBL1 = new(); @@ -78,7 +78,7 @@ private void ReadLBL1(BinaryReaderX br) var length = Convert.ToUInt32(br.ReadByte()); var name = br.ReadString((int)length); var index = br.ReadUInt32(); - var lbl = new MSBTLabel(name) {Index = index, Length = length}; + var lbl = new MSBTLabel {Name = name, Index = index, Length = length}; LBL1.Labels.Add(lbl); } } diff --git a/NHSE.Parsing/MSBT/MSBTGroup.cs b/NHSE.Parsing/MSBT/MSBTGroup.cs index 34353fb..0c601d3 100644 --- a/NHSE.Parsing/MSBT/MSBTGroup.cs +++ b/NHSE.Parsing/MSBT/MSBTGroup.cs @@ -1,7 +1,7 @@ namespace NHSE.Parsing; -public class MSBTGroup +public sealed record MSBTGroup { - public uint NumberOfLabels; - public uint Offset; + public required uint NumberOfLabels { get; init; } + public required uint Offset { get; init; } } \ No newline at end of file diff --git a/NHSE.Parsing/MSBT/MSBTHeader.cs b/NHSE.Parsing/MSBT/MSBTHeader.cs index 1eced1c..357007d 100644 --- a/NHSE.Parsing/MSBT/MSBTHeader.cs +++ b/NHSE.Parsing/MSBT/MSBTHeader.cs @@ -2,7 +2,7 @@ namespace NHSE.Parsing; -public class MSBTHeader +public sealed class MSBTHeader { public readonly string Identifier; // MsgStdBn public readonly byte[] ByteOrderMark; diff --git a/NHSE.Parsing/MSBT/MSBTLabel.cs b/NHSE.Parsing/MSBT/MSBTLabel.cs index 5160358..e2c7c06 100644 --- a/NHSE.Parsing/MSBT/MSBTLabel.cs +++ b/NHSE.Parsing/MSBT/MSBTLabel.cs @@ -2,19 +2,14 @@ namespace NHSE.Parsing; -public class MSBTLabel +public sealed record MSBTLabel { - public uint Length; - public readonly string Name; - public MSBTTextString String; + public required uint Length { get; init; } + public required uint Index { get; init; } + public required string Name { get; init; } - public MSBTLabel(string name) - { - Name = name; - String = MSBTTextString.Empty; - } + public MSBTTextString String { get; set; } = MSBTTextString.Empty; - public uint Index { get; set; } public override string ToString() => Length > 0 ? Name : (Index + 1).ToString(); public string ToString(Encoding encoding) => encoding.GetString(String.Value.Span); } \ No newline at end of file diff --git a/NHSE.Parsing/MSBT/MSBTSection.cs b/NHSE.Parsing/MSBT/MSBTSection.cs index 8a5fc7a..778917f 100644 --- a/NHSE.Parsing/MSBT/MSBTSection.cs +++ b/NHSE.Parsing/MSBT/MSBTSection.cs @@ -1,14 +1,8 @@ namespace NHSE.Parsing; -public class MSBTSection +public abstract class MSBTSection(string identifier, byte[] padding) { - public string Identifier; - public uint SectionSize; // Begins after Unknown1 - public byte[] Padding1; // Always 0x0000 0000 - - public MSBTSection(string identifier, byte[] padding) - { - Identifier = identifier; - Padding1 = padding; - } + public string Identifier { get; set; } = identifier; + public uint SectionSize { get; set; } // Begins after Unknown1 + public byte[] Padding1 { get; set; } = padding; // Always 0x0000 0000 } \ No newline at end of file diff --git a/NHSE.Parsing/MSBT/MSBTTextString.cs b/NHSE.Parsing/MSBT/MSBTTextString.cs index 73ce141..d5f49c3 100644 --- a/NHSE.Parsing/MSBT/MSBTTextString.cs +++ b/NHSE.Parsing/MSBT/MSBTTextString.cs @@ -4,19 +4,10 @@ namespace NHSE.Parsing; -public class MSBTTextString +public sealed record MSBTTextString(Memory Value, uint Index) { - public readonly Memory Value; - public readonly uint Index; - public static readonly MSBTTextString Empty = new(default, 0); - public MSBTTextString(Memory v, uint i) - { - Value = v; - Index = i; - } - public override string ToString() => (Index + 1).ToString(); public string ToString(Encoding encoding) => encoding.GetString(Value.Span); diff --git a/NHSE.Parsing/MSBT/TXT2.cs b/NHSE.Parsing/MSBT/TXT2.cs index b5c066d..3da42b0 100644 --- a/NHSE.Parsing/MSBT/TXT2.cs +++ b/NHSE.Parsing/MSBT/TXT2.cs @@ -2,7 +2,7 @@ namespace NHSE.Parsing; -public class TXT2() : MSBTSection(string.Empty, []) +public sealed class TXT2() : MSBTSection(string.Empty, []) { public uint NumberOfStrings; diff --git a/NHSE.Parsing/PBC/PBC.cs b/NHSE.Parsing/PBC/PBC.cs index 187d643..aa99da3 100644 --- a/NHSE.Parsing/PBC/PBC.cs +++ b/NHSE.Parsing/PBC/PBC.cs @@ -6,7 +6,7 @@ namespace NHSE.Parsing; -public class PBC +public sealed class PBC { private const uint MAGIC = 0x00636270; // pbc\0 diff --git a/NHSE.Parsing/ParseConverter.cs b/NHSE.Parsing/ParseConverter.cs index 3b49c26..24c48d1 100644 --- a/NHSE.Parsing/ParseConverter.cs +++ b/NHSE.Parsing/ParseConverter.cs @@ -1,4 +1,5 @@ -using System.IO; +using System.Diagnostics.CodeAnalysis; +using System.IO; using System.Linq; namespace NHSE.Parsing; @@ -22,7 +23,7 @@ public static void ConvertItemStrings(string input, string output) private static string[] ConvertItemList(string path) { var lines = File.ReadAllLines(path); - var items = lines.Select(z => new ParseItem(z)).ToArray(); + var items = lines.Select(ParseItem.FromString).ToArray(); var max = items.Max(z => z.Index); var result = new string[max + 1]; @@ -32,14 +33,18 @@ private static string[] ConvertItemList(string path) } } -public class ParseItem +public readonly record struct ParseItem { - public readonly int Index; - public readonly string Name; + public required int Index {get; init; } + public required string Name { get; init; } + + [SetsRequiredMembers] public ParseItem(string line) { var split = line.Split(", "); Index = int.Parse(split[0], System.Globalization.NumberStyles.HexNumber); Name = split[1]; } + + public static ParseItem FromString(string s) => new(s); } \ No newline at end of file diff --git a/NHSE.Tests/ArrayUtilTests.cs b/NHSE.Tests/ArrayUtilTests.cs index f56588b..9e8c3dc 100644 --- a/NHSE.Tests/ArrayUtilTests.cs +++ b/NHSE.Tests/ArrayUtilTests.cs @@ -6,10 +6,10 @@ namespace NHSE.Tests; -public class ArrayUtilTests +public static class ArrayUtilTests { [Fact] - public void ReplaceOccurrences_WhenPatternNotFound_ReturnsZero() + public static void ReplaceOccurrences_WhenPatternNotFound_ReturnsZero() { byte[] array = [0x01, 0x02, 0x03, 0x04, 0x05]; byte[] pattern = [0xAA, 0xBB]; @@ -22,7 +22,7 @@ public void ReplaceOccurrences_WhenPatternNotFound_ReturnsZero() } [Fact] - public void ReplaceOccurrences_WhenSingleOccurrence_ReplacesAndReturnsOne() + public static void ReplaceOccurrences_WhenSingleOccurrence_ReplacesAndReturnsOne() { byte[] array = [0x01, 0xAA, 0xBB, 0x04, 0x05]; byte[] pattern = [0xAA, 0xBB]; @@ -35,7 +35,7 @@ public void ReplaceOccurrences_WhenSingleOccurrence_ReplacesAndReturnsOne() } [Fact] - public void ReplaceOccurrences_WhenMultipleOccurrences_ReplacesAllAndReturnsCount() + public static void ReplaceOccurrences_WhenMultipleOccurrences_ReplacesAllAndReturnsCount() { byte[] array = [0xAA, 0xBB, 0x03, 0xAA, 0xBB, 0x06, 0xAA, 0xBB]; byte[] pattern = [0xAA, 0xBB]; @@ -48,7 +48,7 @@ public void ReplaceOccurrences_WhenMultipleOccurrences_ReplacesAllAndReturnsCoun } [Fact] - public void ReplaceOccurrences_WhenConsecutiveOccurrences_ReplacesAll() + public static void ReplaceOccurrences_WhenConsecutiveOccurrences_ReplacesAll() { byte[] array = [0xAA, 0xBB, 0xAA, 0xBB, 0xAA, 0xBB]; byte[] pattern = [0xAA, 0xBB]; @@ -61,7 +61,7 @@ public void ReplaceOccurrences_WhenConsecutiveOccurrences_ReplacesAll() } [Fact] - public void ReplaceOccurrences_WhenSwapContainsPattern_DoesNotCauseInfiniteLoop() + public static void ReplaceOccurrences_WhenSwapContainsPattern_DoesNotCauseInfiniteLoop() { // Swap contains the original pattern - must skip past swapped data byte[] array = [0x01, 0xAA, 0xBB, 0x04]; @@ -75,7 +75,7 @@ public void ReplaceOccurrences_WhenSwapContainsPattern_DoesNotCauseInfiniteLoop( } [Fact] - public void ReplaceOccurrences_WhenLargeFileWithRandomPlacements_ReplacesAllOccurrences() + public static void ReplaceOccurrences_WhenLargeFileWithRandomPlacements_ReplacesAllOccurrences() { const int fileSize = 1024 * 1024; // 1 MB const int sequenceLength = 0x13; // 19 bytes diff --git a/NHSE.Tests/BuildingTests.cs b/NHSE.Tests/BuildingTests.cs index 7dd11fc..b6beb3c 100644 --- a/NHSE.Tests/BuildingTests.cs +++ b/NHSE.Tests/BuildingTests.cs @@ -1,14 +1,14 @@ -using System.Linq; +using System.Linq; using FluentAssertions; using NHSE.Core; using Xunit; namespace NHSE.Tests; -public class BuildingTests +public static class BuildingTests { [Fact] - public void BuildingMarshal() + public static void BuildingMarshal() { var building = new Building(); var bytes = building.ToBytesClass(); @@ -16,7 +16,7 @@ public void BuildingMarshal() } [Fact] - public void BuildingClear() + public static void BuildingClear() { var item = new Building {BuildingType = BuildingType.PlayerHouse1, X=5, Y=7}; var bytes = item.ToBytesClass(); diff --git a/NHSE.Tests/EncryptedIntTests.cs b/NHSE.Tests/EncryptedIntTests.cs index 2cb74fa..dd97782 100644 --- a/NHSE.Tests/EncryptedIntTests.cs +++ b/NHSE.Tests/EncryptedIntTests.cs @@ -5,10 +5,10 @@ namespace NHSE.Tests; -public class EncryptedIntTests +public static class EncryptedIntTests { [Fact] - public void TestParse() + public static void TestParse() { const int expect = 31_280; ReadOnlySpan data = [0x8A, 0xC4, 0xE3, 0xCF, 0x37, 0xD5, 0x1A, 0xD3]; diff --git a/NHSE.Tests/EnumHashTests.cs b/NHSE.Tests/EnumHashTests.cs index c5fc527..b552e74 100644 --- a/NHSE.Tests/EnumHashTests.cs +++ b/NHSE.Tests/EnumHashTests.cs @@ -4,13 +4,13 @@ namespace NHSE.Tests; -public class EnumHashTests +public static class EnumHashTests { [Theory] [InlineData("Base", 0x6086515F)] [InlineData("River", 0x3422482F)] [InlineData("RoadStone", 0x13011867)] - public void ChecksumMatches(string str, uint val) + public static void ChecksumMatches(string str, uint val) { var computed = CRC32.Compute(str); computed.Should().Be(val); diff --git a/NHSE.Tests/FancyMarshalTests.cs b/NHSE.Tests/FancyMarshalTests.cs index 68b84d9..2e6d948 100644 --- a/NHSE.Tests/FancyMarshalTests.cs +++ b/NHSE.Tests/FancyMarshalTests.cs @@ -1,10 +1,10 @@ -using FluentAssertions; +using FluentAssertions; using NHSE.Core; using Xunit; namespace NHSE.Tests; -public class FancyMarshalTests +public sealed class FancyMarshalTests { [Fact] public void MarshalGSaveBulletinBoard() => MarshalBytesTestS(GSaveBulletinBoard.SIZE); [Fact] public void MarshalBulletinBoard() => MarshalBytesTestS(BulletinBoardStock.SIZE); diff --git a/NHSE.Tests/MarshalTests.cs b/NHSE.Tests/MarshalTests.cs index 87a2e5d..56bbcfd 100644 --- a/NHSE.Tests/MarshalTests.cs +++ b/NHSE.Tests/MarshalTests.cs @@ -1,10 +1,10 @@ -using FluentAssertions; +using FluentAssertions; using NHSE.Core; using Xunit; namespace NHSE.Tests; -public class MarshalTests +public sealed class MarshalTests { [Fact] public void MarshalItem() => MarshalTest(Item.SIZE); [Fact] public void MarshalVillagerItem() => MarshalTest(VillagerItem.SIZE); diff --git a/NHSE.Villagers/VillagerData.cs b/NHSE.Villagers/VillagerData.cs index cc8007e..428eba8 100644 --- a/NHSE.Villagers/VillagerData.cs +++ b/NHSE.Villagers/VillagerData.cs @@ -2,14 +2,7 @@ namespace NHSE.Villagers; -public class VillagerData -{ - public readonly Memory Villager; - public readonly Memory House; - - public VillagerData(Memory villager, Memory house) - { - Villager = villager; - House = house; - } -} \ No newline at end of file +/// +/// Tuple-like record struct to hold villager and house memory segments. +/// +public readonly record struct VillagerData(Memory Villager, Memory House); \ No newline at end of file diff --git a/NHSE.Villagers/VillagerInfo.cs b/NHSE.Villagers/VillagerInfo.cs index efb7746..3480612 100644 --- a/NHSE.Villagers/VillagerInfo.cs +++ b/NHSE.Villagers/VillagerInfo.cs @@ -2,14 +2,4 @@ namespace NHSE.Villagers; -public class VillagerInfo -{ - public readonly Villager2 Villager; - public readonly IVillagerHouse House; - - public VillagerInfo(Villager2 villager, IVillagerHouse house) - { - Villager = villager; - House = house; - } -} \ No newline at end of file +public readonly record struct VillagerInfo(Villager2 Villager, IVillagerHouse House); \ No newline at end of file diff --git a/NHSE.WinForms/Controls/ItemGridEditor.cs b/NHSE.WinForms/Controls/ItemGridEditor.cs index 7d16d20..9bd2344 100644 --- a/NHSE.WinForms/Controls/ItemGridEditor.cs +++ b/NHSE.WinForms/Controls/ItemGridEditor.cs @@ -11,7 +11,11 @@ namespace NHSE.WinForms; public partial class ItemGridEditor : UserControl { - private static readonly GridSize Sprites = new(); + private static readonly GridSize Sprites = new() + { + Width = 64, + Height = 64, + }; private readonly ItemEditor Editor; private readonly IReadOnlyList Items; @@ -304,9 +308,9 @@ private void SetEditorItems(List items) private void B_ClearFish_Click(object sender, EventArgs e) => ClearItemIf(z => GameLists.Fish.Contains(z.ItemId)); private void B_ClearDive_Click(object sender, EventArgs e) => ClearItemIf(z => GameLists.Dive.Contains(z.ItemId)); - private class GridSize : IGridItem + private sealed record GridSize : IGridItem { - public int Width { get; set; } = 64; - public int Height { get; set; } = 64; + public required int Width { get; set; } + public required int Height { get; set; } } } \ No newline at end of file diff --git a/NHSE.WinForms/Editor.cs b/NHSE.WinForms/Editor.cs index 8734ca4..272468b 100644 --- a/NHSE.WinForms/Editor.cs +++ b/NHSE.WinForms/Editor.cs @@ -206,7 +206,7 @@ private void SaveMain() #region Player Editing private void LoadPlayers() { - if (SAV.Players.Length == 0) + if (SAV.Players.Count == 0) throw new Exception("No players found in the loaded directory."); CB_Players.Items.Clear(); diff --git a/NHSE.WinForms/Subforms/Map/FieldItemEditor.cs b/NHSE.WinForms/Subforms/Map/FieldItemEditor.cs index dc69611..8273d37 100644 --- a/NHSE.WinForms/Subforms/Map/FieldItemEditor.cs +++ b/NHSE.WinForms/Subforms/Map/FieldItemEditor.cs @@ -69,7 +69,7 @@ private void LoadComboBoxes() CB_MapAcreSelect.DisplayMember = nameof(ComboItem.Text); CB_MapAcreSelect.ValueMember = nameof(ComboItem.Value); - CB_MapAcreSelect.DataSource = ComboItemUtil.GetArray(typeof(OutsideAcre)); + CB_MapAcreSelect.DataSource = ComboItemUtil.GetArray(); NUD_MapAcreTemplateOutside.Value = SAV.OutsideFieldTemplateUniqueId; NUD_MapAcreTemplateField.Value = SAV.MainFieldParamUniqueID; diff --git a/NHSE.WinForms/Subforms/SysBot/SysBotController.cs b/NHSE.WinForms/Subforms/SysBot/SysBotController.cs index dd75399..687fb1c 100644 --- a/NHSE.WinForms/Subforms/SysBot/SysBotController.cs +++ b/NHSE.WinForms/Subforms/SysBot/SysBotController.cs @@ -5,11 +5,8 @@ namespace NHSE.WinForms; -public class SysBotController +public sealed class SysBotController(InjectionType type) { - public SysBotController(InjectionType type) => Type = type; - - private readonly InjectionType Type; public readonly SysBot Bot = new(); private readonly Settings Settings = Settings.Default; @@ -42,7 +39,7 @@ public bool Connect(string ip, string port) public uint GetDefaultOffset() { var settings = Settings; - return Type switch + return type switch { InjectionType.Generic => settings.SysBotGenericOffset, InjectionType.Pouch => settings.SysBotPouchOffset, @@ -53,7 +50,7 @@ public uint GetDefaultOffset() public void SetOffset(uint value) { var settings = Settings; - switch (Type) + switch (type) { case InjectionType.Generic: settings.SysBotGenericOffset = value; break; case InjectionType.Pouch: settings.SysBotPouchOffset = value; break; diff --git a/NHSE.WinForms/Subforms/SysBot/USBBotController.cs b/NHSE.WinForms/Subforms/SysBot/USBBotController.cs index 5b9ea18..0dda797 100644 --- a/NHSE.WinForms/Subforms/SysBot/USBBotController.cs +++ b/NHSE.WinForms/Subforms/SysBot/USBBotController.cs @@ -3,7 +3,7 @@ namespace NHSE.WinForms; -public class USBBotController +public sealed class USBBotController { public readonly USBBot Bot = new(); @@ -20,10 +20,7 @@ public bool Connect() } } - public void Disconnect() - { - Bot.Disconnect(); - } + public void Disconnect() => Bot.Disconnect(); //todo: this //public uint GetDefaultOffset() diff --git a/NHSE.WinForms/Util/InterpolatingPictureBox.cs b/NHSE.WinForms/Util/InterpolatingPictureBox.cs index 013301e..a9e3db2 100644 --- a/NHSE.WinForms/Util/InterpolatingPictureBox.cs +++ b/NHSE.WinForms/Util/InterpolatingPictureBox.cs @@ -3,7 +3,7 @@ namespace NHSE.WinForms; -public class InterpolatingPictureBox : PictureBox +public sealed class InterpolatingPictureBox : PictureBox { private readonly InterpolationMode InterpolationMode = InterpolationMode.HighQualityBicubic;