From 9d1309827e09421edc345e46269887677a3369e3 Mon Sep 17 00:00:00 2001 From: Kurt Date: Wed, 14 Jan 2026 11:17:15 -0600 Subject: [PATCH] Pre 3.0.0 support Adds data for supporting 3.0.0, still needs savefile structures/hash range dumped and incorporated into MainOffsets30/PersonalOffsets30. Offsets/range is currently a copy of 2.0, which is obviously not correct. Saves will fail to load as encrypted values are not at the expected offset (pls no complaints). CTRL-I from main form still opens the injector interface; RAM offset not yet documented. --- NHSE.Core/Hashing/FileHashRevision.cs | 51 ++ NHSE.Core/Resources/byte/item_kind.bin | Bin 14987 -> 14987 bytes NHSE.Core/Resources/byte/item_menuicon.bin | Bin 29974 -> 29974 bytes NHSE.Core/Resources/byte/item_size.bin | Bin 14987 -> 14987 bytes .../Resources/text/de/text_body_color_de.txt | 267 ++++++++++ .../Resources/text/de/text_body_parts_de.txt | 49 ++ .../text/de/text_fabric_color_de.txt | 95 ++++ .../text/de/text_fabric_parts_de.txt | 16 + NHSE.Core/Resources/text/de/text_item_de.txt | 440 ++++++++--------- .../Resources/text/de/text_phrase_de.txt | 4 + .../Resources/text/de/text_villager_de.txt | 8 + .../Resources/text/en/text_body_color_en.txt | 267 ++++++++++ .../Resources/text/en/text_body_parts_en.txt | 49 ++ .../text/en/text_fabric_color_en.txt | 95 ++++ .../text/en/text_fabric_parts_en.txt | 16 + NHSE.Core/Resources/text/en/text_item_en.txt | 440 ++++++++--------- .../Resources/text/en/text_phrase_en.txt | 4 + .../Resources/text/en/text_villager_en.txt | 8 + .../Resources/text/es/text_body_color_es.txt | 267 ++++++++++ .../Resources/text/es/text_body_parts_es.txt | 49 ++ .../text/es/text_fabric_color_es.txt | 95 ++++ .../text/es/text_fabric_parts_es.txt | 16 + NHSE.Core/Resources/text/es/text_item_es.txt | 440 ++++++++--------- .../Resources/text/es/text_phrase_es.txt | 4 + .../Resources/text/es/text_villager_es.txt | 8 + .../Resources/text/fr/text_body_color_fr.txt | 267 ++++++++++ .../Resources/text/fr/text_body_parts_fr.txt | 49 ++ .../text/fr/text_fabric_color_fr.txt | 95 ++++ .../text/fr/text_fabric_parts_fr.txt | 16 + NHSE.Core/Resources/text/fr/text_item_fr.txt | 440 ++++++++--------- .../Resources/text/fr/text_phrase_fr.txt | 4 + .../Resources/text/fr/text_villager_fr.txt | 8 + .../Resources/text/it/text_body_color_it.txt | 267 ++++++++++ .../Resources/text/it/text_body_parts_it.txt | 49 ++ .../text/it/text_fabric_color_it.txt | 95 ++++ .../text/it/text_fabric_parts_it.txt | 16 + NHSE.Core/Resources/text/it/text_item_it.txt | 440 ++++++++--------- .../Resources/text/it/text_phrase_it.txt | 4 + .../Resources/text/it/text_villager_it.txt | 8 + .../Resources/text/jp/text_body_color_jp.txt | 267 ++++++++++ .../Resources/text/jp/text_body_parts_jp.txt | 49 ++ .../text/jp/text_fabric_color_jp.txt | 95 ++++ .../text/jp/text_fabric_parts_jp.txt | 16 + NHSE.Core/Resources/text/jp/text_item_jp.txt | 442 ++++++++--------- .../Resources/text/jp/text_phrase_jp.txt | 4 + .../Resources/text/jp/text_villager_jp.txt | 8 + .../Resources/text/ko/text_body_color_ko.txt | 267 ++++++++++ .../Resources/text/ko/text_body_parts_ko.txt | 49 ++ .../text/ko/text_fabric_color_ko.txt | 95 ++++ .../text/ko/text_fabric_parts_ko.txt | 16 + NHSE.Core/Resources/text/ko/text_item_ko.txt | 440 ++++++++--------- .../Resources/text/ko/text_phrase_ko.txt | 4 + .../Resources/text/ko/text_villager_ko.txt | 8 + .../text/zhs/text_body_color_zhs.txt | 267 ++++++++++ .../text/zhs/text_body_parts_zhs.txt | 49 ++ .../text/zhs/text_fabric_color_zhs.txt | 95 ++++ .../text/zhs/text_fabric_parts_zhs.txt | 16 + .../Resources/text/zhs/text_item_zhs.txt | 446 ++++++++--------- .../Resources/text/zhs/text_phrase_zhs.txt | 4 + .../Resources/text/zhs/text_villager_zhs.txt | 8 + .../text/zht/text_body_color_zht.txt | 267 ++++++++++ .../text/zht/text_body_parts_zht.txt | 49 ++ .../text/zht/text_fabric_color_zht.txt | 95 ++++ .../text/zht/text_fabric_parts_zht.txt | 16 + .../Resources/text/zht/text_item_zht.txt | 456 +++++++++--------- .../Resources/text/zht/text_phrase_zht.txt | 4 + .../Resources/text/zht/text_villager_zht.txt | 8 + NHSE.Core/Save/Meta/RevisionChecker.cs | 12 +- NHSE.Core/Save/Offsets/MainSaveOffsets.cs | 1 + NHSE.Core/Save/Offsets/MainSaveOffsets30.cs | 68 +++ NHSE.Core/Save/Offsets/PersonalOffsets.cs | 1 + NHSE.Core/Save/Offsets/PersonalOffsets30.cs | 48 ++ NHSE.Core/Structures/Building/RoofType.cs | 72 +++ NHSE.Core/Structures/Building/WallType.cs | 72 +++ NHSE.Core/Structures/GameLists.cs | 15 +- NHSE.Core/Structures/Item/ItemKind.cs | 3 + NHSE.Core/Structures/Item/ItemMenuIconType.cs | 5 +- NHSE.Core/Structures/RecipeList.cs | 2 +- NHSE.Core/Structures/Records/EventFlagLand.cs | 41 ++ .../Structures/Records/EventFlagPlayer.cs | 209 +++++++- .../Structures/Records/EventFlagVillager.cs | 4 + .../Records/EventFlagVillagerMemoryPlayer.cs | 2 + .../Records/LifeSupportAchievement.cs | 3 + NHSE.Core/Util/ArrayUtil.cs | 59 ++- NHSE.Tests/DumpTests.cs | 12 +- NHSE.Tests/NHSE.Tests.csproj | 2 +- 86 files changed, 6588 insertions(+), 2029 deletions(-) create mode 100644 NHSE.Core/Save/Offsets/MainSaveOffsets30.cs create mode 100644 NHSE.Core/Save/Offsets/PersonalOffsets30.cs diff --git a/NHSE.Core/Hashing/FileHashRevision.cs b/NHSE.Core/Hashing/FileHashRevision.cs index f5bbb8f..3489d4d 100644 --- a/NHSE.Core/Hashing/FileHashRevision.cs +++ b/NHSE.Core/Hashing/FileHashRevision.cs @@ -556,4 +556,55 @@ public static class FileHashRevision ]); #endregion + + #region REVISION 3.0.0 + + internal const int REV_300_MAIN = 0x9B0E90; + internal const int REV_300_PERSONAL = 0x74A40; + internal const int REV_300_POSTBOX = REV_170_POSTBOX; + internal const int REV_300_PHOTO = REV_200_PHOTO; + internal const int REV_300_PROFILE = REV_110_PROFILE; + internal const int REV_300_WHEREAREN = 0xB8A4E0; // todo? + + public static readonly FileHashInfo REV_300 = new([ + new(FN_MAIN, REV_300_MAIN, [ + new(0x000110, 0x1e339c), + new(0x1e34b0, 0x36406c), + new(0x547630, 0x03693c), + new(0x57df70, 0x033acc), + new(0x5b1b50, 0x03693c), + new(0x5e8490, 0x033acc), + new(0x61c070, 0x03693c), + new(0x6529b0, 0x033acc), + new(0x686590, 0x03693c), + new(0x6bced0, 0x033acc), + new(0x6f0ab0, 0x03693c), + new(0x7273f0, 0x033acc), + new(0x75afd0, 0x03693c), + new(0x791910, 0x033acc), + new(0x7c54f0, 0x03693c), + new(0x7fbe30, 0x033acc), + new(0x82fa10, 0x03693c), + new(0x866350, 0x033acc), + new(0x899e20, 0x057d8c) + ]), + new(FN_PERSONAL, REV_300_PERSONAL, [ + new(0x00110, 0x3693c), + new(0x36a50, 0x33acc) + ]), + new(FN_POSTBOX, REV_300_POSTBOX, [ + new(0x100, 0x4732c) + ]), + new(FN_PHOTO, REV_300_PHOTO, [ + new(0x100, 0x2f54c) + ]), + new(FN_PROFILE, REV_300_PROFILE, [ + new(0x100, 0x6945c) + ]), + new(FN_WHEREAREN, REV_300_WHEREAREN, [ + new(0x100, 0xB8A3DC) + ]) + ]); + + #endregion } \ No newline at end of file diff --git a/NHSE.Core/Resources/byte/item_kind.bin b/NHSE.Core/Resources/byte/item_kind.bin index 1488f0b18a36a05eeb70d848f68fbe2b44fb0ffa..81f74fdd61029663abd24ae5498c34ed3770cb8f 100644 GIT binary patch literal 14987 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 literal 14987 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 diff --git a/NHSE.Core/Resources/byte/item_menuicon.bin b/NHSE.Core/Resources/byte/item_menuicon.bin index ef54d6afff9d6385fe27be0feab8b8ec2474255c..1a605904af9fc840273424fb4f8573787326b369 100644 GIT binary patch literal 29974 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 Ca}?$P delta 466 zcmYjNyA8rX40VE&2#yeu@DU9KqDE&19KU6_f3*CmarT2~seIzzjyo9OSR8{9i86YXw*@Q(4llwIlDs z6GBIs4_}Z7q4n@s389A#=>(rrn|7-8bTlHfmGvh0+@M0DncozY=R5L0iLu0MY|}^v zf|(&7A7u!I#?4p*x&BeG7bB`m3h~`G2iKU=eoH$_fLGM SizeInfo = @@ -96,7 +98,8 @@ public static class RevisionChecker SizesByRevision[12], // 2.0.5 SizesByRevision[12], // 2.0.6 SizesByRevision[12], // 2.0.7 - SizesByRevision[12] // 2.0.8 + SizesByRevision[12], // 2.0.8 + SizesByRevision[13], // 3.0.0 ]; public static readonly IReadOnlyList HashInfo = @@ -131,7 +134,8 @@ public static class RevisionChecker REV_200, // 2.0.5 REV_200, // 2.0.6 REV_200, // 2.0.7 - REV_200 // 2.0.8 + REV_200, // 2.0.8 + REV_300, // 2.0.8 ]; extension(FileHeaderInfo info) diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets.cs index fc9aa42..9a03405 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets.cs @@ -95,6 +95,7 @@ public static MainSaveOffsets GetOffsets(FileHeaderInfo Info) 28 => new MainSaveOffsets20(), 29 => new MainSaveOffsets20(), 30 => new MainSaveOffsets20(), + 31 => new MainSaveOffsets30(), _ => throw new IndexOutOfRangeException("Unknown revision!" + Environment.NewLine + Info), }; } diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets30.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets30.cs new file mode 100644 index 0000000..9abf99f --- /dev/null +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets30.cs @@ -0,0 +1,68 @@ +using System; + +namespace NHSE.Core; + +/// +/// +/// +/// Same as +public class MainSaveOffsets30 : MainSaveOffsets +{ + public override int PatternCount => PatternCount2; + + #region GSaveLand + public const int GSaveLandStart = 0x110; + public override int Animal => GSaveLandStart + 0x10; + + public override int LandMyDesign => GSaveLandStart + 0x1e3848; + public override int PatternsPRO => LandMyDesign + (PatternCount2 * DesignPattern.SIZE); + public override int PatternFlag => PatternsPRO + (PatternCount2 * DesignPatternPRO.SIZE); + public override int PatternTailor => PatternFlag + DesignPattern.SIZE; + + public override int PatternsEditFlagStart => GSaveLandStart + 0x8BE150; // x100, HasPlayerEdited? + public override int PatternsProEditFlagStart => PatternsEditFlagStart + 0x64; // x100, HasPlayerEdited? + + public const int GSaveWeather = GSaveLandStart + 0x1e35f0; + public override int WeatherArea => GSaveWeather + 0x14; // Hemisphere + public override int WeatherRandSeed => GSaveWeather + 0x18; + + public override int EventFlagLand => GSaveLandStart + 0x22ebf0; + + // GSaveMainField + public const int GSaveMainFieldStart = GSaveLandStart + 0x22f3f0; + 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 MyDesignMap => GSaveMainFieldStart + 0xCFA34; + + public override int PlayerHouseList => GSaveLandStart + 0x30a6bc; + public override int NpcHouseList => GSaveLandStart + 0x44f7fc; + + public const int GSaveShop = GSaveLandStart + 0x45b50c; + public override int ShopKabu => GSaveShop + 0x2d40; // part of shop; tailor & zakka increased size + public override int Museum => GSaveLandStart + 0x45ec44; + public override int Visitor => GSaveLandStart + 0x462048; + public override int SaveFg => GSaveLandStart + 0x462278; + public override int BulletinBoard => GSaveLandStart + 0x462bc0; + public override int AirportThemeColor => GSaveLandStart + 0x5437c8; + #endregion + + #region GSaveLandOther + public const int GSaveLandOtherStart = 0x547520; + + public override int LostItemBox => GSaveLandOtherStart + 0x3726c0; + public override int LastSavedTime => GSaveLandOtherStart + 0x377020; + #endregion + + public override int VillagerSize => Villager2.SIZE; + public override IVillager ReadVillager(Memory data) => new Villager2(data); + + public override int VillagerHouseSize => VillagerHouse2.SIZE; + public override IVillagerHouse ReadVillagerHouse(Memory data) => new VillagerHouse2(data); + + public override int PlayerHouseSize => PlayerHouse2.SIZE; + public override IPlayerHouse ReadPlayerHouse(Memory data) => new PlayerHouse2(data); + public override int PlayerRoomSize => PlayerRoom2.SIZE; + public override IPlayerRoom ReadPlayerRoom(Memory data) => new PlayerRoom2(data); +} \ No newline at end of file diff --git a/NHSE.Core/Save/Offsets/PersonalOffsets.cs b/NHSE.Core/Save/Offsets/PersonalOffsets.cs index 54aafa1..52921a6 100644 --- a/NHSE.Core/Save/Offsets/PersonalOffsets.cs +++ b/NHSE.Core/Save/Offsets/PersonalOffsets.cs @@ -75,6 +75,7 @@ public static PersonalOffsets GetOffsets(FileHeaderInfo Info) 28 => new PersonalOffsets20(), 29 => new PersonalOffsets20(), 30 => new PersonalOffsets20(), + 31 => new PersonalOffsets30(), _ => throw new IndexOutOfRangeException("Unknown revision!" + Environment.NewLine + Info), }; } diff --git a/NHSE.Core/Save/Offsets/PersonalOffsets30.cs b/NHSE.Core/Save/Offsets/PersonalOffsets30.cs new file mode 100644 index 0000000..73961f1 --- /dev/null +++ b/NHSE.Core/Save/Offsets/PersonalOffsets30.cs @@ -0,0 +1,48 @@ +using System; + +namespace NHSE.Core; + +/// +/// +/// +public sealed class PersonalOffsets30 : PersonalOffsets +{ + private const int Player = 0x110; + + public override int PersonalId => Player + 0xAFA8; + public override int EventFlagsPlayer => Player + 0xAFE0; + + private const int GSaveLifeSupport = Player + 0xBFE0; + public override int CountAchievement => GSaveLifeSupport + 0xE98; // CountAchievement + + public override int NowPoint => GSaveLifeSupport + 0x5498; // Nook Miles + public override int TotalPoint => NowPoint + 8; // Total Nook Miles Earned + public override int Birthday => Player + 0x1228c; + + public override int ProfileMain => Player + 0x122a0; + public override int ProfilePhoto => ProfileMain + 0x14; + public override int ProfileBirthday => ProfileMain + 0x23058; + public override int ProfileFruit => ProfileMain + 0x2305C; + public override int ProfileTimestamp => ProfileMain + 0x230CC; + public override int ProfileIsMakeVillage => ProfileMain + 0x230D0; + + // end player + + private const int PlayerOther = 0x36a50; + + public override int Pockets1 => PlayerOther + 0x10; + public override int Pockets2 => Pockets1 + (8 * Pockets1Count) + 0x18; + public override int Wallet => Pockets2 + (8 * Pockets2Count) + 0x18; + public override int ItemChest => PlayerOther + 0x18C; + public override int ItemCollectBit => PlayerOther + 0xA058; + public override int ItemRemakeCollectBit => PlayerOther + 0xA7AC; + public override int Manpu => PlayerOther + 0xAF7C; + public override int Bank => PlayerOther + 0x24afc; + public override int Recipes => Bank + 0x10; + + public override int MaxRecipeID => 0x430; + public override int MaxRemakeBitFlag => 0x7D0 * 32; + + public override IReactionStore ReadReactions(ReadOnlySpan data) => data.Slice(Manpu, GSavePlayerManpu15.SIZE).ToStructure(); + public override void SetReactions(Span data, IReactionStore value) => ((GSavePlayerManpu15)value).ToBytes().CopyTo(data[Manpu..]); +} \ No newline at end of file diff --git a/NHSE.Core/Structures/Building/RoofType.cs b/NHSE.Core/Structures/Building/RoofType.cs index 682aebf..e601ede 100644 --- a/NHSE.Core/Structures/Building/RoofType.cs +++ b/NHSE.Core/Structures/Building/RoofType.cs @@ -25,6 +25,7 @@ public enum RoofType : ushort HouseRoofNASlateA = 0x13, HouseRoofNAMetalA = 0x14, HouseRoofNATileA = 0x15, + HouseRoofPB04SlateA = 0x16, HouseRoofPA04ThatchedB = 0x17, HouseRoofPA04ThatchedC = 0x18, HouseRoofPA04ThatchedD = 0x19, @@ -171,4 +172,75 @@ public enum RoofType : ushort HouseRoofNASlateI = 0xAD, HouseRoofNDWoodI = 0xAE, HouseRoofNDWoodJ = 0xAF, + HouseRoofPC04JapaneseA = 0xB0, + HouseRoofPB04WoodpanelA = 0xB1, + HouseRoofPB04MetalA = 0xB2, + HouseRoofPC04OrientalA = 0xB3, + HouseRoofPC04ThatchedA = 0xB4, + HouseRoofPC04OrientalB = 0xB5, + HouseRoofPC04OrientalC = 0xB6, + HouseRoofPC04OrientalD = 0xB7, + HouseRoofPC04OrientalE = 0xB8, + HouseRoofPC04OrientalF = 0xB9, + HouseRoofPC04OrientalG = 0xBA, + HouseRoofPC04OrientalH = 0xBB, + HouseRoofPB04SlateB = 0xBC, + HouseRoofPB04SlateC = 0xBD, + HouseRoofPB04SlateD = 0xBE, + HouseRoofPB04SlateE = 0xBF, + HouseRoofPB04SlateF = 0xC0, + HouseRoofPB04SlateG = 0xC1, + HouseRoofPB04SlateH = 0xC2, + HouseRoofPC04ThatchedB = 0xC3, + HouseRoofPC04ThatchedC = 0xC4, + HouseRoofPC04ThatchedD = 0xC5, + HouseRoofPC04ThatchedE = 0xC6, + HouseRoofPC04ThatchedF = 0xC7, + HouseRoofPC04ThatchedG = 0xC8, + HouseRoofPC04ThatchedH = 0xC9, + HouseRoofPC04JapaneseB = 0xCA, + HouseRoofPC04JapaneseC = 0xCB, + HouseRoofPC04JapaneseD = 0xCC, + HouseRoofPC04JapaneseE = 0xCD, + HouseRoofPC04JapaneseF = 0xCE, + HouseRoofPC04JapaneseG = 0xCF, + HouseRoofPC04JapaneseH = 0xD0, + HouseRoofPD04WoodA = 0xD4, + HouseRoofPD04StoneA = 0xD5, + HouseRoofPD04ThatchedA = 0xD6, + HouseRoofPB04WoodpanelB = 0xD7, + HouseRoofPB04WoodpanelC = 0xD8, + HouseRoofPB04WoodpanelD = 0xD9, + HouseRoofPB04WoodpanelE = 0xDA, + HouseRoofPB04WoodpanelF = 0xDB, + HouseRoofPB04WoodpanelG = 0xDC, + HouseRoofPB04WoodpanelH = 0xDD, + HouseRoofPB04MetalB = 0xDE, + HouseRoofPB04MetalC = 0xDF, + HouseRoofPB04MetalD = 0xE0, + HouseRoofPB04MetalE = 0xE1, + HouseRoofPB04MetalF = 0xE2, + HouseRoofPB04MetalG = 0xE3, + HouseRoofPB04MetalH = 0xE4, + HouseRoofPD04ThatchedB = 0xE5, + HouseRoofPD04ThatchedC = 0xE6, + HouseRoofPD04ThatchedD = 0xE7, + HouseRoofPD04ThatchedE = 0xE8, + HouseRoofPD04ThatchedF = 0xE9, + HouseRoofPD04ThatchedG = 0xEA, + HouseRoofPD04ThatchedH = 0xEB, + HouseRoofPD04WoodB = 0xEC, + HouseRoofPD04WoodC = 0xED, + HouseRoofPD04WoodD = 0xEE, + HouseRoofPD04WoodE = 0xEF, + HouseRoofPD04WoodF = 0xF0, + HouseRoofPD04WoodG = 0xF1, + HouseRoofPD04WoodH = 0xF3, + HouseRoofPD04StoneB = 0xF4, + HouseRoofPD04StoneC = 0xF5, + HouseRoofPD04StoneD = 0xF6, + HouseRoofPD04StoneE = 0xF7, + HouseRoofPD04StoneF = 0xF8, + HouseRoofPD04StoneG = 0xF9, + HouseRoofPD04StoneH = 0xFA, } \ No newline at end of file diff --git a/NHSE.Core/Structures/Building/WallType.cs b/NHSE.Core/Structures/Building/WallType.cs index 9029aa7..62ce5d4 100644 --- a/NHSE.Core/Structures/Building/WallType.cs +++ b/NHSE.Core/Structures/Building/WallType.cs @@ -18,6 +18,7 @@ public enum WallType : ushort HouseWallNAWoodsidingA = 0x0E, HouseWallNABrickA = 0x0F, HouseWallNAStuccoA = 0x10, + HouseWallPB04WoodsidngA = 0x11, HouseWallPA04StuccoA = 0x13, HouseWallPA04WoodframeB = 0x14, HouseWallPA04WoodframeC = 0x15, @@ -154,4 +155,75 @@ public enum WallType : ushort HouseWallNAMetalH = 0xAB, HouseWallNAWoodsidingI = 0xAC, HouseWallNAWoodsidingJ = 0xAD, + HouseWallPC04JapaneseA = 0xAE, + HouseWallPB04LogA = 0xAF, + HouseWallPB04BrickA = 0xB0, + HouseWallPC04OrientalA = 0xB1, + HouseWallPC04StoneA = 0xB2, + HouseWallPB04WoodsidngB = 0xB3, + HouseWallPB04WoodsidngC = 0xB4, + HouseWallPB04WoodsidngD = 0xB5, + HouseWallPB04WoodsidngE = 0xB6, + HouseWallPB04WoodsidngF = 0xB7, + HouseWallPB04WoodsidngG = 0xB8, + HouseWallPB04WoodsidngH = 0xB9, + HouseWallPC04OrientalB = 0xBA, + HouseWallPC04OrientalC = 0xBB, + HouseWallPC04OrientalD = 0xBC, + HouseWallPC04OrientalE = 0xBD, + HouseWallPC04OrientalF = 0xBE, + HouseWallPC04OrientalG = 0xBF, + HouseWallPC04OrientalH = 0xC0, + HouseWallPB04LogB = 0xC1, + HouseWallPB04LogC = 0xC2, + HouseWallPB04LogD = 0xC3, + HouseWallPB04LogE = 0xC4, + HouseWallPB04LogF = 0xC5, + HouseWallPB04LogG = 0xC6, + HouseWallPB04LogH = 0xC7, + HouseWallPC04StoneB = 0xC8, + HouseWallPC04StoneC = 0xC9, + HouseWallPC04StoneD = 0xCA, + HouseWallPC04StoneE = 0xCB, + HouseWallPC04StoneF = 0xCC, + HouseWallPC04StoneG = 0xCD, + HouseWallPC04StoneH = 0xCE, + HouseWallPB04BrickB = 0xCF, + HouseWallPB04BrickC = 0xD0, + HouseWallPB04BrickD = 0xD1, + HouseWallPB04BrickE = 0xD2, + HouseWallPB04BrickF = 0xD3, + HouseWallPB04BrickG = 0xD4, + HouseWallPB04BrickH = 0xD5, + HouseWallPC04JapaneseB = 0xD6, + HouseWallPC04JapaneseC = 0xD7, + HouseWallPC04JapaneseD = 0xD8, + HouseWallPC04JapaneseE = 0xD9, + HouseWallPC04JapaneseF = 0xDA, + HouseWallPC04JapaneseG = 0xDB, + HouseWallPC04JapaneseH = 0xDC, + HouseWallPD04WoodA = 0xDD, + HouseWallPD04StuccoA = 0xDE, + HouseWallPD04SoilA = 0xDF, + HouseWallPD04WoodB = 0xE0, + HouseWallPD04WoodC = 0xE1, + HouseWallPD04WoodD = 0xE2, + HouseWallPD04WoodE = 0xE3, + HouseWallPD04WoodF = 0xE4, + HouseWallPD04WoodG = 0xE5, + HouseWallPD04WoodH = 0xE6, + HouseWallPD04StuccoB = 0xE7, + HouseWallPD04StuccoC = 0xE8, + HouseWallPD04StuccoD = 0xE9, + HouseWallPD04StuccoE = 0xEA, + HouseWallPD04StuccoF = 0xEB, + HouseWallPD04StuccoG = 0xEC, + HouseWallPD04StuccoH = 0xED, + HouseWallPD04SoilB = 0xEE, + HouseWallPD04SoilC = 0xEF, + HouseWallPD04SoilD = 0xF0, + HouseWallPD04SoilE = 0xF1, + HouseWallPD04SoilF = 0xF2, + HouseWallPD04SoilG = 0xF3, + HouseWallPD04SoilH = 0xF4, } \ No newline at end of file diff --git a/NHSE.Core/Structures/GameLists.cs b/NHSE.Core/Structures/GameLists.cs index 79ddc4d..5f68fd0 100644 --- a/NHSE.Core/Structures/GameLists.cs +++ b/NHSE.Core/Structures/GameLists.cs @@ -95,11 +95,16 @@ public static class GameLists 03487, // rosalia batesi beetle 03539, // snowflake 03540, // large snowflake + // 03541, // red feather + // 03542, // blue feather + // 03543, // green feather + // 03545, // purple feather + // 03548, // rainbow feather 04702, // Wisp spirit piece 05157, // giant water bug 05339, // damselfly 05859, // cherry-blossom petal - 07374 // maple leaf + 07374, // maple leaf ]; public static ReadOnlySpan Fish => @@ -188,7 +193,7 @@ public static class GameLists 04203, // suckerfish 04204, // barreleye 05254, // ranchu goldfish - 12514 // water egg + 12514, // water egg ]; public static ReadOnlySpan Fossils => @@ -265,7 +270,7 @@ public static class GameLists 04697, // quetzal torso 04698, // right quetzal wing 04699, // left quetzal wing - 07251 // diplo tail tip + 07251, // diplo tail tip ]; public static ReadOnlySpan Art => @@ -383,7 +388,9 @@ public static class GameLists 07303, // sea pig 07308, // Dungeness crab 07318, // Venus' flower basket - 07411 // mussel + 07411, // mussel + 12968, // pearl + 13105, // communicator ]; public static ReadOnlySpan Shells => diff --git a/NHSE.Core/Structures/Item/ItemKind.cs b/NHSE.Core/Structures/Item/ItemKind.cs index 973d183..ba36706 100644 --- a/NHSE.Core/Structures/Item/ItemKind.cs +++ b/NHSE.Core/Structures/Item/ItemKind.cs @@ -46,6 +46,7 @@ public enum ItemKind : byte Kind_DiveFish, Kind_DIYRecipe, Kind_DoorDeco, + Kind_DreamGold, Kind_Drink, Kind_DummyCardboard, Kind_DummyDIYRecipe, @@ -157,6 +158,7 @@ public enum ItemKind : byte Kind_Socks, Kind_SouvenirChocolate, Kind_SoySet, + Kind_SpeakerMegaphone, Kind_StarPiece, Kind_StickLight, Kind_StickLightColorful, @@ -174,6 +176,7 @@ public enum ItemKind : byte Kind_Tambourine, Kind_Tapioca, Kind_Timer, + Kind_Transceiver, Kind_Trash, Kind_TreasureQuest, Kind_TreasureQuestDust, diff --git a/NHSE.Core/Structures/Item/ItemMenuIconType.cs b/NHSE.Core/Structures/Item/ItemMenuIconType.cs index 33d116f..133c9d6 100644 --- a/NHSE.Core/Structures/Item/ItemMenuIconType.cs +++ b/NHSE.Core/Structures/Item/ItemMenuIconType.cs @@ -1,10 +1,13 @@ -namespace NHSE.Core; +namespace NHSE.Core; /// /// Menu icons (image shown in the inventory) of Items /// public enum ItemMenuIconType : ushort { + _0x6DC40167, + _0x7A38C58E, + _0xCA743497, Akoyagai, Amaebi, Anemone0, diff --git a/NHSE.Core/Structures/RecipeList.cs b/NHSE.Core/Structures/RecipeList.cs index 56f7bb5..e91aece 100644 --- a/NHSE.Core/Structures/RecipeList.cs +++ b/NHSE.Core/Structures/RecipeList.cs @@ -779,7 +779,7 @@ public static class RecipeList {0x390, 14003}, // sea-bass pie {0x391, 14010}, // salad {0x392, 14048}, // mushroom potage - {0x393, 14104}, // fish and chips + {0x393, 14104}, // fish-and-chips {0x394, 14105}, // french fries {0x395, 14109}, // plain scones {0x396, 14110}, // veggie cupcakes diff --git a/NHSE.Core/Structures/Records/EventFlagLand.cs b/NHSE.Core/Structures/Records/EventFlagLand.cs index 8494f79..9a25bbe 100644 --- a/NHSE.Core/Structures/Records/EventFlagLand.cs +++ b/NHSE.Core/Structures/Records/EventFlagLand.cs @@ -493,6 +493,47 @@ public EventFlagLand(short init, short max, ushort index, string name) {0x21E, new EventFlagLand(0 , 10 , 0542, "GrowHaniwaPieceNum" )}, // Tips|ハニワのかけらがハニワに成長した個数 {0x21F, new EventFlagLand(0 , 1 , 0543, "UnlockSzaResetHouse" )}, // しずえ|NPCの家リセット解禁(家コーデが村の誰かのところで解禁) {0x220, new EventFlagLand(0 , 1 , 0544, "RcoTipsDisableNoticeLoginBonus" )}, // Tips|タヌポートログボ出すの禁止か?(工事当日&大晦日にON) + {0x221, new EventFlagLand(0 , 1 , 0545, "HotelBuilt" )}, // ホテル|2_建物が建設済み(オープンしてない可能性あり) + {0x222, new EventFlagLand(0 , 1 , 0546, "HotelConstruction" )}, // ホテル|0_工事中である + {0x223, new EventFlagLand(0 , 1 , 0547, "HotelBuiltDay" )}, // ホテル|1_建物完成当日か + {0x224, new EventFlagLand(0 , 1 , 0548, "HotelOpend" )}, // ホテル|5_オープン済み(1部屋作って来客がいる) + {0x225, new EventFlagLand(0 , 1 , 0549, "HotelOpenDay" )}, // ホテル|4_オープン当日か(1部屋目作った日) + {0x226, new EventFlagLand(0 , 10000, 0550, "HotelBuiltDaysCount" )}, // ホテル|3_建物完成からの経過日数(初日が1) + {0x227, new EventFlagLand(0 , 1 , 0551, "GrowUpAfterPatch3_0" )}, // 3.0適用して成長処理をした + {0x228, new EventFlagLand(0 , 10000, 0552, "HotelOpenDaysCount" )}, // ホテル|6_オープンしてからの経過日数(初日が1) + {0x229, new EventFlagLand(0 , 1 , 0553, "HotelIsCompletedVipEditTutorialAnyone" )}, // ホテル|島のだれかがVIP部屋エディットのチュートリアルを完了したか + {0x22A, new EventFlagLand(0 , 9999 , 0554, "HotelUnlockItemFromPoint" )}, // ホテル|入手経路解禁実績ポイント + {0x22B, new EventFlagLand(0 , 1 , 0555, "HotelIsCompletedEditTutorialAnyone" )}, // ホテル|島のだれかが客室エディットのチュートリアルを完了したか + {0x22C, new EventFlagLand(0 , 1 , 0556, "ReserveVisitNpcTidy" )}, // リセットさん | リセットさんの来訪予約フラグ + {0x22D, new EventFlagLand(0 , 1 , 0557, "HotelIsLotItemEditTutorialAfterDay" )}, // ホテル|島のだれかが客室エディットをクリアしてから後日、商品抽選をしたか + {0x22E, new EventFlagLand(0 , 8 , 0558, "HotelUnlockNormalRoomNumber" )}, // ホテル | 解禁されている一般客室の番号(4なら4号室まで解禁扱い) + {0x22F, new EventFlagLand(0 , 8 , 0559, "HotelUnlockNormalRoomNumberReserve" )}, // ホテル | 解禁予約する一般客室の番号(4なら日跨ぎ時に4号室まで解禁) + {0x230, new EventFlagLand(0 , 1 , 0560, "HotelUnlockVipRoom" )}, // ホテル | VIPルームが解禁されているか + {0x231, new EventFlagLand(0 , 1 , 0561, "HotelUnlockVipRoomReserve" )}, // ホテル | VIPルームが解禁予約(1の時に日跨ぎでVIPルームを解禁) + {0x232, new EventFlagLand(0 , 1 , 0562, "TidyingToday" )}, // リセットさん | 今日島のだれかがお片付けをしたか + {0x233, new EventFlagLand(0 , 3 , 0563, "ReasonForNoRoomNpc" )}, // ホテル|宿無しNPCがホテルの予約をしてない理由 0:未設定 1~3:設定済み + {0x234, new EventFlagLand(0 , 1 , 0564, "IsVisitNpcTidyToday" )}, // リセットさん | 今日リセットさんが来訪してくるか + {0x235, new EventFlagLand(0 , 1 , 0565, "IsCallNpcTidy" )}, // リセットさん | リセットさんを呼び出したか + {0x236, new EventFlagLand(0 , 1 , 0566, "UnlockCallNpcTidy" )}, // リセットさん | リセットさん呼び出し機能が解禁したか + {0x237, new EventFlagLand(0 , 32 , 0567, "NpcTidyVisitControlFlags" )}, // リセットさん | リセットさん定期来訪制御用フラグ + {0x238, new EventFlagLand(0 , 1 , 0568, "HotelMannequinOpen" )}, // ホテル | 島の誰かがマネキンチュートリアルをクリアしたか? + {0x239, new EventFlagLand(0 , 1 , 0569, "UnlockCallNpcTidyToday" )}, // リセットさん| リセットさん呼び出し機能が解禁の当日か + {0x23A, new EventFlagLand(0 , 1 , 0570, "TipsAllHotelRoomCoordinated" )}, // Tips|ホテル1~8号室全て完成か? + {0x23B, new EventFlagLand(0 , 3 , 0571, "NpcTidyVisitType" )}, // リセットさん|来訪タイプ制御用 + {0x23C, new EventFlagLand(0 , 1 , 0572, "HeardAnnounceHotelConstruction" )}, // ホテル|島のだれかがホテル「工事中」の放送を聞いた + {0x23D, new EventFlagLand(0 , 1 , 0573, "VineOrFixLadderIsExisted" )}, // ツルまたはFIXはしごが設置されている + {0x23E, new EventFlagLand(0 , 3 , 0574, "UnlockHotelItemFromLevel" )}, // ホテル|解禁された入手経路の解禁レベル + {0x23F, new EventFlagLand(0 , 1 , 0575, "HotelFurnitureIntroductionDoneAnyone" )}, // ホテル|島のプレイヤーの誰かがホテルの土産屋初回チュートリアルを受けたか? + {0x240, new EventFlagLand(0 , 1 , 0576, "HotelSideTripPlayerTodayAnyone" )}, // ホテル|今日、島のプレイヤーの誰かがホテルに訪れたか? + {0x241, new EventFlagLand(0 , 1 , 0577, "HotelShopUnlockItemFromOnlyMode" )}, // ホテル|土産屋の店頭に解禁した入手経路のみを並べるか? + {0x242, new EventFlagLand(0 , 1 , 0578, "HotelShopUnlockNewItemFromNeedLot" )}, // ホテル|新しい入手経路を解禁した当日で商品を抽選しなおすか + {0x243, new EventFlagLand(0 , 1 , 0579, "HotelIsEditedMannequin0" )}, // ホテル|マネキン0番のコーデを一度でも編集したか + {0x244, new EventFlagLand(0 , 1 , 0580, "HotelIsEditedMannequin1" )}, // ホテル|マネキン1番のコーデを一度でも編集したか + {0x245, new EventFlagLand(0 , 1 , 0581, "SzaResetSymbolRecently" )}, // しずえ|直前の旗のデザイン変更は「リセット」? + {0x246, new EventFlagLand(0 , 4 , 0582, "SzaResetTownTuneRecentlyNo" )}, // しずえ|直前の島メロ「リセット」の曲 0なし、1~4初期パターンのいずれか + {0x247, new EventFlagLand(0 , 1 , 0583, "SzaSetTownTuneOriginalRecently" )}, // しずえ|直前の島メロ変更がオリジナル曲の提案か?(v3.0.0以降) + {0x248, new EventFlagLand(0 , 1 , 0584, "HotelIsFullAllRoomWithVisitor" )}, // ホテル|全部屋完成後宿泊客で満室になったかどうか + {0x249, new EventFlagLand(0 , 1 , 0585, "HotelShopOpen" )}, // ホテル | 島の誰かがみやげやのチュートリアルをクリアしたか? }; private const string Unknown = "???"; diff --git a/NHSE.Core/Structures/Records/EventFlagPlayer.cs b/NHSE.Core/Structures/Records/EventFlagPlayer.cs index 292037e..c9046f8 100644 --- a/NHSE.Core/Structures/Records/EventFlagPlayer.cs +++ b/NHSE.Core/Structures/Records/EventFlagPlayer.cs @@ -497,14 +497,14 @@ public EventFlagPlayer(short init, short max, ushort index, string name) {0x262, new EventFlagPlayer(0 , 1 , 0610, "ItemRingEnable" )}, // アイテムリング解禁 {0x263, new EventFlagPlayer(0 , 1 , 0611, "RcoTalkAboutOfficeWork" )}, // たぬきち|案内所での業務内容聞いた? {0x264, new EventFlagPlayer(0 , 1 , 0612, "TwinTurnipExplanation" )}, // まめつぶからカブ価と高額買取品の説明聞いた? - {0x265, new EventFlagPlayer(0 , 1 , 0613, "HeldCeremonyMarket1" )}, // セレモニ|商店(小)を開いた - {0x266, new EventFlagPlayer(0 , 1 , 0614, "HeldCeremonyMarket2" )}, // セレモニ|商店(大)を開いた - {0x267, new EventFlagPlayer(0 , 1 , 0615, "HerdCeremonyOffice" )}, // セレモニ|案内所を開いた - {0x268, new EventFlagPlayer(0 , 1 , 0616, "HeldCeremonyMuseum" )}, // セレモニ|博物館を開いた - {0x269, new EventFlagPlayer(0 , 1 , 0617, "HeldCeremonyTailor" )}, // セレモニ|仕立て屋を開いた - {0x26A, new EventFlagPlayer(0 , 1 , 0618, "HeldCeremonyCampSite" )}, // セレモニ|キャンプ場を開いた - {0x26B, new EventFlagPlayer(0 , 1 , 0619, "HeldCeremonyBridge" )}, // セレモニ|橋を開いた - {0x26C, new EventFlagPlayer(0 , 1 , 0620, "HeldCeremonySlope" )}, // セレモニ|坂を開いた + {0x265, new EventFlagPlayer(0 , 1 , 0613, "HeldCeremonyMarket1" )}, // セレモニー|商店(小)を開いた + {0x266, new EventFlagPlayer(0 , 1 , 0614, "HeldCeremonyMarket2" )}, // セレモニー|商店(大)を開いた + {0x267, new EventFlagPlayer(0 , 1 , 0615, "HerdCeremonyOffice" )}, // セレモニー|案内所を開いた + {0x268, new EventFlagPlayer(0 , 1 , 0616, "HeldCeremonyMuseum" )}, // セレモニー|博物館を開いた + {0x269, new EventFlagPlayer(0 , 1 , 0617, "HeldCeremonyTailor" )}, // セレモニー|仕立て屋を開いた + {0x26A, new EventFlagPlayer(0 , 1 , 0618, "HeldCeremonyCampSite" )}, // セレモニー|キャンプ場を開いた + {0x26B, new EventFlagPlayer(0 , 1 , 0619, "HeldCeremonyBridge" )}, // セレモニー|橋を開いた + {0x26C, new EventFlagPlayer(0 , 1 , 0620, "HeldCeremonySlope" )}, // セレモニー|坂を開いた {0x26D, new EventFlagPlayer(0 , 1 , 0621, "HghPeddlerPurchaceToday" )}, // きぬよ行商|今回の来訪で商品購入した {0x26E, new EventFlagPlayer(0 , 1 , 0622, "RollanBuyWallpaperCount" )}, // ローラン|今日フシギなかべがみを買った? {0x26F, new EventFlagPlayer(0 , 1 , 0623, "RollanBuyCarpetCount" )}, // ローラン|今日フシギなゆかを買った? @@ -595,8 +595,8 @@ public EventFlagPlayer(short init, short max, ushort index, string name) {0x2C9, new EventFlagPlayer(0 , -1 , 0713, "BDayMsgRandomSead" )}, // バースデーメッセージの内容を決定する乱数のシード値 {0x2CA, new EventFlagPlayer(0 , 1 , 0714, "UnlockMyDesignProCategory" )}, // スマホUI|PROデザインのタブカテゴリ解禁 {0x2D5, new EventFlagPlayer(0 , 30 , 0725, "BalloonShootCountToday" )}, // 今日風船をいくつ撃ったか? - {0x2D6, new EventFlagPlayer(0 , 1 , 0726, "ContributedBuildBridgeorSlope" )}, // セレモニ|橋か坂の建設に貢献した - {0x2D7, new EventFlagPlayer(0 , 1 , 0727, "ContributedTodaysCeremonyBridgeorSlope" )}, // セレモニ|今日の橋か坂のセレモニーに貢献した + {0x2D6, new EventFlagPlayer(0 , 1 , 0726, "ContributedBuildBridgeorSlope" )}, // セレモニー|橋か坂の建設に貢献した + {0x2D7, new EventFlagPlayer(0 , 1 , 0727, "ContributedTodaysCeremonyBridgeorSlope" )}, // セレモニー|今日の橋か坂のセレモニーに貢献した {0x2D8, new EventFlagPlayer(0 , 1 , 0728, "Mobile1stBootAfterUnlockPro_Mydesign" )}, // プロ編集解禁後スマホアプリ初起動|マイデザイン {0x2D9, new EventFlagPlayer(0 , 1 , 0729, "TkkBirthdayMessageFlag" )}, // とたけけ|バースデーメッセージ送った? {0x2DA, new EventFlagPlayer(0 , 1 , 0730, "TalkFirstCamperAfterSetHousing" )}, // たぬきち|1人目のキャンプ客とハウジングキットセット後会話した @@ -792,7 +792,7 @@ public EventFlagPlayer(short init, short max, ushort index, string name) {0x3A7, new EventFlagPlayer(0 , 1 , 0935, "Owl1stTalkMuseum2" )}, // フータ|博物館②完成後の挨拶した? {0x3A8, new EventFlagPlayer(0 , 1 , 0936, "OwlPaintingQuestExplain" )}, // フータ|絵画クエストの説明を受けたか? {0x3A9, new EventFlagPlayer(0 , 1 , 0937, "FutaReadyForMuseum2" )}, // フータ|博物館②建設条件達成の報告を聞いたか? - {0x3AA, new EventFlagPlayer(0 , 1 , 0938, "HeldCeremonyMuseum2" )}, // セレモニ|博物館②を開いた + {0x3AA, new EventFlagPlayer(0 , 1 , 0938, "HeldCeremonyMuseum2" )}, // セレモニー|博物館②を開いた {0x3AB, new EventFlagPlayer(0 , 2 , 0939, "EarthdayDailyClearNum" )}, // アースデー専用クエストを今日クリアした数 {0x3AC, new EventFlagPlayer(0 , 1 , 0940, "OwlShowPaintingBeforeQuest" )}, // フータ|絵画クエスト前に絵画を見せたか? {0x3AD, new EventFlagPlayer(0 , 1 , 0941, "OwlPaintingQuestDeclined" )}, // フータ|絵画クエストで寄贈を断ったことある @@ -1284,7 +1284,7 @@ public EventFlagPlayer(short init, short max, ushort index, string name) {0x5F6, new EventFlagPlayer(0 , 1 , 1526, "DodSelectWherearen1st" )}, // モーリー|「お仕事に行く」の説明を聞いた {0x5F7, new EventFlagPlayer(0 , 1 , 1527, "FortuneApproachTalked" )}, // 占い結果でのアプローチ会話発生済み {0x5F8, new EventFlagPlayer(0 , 1 , 1528, "SawMuseumCafeTakeoutNpc" )}, // 喫茶ハトの巣|テイクアウトで来店した特殊NPCを見た - {0x5F9, new EventFlagPlayer(0 , 7 , 1529, "LastSawMuseumCafeTakeoutNpc" )}, // 喫茶ハトの巣|最後にテイクアウトで来店するのを見たNPC + {0x5F9, new EventFlagPlayer(0 , 8 , 1529, "LastSawMuseumCafeTakeoutNpc" )}, // 喫茶ハトの巣|最後にテイクアウトで来店するのを見たNPC {0x5FA, new EventFlagPlayer(0 , 1 , 1530, "KppTourDone_RareStarpiece" )}, // かっぺいツアー|レア島行った:星のかけら {0x5FB, new EventFlagPlayer(0 , 1 , 1531, "KppTourDone_RareCherryBlossom" )}, // かっぺいツアー|レア島行った:桜の花びら {0x5FC, new EventFlagPlayer(0 , 1 , 1532, "KppTourDone_RareSpringBamboo" )}, // かっぺいツアー|レア島行った:春のわかたけ @@ -1317,7 +1317,7 @@ public EventFlagPlayer(short init, short max, ushort index, string name) {0x619, new EventFlagPlayer(0 , 1 , 1561, "SelectedGotoCafe" )}, // 日課「喫茶店に行こうキャンペーン」を今日達成した {0x61A, new EventFlagPlayer(0 , 2 , 1562, "SelectedDoRadioGymnastics" )}, // 日課「ラジオ体操をしよう」が出現カウンター {0x61B, new EventFlagPlayer(0 , 1 , 1563, "TtlB_Acorn_Today" )}, // コトブキ|今日どんぐり貰った? - {0x61C, new EventFlagPlayer(0 , 1 , 1564, "HeldCeremonyMuseum3" )}, // セレモニ|博物館③を開いた + {0x61C, new EventFlagPlayer(0 , 1 , 1564, "HeldCeremonyMuseum3" )}, // セレモニー|博物館③を開いた {0x61D, new EventFlagPlayer(0 , 1 , 1565, "StandByPhoneCallNpcNG" )}, // 電話デモ|NPCを呼び出せなかった入電するか? {0x61E, new EventFlagPlayer(0 , 1 , 1566, "PgeTalkTakeOutFlag" )}, // マスター|テイクアウトの話聞いた? {0x61F, new EventFlagPlayer(0 , 1 , 1567, "UnlockPlayerHair37" )}, // 髪型解禁:Hair37センターわけ @@ -1526,6 +1526,189 @@ public EventFlagPlayer(short init, short max, ushort index, string name) {0x6FA, new EventFlagPlayer(0 , 1 , 1786, "SloRecommendbush" )}, // レイジ|コミューン島今週のおすすめの低木を伝えたか {0x6FB, new EventFlagPlayer(0 , 2 , 1787, "PMovingTmpDustCloth" )}, // プレイヤーだけ引越し|まごころ雑巾をP引越し時に一時的に使えなくするためのtmpフラグ {0x6FC, new EventFlagPlayer(0 , 1 , 1788, "RcoTipsRcoMachineLoginBonus" )}, // Tips|タヌポートログボのTips出す? + {0x6FD, new EventFlagPlayer(0 , -1 , 1789, "RollbackedYear" )}, // Blanco|ロールバックが行われた年 + {0x6FE, new EventFlagPlayer(0 , 12 , 1790, "RollbackedMonth" )}, // Blanco|ロールバックが行われた月 + {0x6FF, new EventFlagPlayer(0 , 31 , 1791, "RollbackedDay" )}, // Blanco|ロールバックが行われた日 + {0x700, new EventFlagPlayer(0 , 1 , 1792, "Checked_NoticeAboutMagokoro_MainIsland" )}, // まごころ雑巾解禁時の自宅、撮影所の初回ダイアログ表示を行うべきかをチェック済み + {0x701, new EventFlagPlayer(0 , 1 , 1793, "NoticeBlackFridayToday" )}, // ブラックフライデー|今日開催中告知を聞いた? + {0x702, new EventFlagPlayer(0 , 1 , 1794, "HotelUnlockDIYTrade" )}, // 本島ホテル|DIY家具トレードを解禁した? + {0x703, new EventFlagPlayer(0 , 1 , 1795, "ReserveTotalTradeBonus" )}, // かっぺい |今回のDIY家具トレードで長期ボーナスが発生したか + {0x704, new EventFlagPlayer(0 , 1 , 1796, "ReserveTradeRemakeBonus" )}, // かっぺい |今回のDIY家具トレードでリメイクボーナスが発生したか + {0x705, new EventFlagPlayer(0 , 1 , 1797, "ReserveTotalTradeBonusMultiPlay" )}, // かっぺい |通信中にDIY家具トレードで長期ボーナスが発生したか + {0x706, new EventFlagPlayer(0 , 1 , 1798, "ReserveTradeRemakeBonusMultiPlay" )}, // かっぺい |通信中にDIY家具トレードでリメイクボーナスが発生したか + {0x707, new EventFlagPlayer(0 , 9999, 1799, "ReserveTradeBonusTicketNum" )}, // かっぺい |次回会話時に受け取るボーナスチケットの総枚数 + {0x708, new EventFlagPlayer(0 , 1 , 1800, "IsClearHotelWorkDataByOther" )}, // ホテル|自分の作業途中のデータが他者に破棄されたか + {0x70A, new EventFlagPlayer(0 , 3 , 1802, "OpenedHotelCatalogLevel" )}, // ホテル|閲覧済みの新規家具交換カタログUIの解禁段階 + {0x70C, new EventFlagPlayer(0 , 1 , 1804, "IsOpenedHotelCatalogBefore" )}, // ホテル|新規家具交換カタログUIを開いたことがあるか + {0x70D, new EventFlagPlayer(0 , 1 , 1805, "IsFirstEnterToCloudIslandThisTime" )}, // オンライン島|今回のセッションですでに入場したか + {0x70F, new EventFlagPlayer(0 , 1 , 1807, "SeqHotelEditTutorialDone" )}, // ホテル | 部屋編集チュートリアルが完了したか? + {0x712, new EventFlagPlayer(0 , 1 , 1810, "HeardThanksToMakeVIPRoom" )}, // ホテル|VIPルーム作ったお礼を聞いた + {0x713, new EventFlagPlayer(0 , 1 , 1811, "FinishEditVIPRoomToday" )}, // ホテル|今日の分のVIPルームを作成済み + {0x714, new EventFlagPlayer(0 , 2 , 1812, "HotelVIPInvitePattern" )}, // ホテル|VIP客の誘致パターン + {0x715, new EventFlagPlayer(0 , 1 , 1813, "WHEREAREN_Is1stKKFesDone" )}, // OneRoom|初回けけフェスを見たか? + {0x716, new EventFlagPlayer(0 , 1 , 1814, "SeqHotelIntroductionDone" )}, // ホテル | ホテルの初回説明チュートリアルが完了したか? + {0x717, new EventFlagPlayer(0 , 1 , 1815, "SeqHotelFurnitureIntroductionDone" )}, // ホテル | ホテル家具交換の初回説明チュートリアルが完了したか? + {0x719, new EventFlagPlayer(0 , 1 , 1817, "HotelSpeakTokpm" )}, // ホテル | 今日クーコに話しかけたか? + {0x71A, new EventFlagPlayer(0 , 8 , 1818, "HotelKnownUnlockRoom" )}, // ホテル | 解禁告知を聞いた一般客室の番号(4なら4号室まで解禁扱い) + {0x71B, new EventFlagPlayer(0 , 1 , 1819, "HotelVipRoomIntroductionDone" )}, // ホテル | VIPルームの初回説明チュートリアルが完了したか? + {0x71C, new EventFlagPlayer(0 , 1 , 1820, "HotelNotOpenIntroductionDone" )}, // ホテル | 未営業時の立て付け説明を受けたか? + {0x71D, new EventFlagPlayer(0 , 1 , 1821, "ReserveHotelMannequinTutorial" )}, // ホテル | マネキンの初回説明チュートリアルの発生予約フラグ + {0x71E, new EventFlagPlayer(0 , 1 , 1822, "SeqHotelMannequinTutorialDone" )}, // ホテル | マネキンの初回説明チュートリアルが完了したか? + {0x71F, new EventFlagPlayer(0 , 1 , 1823, "NpcTidyFirstTalk" )}, // リセットさん|面識ある? + {0x720, new EventFlagPlayer(0 , 1 , 1824, "PAnnounceHotelBuint" )}, // 島内放送|ホテル建物完成告知を聞いたか? + {0x721, new EventFlagPlayer(0 , 1 , 1825, "PAnnounceHotelOpend" )}, // 島内放送|ホテル営業開始告知を聞いたか? + {0x722, new EventFlagPlayer(0 , 2 , 1826, "TodayWanderingNpcInvitePattern" )}, // ホテル |今日の宿案内NPCの誘致パターン + {0x728, new EventFlagPlayer(0 , 1 , 1832, "NoticeUsingStorageForDIY" )}, // DIYまたは調理台で収納が利用できる通知をみたか + {0x729, new EventFlagPlayer(0 , 1 , 1833, "GrowUpAfterPatch3_0" )}, // 3.0を適用して成長処理をした + {0x72B, new EventFlagPlayer(0 , 1 , 1835, "WasEnableStorageBefore3_0" )}, // 3.0適用前に収納を解放していた + {0x72C, new EventFlagPlayer(0 , 1 , 1836, "NpcTidyTalkToday" )}, // リセットさん|今日すでに会話した? + {0x72D, new EventFlagPlayer(0 , 1 , 1837, "NpcTidyFirstTalkToday" )}, // リセットさん|今日初めて会話した? + {0x72E, new EventFlagPlayer(0 , 1 , 1838, "NpcTidyCall" )}, // リセットさん|今日リセットさんを呼びだした本人? + {0x72F, new EventFlagPlayer(0 , 1 , 1839, "HeldCeremonyHotel" )}, // セレモニー|ホテルを開いた + {0x730, new EventFlagPlayer(0 , 1 , 1840, "NpcTidyRequestBeforeFlag" )}, // リセットさん|今までに片付け依頼したことある? + {0x731, new EventFlagPlayer(0 , 1 , 1841, "NpcTidyRequestTodayFlag" )}, // リセットさん|今日自分が片付け依頼した? + {0x732, new EventFlagPlayer(0 , 1 , 1842, "UnlockCloudIsland" )}, // オンライン島|ベッド選択肢解禁している? + {0x733, new EventFlagPlayer(0 , 1 , 1843, "IsFirstExplainedCloudIsland" )}, // オンライン島(持ち帰り)|初回説明済んでいる? + {0x734, new EventFlagPlayer(0 , 1 , 1844, "FirstVisitCloudIsland" )}, // オンライン島(持ち帰り)|自分の島に行ったことがある? + {0x735, new EventFlagPlayer(0 , 1 , 1845, "IsExplainedLoadCloudIsland" )}, // オンライン島(持ち帰り)|ロード説明済んでいる? + {0x736, new EventFlagPlayer(0 , 1 , 1846, "NoticeEnableMultiCreationDIY" )}, // DIYまたは調理台で複数作成ができる通知を見たか + {0x737, new EventFlagPlayer(0 , 1 , 1847, "FirstForceTalkCloudIsland" )}, // オンライン島(持ち帰り)|オン島の最初の強制会話聞いた? + {0x738, new EventFlagPlayer(0 , 1 , 1848, "IsBedWaitRightSideCloudIsland" )}, // オンライン島に行くときにベッドの右側に寝たか + {0x739, new EventFlagPlayer(0 , 1 , 1849, "NoticeUsingStorageForRemake" )}, // リメイクで収納のリメイクキットが利用できる通知を見たか + {0x73A, new EventFlagPlayer(0 , -1 , 1850, "HotelCoordinatedVIPCount_VisitingNPC" )}, // ホテル|1-8号室NPCにVIPを作った回数 + {0x73B, new EventFlagPlayer(0 , -1 , 1851, "HotelCoordinatedVIPCount_amiibo" )}, // ホテル|amiiboでNPCを招待してVIPを作った回数 + {0x73C, new EventFlagPlayer(0 , -1 , 1852, "HotelCoordinatedVIPCount" )}, // ホテル|VIPルームを作った回数 + {0x73D, new EventFlagPlayer(0 , 1 , 1853, "SeoNotGetPearlFlag" )}, // ラコスケ|持ち物いっぱいでしんじゅ貰えなかった + {0x73E, new EventFlagPlayer(0 , 1 , 1854, "NpcTidyPayTodayFlag" )}, // リセットさん|今日自分が片付け料金払った? + {0x73F, new EventFlagPlayer(0 , -1 , 1855, "DiyCountUpdatedVer3_0" )}, // Tips|Ver3.0アプデ後にDIYまたは料理をおこなった回数 + {0x740, new EventFlagPlayer(0 , -1 , 1856, "DiyCountMultiMake" )}, // Tips|複数作成をDIYまたは料理でおこなった回数 + {0x741, new EventFlagPlayer(0 , 1 , 1857, "NpcTidyFirstRequestTodayFlag" )}, // リセットさん|今日初回無料? + {0x742, new EventFlagPlayer(0 , 1 , 1858, "HotelRoom4UnlockIntroductionDone" )}, // ホテル | 4号室解禁の前振りを聞いたか? + {0x743, new EventFlagPlayer(0 , 1 , 1859, "UnlockZeldaCollabo" )}, // コラボ解禁_ゼルダ + {0x744, new EventFlagPlayer(0 , 1 , 1860, "UnlockSplatoonCollabo" )}, // コラボ解禁_スプラトゥーン + {0x745, new EventFlagPlayer(0 , 1 , 1861, "HotelVipRoomLeadIn" )}, // ホテル | VIP解禁の前振りを聞いたか? + {0x746, new EventFlagPlayer(0 , 1 , 1862, "HotelRoom6UnlockIntroductionDone" )}, // ホテル | 6号室解禁の前振りを聞いたか? + {0x747, new EventFlagPlayer(0 , 1 , 1863, "HotelRoom8UnlockIntroductionDone" )}, // ホテル | 8号室解禁の前振りを聞いたか? + {0x748, new EventFlagPlayer(0 , 1 , 1864, "HotelMakingRoom1" )}, // ホテル | 1号室を完成させた本人か? + {0x749, new EventFlagPlayer(0 , 1 , 1865, "HotelOpenVipRoom" )}, // ホテル | VIP解禁条件を達成した本人か? + {0x74A, new EventFlagPlayer(0 , 1 , 1866, "IsAnyNpcCalledWithMegaphone" )}, // いずれかのNPCをメガホンで呼び出したか? + {0x74B, new EventFlagPlayer(0 , 1 , 1867, "IsExplainedSwitch2EditionMode" )}, // おでかけ|Switch2Editionの説明をした? + {0x74C, new EventFlagPlayer(0 , 1 , 1868, "HotelNotListenToHowToEdit" )}, // ホテル | コーディネートの進め方について説明を聞いていない + {0x74D, new EventFlagPlayer(0 , 1 , 1869, "HotelTutorialSkip" )}, // ホテル | エディットチュートリアルをスキップしたか? + {0x74E, new EventFlagPlayer(0 , 1 , 1870, "NpcKpmFirstTalk" )}, // クーコ | 面識ある? + {0x74F, new EventFlagPlayer(0 , 1 , 1871, "NpcKpgFirstTalk" )}, // ゲコ | 面識ある? + {0x750, new EventFlagPlayer(0 , 1 , 1872, "NpcKpsFirstTalk" )}, // クク | 面識ある? + {0x751, new EventFlagPlayer(0 , 1 , 1873, "TodayVisitTapCloudIndoor" )}, // オンライン島(持ち帰り)|今日ゆめみシーンに行った + {0x752, new EventFlagPlayer(0 , 1 , 1874, "SelCloudIslandOnBed" )}, // オンライン島|ベッド選択肢選んだことある? + {0x753, new EventFlagPlayer(0 , 1 , 1875, "SloExplainWeeding_After3" )}, // レイジ|3.0パッチ後に初めて草むしりサービスの説明聞いた + {0x754, new EventFlagPlayer(0 , 1 , 1876, "SloExplainWeedingPriceDown" )}, // レイジ|3.0パッチ後に草むしりサービス価格変更の説明聞いた + {0x755, new EventFlagPlayer(0 , -1 , 1877, "HotelDiyTradeAchieveOrderNum" )}, // Tips|DIY家具トレードをクリアした回数 + {0x756, new EventFlagPlayer(0 , -1 , 1878, "HighPriceTradeOrderBonusPoint" )}, // DIY家具トレード|高値ボーナスポイント + {0x757, new EventFlagPlayer(0 , -1 , 1879, "HighPriceTradeOrderBonusPointBackup" )}, // DIY家具トレード|高値ボーナスポイント(予備) + {0x758, new EventFlagPlayer(0 , -1 , 1880, "HighPriceTradeOrderBonusItemRecipeID" )}, // DIY家具トレード|高値ボーナスアイテムレシピID + {0x759, new EventFlagPlayer(0 , -1 , 1881, "HighPriceTradeOrderBonusItemLapsedDays" )}, // DIY家具トレード|高値ボーナスアイテム設定経過日数 + {0x75A, new EventFlagPlayer(0 , -1 , 1882, "HighPriceTradeOrderBonusTicketNum" )}, // DIY家具トレード|高値ボーナスアイテム報酬枚数 + {0x75B, new EventFlagPlayer(0 , -1 , 1883, "HighPriceTradeOrderBonusCandidateTicketNum" )}, // DIY家具トレード|高値ボーナス候補アイテム報酬枚数 + {0x75C, new EventFlagPlayer(0 , 1 , 1884, "TodayHighPriceTradeOrderBonusEvent" )}, // DIY家具トレード|高値ボーナスイベントが今日の発生状況制御用 + {0x75D, new EventFlagPlayer(0 , 7 , 1885, "HighPriceTradeOrderBonusOccurCount" )}, // DIY家具トレード|高値ボーナスイベント発生までの日数カウンタ + {0x75E, new EventFlagPlayer(0 , 1 , 1886, "DodRemoveMannequinRentalCode" )}, // モーリー | モーリーにマネキンレンタルコーデを強制解除されたことがある? + {0x760, new EventFlagPlayer(0 , 1 , 1888, "HasSetVineOrFixLadderAfterVer3_0" )}, // Ver3.0.0を適用後にツルまたは設置はしごを配置したことがある + {0x761, new EventFlagPlayer(0 , 1 , 1889, "NotEditTutorialTalkNpcKpg" )}, // ゲコ | エディットチュートリアル前にゲコと話した? + {0x763, new EventFlagPlayer(0 , 1 , 1891, "IsAchivedTradeOrderBonusOnce" )}, // DIY家具トレード|ボーナスを一度でも達成したか? + {0x764, new EventFlagPlayer(0 , 4 , 1892, "OpenNewFurnitureNews" )}, // ゲコ | 新規家具解禁のお知らせを聞いた段階 + {0x765, new EventFlagPlayer(0 , 1 , 1893, "HotelStoreFirstBuyItem" )}, // ゲコ | みやげやで、家具が増えることについての説明を聞いたか? + {0x766, new EventFlagPlayer(0 , 1 , 1894, "NpcKpgFirstTalkToday" )}, // ゲコ | 今日ゲコと話した? + {0x76A, new EventFlagPlayer(0 , 1 , 1898, "NoticeAboutMouseInteriorMode" )}, // マウス | インテリアモードでマウス操作説明ダイアログを見たか + {0x76B, new EventFlagPlayer(0 , 1 , 1899, "NoticeAboutMouseMyDesign" )}, // マウス | マイデザインでマウス操作説明ダイアログを見たか + {0x76C, new EventFlagPlayer(0 , 1 , 1900, "NoticeAboutMouseBoard" )}, // マウス | 掲示板でマウス操作説明ダイアログを見たか + {0x76D, new EventFlagPlayer(0 , 1 , 1901, "HasBoughtFromHotelCatalog" )}, // ホテル | ホテルカタログで買い物をしたことがあるか + {0x76E, new EventFlagPlayer(0 , 1 , 1902, "Mobile1stBoot_MydesignCloudIsland" )}, // スマホアプリ初起動|マイデザインをオン島で初起動 + {0x76F, new EventFlagPlayer(0 , 1 , 1903, "Mobile1stBoot_MydesignCloudIsland_Guest" )}, // スマホアプリ初起動|マイデザインをよそのオン島で初起動 + {0x770, new EventFlagPlayer(0 , 1 , 1904, "FamicomCheckFlag1" )}, // ファミコン家具|ファミリーコンピュータをチェックしたことある? + {0x771, new EventFlagPlayer(0 , 1 , 1905, "FamicomCheckFlag2" )}, // ファミコン家具|NESをチェックしたことある? + {0x772, new EventFlagPlayer(0 , 1 , 1906, "FamicomCheckFlag3" )}, // ファミコン家具|ディスクシステムをチェックしたことある? + {0x773, new EventFlagPlayer(0 , 1 , 1907, "FamicomCheckFlag4" )}, // ファミコン家具|スーパーファミコンをチェックしたことある? + {0x774, new EventFlagPlayer(0 , 1 , 1908, "FamicomCheckFlag5" )}, // ファミコン家具|SUPER NINTENDO EUをチェックしたことある? + {0x775, new EventFlagPlayer(0 , 1 , 1909, "FamicomCheckFlag6" )}, // ファミコン家具|SUPER NINTENDO USをチェックしたことある? + {0x776, new EventFlagPlayer(0 , 1 , 1910, "FamicomCheckFlag7" )}, // ファミコン家具|ゲームボーイをチェックしたことある? + {0x777, new EventFlagPlayer(0 , 1 , 1911, "FamicomCheckNSOFlag" )}, // ファミコン家具|ファミコン家具をチェックしたことある? + {0x778, new EventFlagPlayer(0 , 1 , 1912, "NoticeAboutLiveFaceIntroduceDialog" )}, // LiveFace | LiveFace紹介ダイアログを表示したか + {0x779, new EventFlagPlayer(0 , 1 , 1913, "NoticeAboutLiveFaceMinusBtnMenuDialog" )}, // LiveFace | 初回説明ダイアログを表示したか + {0x77A, new EventFlagPlayer(0 , 1 , 1914, "HotelHasEditedMannequin" )}, // ホテル | マネキンコーデを1度でも編集して保存した + {0x77B, new EventFlagPlayer(0 , 1 , 1915, "PlayOnceAfterUpdateAOC" )}, // メガホン|メガホン手紙配送のチェックをしたか + {0x77C, new EventFlagPlayer(0 , 1 , 1916, "ExplainMegaphone" )}, // メガホン|まめきちからメガホンの説明を聞いたか + {0x77D, new EventFlagPlayer(0 , 1 , 1917, "UnlockBuyMegaphone" )}, // お店|メガホンの陳列開始 + {0x77E, new EventFlagPlayer(0 , 2 , 1918, "RcoStorageExpansion_v300" )}, // たぬきち|収納の拡張(v3.0.0)追加段階0~2 + {0x77F, new EventFlagPlayer(0 , 1 , 1919, "MailSend_Notice_v300_AddStorage" )}, // たぬきち|収納の拡張(v3.0.0)段階追加お知らせの手紙判定したか? + {0x780, new EventFlagPlayer(0 , 1 , 1920, "RcoStandbyNotice_v300_AddStorage" )}, // たぬきち|収納の拡張(v3.0.0)段階追加のお知らせ強制会話するか? + {0x782, new EventFlagPlayer(0 , 1 , 1922, "KpsNpcInviteBefore" )}, // クク | 宿案内のボーナスもらったことある? + {0x783, new EventFlagPlayer(0 , 1 , 1923, "ReserveHotelintroduction" )}, // ホテル|初回説明チュートリアルを予約する(ON後OFFにしない) + {0x784, new EventFlagPlayer(0 , 1 , 1924, "IsAccessHotelMannequin" )}, // ホテル|マネキンに一度でもアクセスしたことがあるか? + {0x785, new EventFlagPlayer(0 , 1 , 1925, "RcoStorageMax5000_Before_v300" )}, // たぬきち|収納の拡張(v3.0.0)v3.0アプデ時点で最大5000拡張済み? + {0x786, new EventFlagPlayer(0 , 1 , 1926, "KpmTalkToOpenHotel" )}, // ホテル | ホテルが営業開始したというクーコのセリフを聞いた? + {0x787, new EventFlagPlayer(0 , 1 , 1927, "KpmEditTutorialFirstTalk" )}, // ホテル | エディットチュートリアルの最初の受付セリフを聞いた? + {0x788, new EventFlagPlayer(0 , 1 , 1928, "HotelEditCompletedToday" )}, // ホテル | 今日ホテルの部屋編集を完了させたか? + {0x789, new EventFlagPlayer(0 , 1 , 1929, "SelectPitfallCloudIslnad" )}, // オンライン島(持ち帰り)|おとしあなのタネの説明済んでいる? + {0x78A, new EventFlagPlayer(0 , 1 , 1930, "KppFirstTalkHotel" )}, // かっぺい|ホテルチュートリアルで初対面だった + {0x78B, new EventFlagPlayer(0 , 1 , 1931, "HeardMileTourHintFromHAAN" )}, // メインシーケンス|マイルツアーのヒントをHAやANから聞いた? + {0x78C, new EventFlagPlayer(0 , 1 , 1932, "KppFirstTalkHotel_BoatTalk" )}, // かっぺい|ホテルチュートリアルで初対面の後、ボートツアーの説明した + {0x78D, new EventFlagPlayer(0 , -1 , 1933, "FamicomPlayCount1" )}, // ファミコン家具|ファミリーコンピュータを遊んだ回数 + {0x78E, new EventFlagPlayer(0 , -1 , 1934, "FamicomPlayCount2" )}, // ファミコン家具|NESを遊んだ回数 + {0x78F, new EventFlagPlayer(0 , -1 , 1935, "FamicomPlayCount3" )}, // ファミコン家具|ディスクシステムを遊んだ回数 + {0x790, new EventFlagPlayer(0 , -1 , 1936, "FamicomPlayCount4" )}, // ファミコン家具|スーパーファミコンを遊んだ回数 + {0x791, new EventFlagPlayer(0 , -1 , 1937, "FamicomPlayCount5" )}, // ファミコン家具|SUPER NINTENDO EUを遊んだ回数 + {0x792, new EventFlagPlayer(0 , -1 , 1938, "FamicomPlayCount6" )}, // ファミコン家具|SUPER NINTENDO USを遊んだ回数 + {0x793, new EventFlagPlayer(0 , -1 , 1939, "FamicomPlayCount7" )}, // ファミコン家具|ゲームボーイを遊んだ回数 + {0x794, new EventFlagPlayer(0 , -1 , 1940, "MegaphoneUseCount" )}, // メガホン|使用回数 + {0x795, new EventFlagPlayer(0 , 1 , 1941, "TodayGetHotelCoupon" )}, // ホテル | 今日エディット報酬もらった? + {0x796, new EventFlagPlayer(0 , -1 , 1942, "GetHighPriceTradeOrderBonusCount" )}, // DIY家具トレード|高値ボーナスを受け取った回数 + {0x797, new EventFlagPlayer(0 , -1 , 1943, "ChangeStickUseCount" )}, // 変身ステッキ|使用回数 + {0x798, new EventFlagPlayer(0 , 1 , 1944, "EditFirstRoundExplain" )}, // ホテル | エディット1周目の説明を聞いた? + {0x799, new EventFlagPlayer(0 , 1 , 1945, "SzaTalkAboutFutureNature" )}, // しずえ|島の評判:花の成長を待つアドバイスを今日聞いた + {0x79A, new EventFlagPlayer(0 , 1 , 1946, "EditFirstRoundFinish" )}, // ホテル | エディット1周目を終えたか? + {0x79B, new EventFlagPlayer(0 , 1 , 1947, "EditTutorialFirstCustomer" )}, // ホテル | エディットチュートリアルでお客様1人目が来た + {0x79C, new EventFlagPlayer(0 , -1 , 1948, "GetTotalTradeBonusCount" )}, // DIY家具トレード|アチーブボーナスが発生した回数 + {0x79D, new EventFlagPlayer(0 , -1 , 1949, "GetTradeRemakeBonusCount" )}, // DIY家具トレード|リメイクボーナスが発生した回数 + {0x79F, new EventFlagPlayer(0 , 1 , 1951, "VIPOpenExplanationAtFloor" )}, // ホテル | VIPが解禁された説明を受付で聞いた? + {0x7A0, new EventFlagPlayer(0 , 1 , 1952, "EditRework" )}, // ホテル | 手直しは報酬がもらえないという説明を聞いた? + {0x7A1, new EventFlagPlayer(0 , 1 , 1953, "ReserveFirstTradeBonus" )}, // かっぺい | 初回ボーナス発生予約 + {0x7A2, new EventFlagPlayer(0 , 1 , 1954, "HasActivateChatMultiPlay" )}, // LiveFace | 通信プレイ中に本体チャット機能を起動したことがあるか + {0x7A3, new EventFlagPlayer(0 , 1 , 1955, "EditVIPRoomFirstRound" )}, // ホテル | VIPエディット1周目か? + {0x7A4, new EventFlagPlayer(0 , 1 , 1956, "EditTutorialFirstTalkKpm" )}, // ホテル | エディットチュートリアルの受付セリフ1回目を聞いた? + {0x7A5, new EventFlagPlayer(0 , 1 , 1957, "EditTutorialFirstTalkKpmAfterHotelOpen" )}, // ホテル | エディットチュートリアルの受付セリフ1回目を聞いた?(ホテルオープン後) + {0x7A6, new EventFlagPlayer(0 , 1 , 1958, "HotelEditCameraExplanation" )}, // ホテル | カメラアプリで写真を撮ってほしいという説明を聞いた? + {0x7A7, new EventFlagPlayer(0 , 1 , 1959, "AfterEditFirstRound" )}, // ホテル | エディット2周目以降の説明を予約 + {0x7A8, new EventFlagPlayer(0 , 1 , 1960, "HotelKpmTodayGreeting" )}, // ホテル | クーコの今日の挨拶を聞いたか? + {0x7A9, new EventFlagPlayer(0 , 1 , 1961, "HotelStoreKpgTalkEdit" )}, // ホテル | ゲコとエディットチュートリアルの話をしたか?(チュートリアル前) + {0x7AA, new EventFlagPlayer(0 , 1 , 1962, "HotelStoreKpgTalkItem" )}, // ホテル | ゲコと陳列商品の話をしたか?(チュートリアル前) + {0x7AB, new EventFlagPlayer(0 , 1 , 1963, "WHEREAREN_IsFirstKKFesDay" )}, // OneRoom|初回けけフェス当日か? + {0x7AC, new EventFlagPlayer(0 , 1 , 1964, "NpcKpmMorningGreeting" )}, // クーコ | 朝の挨拶を聞いた? + {0x7AD, new EventFlagPlayer(0 , 1 , 1965, "NpcKpmAfternoonGreeting" )}, // クーコ | 昼の挨拶を聞いた? + {0x7AE, new EventFlagPlayer(0 , 1 , 1966, "NpcKpmNightGreeting" )}, // クーコ | 夜の挨拶を聞いた? + {0x7AF, new EventFlagPlayer(0 , 1 , 1967, "HotelOpenElplanation" )}, // ホテル | ホテルがオープンしたという話を聞いた? + {0x7B0, new EventFlagPlayer(0 , 1 , 1968, "HotelVIPTutorialEndExplanation" )}, // ホテル | (2人目以降限定)VIPチュートリアル終わりの説明を予約 + {0x7B1, new EventFlagPlayer(0 , 1 , 1969, "UnlockRoomNewsNext" )}, // ホテル | 客室解禁予告の次のテキストを予約 + {0x7B2, new EventFlagPlayer(0 , 1 , 1970, "HotelNewVIPRoomText" )}, // ホテル | VIP(新規)の〆テキスト予約 + {0x7B3, new EventFlagPlayer(0 , 1 , 1971, "HotelRoomReworkText" )}, // ホテル | 手直しの〆テキスト予約 + {0x7B4, new EventFlagPlayer(0 , 1 , 1972, "HotelNewRoomText" )}, // ホテル | 一般客室(新規)の〆テキスト予約 + {0x7B5, new EventFlagPlayer(0 , 1 , 1973, "HotelRoomText" )}, // ホテル | はじめから作り直すの〆テキスト予約 + {0x7B6, new EventFlagPlayer(0 , 1 , 1974, "PAnnounceHotelConstruct" )}, // 島内放送|ホテル工事中告知を聞いたか? + {0x7B7, new EventFlagPlayer(0 , 1 , 1975, "CanNotGetHotelCouponToday" )}, // ホテル | 今日はもうホテルクーポンがもらえないって聞いた? + {0x7B8, new EventFlagPlayer(0 , 7 , 1976, "ClearedHotelWorkRoomIndex" )}, // ホテル|破棄された作業中データで編集していた部屋インデックス + {0x7B9, new EventFlagPlayer(0 , 1 , 1977, "HotelInvitedOtg" )}, // ホテル|タクミをVIPとして招待した(部屋完成した)ことがある + {0x7BA, new EventFlagPlayer(0 , 1 , 1978, "BocSendBambooShoots" )}, // ウリ|たけのこ送ったことある? + {0x7BB, new EventFlagPlayer(0 , 1 , 1979, "KppTakeTour2TodayFlag" )}, // かっぺい|今日2回目のかっぺいツアー参加した? + {0x7BC, new EventFlagPlayer(0 , 1 , 1980, "HotelIsAddForHotelEditSPToday" )}, // ホテル|今日客室エディットでHotelSPを加算したか + {0x7BD, new EventFlagPlayer(0 , 1 , 1981, "KppTakeTour2ExplainFlag" )}, // かっぺい|かっぺいツアー2回行ける説明聞いたことある? + {0x7BE, new EventFlagPlayer(0 , 1 , 1982, "RcoNoticeHotelCeremony" )}, // たぬきち|ホテルオープン当日1部屋目作成者にセレモニー告知した? + {0x7BF, new EventFlagPlayer(0 , 1 , 1983, "Kpp2ndBoatTourTips" )}, // Tips|かっぺいの1日2度目のボートツアーのtips開始 + {0x7C1, new EventFlagPlayer(0 , 1 , 1985, "KpgTalkToHotelCoupon" )}, // ホテル | ホテルクーポンについてゲコが触れたことがある? + {0x7C5, new EventFlagPlayer(0 , 1 , 1989, "KpsTodayTalk" )}, // クク | 今日ククと会話した? + {0x7C6, new EventFlagPlayer(0 , -1 , 1990, "HotelDiyTradeAchieveOrderNumNowIsland" )}, // DIY家具トレード|今の島でDIY家具トレードをクリアした回数 + {0x7C7, new EventFlagPlayer(0 , 1 , 1991, "PlayerMovingWithHotelCoupon" )}, // プレイヤーだけ引越し|ホテルクーポンを所持してPだけ引越しした? + {0x7C8, new EventFlagPlayer(0 , 1 , 1992, "NoticeAboutPMovinghTapDream" )}, // ゆめみ|面識を作った状態で、プレイヤーだけ引越しをした通知を行う + {0x7C9, new EventFlagPlayer(0 , 1 , 1993, "ReadFixedWalkTecnique" )}, // 島クリエイター|向き固定歩きテクニックを見た? + {0x7CA, new EventFlagPlayer(0 , 1 , 1994, "HotelIsRentalFromOtherIsland" )}, // ホテル | 他人の島でレンタルしたか }; private const string Unknown = "???"; diff --git a/NHSE.Core/Structures/Records/EventFlagVillager.cs b/NHSE.Core/Structures/Records/EventFlagVillager.cs index a31fd1e..b1a761c 100644 --- a/NHSE.Core/Structures/Records/EventFlagVillager.cs +++ b/NHSE.Core/Structures/Records/EventFlagVillager.cs @@ -82,6 +82,10 @@ public EventFlagVillager(short v1, short v2, ushort index, string name) {0x04A, new EventFlagVillager(0 , 3 , 0074, "ReserveDIYStatus" )}, // 家コーディネートの作業台の状態予約 {0x04B, new EventFlagVillager(0 , 3 , 0075, "AudioShuffleState" )}, // 編集された部屋のオーディオのシャッフル設定 {0x04C, new EventFlagVillager(0 , 3 , 0076, "IslandKitchenStandPos" )}, // 調理行動時アイランドキッチンの正面側に立つか + {0x04D, new EventFlagVillager(0 , 1 , 0077, "WeddingDishEventSet" )}, // 「リサとカイゾーのえざら」がイベント用処理として配置中か + {0x04E, new EventFlagVillager(0 , 10 , 0078, "RoseBouquetEventSet" )}, // 「ハートのバラブーケ」がイベント用処理として配置中か + {0x04F, new EventFlagVillager(0 , 1 , 0079, "MarketBuildingSupportToday" )}, // 今日お店の資材集め応援会話発生したか? + {0x050, new EventFlagVillager(0 , 1 , 0080, "MileTourTicketSupport" )}, // ツアーのヒント会話が発生したか? }; private const string Unknown = "???"; diff --git a/NHSE.Core/Structures/Records/EventFlagVillagerMemoryPlayer.cs b/NHSE.Core/Structures/Records/EventFlagVillagerMemoryPlayer.cs index ff6f8f4..ccb94ce 100644 --- a/NHSE.Core/Structures/Records/EventFlagVillagerMemoryPlayer.cs +++ b/NHSE.Core/Structures/Records/EventFlagVillagerMemoryPlayer.cs @@ -185,6 +185,8 @@ public EventFlagVillagerMemoryPlayer(byte init, byte max, ushort index, string n {0xA7, new EventFlagVillagerMemoryPlayer(0 , 1 , 167, "WHEREAREN_VisitWherearenWithPlayer" )}, // OneRoom|おみやげチョコレートを受け取ってウェアラン諸島に行ったことがあるか? {0xA8, new EventFlagVillagerMemoryPlayer(0 , 1 , 168, "TalkProgressMuseumBuiltCafe" )}, // 博物館(カフェ)への拡張に関するFreeH_Progressを聞いたか? {0xA9, new EventFlagVillagerMemoryPlayer(0 , 1 , 169, "WHEREAREN_GetChocolate" )}, // OneRoom|おみやげチョコレートを受け取ったことがあるか? + {0xAA, new EventFlagVillagerMemoryPlayer(0 , 10 , 170, "BromideRewardSkipCount" )}, // 報酬としてブロマイドを選ばないようにするカウンタ + {0xAB, new EventFlagVillagerMemoryPlayer(0 , 5 , 171, "DownFriendShipCount" )}, // 今日強制会話で親密度を下げた回数(Megaphone、Hit、Push) }; private const string Unknown = "???"; diff --git a/NHSE.Core/Structures/Records/LifeSupportAchievement.cs b/NHSE.Core/Structures/Records/LifeSupportAchievement.cs index abca671..f946234 100644 --- a/NHSE.Core/Structures/Records/LifeSupportAchievement.cs +++ b/NHSE.Core/Structures/Records/LifeSupportAchievement.cs @@ -189,6 +189,9 @@ public bool GetIsSatisfied(in int index, in uint count) {0x6B, new(107, 5, 0005, 0030, 0100, 0300, 0500, -1, -1, "CookFood" )}, // 料理した回数 {0x6C, new(108, 5, 0005, 0010, 0020, 0030, 0050, -1, -1, "DrinkCoffee" )}, // 喫茶店でコーヒーを飲んだ回数 {0x6D, new(109, 5, 0003, 0010, 0020, 0030, 0050, -1, -1, "JoinRadioGymnastics" )}, // ラジオ体操した回数 + {0x6E, new(110, 5, 0005, 0050, 0150, 0300, 0500, -1, 1794, "DIYTrade" )}, // DIYトレードをした + {0x6F, new(111, 3, 0001, 0005, 0010, 0000, 0000, -1, -1, "GuideNoRoomNPC" )}, // 宿無しNPCをホテルに導いた + {0x70, new(112, 3, 0001, 0005, 0020, 0000, 0000, -1, -1, "CoordinateHotelRoom" )}, // ホテルの客室コーディネートをした }; public static string GetName(int index, uint count, IReadOnlyDictionary str) diff --git a/NHSE.Core/Util/ArrayUtil.cs b/NHSE.Core/Util/ArrayUtil.cs index 6143469..87c8fb5 100644 --- a/NHSE.Core/Util/ArrayUtil.cs +++ b/NHSE.Core/Util/ArrayUtil.cs @@ -7,20 +7,67 @@ namespace NHSE.Core; /// public static class ArrayUtil { + //public static int ReplaceOccurrences(this Span array, ReadOnlySpan pattern, ReadOnlySpan swap) + //{ + // int count = 0; + // int ofs = 0; + // while (true) + // { + // var index = array[ofs..].IndexOf(pattern); + // if (index == -1) + // return count; + // ofs += index; + // + // swap.CopyTo(array[ofs..]); + // ofs += swap.Length; // skip past swapped data + // ++count; + // } + //} + public static int ReplaceOccurrences(this Span array, ReadOnlySpan pattern, ReadOnlySpan swap) { int count = 0; - int ofs = 0; while (true) { - var index = array[ofs..].IndexOf(pattern); - if (index == -1) + int ofs = IndexOfBytes(array, pattern); + if (ofs == -1) return count; - ofs += index; - swap.CopyTo(array[ofs..]); - ofs += swap.Length; // skip past swapped data ++count; } } + + /// + /// Finds a provided within the supplied . + /// + /// Array to look in + /// Pattern to look for + /// Starting offset to look from + /// Amount of entries to look through + /// Index the pattern occurs at; if not found, returns -1. + public static int IndexOfBytes(ReadOnlySpan array, ReadOnlySpan pattern, int startIndex = 0, int length = -1) + { + int len = pattern.Length; + int endIndex = length > 0 + ? startIndex + length + : array.Length - len - startIndex; + + endIndex = Math.Min(array.Length - pattern.Length, endIndex); + + int i = startIndex; + int j = 0; + while (true) + { + if (pattern[j] != array[i + j]) + { + if (++i == endIndex) + return -1; + j = 0; + } + else if (++j == len) + { + return i; + } + } + } } \ No newline at end of file diff --git a/NHSE.Tests/DumpTests.cs b/NHSE.Tests/DumpTests.cs index 8d56834..5b602b1 100644 --- a/NHSE.Tests/DumpTests.cs +++ b/NHSE.Tests/DumpTests.cs @@ -8,15 +8,14 @@ public static class DumpTests { private const string RepoPath = @"C:\Users\kapho\source\repos"; private const string PatchDumpPath = @"E:\acnh\" + PatchFolderName; - private const string PatchFolderName = "v20"; + private const string PatchFolderName = "v30"; private const string MessageDumpFormat = @"Message\String_{0}"; [Fact] public static void DumpBCSV() { const string folder = PatchDumpPath + @"\bcsv"; - if (!Directory.Exists(folder)) // skip this test if not properly configured for this test - return; + Assert.SkipUnless(Directory.Exists(folder), "Directory not found, skip."); // skip this test if not properly configured for this test GameBCSVDumper.UpdateDumps(folder, folder, true); } @@ -25,11 +24,10 @@ public static void DumpBCSV() public static void DumpMSBT() { const string folder = RepoPath; - if (!Directory.Exists(folder)) // skip this test if not properly configured for this test - return; const string dump = PatchDumpPath; - if (!Directory.Exists(dump)) // skip this test if not properly configured for this test - return; + Assert.SkipUnless(Directory.Exists(folder), "Repo not found, skip."); // skip this test if not properly configured for this test + Assert.SkipUnless(Directory.Exists(dump), "Dump not found, skip."); // skip this test if not properly configured for this test + GameMSBTDumperNHSE.Dump(folder, dump, MessageDumpFormat); } } \ No newline at end of file diff --git a/NHSE.Tests/NHSE.Tests.csproj b/NHSE.Tests/NHSE.Tests.csproj index a4dd9dc..cdf9742 100644 --- a/NHSE.Tests/NHSE.Tests.csproj +++ b/NHSE.Tests/NHSE.Tests.csproj @@ -7,7 +7,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive