From 5779b65b9b89168392883b6ae5ea1f61ea401700 Mon Sep 17 00:00:00 2001 From: Kurt Date: Wed, 6 May 2020 15:32:09 -0700 Subject: [PATCH] Adapt personal player struct to disassembled pseudo.h Similar to main's adaption in a prior commit, let's use the relative offsets. adds total nook miles earned to editor fixes the off-by-one indexing for achievement list --- NHSE.Core/Save/Files/Personal.cs | 20 ++- NHSE.Core/Save/Offsets/PersonalOffsets.cs | 11 +- NHSE.Core/Save/Offsets/PersonalOffsets10.cs | 35 ++-- NHSE.Core/Save/Offsets/PersonalOffsets11.cs | 33 ++-- NHSE.Core/Save/Offsets/PersonalOffsets12.cs | 31 ++-- .../Records/LifeSupportAchievement.cs | 168 +++++++++--------- NHSE.Parsing/GameBCSVDumper.cs | 2 - NHSE.WinForms/Editor.Designer.cs | 114 +++++++----- NHSE.WinForms/Editor.cs | 9 +- .../Subforms/Player/ItemReceivedEditor.cs | 4 +- 10 files changed, 249 insertions(+), 178 deletions(-) diff --git a/NHSE.Core/Save/Files/Personal.cs b/NHSE.Core/Save/Files/Personal.cs index 03130c5..98e28f6 100644 --- a/NHSE.Core/Save/Files/Personal.cs +++ b/NHSE.Core/Save/Files/Personal.cs @@ -54,8 +54,14 @@ public EncryptedInt32 Bank public EncryptedInt32 NookMiles { - get => EncryptedInt32.ReadVerify(Data, Offsets.NookMiles); - set => value.Write(Data, Offsets.NookMiles); + get => EncryptedInt32.ReadVerify(Data, Offsets.NowPoint); + set => value.Write(Data, Offsets.NowPoint); + } + + public EncryptedInt32 TotalNookMiles + { + get => EncryptedInt32.ReadVerify(Data, Offsets.TotalPoint); + set => value.Write(Data, Offsets.TotalPoint); } public IReadOnlyList Bag // Slots 21-40 @@ -94,16 +100,16 @@ public IReadOnlyList ItemChest set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.ItemChest + (Offsets.ItemChestCount * Item.SIZE)); } - public uint[] GetActivities() + public uint[] GetCountAchievement() { - var result = new uint[Offsets.MaxActivityID]; - Buffer.BlockCopy(Data, Offsets.Activity, result, 0, sizeof(uint) * result.Length); + var result = new uint[Offsets.MaxAchievementID]; + Buffer.BlockCopy(Data, Offsets.CountAchievement, result, 0, sizeof(uint) * result.Length); return result; } - public void SetActivities(uint[] activities) + public void SetCountAchievement(uint[] achievements) { - Buffer.BlockCopy(activities, 0, Data, Offsets.Activity, sizeof(uint) * Offsets.MaxActivityID); + Buffer.BlockCopy(achievements, 0, Data, Offsets.CountAchievement, sizeof(uint) * Offsets.MaxAchievementID); } public bool[] GetRecipeList() => ArrayUtil.GitBitFlagArray(Data, Offsets.Recipes, Offsets.MaxRecipeID + 1); diff --git a/NHSE.Core/Save/Offsets/PersonalOffsets.cs b/NHSE.Core/Save/Offsets/PersonalOffsets.cs index b15da18..8367803 100644 --- a/NHSE.Core/Save/Offsets/PersonalOffsets.cs +++ b/NHSE.Core/Save/Offsets/PersonalOffsets.cs @@ -9,24 +9,25 @@ public abstract class PersonalOffsets { public abstract int PersonalId { get; } public abstract int EventFlagsPlayer { get; } - public abstract int Activity { get; } + public abstract int CountAchievement { get; } public abstract int Wallet { get; } - public abstract int NookMiles { get; } + public abstract int NowPoint { get; } + public abstract int TotalPoint { get; } public abstract int Photo { get; } public abstract int Pockets1 { get; } public abstract int Pockets2 { get; } public abstract int ItemChest { get; } - public abstract int ReceivedItems { get; } + public abstract int ItemCollectBit { get; } public abstract int Bank { get; } public abstract int Recipes { get; } - public int MaxActivityID { get; } = 100; // guess + public int MaxAchievementID { get; } = 512; public int Pockets1Count { get; } = 20; public int Pockets2Count { get; } = 20; public int ItemChestCount { get; } = 5000; - public virtual int MaxRecipeID { get; } = 0x2A0; + public abstract int MaxRecipeID { get; } public static PersonalOffsets GetOffsets(FileHeaderInfo Info) { diff --git a/NHSE.Core/Save/Offsets/PersonalOffsets10.cs b/NHSE.Core/Save/Offsets/PersonalOffsets10.cs index c6892bd..f4ddfd1 100644 --- a/NHSE.Core/Save/Offsets/PersonalOffsets10.cs +++ b/NHSE.Core/Save/Offsets/PersonalOffsets10.cs @@ -5,19 +5,32 @@ /// public sealed class PersonalOffsets10 : PersonalOffsets { - public override int PersonalId => 0xB0A0; - public override int EventFlagsPlayer => PersonalId + 0x38; // +0x18 from v1.0, +0x18 after player name start - public override int Activity => 0xCF6C; - public override int NookMiles => 0x11570; - public override int Photo => 0x11598; + private const int Player = 0x108; - public override int Pockets1 => 0x35BD4; + public override int PersonalId => Player + 0xAF98; + public override int EventFlagsPlayer => Player + 0xAFD0; + + private const int GSaveLifeSupport = Player + 0xBFD0; + 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 + + private const int GSaveNetPlayerProfile = Player + 0x11480; + public override int Photo => GSaveNetPlayerProfile + 0x24; + + // end player + + private const int PlayerOther = 0x35BD0; + + public override int Pockets1 => PlayerOther + 0x4; public override int Pockets2 => Pockets1 + (8 * Pockets1Count) + 0x18; public override int Wallet => Pockets2 + (8 * Pockets2Count) + 0x18; - public override int ItemChest => Wallet + 0xC; - public override int ReceivedItems => 0x3FC1C; + public override int ItemChest => PlayerOther + 0x18C; + public override int ItemCollectBit => PlayerOther + 0xA04C; + public override int Bank => PlayerOther + 0x33014; + public override int Recipes => Bank + 0x10; - public override int Bank => 0x68BE4; - public override int Recipes => 0x68BF4; + public override int MaxRecipeID { get; } = 0x2A0; } -} \ No newline at end of file +} diff --git a/NHSE.Core/Save/Offsets/PersonalOffsets11.cs b/NHSE.Core/Save/Offsets/PersonalOffsets11.cs index ad1cd92..c606e95 100644 --- a/NHSE.Core/Save/Offsets/PersonalOffsets11.cs +++ b/NHSE.Core/Save/Offsets/PersonalOffsets11.cs @@ -5,20 +5,31 @@ /// public sealed class PersonalOffsets11 : PersonalOffsets { - public override int PersonalId => 0xB0B8; // +0x18 from v1.0 - public override int EventFlagsPlayer => PersonalId + 0x38; // +0x18 from v1.0, +0x18 after player name start - public override int Activity => 0xCF84; // +0x18 from v1.0 - public override int NookMiles => 0x11588; // +0x18 from v1.0 - public override int Photo => 0x115C4; // +0x18 from v1.0 + private const int Player = 0x110; - public override int Pockets1 => 0x35C20; // +0x4C from v1.0 + public override int PersonalId => Player + 0xAFA8; + public override int EventFlagsPlayer => Player + 0xAFE0; + + private const int GSaveLifeSupport = Player + 0xBFE0; + public override int CountAchievement => GSaveLifeSupport + 0xE98; + + public override int NowPoint => GSaveLifeSupport + 0x5498; // Nook Miles + public override int TotalPoint => NowPoint + 8; // Total Nook Miles Earned + + private const int GSaveNetPlayerProfile = Player + 0x11490; + public override int Photo => GSaveNetPlayerProfile + 0x24; + + // end player + + private const int PlayerOther = 0x35C10; + + 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 => Wallet + 0xC; - public override int ReceivedItems => 0x3FC68; // +0x4C from v1.0 - - public override int Bank => 0x68C34; // +0x50 from v1.0 - public override int Recipes => 0x68C44; // + 0x50 from v1.0 + public override int ItemChest => PlayerOther + 0x18C; + public override int ItemCollectBit => PlayerOther + 0xA058; + public override int Bank => PlayerOther + 0x33024; + public override int Recipes => Bank + 0x10; public override int MaxRecipeID { get; } = 0x2C8; } diff --git a/NHSE.Core/Save/Offsets/PersonalOffsets12.cs b/NHSE.Core/Save/Offsets/PersonalOffsets12.cs index eaf91f2..566cc0b 100644 --- a/NHSE.Core/Save/Offsets/PersonalOffsets12.cs +++ b/NHSE.Core/Save/Offsets/PersonalOffsets12.cs @@ -5,19 +5,30 @@ /// public sealed class PersonalOffsets12 : PersonalOffsets { - public override int PersonalId => 0xB0B8; - public override int EventFlagsPlayer => PersonalId + 0x38; - public override int Activity => 0xCF84; - public override int NookMiles => 0x11588; - public override int Photo => 0x117C4; // +0x3FC from v1.1 + private const int Player = 0x110; - public override int Pockets1 => 0x35E50; // +0x230 from v1.1 + 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 + + private const int GSaveNetPlayerProfile = Player + 0x11690; + public override int Photo => GSaveNetPlayerProfile + 0x24; + + // end player + + private const int PlayerOther = 0x35E40; + + 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 => Wallet + 0xC; - public override int ReceivedItems => 0x3FE98; // +0x230 from v1.1 - - public override int Bank => 0x6A424; // +0x17F0 from v1.1 + public override int ItemChest => PlayerOther + 0x18C; + public override int ItemCollectBit => PlayerOther + 0xA058; + public override int Bank => PlayerOther + 0x345E4; public override int Recipes => Bank + 0x10; public override int MaxRecipeID { get; } = 0x2CB; diff --git a/NHSE.Core/Structures/Records/LifeSupportAchievement.cs b/NHSE.Core/Structures/Records/LifeSupportAchievement.cs index e875781..2e0b231 100644 --- a/NHSE.Core/Structures/Records/LifeSupportAchievement.cs +++ b/NHSE.Core/Structures/Records/LifeSupportAchievement.cs @@ -22,90 +22,90 @@ public LifeSupportAchievement(short land, short player, ushort index, string nam public static readonly IReadOnlyDictionary List = new Dictionary { - {0x001, new LifeSupportAchievement( 3, -1, 0001, "CatchFish" )}, // サカナを釣った - {0x002, new LifeSupportAchievement( 3, -1, 0002, "CatchInsect" )}, // ムシを捕まえた - {0x003, new LifeSupportAchievement(-1, -1, 0003, "CatchFishContinuously" )}, // 連続で釣りを成功させた回数の最高記録 - {0x004, new LifeSupportAchievement(-1, -1, 0004, "FillFishList" )}, // サカナ図鑑を埋めた - {0x005, new LifeSupportAchievement(-1, -1, 0005, "FillInsectList" )}, // ムシ図鑑を埋めた - {0x006, new LifeSupportAchievement(-1, -1, 0006, "ShootDownBalloon" )}, // ふうせんを撃ち落とした - {0x007, new LifeSupportAchievement( 3, -1, 0007, "PlantFlowerSeed" )}, // 花の種を植えた - {0x008, new LifeSupportAchievement(-1, -1, 0008, "PlantFruit" )}, // 6種類のフルーツを植えた - {0x009, new LifeSupportAchievement(-1, -1, 0009, "PlantTreeSeedling" )}, // 木の苗を植えた - {0x00A, new LifeSupportAchievement(-1, -1, 0010, "BuyKabu" )}, // カブを買った - {0x00B, new LifeSupportAchievement(-1, -1, 0011, "HowmuchSellKabu" )}, // カブで得た累計利益 - {0x00C, new LifeSupportAchievement(-1, -1, 0012, "HowmuchBuyItem" )}, // これまでの買い物総額 - {0x00D, new LifeSupportAchievement(-1, -1, 0013, "BuyItemRcm" )}, // まめきちの店で買い物した - {0x00E, new LifeSupportAchievement(-1, -1, 0014, "SellItemRcm" )}, // まめきちの店で売った - {0x00F, new LifeSupportAchievement(-1, -1, 0015, "RemakeFurniture" )}, // リメイクをした - {0x010, new LifeSupportAchievement(-1, -1, 0016, "FillCatalog" )}, // カタログの項目数 - {0x011, new LifeSupportAchievement(-1, -1, 0017, "BuyItemCatalog" )}, // 通販を利用した - {0x012, new LifeSupportAchievement(-1, -1, 0018, "GotoTotakekeShow" )}, // とたけけのライブを観た - {0x013, new LifeSupportAchievement(-1, -1, 0019, "VisitAnotherIsland" )}, // よその島へのおでかけした - {0x014, new LifeSupportAchievement(-1, -1, 0020, "InviteFriend" )}, // 島にフレンドを招いた - {0x016, new LifeSupportAchievement(-1, -1, 0022, "DayPlayed" )}, // 活動日数 - {0x018, new LifeSupportAchievement(-1, -1, 0024, "WaterPlant" )}, // 水やりをした - {0x019, new LifeSupportAchievement(-1, -1, 0025, "BeStungbyWasp" )}, // ハチに刺された - {0x01A, new LifeSupportAchievement(-1, -1, 0026, "CatchSeminonukegara" )}, // セミのぬけがらを取った - {0x01B, new LifeSupportAchievement(-1, -1, 0027, "CatchNomi" )}, // ノミを取ってあげた - {0x01C, new LifeSupportAchievement(-1, -1, 0028, "BeStungbyPoisonousInsect" )}, // こわいムシで気絶した - {0x020, new LifeSupportAchievement(-1, -1, 0032, "FillReactionList" )}, // リアクションを覚えた - {0x021, new LifeSupportAchievement(-1, -1, 0033, "CatchTrash" )}, // ゴミを釣った - {0x022, new LifeSupportAchievement(-1, -1, 0034, "PayImmigrationCost" )}, // 移住費用を支払った - {0x023, new LifeSupportAchievement(-1, -1, 0035, "RepayLoan" )}, // ローンを完済した - {0x024, new LifeSupportAchievement( 3, -1, 0036, "UseMydesign" )}, // マイデザインを使った - {0x025, new LifeSupportAchievement(-1, -1, 0037, "UseMydesignPRO" )}, // マイデザインPROを使った - {0x026, new LifeSupportAchievement(-1, -1, 0038, "SellWeed" )}, // 雑草を引き取ってもらった - {0x028, new LifeSupportAchievement(-1, -1, 0040, "CollectGoldTool" )}, // 6種類の金の道具を集めた - {0x029, new LifeSupportAchievement(-1, -1, 0041, "GetSRankonHHA" )}, // HHAでSを取った - {0x02A, new LifeSupportAchievement(-1, -1, 0042, "AttendFishingConvention" )}, // 釣り大会に春夏秋冬参加した - {0x02B, new LifeSupportAchievement(-1, -1, 0043, "AttendInsectConvention" )}, // ムシとり大会に6~9月参加した - {0x02C, new LifeSupportAchievement(-1, -1, 0044, "HelpGul" )}, // ジョニーを助けた - {0x02D, new LifeSupportAchievement(-1, -1, 0045, "HelpGst" )}, // ゆうたろうを助けた - {0x02E, new LifeSupportAchievement(-1, -1, 0046, "MakePerfectSnowball" )}, // 最高のゆきだるまを作った - {0x02F, new LifeSupportAchievement(-1, -1, 0047, "ReachMyBirthday" )}, // 誕生日を迎えた - {0x030, new LifeSupportAchievement(-1, -1, 0048, "CelebrateVillagersBithday" )}, // 村民の誕生日を祝ってあげた - {0x031, new LifeSupportAchievement(-1, -1, 0049, "AttendCountdownParty" )}, // カウントダウンに参加した - {0x032, new LifeSupportAchievement(-1, -1, 0050, "BreakTool" )}, // 道具を壊した - {0x033, new LifeSupportAchievement(-1, -1, 0051, "SendLetter" )}, // 手紙を送った - {0x034, new LifeSupportAchievement(-1, -1, 0052, "MakePitfall" )}, // 落とし穴を作った - {0x035, new LifeSupportAchievement(-1, -1, 0053, "FallintoPitfall" )}, // 落とし穴に落ちた - {0x036, new LifeSupportAchievement(-1, -1, 0054, "ImmigratetoIsland" )}, // 島に移住した - {0x037, new LifeSupportAchievement(-1, -1, 0055, "BeFriendwithVillager" )}, // どうぶつとなかよしになった - {0x038, new LifeSupportAchievement(-1, -1, 0056, "FillRecipeList" )}, // 集めたレシピの数 - {0x039, new LifeSupportAchievement(-1, -1, 0057, "BootPhone" )}, // スマホを起動した(上級) - {0x03A, new LifeSupportAchievement(-1, -1, 0058, "StrikeRock8Times" )}, // コイン岩を8連打した - {0x03B, new LifeSupportAchievement(-1, 320, 0059, "AchieveAppQuest" )}, // 村活クエストを達成した - {0x03C, new LifeSupportAchievement(-1, -1, 0060, "AchieveVillagersQuest" )}, // どうぶつのお願いを聞いた - {0x03D, new LifeSupportAchievement(-1, -1, 0061, "DigBell" )}, // ベルを掘り出した - {0x03E, new LifeSupportAchievement(-1, -1, 0062, "DigFossil" )}, // 化石を掘り出した - {0x03F, new LifeSupportAchievement(-1, -1, 0063, "JudgeFossil" )}, // 化石を鑑定した - {0x040, new LifeSupportAchievement(66, -1, 0064, "DigShell" )}, // 潮干狩りをした - {0x041, new LifeSupportAchievement( 3, -1, 0065, "PutFurnitureOutside" )}, // 外に家具を置いた - {0x044, new LifeSupportAchievement(-1, -1, 0068, "StrikeWood" )}, // 木からもくざいを出した - {0x045, new LifeSupportAchievement( 3, -1, 0069, "GreetAllVillager" )}, // 村民全員とあいさつをした - {0x046, new LifeSupportAchievement( 3, -1, 0070, "SellShell" )}, // 貝殻を売った - {0x047, new LifeSupportAchievement( 3, -1, 0071, "SellFruit" )}, // フルーツを売った - {0x048, new LifeSupportAchievement(-1, -1, 0072, "CatchBeeContinuously" )}, // ハチを5連続捕まえた - {0x049, new LifeSupportAchievement(-1, -1, 0073, "DIYTool" )}, // 道具をDIYした - {0x04A, new LifeSupportAchievement(-1, -1, 0074, "DIYFurniture" )}, // 家具をDIYした - {0x04C, new LifeSupportAchievement( 3, -1, 0076, "TakePicture" )}, // カメラで写真を撮った - {0x04D, new LifeSupportAchievement(-1, -1, 0077, "BootPhoneBeginner" )}, // スマホを起動した(初級) - {0x04E, new LifeSupportAchievement(-1, -1, 0078, "HouseStorageItem" )}, // 家の倉庫に収納したアイテムの数 - {0x04F, new LifeSupportAchievement(-1, -1, 0079, "PlaceFurnitureMyHouse" )}, // 家に飾っている家具の数 - {0x050, new LifeSupportAchievement(-1, -1, 0080, "FallFurnitureLeaf" )}, // 木を揺すって家具(葉っぱ)を落とした回数 - {0x051, new LifeSupportAchievement(-1, -1, 0081, "DropPresentinWater" )}, // 風船のプレゼントを撃ち水の中に落とした - {0x052, new LifeSupportAchievement(-1, -1, 0082, "ReformMyHome" )}, // マイホームをリフォームした - {0x053, new LifeSupportAchievement(-1, -1, 0083, "ExtendMyHome" )}, // マイホームを増築した - {0x054, new LifeSupportAchievement( 3, -1, 0084, "PostMessageBoard" )}, // 自分の島の掲示板に書き込む - {0x055, new LifeSupportAchievement(-1, -1, 0085, "UseCloset" )}, // クローゼットで着替える - {0x056, new LifeSupportAchievement(-1, -1, 0086, "PrayShootingStar" )}, // 流れ星に祈る - {0x057, new LifeSupportAchievement(59, -1, 0087, "ChangeSymbol" )}, // 島の旗、島メロを変える - {0x058, new LifeSupportAchievement( 3, -1, 0088, "UpdatePassport" )}, // パスポートを更新した - {0x059, new LifeSupportAchievement(-1, 513, 0089, "ModifyIsland" )}, // 各地形造成をやってみた - {0x05A, new LifeSupportAchievement(-1, 478, 0090, "BuildFence" )}, // 柵を置く - {0x05B, new LifeSupportAchievement(-1, -1, 0091, "DonateFake" )}, // 寄贈しようとした美術品が贋作だった - {0x05C, new LifeSupportAchievement(-1, -1, 0092, "BuyatTsunekichiShop" )}, // いなりマーケットで芸術品を買った - {0x05D, new LifeSupportAchievement(-1, -1, 0093, "PlantBushSeedling" )}, // 各種低木の苗を植えた + {0x000, new LifeSupportAchievement( 3, -1, 0000, "CatchFish" )}, // サカナを釣った + {0x001, new LifeSupportAchievement( 3, -1, 0001, "CatchInsect" )}, // ムシを捕まえた + {0x002, new LifeSupportAchievement(-1, -1, 0002, "CatchFishContinuously" )}, // 連続で釣りを成功させた回数の最高記録 + {0x003, new LifeSupportAchievement(-1, -1, 0003, "FillFishList" )}, // サカナ図鑑を埋めた + {0x004, new LifeSupportAchievement(-1, -1, 0004, "FillInsectList" )}, // ムシ図鑑を埋めた + {0x005, new LifeSupportAchievement(-1, -1, 0005, "ShootDownBalloon" )}, // ふうせんを撃ち落とした + {0x006, new LifeSupportAchievement( 3, -1, 0006, "PlantFlowerSeed" )}, // 花の種を植えた + {0x007, new LifeSupportAchievement(-1, -1, 0007, "PlantFruit" )}, // 6種類のフルーツを植えた + {0x008, new LifeSupportAchievement(-1, -1, 0008, "PlantTreeSeedling" )}, // 木の苗を植えた + {0x009, new LifeSupportAchievement(-1, -1, 0009, "BuyKabu" )}, // カブを買った + {0x00A, new LifeSupportAchievement(-1, -1, 0010, "HowmuchSellKabu" )}, // カブで得た累計利益 + {0x00B, new LifeSupportAchievement(-1, -1, 0011, "HowmuchBuyItem" )}, // これまでの買い物総額 + {0x00C, new LifeSupportAchievement(-1, -1, 0012, "BuyItemRcm" )}, // まめきちの店で買い物した + {0x00D, new LifeSupportAchievement(-1, -1, 0013, "SellItemRcm" )}, // まめきちの店で売った + {0x00E, new LifeSupportAchievement(-1, -1, 0014, "RemakeFurniture" )}, // リメイクをした + {0x00F, new LifeSupportAchievement(-1, -1, 0015, "FillCatalog" )}, // カタログの項目数 + {0x010, new LifeSupportAchievement(-1, -1, 0016, "BuyItemCatalog" )}, // 通販を利用した + {0x011, new LifeSupportAchievement(-1, -1, 0017, "GotoTotakekeShow" )}, // とたけけのライブを観た + {0x012, new LifeSupportAchievement(-1, -1, 0018, "VisitAnotherIsland" )}, // よその島へのおでかけした + {0x013, new LifeSupportAchievement(-1, -1, 0019, "InviteFriend" )}, // 島にフレンドを招いた + {0x015, new LifeSupportAchievement(-1, -1, 0021, "DayPlayed" )}, // 活動日数 + {0x017, new LifeSupportAchievement(-1, -1, 0023, "WaterPlant" )}, // 水やりをした + {0x018, new LifeSupportAchievement(-1, -1, 0024, "BeStungbyWasp" )}, // ハチに刺された + {0x019, new LifeSupportAchievement(-1, -1, 0025, "CatchSeminonukegara" )}, // セミのぬけがらを取った + {0x01A, new LifeSupportAchievement(-1, -1, 0026, "CatchNomi" )}, // ノミを取ってあげた + {0x01B, new LifeSupportAchievement(-1, -1, 0027, "BeStungbyPoisonousInsect" )}, // こわいムシで気絶した + {0x01F, new LifeSupportAchievement(-1, -1, 0031, "FillReactionList" )}, // リアクションを覚えた + {0x020, new LifeSupportAchievement(-1, -1, 0032, "CatchTrash" )}, // ゴミを釣った + {0x021, new LifeSupportAchievement(-1, -1, 0033, "PayImmigrationCost" )}, // 移住費用を支払った + {0x022, new LifeSupportAchievement(-1, -1, 0034, "RepayLoan" )}, // ローンを完済した + {0x023, new LifeSupportAchievement( 3, -1, 0035, "UseMydesign" )}, // マイデザインを使った + {0x024, new LifeSupportAchievement(-1, -1, 0036, "UseMydesignPRO" )}, // マイデザインPROを使った + {0x025, new LifeSupportAchievement(-1, -1, 0037, "SellWeed" )}, // 雑草を引き取ってもらった + {0x027, new LifeSupportAchievement(-1, -1, 0039, "CollectGoldTool" )}, // 6種類の金の道具を集めた + {0x028, new LifeSupportAchievement(-1, -1, 0040, "GetSRankonHHA" )}, // HHAでSを取った + {0x029, new LifeSupportAchievement(-1, -1, 0041, "AttendFishingConvention" )}, // 釣り大会に春夏秋冬参加した + {0x02A, new LifeSupportAchievement(-1, -1, 0042, "AttendInsectConvention" )}, // ムシとり大会に6~9月参加した + {0x02B, new LifeSupportAchievement(-1, -1, 0043, "HelpGul" )}, // ジョニーを助けた + {0x02C, new LifeSupportAchievement(-1, -1, 0044, "HelpGst" )}, // ゆうたろうを助けた + {0x02D, new LifeSupportAchievement(-1, -1, 0045, "MakePerfectSnowball" )}, // 最高のゆきだるまを作った + {0x02E, new LifeSupportAchievement(-1, -1, 0046, "ReachMyBirthday" )}, // 誕生日を迎えた + {0x02F, new LifeSupportAchievement(-1, -1, 0047, "CelebrateVillagersBithday" )}, // 村民の誕生日を祝ってあげた + {0x030, new LifeSupportAchievement(-1, -1, 0048, "AttendCountdownParty" )}, // カウントダウンに参加した + {0x031, new LifeSupportAchievement(-1, -1, 0049, "BreakTool" )}, // 道具を壊した + {0x032, new LifeSupportAchievement(-1, -1, 0050, "SendLetter" )}, // 手紙を送った + {0x033, new LifeSupportAchievement(-1, -1, 0051, "MakePitfall" )}, // 落とし穴を作った + {0x034, new LifeSupportAchievement(-1, -1, 0052, "FallintoPitfall" )}, // 落とし穴に落ちた + {0x035, new LifeSupportAchievement(-1, -1, 0053, "ImmigratetoIsland" )}, // 島に移住した + {0x036, new LifeSupportAchievement(-1, -1, 0054, "BeFriendwithVillager" )}, // どうぶつとなかよしになった + {0x037, new LifeSupportAchievement(-1, -1, 0055, "FillRecipeList" )}, // 集めたレシピの数 + {0x038, new LifeSupportAchievement(-1, -1, 0056, "BootPhone" )}, // スマホを起動した(上級) + {0x039, new LifeSupportAchievement(-1, -1, 0057, "StrikeRock8Times" )}, // コイン岩を8連打した + {0x03A, new LifeSupportAchievement(-1, 320, 0058, "AchieveAppQuest" )}, // 村活クエストを達成した + {0x03B, new LifeSupportAchievement(-1, -1, 0059, "AchieveVillagersQuest" )}, // どうぶつのお願いを聞いた + {0x03C, new LifeSupportAchievement(-1, -1, 0060, "DigBell" )}, // ベルを掘り出した + {0x03D, new LifeSupportAchievement(-1, -1, 0061, "DigFossil" )}, // 化石を掘り出した + {0x03E, new LifeSupportAchievement(-1, -1, 0062, "JudgeFossil" )}, // 化石を鑑定した + {0x03F, new LifeSupportAchievement(66, -1, 0063, "DigShell" )}, // 潮干狩りをした + {0x040, new LifeSupportAchievement( 3, -1, 0064, "PutFurnitureOutside" )}, // 外に家具を置いた + {0x043, new LifeSupportAchievement(-1, -1, 0067, "StrikeWood" )}, // 木からもくざいを出した + {0x044, new LifeSupportAchievement( 3, -1, 0068, "GreetAllVillager" )}, // 村民全員とあいさつをした + {0x045, new LifeSupportAchievement( 3, -1, 0069, "SellShell" )}, // 貝殻を売った + {0x046, new LifeSupportAchievement( 3, -1, 0070, "SellFruit" )}, // フルーツを売った + {0x047, new LifeSupportAchievement(-1, -1, 0071, "CatchBeeContinuously" )}, // ハチを5連続捕まえた + {0x048, new LifeSupportAchievement(-1, -1, 0072, "DIYTool" )}, // 道具をDIYした + {0x049, new LifeSupportAchievement(-1, -1, 0073, "DIYFurniture" )}, // 家具をDIYした + {0x04B, new LifeSupportAchievement( 3, -1, 0075, "TakePicture" )}, // カメラで写真を撮った + {0x04C, new LifeSupportAchievement(-1, -1, 0076, "BootPhoneBeginner" )}, // スマホを起動した(初級) + {0x04D, new LifeSupportAchievement(-1, -1, 0077, "HouseStorageItem" )}, // 家の倉庫に収納したアイテムの数 + {0x04E, new LifeSupportAchievement(-1, -1, 0078, "PlaceFurnitureMyHouse" )}, // 家に飾っている家具の数 + {0x04F, new LifeSupportAchievement(-1, -1, 0079, "FallFurnitureLeaf" )}, // 木を揺すって家具(葉っぱ)を落とした回数 + {0x050, new LifeSupportAchievement(-1, -1, 0080, "DropPresentinWater" )}, // 風船のプレゼントを撃ち水の中に落とした + {0x051, new LifeSupportAchievement(-1, -1, 0081, "ReformMyHome" )}, // マイホームをリフォームした + {0x052, new LifeSupportAchievement(-1, -1, 0082, "ExtendMyHome" )}, // マイホームを増築した + {0x053, new LifeSupportAchievement( 3, -1, 0083, "PostMessageBoard" )}, // 自分の島の掲示板に書き込む + {0x054, new LifeSupportAchievement(-1, -1, 0084, "UseCloset" )}, // クローゼットで着替える + {0x055, new LifeSupportAchievement(-1, -1, 0085, "PrayShootingStar" )}, // 流れ星に祈る + {0x056, new LifeSupportAchievement(59, -1, 0086, "ChangeSymbol" )}, // 島の旗、島メロを変える + {0x057, new LifeSupportAchievement( 3, -1, 0087, "UpdatePassport" )}, // パスポートを更新した + {0x058, new LifeSupportAchievement(-1, 513, 0088, "ModifyIsland" )}, // 各地形造成をやってみた + {0x059, new LifeSupportAchievement(-1, 478, 0089, "BuildFence" )}, // 柵を置く + {0x05A, new LifeSupportAchievement(-1, -1, 0090, "DonateFake" )}, // 寄贈しようとした美術品が贋作だった + {0x05B, new LifeSupportAchievement(-1, -1, 0091, "BuyatTsunekichiShop" )}, // いなりマーケットで芸術品を買った + {0x05C, new LifeSupportAchievement(-1, -1, 0092, "PlantBushSeedling" )}, // 各種低木の苗を植えた }; public static string GetName(int index, uint count, IReadOnlyDictionary str) diff --git a/NHSE.Parsing/GameBCSVDumper.cs b/NHSE.Parsing/GameBCSVDumper.cs index ae823f2..313ea93 100644 --- a/NHSE.Parsing/GameBCSVDumper.cs +++ b/NHSE.Parsing/GameBCSVDumper.cs @@ -268,8 +268,6 @@ public static List GetLifeSupportAchievementList(string pathBCSV, string var iid = bcsv.ReadValue(i, findex); var ival = ushort.Parse(iid); - ival++; // offset by 1; index 0 is used for something else - var iv1 = bcsv.ReadValue(i, fv1).Substring(2); var iv1a = int.Parse(iv1, NumberStyles.HexNumber); diff --git a/NHSE.WinForms/Editor.Designer.cs b/NHSE.WinForms/Editor.Designer.cs index 8e23fda..99c8276 100644 --- a/NHSE.WinForms/Editor.Designer.cs +++ b/NHSE.WinForms/Editor.Designer.cs @@ -51,6 +51,7 @@ private void InitializeComponent() this.B_EditBuildings = new System.Windows.Forms.ToolStripMenuItem(); this.B_EditAcres = new System.Windows.Forms.ToolStripMenuItem(); this.B_EditFieldItems = new System.Windows.Forms.ToolStripMenuItem(); + this.B_EditBulletin = new System.Windows.Forms.ToolStripMenuItem(); this.B_EditPRODesigns = new System.Windows.Forms.Button(); this.B_EditPatterns = new System.Windows.Forms.Button(); this.B_EditLandFlags = new System.Windows.Forms.Button(); @@ -58,6 +59,8 @@ private void InitializeComponent() this.B_RecycleBin = new System.Windows.Forms.Button(); this.Tab_Villagers = new System.Windows.Forms.TabPage(); this.Tab_Players = new System.Windows.Forms.TabPage(); + this.L_StorageCount = new System.Windows.Forms.Label(); + this.NUD_StorageCount = new System.Windows.Forms.NumericUpDown(); this.L_PocketCount2 = new System.Windows.Forms.Label(); this.L_PocketCount1 = new System.Windows.Forms.Label(); this.NUD_PocketCount2 = new System.Windows.Forms.NumericUpDown(); @@ -68,7 +71,6 @@ private void InitializeComponent() this.B_EditPlayerReceivedItems = new System.Windows.Forms.ToolStripMenuItem(); this.B_EditAchievements = new System.Windows.Forms.ToolStripMenuItem(); this.B_EditPlayerRecipes = new System.Windows.Forms.ToolStripMenuItem(); - this.B_EditPlayerFlags = new System.Windows.Forms.Button(); this.B_EditPlayerItems = new System.Windows.Forms.Button(); this.L_Wallet = new System.Windows.Forms.Label(); this.NUD_Wallet = new System.Windows.Forms.NumericUpDown(); @@ -83,14 +85,15 @@ private void InitializeComponent() this.CB_Players = new System.Windows.Forms.ComboBox(); this.PB_Player = new System.Windows.Forms.PictureBox(); this.TC_Editors = new System.Windows.Forms.TabControl(); - this.B_EditBulletin = new System.Windows.Forms.ToolStripMenuItem(); - this.L_StorageCount = new System.Windows.Forms.Label(); - this.NUD_StorageCount = new System.Windows.Forms.NumericUpDown(); + this.B_EditPlayerFlags = new System.Windows.Forms.ToolStripMenuItem(); + this.L_EarnedMiles = new System.Windows.Forms.Label(); + this.NUD_TotalNookMiles = new System.Windows.Forms.NumericUpDown(); this.Menu_Editor.SuspendLayout(); this.CM_Picture.SuspendLayout(); this.Tab_Map.SuspendLayout(); this.CM_EditMap.SuspendLayout(); this.Tab_Players.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_StorageCount)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.NUD_PocketCount2)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.NUD_PocketCount1)).BeginInit(); this.CM_EditPlayer.SuspendLayout(); @@ -99,7 +102,7 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.NUD_BankBells)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.PB_Player)).BeginInit(); this.TC_Editors.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.NUD_StorageCount)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_TotalNookMiles)).BeginInit(); this.SuspendLayout(); // // Menu_Editor @@ -300,6 +303,13 @@ private void InitializeComponent() this.B_EditFieldItems.Text = "Edit Field Items"; this.B_EditFieldItems.Click += new System.EventHandler(this.B_EditFieldItems_Click); // + // B_EditBulletin + // + this.B_EditBulletin.Name = "B_EditBulletin"; + this.B_EditBulletin.Size = new System.Drawing.Size(171, 22); + this.B_EditBulletin.Text = "Edit Bulletin Board"; + this.B_EditBulletin.Click += new System.EventHandler(this.B_EditBulletin_Click); + // // B_EditPRODesigns // this.B_EditPRODesigns.Location = new System.Drawing.Point(104, 52); @@ -362,6 +372,8 @@ private void InitializeComponent() // // Tab_Players // + this.Tab_Players.Controls.Add(this.L_EarnedMiles); + this.Tab_Players.Controls.Add(this.NUD_TotalNookMiles); this.Tab_Players.Controls.Add(this.L_StorageCount); this.Tab_Players.Controls.Add(this.NUD_StorageCount); this.Tab_Players.Controls.Add(this.L_PocketCount2); @@ -369,7 +381,6 @@ private void InitializeComponent() this.Tab_Players.Controls.Add(this.NUD_PocketCount2); this.Tab_Players.Controls.Add(this.NUD_PocketCount1); this.Tab_Players.Controls.Add(this.B_EditPlayer); - this.Tab_Players.Controls.Add(this.B_EditPlayerFlags); this.Tab_Players.Controls.Add(this.B_EditPlayerItems); this.Tab_Players.Controls.Add(this.L_Wallet); this.Tab_Players.Controls.Add(this.NUD_Wallet); @@ -391,6 +402,33 @@ private void InitializeComponent() this.Tab_Players.Text = "Players"; this.Tab_Players.UseVisualStyleBackColor = true; // + // L_StorageCount + // + this.L_StorageCount.AutoSize = true; + this.L_StorageCount.Location = new System.Drawing.Point(200, 145); + this.L_StorageCount.Name = "L_StorageCount"; + this.L_StorageCount.Size = new System.Drawing.Size(75, 13); + this.L_StorageCount.TabIndex = 24; + this.L_StorageCount.Text = "Storage Count"; + this.L_StorageCount.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUD_StorageCount + // + this.NUD_StorageCount.Location = new System.Drawing.Point(151, 142); + this.NUD_StorageCount.Maximum = new decimal(new int[] { + 2147483647, + 0, + 0, + 0}); + this.NUD_StorageCount.Name = "NUD_StorageCount"; + this.NUD_StorageCount.Size = new System.Drawing.Size(46, 20); + this.NUD_StorageCount.TabIndex = 23; + this.NUD_StorageCount.Value = new decimal(new int[] { + 5000, + 0, + 0, + 0}); + // // L_PocketCount2 // this.L_PocketCount2.AutoSize = true; @@ -462,9 +500,10 @@ private void InitializeComponent() this.B_EditPlayerStorage, this.B_EditPlayerReceivedItems, this.B_EditAchievements, - this.B_EditPlayerRecipes}); + this.B_EditPlayerRecipes, + this.B_EditPlayerFlags}); this.CM_EditPlayer.Name = "CM_EditPlayer"; - this.CM_EditPlayer.Size = new System.Drawing.Size(177, 92); + this.CM_EditPlayer.Size = new System.Drawing.Size(177, 114); // // B_EditPlayerStorage // @@ -494,16 +533,6 @@ private void InitializeComponent() this.B_EditPlayerRecipes.Text = "Edit Recipes"; this.B_EditPlayerRecipes.Click += new System.EventHandler(this.B_EditPlayerRecipes_Click); // - // B_EditPlayerFlags - // - this.B_EditPlayerFlags.Location = new System.Drawing.Point(300, 122); - this.B_EditPlayerFlags.Name = "B_EditPlayerFlags"; - this.B_EditPlayerFlags.Size = new System.Drawing.Size(92, 40); - this.B_EditPlayerFlags.TabIndex = 17; - this.B_EditPlayerFlags.Text = "Edit Flags"; - this.B_EditPlayerFlags.UseVisualStyleBackColor = true; - this.B_EditPlayerFlags.Click += new System.EventHandler(this.B_EditPlayerFlags_Click); - // // B_EditPlayerItems // this.B_EditPlayerItems.Location = new System.Drawing.Point(6, 168); @@ -642,39 +671,33 @@ private void InitializeComponent() this.TC_Editors.Size = new System.Drawing.Size(404, 237); this.TC_Editors.TabIndex = 1; // - // B_EditBulletin + // B_EditPlayerFlags // - this.B_EditBulletin.Name = "B_EditBulletin"; - this.B_EditBulletin.Size = new System.Drawing.Size(171, 22); - this.B_EditBulletin.Text = "Edit Bulletin Board"; - this.B_EditBulletin.Click += new System.EventHandler(this.B_EditBulletin_Click); + this.B_EditPlayerFlags.Name = "B_EditPlayerFlags"; + this.B_EditPlayerFlags.Size = new System.Drawing.Size(176, 22); + this.B_EditPlayerFlags.Text = "Edit Flags"; + this.B_EditPlayerFlags.Click += new System.EventHandler(this.B_EditPlayerFlags_Click); // - // L_StorageCount + // L_EarnedMiles // - this.L_StorageCount.AutoSize = true; - this.L_StorageCount.Location = new System.Drawing.Point(200, 145); - this.L_StorageCount.Name = "L_StorageCount"; - this.L_StorageCount.Size = new System.Drawing.Size(75, 13); - this.L_StorageCount.TabIndex = 24; - this.L_StorageCount.Text = "Storage Count"; - this.L_StorageCount.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.L_EarnedMiles.Location = new System.Drawing.Point(142, 117); + this.L_EarnedMiles.Name = "L_EarnedMiles"; + this.L_EarnedMiles.Size = new System.Drawing.Size(84, 20); + this.L_EarnedMiles.TabIndex = 26; + this.L_EarnedMiles.Text = "Earned Miles:"; + this.L_EarnedMiles.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // - // NUD_StorageCount + // NUD_TotalNookMiles // - this.NUD_StorageCount.Location = new System.Drawing.Point(151, 142); - this.NUD_StorageCount.Maximum = new decimal(new int[] { + this.NUD_TotalNookMiles.Location = new System.Drawing.Point(232, 117); + this.NUD_TotalNookMiles.Maximum = new decimal(new int[] { 2147483647, 0, 0, 0}); - this.NUD_StorageCount.Name = "NUD_StorageCount"; - this.NUD_StorageCount.Size = new System.Drawing.Size(46, 20); - this.NUD_StorageCount.TabIndex = 23; - this.NUD_StorageCount.Value = new decimal(new int[] { - 5000, - 0, - 0, - 0}); + this.NUD_TotalNookMiles.Name = "NUD_TotalNookMiles"; + this.NUD_TotalNookMiles.Size = new System.Drawing.Size(100, 20); + this.NUD_TotalNookMiles.TabIndex = 25; // // Editor // @@ -696,6 +719,7 @@ private void InitializeComponent() this.CM_EditMap.ResumeLayout(false); this.Tab_Players.ResumeLayout(false); this.Tab_Players.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_StorageCount)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.NUD_PocketCount2)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.NUD_PocketCount1)).EndInit(); this.CM_EditPlayer.ResumeLayout(false); @@ -704,7 +728,7 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.NUD_BankBells)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.PB_Player)).EndInit(); this.TC_Editors.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.NUD_StorageCount)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_TotalNookMiles)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -731,7 +755,6 @@ private void InitializeComponent() private System.Windows.Forms.Button B_RecycleBin; private System.Windows.Forms.TabPage Tab_Villagers; private System.Windows.Forms.TabPage Tab_Players; - private System.Windows.Forms.Button B_EditPlayerFlags; private System.Windows.Forms.Button B_EditPlayerItems; private System.Windows.Forms.Label L_Wallet; private System.Windows.Forms.NumericUpDown NUD_Wallet; @@ -768,6 +791,9 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem B_EditBulletin; private System.Windows.Forms.Label L_StorageCount; private System.Windows.Forms.NumericUpDown NUD_StorageCount; + private System.Windows.Forms.ToolStripMenuItem B_EditPlayerFlags; + private System.Windows.Forms.Label L_EarnedMiles; + private System.Windows.Forms.NumericUpDown NUD_TotalNookMiles; } } diff --git a/NHSE.WinForms/Editor.cs b/NHSE.WinForms/Editor.cs index 49857e7..4ec4248 100644 --- a/NHSE.WinForms/Editor.cs +++ b/NHSE.WinForms/Editor.cs @@ -244,6 +244,7 @@ private void LoadPlayer(int index) TB_TownName.Text = pers.TownName; NUD_BankBells.Value = Math.Min(int.MaxValue, pers.Bank.Value); NUD_NookMiles.Value = Math.Min(int.MaxValue, pers.NookMiles.Value); + NUD_TotalNookMiles.Value = Math.Min(int.MaxValue, pers.TotalNookMiles.Value); NUD_Wallet.Value = Math.Min(int.MaxValue, pers.Wallet.Value); // swapped on purpose -- first count is the first two rows of items @@ -297,6 +298,10 @@ private void SavePlayer(int index) nook.Value = (uint)NUD_NookMiles.Value; pers.NookMiles = nook; + var tnook = pers.TotalNookMiles; + tnook.Value = (uint)NUD_TotalNookMiles.Value; + pers.TotalNookMiles = tnook; + var wallet = pers.Wallet; wallet.Value = (uint)NUD_Wallet.Value; pers.Wallet = wallet; @@ -311,10 +316,10 @@ private void SavePlayer(int index) private void B_EditAchievements_Click(object sender, EventArgs e) { var pers = SAV.Players[PlayerIndex].Personal; - var records = pers.GetActivities(); + var records = pers.GetCountAchievement(); using var editor = new AchievementEditor(records); if (editor.ShowDialog() == DialogResult.OK) - pers.SetActivities(records); + pers.SetCountAchievement(records); } private void B_EditPlayerFlags_Click(object sender, EventArgs e) diff --git a/NHSE.WinForms/Subforms/Player/ItemReceivedEditor.cs b/NHSE.WinForms/Subforms/Player/ItemReceivedEditor.cs index 432a442..358b7af 100644 --- a/NHSE.WinForms/Subforms/Player/ItemReceivedEditor.cs +++ b/NHSE.WinForms/Subforms/Player/ItemReceivedEditor.cs @@ -30,7 +30,7 @@ private void FillCheckBoxes() { var items = GameInfo.Strings.itemlistdisplay; - var ofs = Player.Personal.Offsets.ReceivedItems; + var ofs = Player.Personal.Offsets.ItemCollectBit; var data = Player.Personal.Data; for (int i = 0; i < items.Length; i++) { @@ -79,7 +79,7 @@ private void GiveEverything(IReadOnlyList items, bool value = true) private void B_Save_Click(object sender, EventArgs e) { - var ofs = Player.Personal.Offsets.ReceivedItems; + var ofs = Player.Personal.Offsets.ItemCollectBit; var data = Player.Personal.Data; for (int i = 0; i < CLB_Items.Items.Count; i++) FlagUtil.SetFlag(data, ofs, i, CLB_Items.GetItemChecked(i));