public static void Write(Stream output, RawUpgrade instance, Endian endian) { output.WriteValueU32(instance.Name, endian); output.WriteValueU32(instance.TaskGroup, endian); output.WriteValueS32(instance.StarThreshold, endian); output.Seek(4, SeekOrigin.Current); output.WriteValueS64(instance.PrerequisiteOffset, endian); output.WriteValueS64(instance.PrerequisiteCount, endian); output.WriteValueS32(instance.Cost, endian); output.WriteValueU32(instance.Ability, endian); output.WriteValueU32(instance.UIName, endian); output.WriteValueU32(instance.UIDescription, endian); output.WriteValueS32(instance.UIDisplayOrder, endian); output.WriteValueS32(instance.UIImage, endian); output.WriteValueS64(instance.UIVideoOffset, endian); output.WriteValueU32(instance.UITreeName, endian); output.WriteValueS32(instance.UITreeOrder, endian); }
public static RawUpgrade Read(Stream input, Endian endian) { var instance = new RawUpgrade(); instance.Name = input.ReadValueU32(endian); instance.TaskGroup = input.ReadValueU32(endian); instance.StarThreshold = input.ReadValueS32(endian); input.Seek(4, SeekOrigin.Current); instance.PrerequisiteOffset = input.ReadValueS64(endian); instance.PrerequisiteCount = input.ReadValueS64(endian); instance.Cost = input.ReadValueS32(endian); instance.Ability = input.ReadValueU32(endian); instance.UIName = input.ReadValueU32(endian); instance.UIDescription = input.ReadValueU32(endian); instance.UIDisplayOrder = input.ReadValueS32(endian); instance.UIImage = input.ReadValueS32(endian); instance.UIVideoOffset = input.ReadValueS64(endian); instance.UITreeName = input.ReadValueU32(endian); instance.UITreeOrder = input.ReadValueS32(endian); return(instance); }
public void Serialize(Stream output, Endian endian) { var basePosition = output.Position; output.Seek(RawUpgradeRoot.Size, SeekOrigin.Current); var upgradePosition = output.Position; output.Seek(RawUpgrade.Size * this._Upgrades.Count, SeekOrigin.Current); var rawUpgrades = new RawUpgrade[this._Upgrades.Count]; for (int i = 0; i < this._Upgrades.Count; i++) { var upgrade = this._Upgrades[i]; rawUpgrades[i] = new RawUpgrade() { Name = upgrade.Name, TaskGroup = upgrade.TaskGroup, StarThreshold = upgrade.StarThreshold, PrerequisiteCount = upgrade.Prerequisites == null ? 0 : upgrade.Prerequisites.Length, Cost = upgrade.Cost, Ability = upgrade.Ability, UIName = upgrade.UIName, UIDescription = upgrade.UIDescription, UIDisplayOrder = upgrade.UIDisplayOrder, UIImage = upgrade.UIImage, UITreeName = upgrade.UITreeName, UITreeOrder = upgrade.UITreeOrder, }; } for (int i = 0; i < this._Upgrades.Count; i++) { var upgrade = this._Upgrades[i]; if (upgrade.Prerequisites != null && upgrade.Prerequisites.Length > 0) { rawUpgrades[i].PrerequisiteOffset = output.Position - basePosition; foreach (var feat in upgrade.Prerequisites) { output.WriteValueU32(feat, endian); } } } for (int i = 0; i < this._Upgrades.Count; i++) { var upgrade = this._Upgrades[i]; if (upgrade.UIVideo != null) { //output.Position = output.Position.Align(8); rawUpgrades[i].UIVideoOffset = output.Position - basePosition; output.WriteStringZ(upgrade.UIVideo, Encoding.ASCII); } } output.Position = upgradePosition; foreach (var rawUpgrade in rawUpgrades) { rawUpgrade.Write(output, endian); } output.Position = basePosition; new RawUpgradeRoot() { UpgradeOffset = upgradePosition, UpgradeCount = this._Upgrades.Count, }.Write(output, endian); }
public void Deserialize(Stream input, Endian endian) { var basePosition = input.Position; var rawUpgradeRoot = RawUpgradeRoot.Read(input, endian); var upgrades = new Upgrade[rawUpgradeRoot.UpgradeCount]; if (rawUpgradeRoot.UpgradeCount != 0) { if (rawUpgradeRoot.UpgradeCount < 0 || rawUpgradeRoot.UpgradeCount > int.MaxValue) { throw new FormatException(); } var rawUpgrades = new RawUpgrade[rawUpgradeRoot.UpgradeCount]; input.Position = basePosition + rawUpgradeRoot.UpgradeOffset; for (long i = 0; i < rawUpgradeRoot.UpgradeCount; i++) { rawUpgrades[i] = RawUpgrade.Read(input, endian); } for (long i = 0; i < rawUpgradeRoot.UpgradeCount; i++) { var rawUpgrade = rawUpgrades[i]; var upgrade = new Upgrade() { Name = rawUpgrade.Name, TaskGroup = rawUpgrade.TaskGroup, StarThreshold = rawUpgrade.StarThreshold, Prerequisites = new uint[rawUpgrade.PrerequisiteCount], Cost = rawUpgrade.Cost, Ability = rawUpgrade.Ability, UIName = rawUpgrade.UIName, UIDescription = rawUpgrade.UIDescription, UIDisplayOrder = rawUpgrade.UIDisplayOrder, UIImage = rawUpgrade.UIImage, UITreeName = rawUpgrade.UITreeName, UITreeOrder = rawUpgrade.UITreeOrder, }; if (rawUpgrade.PrerequisiteCount != 0) { if (rawUpgrade.PrerequisiteCount < 0 || rawUpgrade.PrerequisiteCount > int.MaxValue) { throw new FormatException(); } input.Position = basePosition + rawUpgrade.PrerequisiteOffset; for (long j = 0; j < rawUpgrade.PrerequisiteCount; j++) { upgrade.Prerequisites[j] = input.ReadValueU32(endian); } } if (rawUpgrade.UIVideoOffset != 0) { input.Position = basePosition + rawUpgrade.UIVideoOffset; upgrade.UIVideo = input.ReadStringZ(Encoding.ASCII); } upgrades[i] = upgrade; } } this._Upgrades.Clear(); this._Upgrades.AddRange(upgrades); }