public bool Write(string filename, IEFile file, bool forceSave = false) { if (!(file is WfxFile)) throw new ArgumentException("File is not a valid creature file"); var wfxFile = file as WfxFile; if (!(forceSave) && (MD5HashGenerator.GenerateKey(wfxFile) == wfxFile.Checksum)) return false; WfxHeaderBinary header = new WfxHeaderBinary(); header.Flags = wfxFile.Flags.CutsceneVolumeEnabled ? header.Flags | Common.Bit0 : header.Flags; header.Flags = wfxFile.Flags.CustomSRCurveRadiusEnabled ? header.Flags | Common.Bit1 : header.Flags; header.Flags = wfxFile.Flags.RandomFrequencyVariationEnabled ? header.Flags | Common.Bit2 : header.Flags; header.Flags = wfxFile.Flags.CutsceneVolumeEnabled ? header.Flags | Common.Bit3 : header.Flags; header.Flags = wfxFile.Flags.EnvironmentalAudioEnabled ? header.Flags | Common.Bit4 : header.Flags; header.ftype = new array4() { character1 = 'W', character2 = 'F', character3 = 'X', character4 = ' ' }; header.fversion = new array4() { character1 = 'V', character2 = '1', character3 = '.', character4 = '0' }; header.RandomFrequencyVariation = wfxFile.RandomFrequencyVariation; header.RandomVolumeVariation = wfxFile.RandomVolumeVariation; header.SrCurveRadius = wfxFile.SrCurveRadius; header.Unused = wfxFile.Unused0018; using (MemoryStream s = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(s)) { var headerAsBytes = Common.WriteStruct(header); bw.Write(headerAsBytes); if (BackupManger != null) { BackupManger.BackupFile(file, file.Filename, file.FileType, this); } using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write)) { bw.BaseStream.Position = 0; bw.BaseStream.CopyTo(fs); fs.Flush(flushToDisk: true); } } } return true; }
public bool Write(string filename, IEFile file, bool forceSave = false) { if (!(file is DimensionalArrayFile)) throw new ArgumentException("File is not a valid 2da file"); var dimensionalArrayFile = file as DimensionalArrayFile; if (!(forceSave) && (MD5HashGenerator.GenerateKey(dimensionalArrayFile) == dimensionalArrayFile.Checksum)) return false; if (BackupManger != null) { BackupManger.BackupFile(file, file.Filename, file.FileType, this); } File.WriteAllText(filename, dimensionalArrayFile.contents); return true; }
public void BackupFile(IEFile file, string filename, IEFileType filetype, IIEFileWriter writer) { if (!File.Exists(filename)) return; if (!Directory.Exists(BackupDirectory)) Directory.CreateDirectory(BackupDirectory); var location = Path.Combine(BackupDirectory, Path.GetFileName(filename)); if (File.Exists(location)) return; if (file.OriginalFile != null) { writer.BackupManger = null; writer.Write(location, file.OriginalFile, SaveIfNotChanged: true); writer.BackupManger = this; } Log(filename, "replace"); }
public bool Write(string filename, IEFile file, bool forceSave = false) { if (!(file is VvcFile)) throw new ArgumentException("File is not a valid creature file"); var vvcFile = file as VvcFile; if (!(forceSave) && (MD5HashGenerator.GenerateKey(vvcFile) == vvcFile.Checksum)) return false; VvcHeaderBinary header = new VvcHeaderBinary(); header.ftype = new array4() { character1 = 'V', character2 = 'V', character3 = 'C', character4 = ' ' }; header.fversion = new array4() { character1 = 'V', character2 = '1', character3 = '.', character4 = '0' }; header.AlphaBlendingAnimation = new array8(vvcFile.AlphaBlendingAnimation); header.Animation = new array8(vvcFile.Animation); header.Animation2 = new array8(vvcFile.Animation2); header.Bam1Sequence = vvcFile.Bam1Sequence; header.Bam2Sequence = vvcFile.Bam2Sequence; header.Bam3Sequence = vvcFile.Bam3Sequence; header.BaseOrientation = vvcFile.BaseOrientation; header.BitmapPalette = new array8(vvcFile.BitmapPalette); header.CentreX = vvcFile.CentreX; header.CentreY = vvcFile.CentreY; header.ColourFlags = vvcFile.ColourFlags.NotLightSource ? Convert.ToUInt16(header.ColourFlags | Common.Bit0) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.LightSource ? Convert.ToUInt16(header.ColourFlags | Common.Bit1) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.InternalBrightness ? Convert.ToUInt16(header.ColourFlags | Common.Bit2) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.Timestopped ? Convert.ToUInt16(header.ColourFlags | Common.Bit3) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.Unused ? Convert.ToUInt16(header.ColourFlags | Common.Bit4) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.InternalGamma ? Convert.ToUInt16(header.ColourFlags | Common.Bit5) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.NonReservedPalette ? Convert.ToUInt16(header.ColourFlags | Common.Bit6) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.FullPalette ? Convert.ToUInt16(header.ColourFlags | Common.Bit7) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.Unused ? Convert.ToUInt16(header.ColourFlags | Common.Bit8) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.Sepia ? Convert.ToUInt16(header.ColourFlags | Common.Bit9) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.Unused2 ? Convert.ToUInt16(header.ColourFlags | Common.Bit10) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.Unused3 ? Convert.ToUInt16(header.ColourFlags | Common.Bit11) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.Unused4 ? Convert.ToUInt16(header.ColourFlags | Common.Bit12) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.Unused5 ? Convert.ToUInt16(header.ColourFlags | Common.Bit13) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.Unused6 ? Convert.ToUInt16(header.ColourFlags | Common.Bit14) : header.ColourFlags; header.ColourFlags = vvcFile.ColourFlags.Unused7 ? Convert.ToUInt16(header.ColourFlags | Common.Bit15) : header.ColourFlags; header.CurrentAnimationSequence = vvcFile.CurrentAnimationSequence; header.DisplayFlags = vvcFile.DisplayFlags.Transparent ? Convert.ToUInt16(header.DisplayFlags | Common.Bit0) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.Translucent ? Convert.ToUInt16(header.DisplayFlags | Common.Bit1) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.TranslucentShadow ? Convert.ToUInt16(header.DisplayFlags | Common.Bit2) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.Blended ? Convert.ToUInt16(header.DisplayFlags | Common.Bit3) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.MirrorXAxis ? Convert.ToUInt16(header.DisplayFlags | Common.Bit4) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.MirrorYAxis ? Convert.ToUInt16(header.DisplayFlags | Common.Bit5) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.Clipped ? Convert.ToUInt16(header.DisplayFlags | Common.Bit6) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.CopyFromBack ? Convert.ToUInt16(header.DisplayFlags | Common.Bit7) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.ClearFill ? Convert.ToUInt16(header.DisplayFlags | Common.Bit8) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.Blend3D ? Convert.ToUInt16(header.DisplayFlags | Common.Bit9) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.NotCoveredByWall ? Convert.ToUInt16(header.DisplayFlags | Common.Bit10) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.PersistThroughTimestop ? Convert.ToUInt16(header.DisplayFlags | Common.Bit11) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.IgnoreDreamPalette ? Convert.ToUInt16(header.DisplayFlags | Common.Bit12) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.Blend2D ? Convert.ToUInt16(header.DisplayFlags | Common.Bit13) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.Unused1 ? Convert.ToUInt16(header.DisplayFlags | Common.Bit14) : header.DisplayFlags; header.DisplayFlags = vvcFile.DisplayFlags.Unused2 ? Convert.ToUInt16(header.DisplayFlags | Common.Bit15) : header.DisplayFlags; header.Duration = vvcFile.Duration; header.FrameRate = vvcFile.FrameRate; header.InternalName = new array8(vvcFile.InternalName); header.LightingBrightness = vvcFile.LightingBrightness; header.LightingBrightness = vvcFile.LightingBrightness; header.OrientationCount = vvcFile.OrientationCount; header.PositionFlags = vvcFile.PositionFlags.OrbitTarget ? Convert.ToInt16(header.PositionFlags | Common.Bit0) : header.PositionFlags; header.PositionFlags = vvcFile.PositionFlags.RelativeToTarget ? Convert.ToInt16(header.PositionFlags | Common.Bit1) : header.PositionFlags; header.PositionFlags = vvcFile.PositionFlags.Unused ? Convert.ToInt16(header.PositionFlags | Common.Bit2) : header.PositionFlags; header.PositionFlags = vvcFile.PositionFlags.IgnoreOrientation ? Convert.ToInt16(header.PositionFlags | Common.Bit3) : header.PositionFlags; header.SequenceFlags = vvcFile.SequenceFlags.Looping ? Convert.ToInt16(header.PositionFlags | Common.Bit0) : header.PositionFlags; header.SequenceFlags = vvcFile.SequenceFlags.SpecialLighting ? Convert.ToInt16(header.PositionFlags | Common.Bit1) : header.PositionFlags; header.SequenceFlags = vvcFile.SequenceFlags.ModifyForHeight ? Convert.ToInt16(header.PositionFlags | Common.Bit2) : header.PositionFlags; header.SequenceFlags = vvcFile.SequenceFlags.DrawAnimation ? Convert.ToInt16(header.PositionFlags | Common.Bit3) : header.PositionFlags; header.SequenceFlags = vvcFile.SequenceFlags.CustomPalette ? Convert.ToInt16(header.PositionFlags | Common.Bit4) : header.PositionFlags; header.SequenceFlags = vvcFile.SequenceFlags.Purgeable ? Convert.ToInt16(header.PositionFlags | Common.Bit5) : header.PositionFlags; header.SequenceFlags = vvcFile.SequenceFlags.NotCoveredByWallgroups ? Convert.ToInt16(header.PositionFlags | Common.Bit6) : header.PositionFlags; header.SequenceFlags = vvcFile.SequenceFlags.MidLevelBrighten ? Convert.ToInt16(header.PositionFlags | Common.Bit7) : header.PositionFlags; header.SequenceFlags = vvcFile.SequenceFlags.HighLevelBrighten ? Convert.ToInt16(header.PositionFlags | Common.Bit8) : header.PositionFlags; header.Unused = vvcFile.Unused001c; header.Unused2 = vvcFile.Unused0024; header.Unused3 = vvcFile.Unused009c; header.UseContinuousSequence = vvcFile.UseContinuousSequence; header.UseOrientation = vvcFile.UseOrientation; header.Wav1 = new array8(vvcFile.Wav1); header.Wav2 = new array8(vvcFile.Wav2); header.Wav3 = new array8(vvcFile.Wav3); header.XPosition = vvcFile.XPosition; header.YPosition = vvcFile.YPosition; header.ZPosition = vvcFile.ZPosition; using (MemoryStream s = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(s)) { var headerAsBytes = Common.WriteStruct(header); bw.Write(headerAsBytes); if (BackupManger != null) { BackupManger.BackupFile(file, file.Filename, file.FileType, this); } using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write)) { bw.BaseStream.Position = 0; bw.BaseStream.CopyTo(fs); fs.Flush(flushToDisk: true); } } } return true; }
public bool Write(string filename, IEFile file, bool forceSave = false) { if (!(file is SplFile)) throw new ArgumentException("File is not a valid creature file"); var splFile = file as SplFile; if (!(forceSave) && (MD5HashGenerator.GenerateKey(splFile) == splFile.Checksum)) return false; List<SplExtendedHeaderBinary> splExtendedHeaders = new List<SplExtendedHeaderBinary>(); List<SplFeatureBlockBinary> splFeatureBlocks = new List<SplFeatureBlockBinary>(); foreach (var featureBlock in splFile.splFeatureBlocks) { SplFeatureBlockBinary featureBlockBinary = new SplFeatureBlockBinary(); featureBlockBinary.DiceSides = featureBlock.DiceSides; featureBlockBinary.DiceThrown = featureBlock.DiceThrown; featureBlockBinary.Duration = featureBlock.Duration; featureBlockBinary.Opcode = featureBlock.Opcode; featureBlockBinary.Parameter1 = featureBlock.Parameter1; featureBlockBinary.Parameter2 = featureBlock.Parameter2; featureBlockBinary.Power = featureBlock.Power; featureBlockBinary.Probability1 = featureBlock.Probability1; featureBlockBinary.Probability2 = featureBlock.Probability2; featureBlockBinary.Resistance = featureBlock.Resistance; featureBlockBinary.Resource = featureBlock.Resource; featureBlockBinary.SavingThrowBonus = featureBlock.SavingThrowBonus; featureBlockBinary.SavingThrowType = featureBlock.SavingThrowType; featureBlockBinary.TargetType = featureBlock.TargetType; featureBlockBinary.TimingMode = Convert.ToByte(featureBlock.TimingMode); featureBlockBinary.Unknown = featureBlock.Unknown; splFeatureBlocks.Add(featureBlockBinary); } foreach (var extendedHeader in splFile.splExtendedHeader) { SplExtendedHeaderBinary extendedHeaderBinary = new SplExtendedHeaderBinary(); extendedHeaderBinary.CastingTime = extendedHeader.CastingTime; extendedHeaderBinary.ChargeDepletionBehaviour = extendedHeader.ChargeDepletionBehaviour; extendedHeaderBinary.Charges = extendedHeader.Charges; extendedHeaderBinary.DamageType = extendedHeader.DamageType; extendedHeaderBinary.DiceSides = extendedHeader.DiceSides; extendedHeaderBinary.DiceThrown = extendedHeader.DiceThrown; extendedHeaderBinary.LevelRequired = extendedHeader.LevelRequired; extendedHeaderBinary.Location = extendedHeader.Location; extendedHeaderBinary.MemorisedIcon = extendedHeader.MemorisedIcon; extendedHeaderBinary.ProjectileAnimation = extendedHeader.ProjectileAnimation; extendedHeaderBinary.Range = extendedHeader.Range; extendedHeaderBinary.SpellForm = extendedHeader.SpellForm; extendedHeaderBinary.TargetCount = extendedHeader.TargetCount; extendedHeaderBinary.TargetType = extendedHeader.TargetType; extendedHeaderBinary.Unknown = extendedHeader.Unknown; extendedHeaderBinary.Unknown2 = extendedHeader.Unknown2; extendedHeaderBinary.FeatureBlockCount = extendedHeader.FeatureBlockCount; extendedHeaderBinary.FeatureBlockOffset = Convert.ToInt16(extendedHeader.splFeatureBlocks.Count); foreach (var featureBlock in extendedHeader.splFeatureBlocks) { SplFeatureBlockBinary featureBlockBinary = new SplFeatureBlockBinary(); featureBlockBinary.DiceSides = featureBlock.DiceSides; featureBlockBinary.DiceThrown = featureBlock.DiceThrown; featureBlockBinary.Duration = featureBlock.Duration; featureBlockBinary.Opcode = featureBlock.Opcode; featureBlockBinary.Parameter1 = featureBlock.Parameter1; featureBlockBinary.Parameter2 = featureBlock.Parameter2; featureBlockBinary.Power = featureBlock.Power; featureBlockBinary.Probability1 = featureBlock.Probability1; featureBlockBinary.Probability2 = featureBlock.Probability2; featureBlockBinary.Resistance = featureBlock.Resistance; featureBlockBinary.Resource = featureBlock.Resource; featureBlockBinary.SavingThrowBonus = featureBlock.SavingThrowBonus; featureBlockBinary.SavingThrowType = featureBlock.SavingThrowType; featureBlockBinary.TargetType = featureBlock.TargetType; featureBlockBinary.TimingMode = Convert.ToByte(featureBlock.TimingMode); featureBlockBinary.Unknown = featureBlock.Unknown; splFeatureBlocks.Add(featureBlockBinary); } splExtendedHeaders.Add(extendedHeaderBinary); } SplHeaderBinary header = new SplHeaderBinary(); header.Flags = splFile.Flags.Byte1Bit0 ? header.Flags | 1 : header.Flags; header.Flags = splFile.Flags.Byte1Bit1 ? header.Flags | 2 : header.Flags; header.Flags = splFile.Flags.Byte1Bit2 ? header.Flags | 4 : header.Flags; header.Flags = splFile.Flags.Byte1Bit3 ? header.Flags | 8 : header.Flags; header.Flags = splFile.Flags.Byte1Bit4 ? header.Flags | 16 : header.Flags; header.Flags = splFile.Flags.Byte1Bit5 ? header.Flags | 32 : header.Flags; header.Flags = splFile.Flags.Byte1Bit6 ? header.Flags | 64 : header.Flags; header.Flags = splFile.Flags.Byte1Bit7 ? header.Flags | 128 : header.Flags; header.Flags = splFile.Flags.Byte2Bit0 ? header.Flags | 256 : header.Flags; header.Flags = splFile.Flags.Byte2Bit1 ? header.Flags | 512 : header.Flags; header.Flags = splFile.Flags.Byte2Bit2 ? header.Flags | 1024 : header.Flags; header.Flags = splFile.Flags.Byte2Bit3 ? header.Flags | 2048 : header.Flags; header.Flags = splFile.Flags.Byte2Bit4 ? header.Flags | 4096 : header.Flags; header.Flags = splFile.Flags.Byte2Bit5 ? header.Flags | 8192 : header.Flags; header.Flags = splFile.Flags.Byte2Bit6 ? header.Flags | 16384 : header.Flags; header.Flags = splFile.Flags.Byte2Bit7 ? header.Flags | 32768 : header.Flags; header.Flags = splFile.Flags.Byte3Bit0 ? header.Flags | 65536 : header.Flags; header.Flags = splFile.Flags.Byte3Bit1 ? header.Flags | 131072 : header.Flags; header.Flags = splFile.Flags.Byte3Bit2 ? header.Flags | 262144 : header.Flags; header.Flags = splFile.Flags.Byte3Bit3 ? header.Flags | 524288 : header.Flags; header.Flags = splFile.Flags.Byte3Bit4 ? header.Flags | 1048576 : header.Flags; header.Flags = splFile.Flags.Byte3Bit5 ? header.Flags | 2097152 : header.Flags; header.Flags = splFile.Flags.Byte3Bit6 ? header.Flags | 4194304 : header.Flags; header.Flags = splFile.Flags.Byte3Bit7 ? header.Flags | 8388608 : header.Flags; header.Flags = splFile.Flags.Byte4Bit0 ? header.Flags | 16777216 : header.Flags; header.Flags = splFile.Flags.Byte4Bit1 ? header.Flags | 33554432 : header.Flags; header.Flags = splFile.Flags.Byte4Bit2 ? header.Flags | 67108864 : header.Flags; header.Flags = splFile.Flags.Byte4Bit3 ? header.Flags | 134217728 : header.Flags; header.Flags = splFile.Flags.Byte4Bit4 ? header.Flags | 268435456 : header.Flags; header.Flags = splFile.Flags.Byte4Bit5 ? header.Flags | 536870912 : header.Flags; header.Flags = splFile.Flags.Byte4Bit6 ? header.Flags | 1073741824 : header.Flags; //header.Flags = splFile.Flags.Byte4Bit7 ? header.Flags | 2147483648 : header.Flags; header.ftype = new array4() { character1 = 'S', character2 = 'P', character3 = 'L', character4 = ' ' }; header.fversion = new array4() { character1 = 'V', character2 = '1', character3 = ' ', character4 = ' ' }; header.CastinGraphic = splFile.CastingGraphic; header.CompletionSound = splFile.CompletionSound; header.ExclusionFlags = splFile.ExclusionFlags; header.ExtendedHeaderCount = Convert.ToInt16(splExtendedHeaders.Count); header.ExtendedHeaderOffset = HeaderSize; header.FeatureBlockCastingCount = Convert.ToInt16(splFile.splFeatureBlocks.Count); header.FeatureBlockCastingIndex = 0; header.FeatureBlockOffset = HeaderSize + (ExtendedHeaderSize * splExtendedHeaders.Count); header.IdentifiedDescription = Common.WriteString(splFile.IdentifiedDescription, TlkFile); header.IdentifiedName = Common.WriteString(splFile.IdentifiedName, TlkFile); header.PrimaryType = splFile.PrimaryType; header.SecondaryType = splFile.SecondaryType; header.SpellBookIcon = splFile.SpellBookIcon; header.SpellLevel = splFile.SpellLevel; header.SpellType = Convert.ToInt16(splFile.SpellType); header.UnidentifiedDescription = Common.WriteString(splFile.UnidentifiedDescription, TlkFile); header.UnidentifiedName = Common.WriteString(splFile.UnidentifiedName, TlkFile); header.Unknown = splFile.Unknown; header.Unknown2 = splFile.Unknown2; header.Unknown3 = splFile.Unknown3; header.Unknown4 = splFile.Unknown4; header.Unknown5 = splFile.Unknown5; header.Unknown6 = splFile.Unknown6; header.Unknown7 = splFile.Unknown7; header.Unknown8 = splFile.Unknown8; header.Unknown9 = splFile.Unknown9; header.Unknown10 = splFile.Unknown10; header.Unknown11 = splFile.Unknown11; using (MemoryStream s = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(s)) { var headerAsBytes = Common.WriteStruct(header); bw.Write(headerAsBytes); foreach (var extendedHeader in splExtendedHeaders) { var extendedHeaderAsBytes = Common.WriteStruct(extendedHeader); bw.Write(extendedHeaderAsBytes); } foreach (var featureBlock in splFeatureBlocks) { var featureBlockAsBytes = Common.WriteStruct(featureBlock); bw.Write(featureBlockAsBytes); } if (BackupManger != null) { BackupManger.BackupFile(file, file.Filename, file.FileType, this); } using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write)) { bw.BaseStream.Position = 0; bw.BaseStream.CopyTo(fs); fs.Flush(flushToDisk: true); } } } return true; }
public bool Write(string filename, IEFile file, bool forceSave = false) { if (!(file is WmpFile)) throw new ArgumentException("File is not a valid creature file"); var wmpFile = file as WmpFile; if (!(forceSave) && (MD5HashGenerator.GenerateKey(wmpFile) == wmpFile.Checksum)) return false; List<WmapWorldmapBinary> binaryWorldmaps = new List<WmapWorldmapBinary>(); List<WmapAreaBinary> binaryAreas = new List<WmapAreaBinary>(); List<WmapAreaLinkBinary> binaryLinks = new List<WmapAreaLinkBinary>(); foreach (var worldmap in wmpFile.worldmaps) { var worldmapBinary = new WmapWorldmapBinary(); worldmapBinary.AreaName = Common.WriteString(worldmap.AreaName, TlkFile); worldmapBinary.BackgroundMos = new array8(worldmap.BackgroundMos); worldmapBinary.Height = worldmap.Height; worldmapBinary.MapIconsBam = new array8(worldmap.MapIconsBam); worldmapBinary.MapNumber = worldmap.MapNumber; worldmapBinary.Unknown = worldmap.Unknown0038; worldmapBinary.Unknown1 = worldmap.Unknown0018; worldmapBinary.Unknown2= worldmap.Unknown001c; worldmapBinary.Width = worldmap.Width; var linkCount = 0; var areaCount = 0; foreach (var area in worldmap.areas) { var binaryArea = new WmapAreaBinary(); binaryArea.AreaFilename = new array8(area.AreaFilename); binaryArea.Caption = Common.WriteString(area.Caption, TlkFile); binaryArea.Flags = area.Flags; binaryArea.LoadingMos = new array8(area.LoadingMos); binaryArea.LongName = new array32(area.LongName); binaryArea.Name = Common.WriteString(area.Name, TlkFile); binaryArea.SequenceBam = area.SequenceBam; binaryArea.ShortName = new array8(area.ShortName); binaryArea.Unknown = area.Unknown0070; binaryArea.XCoordinate = area.XCoordinate; binaryArea.YCoordinate = area.YCoordinate; binaryArea.NorthLinkCount = area.NorthLinks.Count; binaryArea.NorthLinkIndex = binaryLinks.Count; foreach (var link in area.NorthLinks) { var linkBinary = new WmapAreaLinkBinary(); linkBinary.DefaultEntryLocation = link.DefaultEntryLocation; linkBinary.DestintationAreaIndex = link.DefaultEntryLocation; linkBinary.EntryPoint = new array32(link.EntryPoint); linkBinary.RandomEncounterArea1 = new array8(link.RandomEncounterArea1); linkBinary.RandomEncounterArea2 = new array8(link.RandomEncounterArea2); linkBinary.RandomEncounterArea3 = new array8(link.RandomEncounterArea3); linkBinary.RandomEncounterArea4 = new array8(link.RandomEncounterArea4); linkBinary.RandomEncounterArea5 = new array8(link.RandomEncounterArea5); linkBinary.RandomEncounterProbability = link.RandomEncounterProbability; linkBinary.TravelTime = link.TravelTime; linkBinary.Unknown = link.Unknown0058; binaryLinks.Add(linkBinary); linkCount++; } binaryArea.EastLinkCount = area.EastLinks.Count; binaryArea.EastLinkIndex = binaryLinks.Count; foreach (var link in area.EastLinks) { var linkBinary = new WmapAreaLinkBinary(); linkBinary.DefaultEntryLocation = link.DefaultEntryLocation; linkBinary.DestintationAreaIndex = link.DefaultEntryLocation; linkBinary.EntryPoint = new array32(link.EntryPoint); linkBinary.RandomEncounterArea1 = new array8(link.RandomEncounterArea1); linkBinary.RandomEncounterArea2 = new array8(link.RandomEncounterArea2); linkBinary.RandomEncounterArea3 = new array8(link.RandomEncounterArea3); linkBinary.RandomEncounterArea4 = new array8(link.RandomEncounterArea4); linkBinary.RandomEncounterArea5 = new array8(link.RandomEncounterArea5); linkBinary.RandomEncounterProbability = link.RandomEncounterProbability; linkBinary.TravelTime = link.TravelTime; linkBinary.Unknown = link.Unknown0058; binaryLinks.Add(linkBinary); linkCount++; } binaryArea.SouthLinkCount = area.SouthLinks.Count; binaryArea.SouthLinkIndex = binaryLinks.Count; foreach (var link in area.SouthLinks) { var linkBinary = new WmapAreaLinkBinary(); linkBinary.DefaultEntryLocation = link.DefaultEntryLocation; linkBinary.DestintationAreaIndex = link.DefaultEntryLocation; linkBinary.EntryPoint = new array32(link.EntryPoint); linkBinary.RandomEncounterArea1 = new array8(link.RandomEncounterArea1); linkBinary.RandomEncounterArea2 = new array8(link.RandomEncounterArea2); linkBinary.RandomEncounterArea3 = new array8(link.RandomEncounterArea3); linkBinary.RandomEncounterArea4 = new array8(link.RandomEncounterArea4); linkBinary.RandomEncounterArea5 = new array8(link.RandomEncounterArea5); linkBinary.RandomEncounterProbability = link.RandomEncounterProbability; linkBinary.TravelTime = link.TravelTime; linkBinary.Unknown = link.Unknown0058; binaryLinks.Add(linkBinary); linkCount++; } binaryArea.WestLinkCount = area.WestLinks.Count; binaryArea.WestLinkIndex = binaryLinks.Count; foreach (var link in area.WestLinks) { var linkBinary = new WmapAreaLinkBinary(); linkBinary.DefaultEntryLocation = link.DefaultEntryLocation; linkBinary.DestintationAreaIndex = link.DefaultEntryLocation; linkBinary.EntryPoint = new array32(link.EntryPoint); linkBinary.RandomEncounterArea1 = new array8(link.RandomEncounterArea1); linkBinary.RandomEncounterArea2 = new array8(link.RandomEncounterArea2); linkBinary.RandomEncounterArea3 = new array8(link.RandomEncounterArea3); linkBinary.RandomEncounterArea4 = new array8(link.RandomEncounterArea4); linkBinary.RandomEncounterArea5 = new array8(link.RandomEncounterArea5); linkBinary.RandomEncounterProbability = link.RandomEncounterProbability; linkBinary.TravelTime = link.TravelTime; linkBinary.Unknown = link.Unknown0058; binaryLinks.Add(linkBinary); linkCount++; } binaryAreas.Add(binaryArea); areaCount++; } worldmapBinary.AreaCount = areaCount; worldmapBinary.AreaOffset = WmapBinaryHeaderSize + (WmapBinaryWorldmapSize * wmpFile.worldmaps.Count); worldmapBinary.AreaLinkCount = linkCount; worldmapBinary.AreaLinkOffset = WmapBinaryHeaderSize + (WmapBinaryWorldmapSize * wmpFile.worldmaps.Count) + (WmapBinaryAreaSize * binaryAreas.Count); binaryWorldmaps.Add(worldmapBinary); } WmapHeaderBinary headerBinary = new WmapHeaderBinary(); headerBinary.ftype = new array4() { character1 = 'W', character2 = 'M', character3 = 'A', character4 = 'P' }; headerBinary.fversion = new array4() { character1 = 'V', character2 = '1', character3 = '.', character4 = '0' }; headerBinary.WorldmapCount = binaryWorldmaps.Count; headerBinary.WorldmapOffset = WmapBinaryHeaderSize; using (MemoryStream s = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(s)) { var headerAsBytes = Common.WriteStruct(headerBinary); bw.Write(headerAsBytes); foreach (var worldmap in binaryWorldmaps) { var worldmapAsBytes = Common.WriteStruct(worldmap); bw.Write(worldmapAsBytes); } foreach (var area in binaryAreas) { var areaAsBytes = Common.WriteStruct(area); bw.Write(areaAsBytes); } foreach (var link in binaryLinks) { var linkAsBytes = Common.WriteStruct(link); bw.Write(linkAsBytes); } if (BackupManger != null) { BackupManger.BackupFile(file, file.Filename, file.FileType, this); } using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write)) { bw.BaseStream.Position = 0; bw.BaseStream.CopyTo(fs); fs.Flush(flushToDisk: true); } } } return true; }
public bool Write(string filename, IEFile file, bool forceSave = false) { if (!(file is ProFile)) throw new ArgumentException("File is not a valid creature file"); var proFile = file as ProFile; if (!(forceSave) && (MD5HashGenerator.GenerateKey(proFile) == proFile.Checksum)) return false; ProHeaderBinary header = new ProHeaderBinary(); header.ProjectileFlags = proFile.ProjectileFlags.EnableBAMColouring ? header.ProjectileFlags | Common.Bit0 : header.ProjectileFlags; header.ProjectileFlags = proFile.ProjectileFlags.EnableSmoke ? header.ProjectileFlags | Common.Bit1 : header.ProjectileFlags; header.ProjectileFlags = proFile.ProjectileFlags.Unused ? header.ProjectileFlags | Common.Bit2 : header.ProjectileFlags; header.ProjectileFlags = proFile.ProjectileFlags.EnableAreaLighting ? header.ProjectileFlags | Common.Bit3 : header.ProjectileFlags; header.ProjectileFlags = proFile.ProjectileFlags.EnableAreaHeight ? header.ProjectileFlags | Common.Bit4 : header.ProjectileFlags; header.ProjectileFlags = proFile.ProjectileFlags.EnableShadow ? header.ProjectileFlags | Common.Bit5 : header.ProjectileFlags; header.ProjectileFlags = proFile.ProjectileFlags.EnableLightSpot ? header.ProjectileFlags | Common.Bit6 : header.ProjectileFlags; header.ProjectileFlags = proFile.ProjectileFlags.EnableBrightenFlags ? header.ProjectileFlags | Common.Bit7 : header.ProjectileFlags; header.ProjectileFlags = proFile.ProjectileFlags.LowLevelBrighten ? header.ProjectileFlags | Common.Bit8 : header.ProjectileFlags; header.ProjectileFlags = proFile.ProjectileFlags.HighLevelBrighten ? header.ProjectileFlags | Common.Bit9 : header.ProjectileFlags; header.SparkingFlags = proFile.SparkingFlags.ShowSparkle ? header.SparkingFlags | Common.Bit0 : header.SparkingFlags; header.SparkingFlags = proFile.SparkingFlags.UseZCoordinate ? header.SparkingFlags | Common.Bit1 : header.SparkingFlags; header.SparkingFlags = proFile.SparkingFlags.LoopTravelSound ? header.SparkingFlags | Common.Bit2 : header.SparkingFlags; header.SparkingFlags = proFile.SparkingFlags.LoopArrivalSound ? header.SparkingFlags | Common.Bit3 : header.SparkingFlags; header.SparkingFlags = proFile.SparkingFlags.DoNotAffectDirectTarget ? header.SparkingFlags | Common.Bit4 : header.SparkingFlags; header.SparkingFlags = proFile.SparkingFlags.DrawBelowAnimateObjects ? header.SparkingFlags | Common.Bit5 : header.SparkingFlags; header.ftype = new array4() { character1 = 'P', character2 = 'R', character3 = 'O', character4 = ' ' }; header.fversion = new array4() { character1 = 'V', character2 = '1', character3 = '.', character4 = '0' }; header.ArrivalWav = proFile.ArrivalWav; header.FaceTargetGranularity = (byte)proFile.FaceTargetGranularity; header.LightSpotHeight = proFile.LightSpotHeight; header.LightSpotIntensity = proFile.LightSpotIntensity; header.LightSpotWidth = proFile.LightSpotWidth; header.Palette = new array8(proFile.Palette); header.ProjectileAnimation = new array8(proFile.ProjectileAnimation); header.ProjectileColour1 = proFile.ProjectileColour1; header.ProjectileColour2 = proFile.ProjectileColour2; header.ProjectileColour3 = proFile.ProjectileColour3; header.ProjectileColour4 = proFile.ProjectileColour4; header.ProjectileColour5 = proFile.ProjectileColour5; header.ProjectileColour6 = proFile.ProjectileColour6; header.ProjectileColour7 = proFile.ProjectileColour7; header.ProjectileNumberBAMSequence = proFile.ProjectileNumberBAMSequence; header.ProjectileSmokeAnimation = proFile.ProjectileSmokeAnimation; header.ProjectileSpeed = proFile.ProjectileSpeed; header.ProjectileType = (short)proFile.ProjectileType; header.ShadowAnimation = new array8(proFile.ShadowAnimation); header.ShadowNumberBAMSequence = proFile.ShadowNumberBAMSequence; header.SmokeColour1 = proFile.SmokeColour1; header.SmokeColour2 = proFile.SmokeColour2; header.SmokeColour3 = proFile.SmokeColour3; header.SmokeColour4 = proFile.SmokeColour4; header.SmokeColour5 = proFile.SmokeColour5; header.SmokeColour6 = proFile.SmokeColour6; header.SmokeColour7 = proFile.SmokeColour7; header.SmokePuffPeriod = proFile.SmokePuffPeriod; header.SparkColour = (short)proFile.SparkColour; header.TrailingAnimation1 = new array8(proFile.TrailingAnimation1); header.TrailingAnimation2 = new array8(proFile.TrailingAnimation2); header.TrailingAnimation3 = new array8(proFile.TrailingAnimation3); header.TrailingBAMSequence1 = proFile.TrailingBAMSequence1; header.TrailingBAMSequence2 = proFile.TrailingBAMSequence2; header.TrailingBAMSequence3 = proFile.TrailingBAMSequence3; header.TravelBAM = proFile.TravelBAM; header.TravelWav = proFile.TravelWav; header.Unused = proFile.Unused; header.Unused2 = proFile.Unused2; ProExtendedHeaderBinary extendedHeader = new ProExtendedHeaderBinary(); extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.ProjectileRemainsVisibleAtDestination ? extendedHeader.AreaProjectileFlags | Common.Bit0 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.TriggeredByInanimateObjects ? extendedHeader.AreaProjectileFlags | Common.Bit1 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.TriggeredOnCondition ? extendedHeader.AreaProjectileFlags | Common.Bit2 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.TriggerDuringDelay ? extendedHeader.AreaProjectileFlags | Common.Bit3 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.UseSecondaryProjectile ? extendedHeader.AreaProjectileFlags | Common.Bit4 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.UseFragmentGraphics ? extendedHeader.AreaProjectileFlags | Common.Bit5 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.TargetSelection1 ? extendedHeader.AreaProjectileFlags | Common.Bit6 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.TargetSelection2 ? extendedHeader.AreaProjectileFlags | Common.Bit7 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.NumberOfTriggersEqualToCastMageLevel ? extendedHeader.AreaProjectileFlags | Common.Bit8 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.NumberOfTriggersEqualToCastClericLevel ? extendedHeader.AreaProjectileFlags | Common.Bit9 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.UseVVC ? extendedHeader.AreaProjectileFlags | Common.Bit10 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.ConeShape ? extendedHeader.AreaProjectileFlags | Common.Bit11 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.AffectObjectsThroughWallMountainBuildingAndOffArea ? extendedHeader.AreaProjectileFlags | Common.Bit12 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.CheckTriggersFromAnimationFrame30 ? extendedHeader.AreaProjectileFlags | Common.Bit13 : extendedHeader.AreaProjectileFlags; // (req. bit 0) extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.DelayedExplosion ? extendedHeader.AreaProjectileFlags | Common.Bit14 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaProjectileFlags = proFile.ExtendedHeader.AreaProjectileFlags.AffectOnlyOneTarget ? extendedHeader.AreaProjectileFlags | Common.Bit15 : extendedHeader.AreaProjectileFlags; extendedHeader.AreaOfEffect = proFile.ExtendedHeader.AreaOfEffect; extendedHeader.ConeWidth = proFile.ExtendedHeader.ConeWidth; extendedHeader.ExplosionAnimation = proFile.ExtendedHeader.ExplosionAnimation; extendedHeader.ExplosionAnimationAnimation = proFile.ExtendedHeader.ExplosionAnimationAnimation; extendedHeader.ExplosionColour = proFile.ExtendedHeader.ExplosionColour; extendedHeader.ExplosionDelay = proFile.ExtendedHeader.ExplosionDelay; extendedHeader.ExplosionProjectile = proFile.ExtendedHeader.ExplosionProjectile; extendedHeader.FragmentAnimation = proFile.ExtendedHeader.FragmentAnimation; extendedHeader.SecondaryProjectile = proFile.ExtendedHeader.SecondaryProjectile; extendedHeader.TriggerCount = proFile.ExtendedHeader.TriggerCount; extendedHeader.TriggerRadius = proFile.ExtendedHeader.TriggerRadius; extendedHeader.TriggerSound = proFile.ExtendedHeader.TriggerSound; extendedHeader.Unused = proFile.ExtendedHeader.Unused; extendedHeader.Unused2 = proFile.ExtendedHeader.Unused2; using (MemoryStream s = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(s)) { var headerAsBytes = Common.WriteStruct(header); bw.Write(headerAsBytes); if (header.ProjectileType == (int)ProjectileType.AreaOfEffect) { var extendedHeaderAsBytes = Common.WriteStruct(extendedHeader); bw.Write(extendedHeaderAsBytes); } if (BackupManger != null) { BackupManger.BackupFile(file, file.Filename, file.FileType, this); } using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write)) { bw.BaseStream.Position = 0; bw.BaseStream.CopyTo(fs); fs.Flush(flushToDisk: true); } } } return true; }
public bool Write(string filename, IEFile file, bool forceSave = false) { if (!(file is StoFile)) throw new ArgumentException("File is not a valid creature file"); var stoFile = file as StoFile; if (!(forceSave) && (MD5HashGenerator.GenerateKey(stoFile) == stoFile.Checksum)) return false; List<StoSaleItemBinary> stoSaleItems = new List<StoSaleItemBinary>(); List<StoDrinkItemBinary> stoDrinkItems = new List<StoDrinkItemBinary>(); List<StoCureBinary> stoCures = new List<StoCureBinary>(); List<Int32> stoBuyItems = new List<Int32>(); foreach (var saleItem in stoFile.ItemsSoldByStore) { StoSaleItemBinary saleItemBinary = new StoSaleItemBinary(); saleItemBinary.Amount = saleItem.Amount; saleItemBinary.Filename = saleItem.Filename; saleItemBinary.Flags = saleItem.Flags.Identified ? saleItemBinary.Flags | Common.Bit0 : saleItemBinary.Flags; saleItemBinary.Flags = saleItem.Flags.Unstealable ? saleItemBinary.Flags | Common.Bit1 : saleItemBinary.Flags; saleItemBinary.Flags = saleItem.Flags.Stolen ? saleItemBinary.Flags | Common.Bit2 : saleItemBinary.Flags; saleItemBinary.Flags = saleItem.Flags.Undroppable ? saleItemBinary.Flags | Common.Bit3 : saleItemBinary.Flags; saleItemBinary.IsInfinite = saleItem.IsInfinite; saleItemBinary.ItemExpirationTime = saleItem.ItemExpirationTime; saleItemBinary.Quantity1 = saleItem.Quantity1; saleItemBinary.Quantity2 = saleItem.Quantity2; saleItemBinary.Quantity3 = saleItem.Quantity3; stoSaleItems.Add(saleItemBinary); } foreach (var drink in stoFile.stoDrinkItems) { StoDrinkItemBinary drinkBinary = new StoDrinkItemBinary(); drinkBinary.Name = Common.WriteString(drink.Name, TlkFile); drinkBinary.Price = drink.Price; drinkBinary.Rumours = drink.Rumours; drinkBinary.Strength = drink.Strength; stoDrinkItems.Add(drinkBinary); } foreach (var cure in stoFile.stoCures) { StoCureBinary cureBinary = new StoCureBinary(); cureBinary.Filename = cure.Filename; cureBinary.Price = cure.Price; stoCures.Add(cureBinary); } foreach (var buyItem in stoFile.ItemTypesBoughtByStore) { stoBuyItems.Add((Int32)buyItem); } StoHeaderBinary header = new StoHeaderBinary(); header.Flags = stoFile.Flags.CanBuyFromPlayer ? header.Flags | Common.Bit0 : header.Flags; header.Flags = stoFile.Flags.AllowedToSell ? header.Flags | Common.Bit1 : header.Flags; header.Flags = stoFile.Flags.AllowedToIdentify ? header.Flags | Common.Bit2 : header.Flags; header.Flags = stoFile.Flags.AllowedToSteal ? header.Flags | Common.Bit3 : header.Flags; header.Flags = stoFile.Flags.AllowedToDonate ? header.Flags | Common.Bit4 : header.Flags; header.Flags = stoFile.Flags.AllowedToPurchaseCure ? header.Flags | Common.Bit5 : header.Flags; header.Flags = stoFile.Flags.AllowedToPurchaseDrinks ? header.Flags | Common.Bit6 : header.Flags; header.Flags = stoFile.Flags.FlagUnknown1 ? header.Flags | Common.Bit7 : header.Flags; header.Flags = stoFile.Flags.FlagUnknown2 ? header.Flags | Common.Bit8 : header.Flags; header.Flags = stoFile.Flags.Quality1 ? header.Flags | Common.Bit9 : header.Flags; header.Flags = stoFile.Flags.Quality2 ? header.Flags | Common.Bit10 : header.Flags; header.Flags = stoFile.Flags.FlagUnknown3 ? header.Flags | Common.Bit11 : header.Flags; header.Flags = stoFile.Flags.BuyFencedGoods ? header.Flags | Common.Bit12 : header.Flags; header.ftype = new array4() { character1 = 'S', character2 = 'T', character3 = 'O', character4 = 'R' }; header.fversion = new array4() { character1 = 'V', character2 = '1', character3 = '.', character4 = '0' }; header.Name = Common.WriteString(stoFile.Name, TlkFile); header.StoreType = (Int32)stoFile.StoreType; header.SellMarkup = stoFile.SellMarkup; header.BuyMarkup = stoFile.BuyMarkup; header.DepreciationRate = stoFile.DepreciationRate; header.StealFailurePercentage = stoFile.StealFailurePercentage; header.Capacity = stoFile.Capacity; header.Unknown = stoFile.Unknown0024; header.PurchaseOffset = HeaderSize; header.PurchaseCount = stoBuyItems.Count; header.SaleOffset = HeaderSize + (PurchaseSize * stoBuyItems.Count); header.SaleCount = stoSaleItems.Count; header.Lore = stoFile.Lore; header.CostToIdentifyItem = stoFile.CostToIdentifyItem; header.RumoursTavern = stoFile.RumoursTavern; header.DrinksOffset = HeaderSize + (PurchaseSize * stoBuyItems.Count) + (SaleSize * stoSaleItems.Count); header.DrinksCount = stoDrinkItems.Count; header.RumoursTemple = stoFile.RumoursTemple; header.Rooms = stoFile.PeasantRoom ? header.Rooms | Common.Bit0 : header.Rooms; header.Rooms = stoFile.MerchantRoom ? header.Rooms | Common.Bit1 : header.Rooms; header.Rooms = stoFile.NobleRoom ? header.Rooms | Common.Bit2 : header.Rooms; header.Rooms = stoFile.RoyalRoom ? header.Rooms | Common.Bit3 : header.Rooms; header.PeasantRoomPrice = stoFile.PeasantRoomPrice; header.NobleRoomPrice = stoFile.NobleRoomPrice; header.MerchantRoomPrice = stoFile.MerchantRoomPrice; header.RoyalRoomPrice = stoFile.RoyalRoomPrice; header.CureOffset = HeaderSize + (PurchaseSize * stoBuyItems.Count) + (SaleSize * stoSaleItems.Count) + (DrinkSize * stoDrinkItems.Count); header.CureCount = stoCures.Count; header.Unknown2 = stoFile.Unknown2; header.Unknown3 = stoFile.Unknown3; header.Unknown4 = stoFile.Unknown4; header.Unknown5 = stoFile.Unknown5; header.Unknown6 = stoFile.Unknown6; using (MemoryStream s = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(s)) { var headerAsBytes = Common.WriteStruct(header); bw.Write(headerAsBytes); foreach (var buyItem in stoBuyItems) { var stoBuyItemAsBytes = Common.WriteStruct(buyItem); bw.Write(stoBuyItemAsBytes); } foreach (var saleItem in stoSaleItems) { var stoSaleItemAsBytes = Common.WriteStruct(saleItem); bw.Write(stoSaleItemAsBytes); } foreach (var drinkItem in stoDrinkItems) { var stoDrinkItemAsBytes = Common.WriteStruct(drinkItem); bw.Write(stoDrinkItemAsBytes); } foreach (var cureItem in stoCures) { var stoCureItemAsBytes = Common.WriteStruct(cureItem); bw.Write(stoCureItemAsBytes); } if (BackupManger != null) { BackupManger.BackupFile(file, file.Filename, file.FileType, this); } using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write)) { bw.BaseStream.Position = 0; bw.BaseStream.CopyTo(fs); fs.Flush(flushToDisk: true); } } } return true; }
public bool Write(string filename, IEFile file, bool forceSave = false) { if (!(file is EffFile)) throw new ArgumentException("File is not a valid eff file"); var effFile = file as EffFile; if (!(forceSave) && (MD5HashGenerator.GenerateKey(effFile) == effFile.Checksum)) return false; EffHeaderBinary header = new EffHeaderBinary(); header.ftype = new array4() { character1 = 'E', character2 = 'F', character3 = 'F', character4 = ' ' }; header.fversion = new array4() { character1 = 'V', character2 = '2', character3 = '.', character4 = '0' }; header.ftype2 = new array4() { character1 = 'E', character2 = 'F', character3 = 'F', character4 = ' ' }; header.fversion2 = new array4() { character1 = 'V', character2 = '2', character3 = '.', character4 = '0' }; ; header.CasterLevel = effFile.CasterLevel; header.CasterXCoordinate = effFile.CasterXCoordinate; header.CasterYCoordinate = effFile.CasterYCoordinate; header.DiceSides = effFile.DiceSides; header.DiceThrown = effFile.DiceThrown; header.Duration = effFile.Duration; header.HighestAffectedLevelFromParent = effFile.HighestAffectedLevelFromParent; header.LowestAffectedLevelFromParent = effFile.LowestAffectedLevelFromParent; header.Opcode = effFile.Opcode; header.Parameter1 = effFile.Parameter1; header.Parameter2 = effFile.Parameter2; header.Parameter3 = effFile.Parameter3; header.Parameter4 = effFile.Parameter4; header.ParentResource = effFile.ParentResource; header.ParentResourceSlot = effFile.ParentResourceSlot; header.Power = effFile.Power; header.PrimaryType = effFile.PrimaryType; header.Probability1 = effFile.Probability1; header.Probability2 = effFile.Probability2; header.Projectile = effFile.Projectile; header.Resistance = effFile.Resistance; header.Resource = effFile.Resource; header.Resource2 = effFile.Resource2; header.Resource3 = effFile.Resource3; header.ResourceTypeFromParent = effFile.ResourceTypeFromParent; header.SavingThrowBonus = effFile.SavingThrowBonus; header.SavingThrowType = effFile.SavingThrowType; header.SecondaryType = effFile.SecondaryType; header.SetLocalVariableIfNonExistant = effFile.SetLocalVariableIfNonExistant; header.TargetType = effFile.TargetType; header.TargetXCoordinate = effFile.TargetXCoordinate; header.TargetYCoordinate = effFile.TargetYCoordinate; header.TimingMode = effFile.TimingMode; header.Unknown = effFile.Unknown; header.Unknown2 = effFile.Unknown2; header.Unknown3 = effFile.Unknown3; header.Unknown4 = effFile.Unknown4; header.Unknown5 = effFile.Unknown5; header.Unknownd4_1 = effFile.Unknownd4_1; header.Unknownd4_2 = effFile.Unknownd4_2; header.Unknownd4_3 = effFile.Unknownd4_3; header.Unknownd4_4 = effFile.Unknownd4_4; header.Unknownd4_5 = effFile.Unknownd4_5; header.Unknownd4_6 = effFile.Unknownd4_6; header.Unknownd4_7 = effFile.Unknownd4_7; header.Unknownd4_8 = effFile.Unknownd4_8; header.Unknownd4_9 = effFile.Unknownd4_9; header.Unknownd4_10 = effFile.Unknownd4_10; header.Unknownd4_11 = effFile.Unknownd4_11; header.Unknownd4_12 = effFile.Unknownd4_12; header.Unknownd4_13 = effFile.Unknownd4_13; header.Unknownd4_14 = effFile.Unknownd4_14; header.Unknownd4_15 = effFile.Unknownd4_15; header.Variable = effFile.Variable; using (MemoryStream s = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(s)) { var headerAsBytes = Common.WriteStruct(header); bw.Write(headerAsBytes); if (BackupManger != null) { BackupManger.BackupFile(file, file.Filename, file.FileType, this); } using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write)) { bw.BaseStream.Position = 0; bw.BaseStream.CopyTo(fs); fs.Flush(flushToDisk: true); } } } return true; }
public bool Write(string filename, IEFile file, bool forceSave = false) { if (!(file is ItmFile)) throw new ArgumentException("File is not a valid creature file"); var itmFile = file as ItmFile; if (!(forceSave) && (MD5HashGenerator.GenerateKey(itmFile) == itmFile.Checksum)) return false; List<ItmExtendedHeaderBinary> itmExtendedHeaders = new List<ItmExtendedHeaderBinary>(); List<ItmFeatureBlockBinary> itmFeatureBlocks = new List<ItmFeatureBlockBinary>(); foreach (var featureBlock in itmFile.itmFeatureBlocks) { ItmFeatureBlockBinary featureBlockBinary = new ItmFeatureBlockBinary(); featureBlockBinary.DiceSides = featureBlock.DiceSides; featureBlockBinary.DiceThrown = featureBlock.DiceThrown; featureBlockBinary.Duration = featureBlock.Duration; featureBlockBinary.Opcode = featureBlock.Opcode; featureBlockBinary.Parameter1 = featureBlock.Parameter1; featureBlockBinary.Parameter2 = featureBlock.Parameter2; featureBlockBinary.Power = featureBlock.Power; featureBlockBinary.Probability1 = featureBlock.Probability1; featureBlockBinary.Probability2 = featureBlock.Probability2; featureBlockBinary.Resistance = featureBlock.Resistance; featureBlockBinary.Resource = featureBlock.Resource; featureBlockBinary.SavingThrowBonus = featureBlock.SavingThrowBonus; featureBlockBinary.SavingThrowType = featureBlock.SavingThrowType; featureBlockBinary.TargetType = featureBlock.TargetType; featureBlockBinary.TimingMode = featureBlock.TimingMode; featureBlockBinary.Unknown = featureBlock.Unknown; itmFeatureBlocks.Add(featureBlockBinary); } foreach (var extendedHeader in itmFile.itmExtendedHeader) { ItmExtendedHeaderBinary extendedHeaderBinary = new ItmExtendedHeaderBinary(); extendedHeaderBinary.AlternaticeDamageBonus = extendedHeader.AlternaticeDamageBonus; extendedHeaderBinary.AlternaticeDiceSides = extendedHeader.AlternaticeDiceSides; extendedHeaderBinary.AlternaticeDiceThrown = extendedHeader.AlternaticeDiceThrown; extendedHeaderBinary.AttackType = extendedHeader.AttackType; extendedHeaderBinary.ChargeDepletionBehaviour = extendedHeader.ChargeDepletionBehaviour; extendedHeaderBinary.Charges = extendedHeader.Charges; extendedHeaderBinary.DamageBonus = extendedHeader.DamageBonus; extendedHeaderBinary.DamageType = extendedHeader.DamageType; extendedHeaderBinary.DiceSides = extendedHeader.DiceSides; extendedHeaderBinary.DiceThrown = extendedHeader.DiceThrown; extendedHeaderBinary.Flags = extendedHeader.Flags; extendedHeaderBinary.IdentificationRequirement = extendedHeader.IdentificationRequirement; extendedHeaderBinary.IsBowArrow = extendedHeader.IsBowArrow; extendedHeaderBinary.IsCrossbowBolt = extendedHeader.IsCrossbowBolt; extendedHeaderBinary.IsMiscProjectile = extendedHeader.IsMiscProjectile; extendedHeaderBinary.Location = extendedHeader.Location; extendedHeaderBinary.MeleeAnimation1 = extendedHeader.MeleeAnimation1; extendedHeaderBinary.MeleeAnimation2 = extendedHeader.MeleeAnimation2; extendedHeaderBinary.MeleeAnimation3 = extendedHeader.MeleeAnimation3; extendedHeaderBinary.PrimaryType = extendedHeader.PrimaryType; extendedHeaderBinary.ProjectileAnimation = extendedHeader.ProjectileAnimation; extendedHeaderBinary.ProjectileType = extendedHeader.ProjectileType; extendedHeaderBinary.Range = extendedHeader.Range; extendedHeaderBinary.SecondaryType = extendedHeader.SecondaryType; extendedHeaderBinary.Speed = extendedHeader.Speed; extendedHeaderBinary.TargetCount = extendedHeader.TargetCount; extendedHeaderBinary.TargetType = extendedHeader.TargetType; extendedHeaderBinary.Thac0Bonus = extendedHeader.Thac0Bonus; extendedHeaderBinary.Unknown = extendedHeader.Unknown; extendedHeaderBinary.UseIcon = extendedHeader.UseIcon; extendedHeaderBinary.FeatureBlockCount = extendedHeader.FeatureBlockCount; extendedHeaderBinary.FeatureBlockOffset = Convert.ToInt16(extendedHeader.itmFeatureBlocks.Count); foreach (var featureBlock in extendedHeader.itmFeatureBlocks) { ItmFeatureBlockBinary featureBlockBinary = new ItmFeatureBlockBinary(); featureBlockBinary.DiceSides = featureBlock.DiceSides; featureBlockBinary.DiceThrown = featureBlock.DiceThrown; featureBlockBinary.Duration = featureBlock.Duration; featureBlockBinary.Opcode = featureBlock.Opcode; featureBlockBinary.Parameter1 = featureBlock.Parameter1; featureBlockBinary.Parameter2 = featureBlock.Parameter2; featureBlockBinary.Power = featureBlock.Power; featureBlockBinary.Probability1 = featureBlock.Probability1; featureBlockBinary.Probability2 = featureBlock.Probability2; featureBlockBinary.Resistance = featureBlock.Resistance; featureBlockBinary.Resource = featureBlock.Resource; featureBlockBinary.SavingThrowBonus = featureBlock.SavingThrowBonus; featureBlockBinary.SavingThrowType = featureBlock.SavingThrowType; featureBlockBinary.TargetType = featureBlock.TargetType; featureBlockBinary.TimingMode = featureBlock.TimingMode; featureBlockBinary.Unknown = featureBlock.Unknown; itmFeatureBlocks.Add(featureBlockBinary); } itmExtendedHeaders.Add(extendedHeaderBinary); } ItmHeaderBinary header = new ItmHeaderBinary(); header.Flags = itmFile.Flags.CriticalItem ? header.Flags | Common.Bit0 : header.Flags; header.Flags = itmFile.Flags.TwoHanded ? header.Flags | Common.Bit1 : header.Flags; header.Flags = itmFile.Flags.Movable ? header.Flags | Common.Bit2 : header.Flags; header.Flags = itmFile.Flags.Displayable ? header.Flags | Common.Bit3 : header.Flags; header.Flags = itmFile.Flags.Cursed ? header.Flags | Common.Bit4 : header.Flags; header.Flags = itmFile.Flags.Unknown5 ? header.Flags | Common.Bit5 : header.Flags; header.Flags = itmFile.Flags.Magical ? header.Flags | Common.Bit6 : header.Flags; header.Flags = itmFile.Flags.Bow ? header.Flags | Common.Bit7 : header.Flags; header.Flags = itmFile.Flags.Silver ? header.Flags | Common.Bit8 : header.Flags; header.Flags = itmFile.Flags.ColdIron ? header.Flags | Common.Bit9 : header.Flags; header.Flags = itmFile.Flags.Stolen ? header.Flags | Common.Bit10 : header.Flags; header.Flags = itmFile.Flags.Conversable ? header.Flags | Common.Bit11 : header.Flags; header.Flags = itmFile.Flags.Unknown12 ? header.Flags | Common.Bit12 : header.Flags; header.Flags = itmFile.Flags.Unknown13 ? header.Flags | Common.Bit13 : header.Flags; header.Flags = itmFile.Flags.Unknown14 ? header.Flags | Common.Bit14 : header.Flags; header.Flags = itmFile.Flags.Unknown15 ? header.Flags | Common.Bit15 : header.Flags; header.Flags = itmFile.Flags.Unknown16 ? header.Flags | Common.Bit16 : header.Flags; header.Flags = itmFile.Flags.Unknown17 ? header.Flags | Common.Bit17 : header.Flags; header.Flags = itmFile.Flags.Unknown18 ? header.Flags | Common.Bit18 : header.Flags; header.Flags = itmFile.Flags.Unknown19 ? header.Flags | Common.Bit19 : header.Flags; header.Flags = itmFile.Flags.Unknown20 ? header.Flags | Common.Bit20 : header.Flags; header.Flags = itmFile.Flags.Unknown21 ? header.Flags | Common.Bit21 : header.Flags; header.Flags = itmFile.Flags.Unknown22 ? header.Flags | Common.Bit22 : header.Flags; header.Flags = itmFile.Flags.Unknown23 ? header.Flags | Common.Bit23 : header.Flags; header.Flags = itmFile.Flags.Unknown24 ? header.Flags | Common.Bit24 : header.Flags; header.Flags = itmFile.Flags.Unknown25 ? header.Flags | Common.Bit25 : header.Flags; header.Flags = itmFile.Flags.Unknown26 ? header.Flags | Common.Bit26 : header.Flags; header.Flags = itmFile.Flags.Unknown27 ? header.Flags | Common.Bit27 : header.Flags; header.Flags = itmFile.Flags.Unknown28 ? header.Flags | Common.Bit28 : header.Flags; header.Flags = itmFile.Flags.Unknown29 ? header.Flags | Common.Bit29 : header.Flags; header.Flags = itmFile.Flags.Unknown30 ? header.Flags | Common.Bit30 : header.Flags; header.Flags = itmFile.Flags.Unknown31 ? header.Flags | Common.Bit31 : header.Flags; header.ftype = new array4() { character1 = 'I', character2 = 'T', character3 = 'M', character4 = ' ' }; header.fversion = new array4() { character1 = 'V', character2 = '1', character3 = ' ', character4 = ' ' }; header.Animation = new array2() { character1 = itmFile.Animation[0], character2 = itmFile.Animation[1] }; header.DescriptionIcon = new array8(itmFile.DescriptionIcon); header.Enchantment = itmFile.Enchantment; header.ExtendedHeaderCount = Convert.ToInt16(itmExtendedHeaders.Count); header.ExtendedHeaderOffset = HeaderSize; header.FeatureBlockEquippingCount = Convert.ToInt16(itmFile.itmFeatureBlocks.Count); header.FeatureBlockEquippingIndex = 0; header.FeatureBlockOffset = HeaderSize + (ExtendedHeaderSize * itmExtendedHeaders.Count); header.GroundIcon = new array8(itmFile.GroundIcon); header.IdentifiedDescription = Common.WriteString(itmFile.IdentifiedDescription, TlkFile); header.IdentifiedName = Common.WriteString(itmFile.IdentifiedName, TlkFile); header.InventoryIcon = new array8(itmFile.InventoryIcon); header.ItemType = Convert.ToInt16(itmFile.ItemType); header.KitUsability1 = itmFile.KitUsability1; header.KitUsability2 = itmFile.KitUsability2; header.KitUsability3 = itmFile.KitUsability3; header.KitUsability4 = itmFile.KitUsability4; header.LoreToIdentify = itmFile.LoreToIdentify; header.MinimumCharisma = itmFile.MinimumCharisma; header.MinimumConstitution = itmFile.MinimumConstitution; header.MinimumDexterity = itmFile.MinimumDexterity; header.MinimumIntelligence = itmFile.MinimumIntelligence; header.MinimumLevel = itmFile.MinimumLevel; header.MinimumStrength = itmFile.MinimumStrength; header.MinimumStrengthBonus = itmFile.MinimumStrengthBonus; header.MinimumWisdom = itmFile.MinimumWisdom; header.Price = itmFile.Price; header.Proficiency = itmFile.Proficiency; header.ReplacementItem = new array8(itmFile.ReplacementItem); header.StackAmount = itmFile.StackAmount; header.UnidentifiedDescription = Common.WriteString(itmFile.UnidentifiedDescription, TlkFile); header.UnidentifiedName = Common.WriteString(itmFile.UnidentifiedName, TlkFile); header.Unknown = itmFile.Unknown; header.Unknown2 = itmFile.Unknown2; header.Unknown3 = itmFile.Unknown3; header.Usability1 = itmFile.Usability1; header.Usability2 = itmFile.Usability2; header.Usability3 = itmFile.Usability3; header.Weight = itmFile.Weight; using (MemoryStream s = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(s)) { var headerAsBytes = Common.WriteStruct(header); bw.Write(headerAsBytes); foreach (var extendedHeader in itmExtendedHeaders) { var extendedHeaderAsBytes = Common.WriteStruct(extendedHeader); bw.Write(extendedHeaderAsBytes); } foreach (var featureBlock in itmFeatureBlocks) { var featureBlockAsBytes = Common.WriteStruct(featureBlock); bw.Write(featureBlockAsBytes); } if (BackupManger != null) { BackupManger.BackupFile(file, file.Filename, file.FileType, this); } using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write)) { bw.BaseStream.Position = 0; bw.BaseStream.CopyTo(fs); fs.Flush(flushToDisk: true); } } } return true; }
public bool Write(string filename, IEFile file, bool forceSave = false) { if (!(file is AreFile)) throw new ArgumentException("File is not a valid area file"); var areFile = file as AreFile; if (!(forceSave) && (MD5HashGenerator.GenerateKey(areFile) == areFile.Checksum)) return false; List<AreActorBinary> actors = new List<AreActorBinary>(); List<AreRegionBinary> regions = new List<AreRegionBinary>(); List<AreSpawnPointBinary> spawns = new List<AreSpawnPointBinary>(); List<AreEntranceBinary> entrances = new List<AreEntranceBinary>(); List<AreContainerBinary> containers = new List<AreContainerBinary>(); List<AreItemBinary> items = new List<AreItemBinary>(); List<AreAmbientBinary> ambients = new List<AreAmbientBinary>(); List<AreVariableBinary> variables = new List<AreVariableBinary>(); List<AreDoorBinary> doors = new List<AreDoorBinary>(); List<AreAnimationBinary> animations = new List<AreAnimationBinary>(); List<AreNoteBinary> notes = new List<AreNoteBinary>(); List<AreTiledObjectBinary> tiledObjects = new List<AreTiledObjectBinary>(); List<AreProjectileBinary> projectiles = new List<AreProjectileBinary>(); List<AreSongBinary> songs = new List<AreSongBinary>(); List<AreInterruptionBinary> interruptions = new List<AreInterruptionBinary>(); List<byte> areaExplorations = new List<byte>(); List<Int32> vertices = new List<Int32>(); foreach (var interruption in areFile.interruptions) { AreInterruptionBinary interruptionBinary = new AreInterruptionBinary(); interruptionBinary.CreatureCount = interruption.CreatureCount; interruptionBinary.DayProbability = interruption.DayProbability; interruptionBinary.Difficulty = interruption.Difficulty; interruptionBinary.Enabled = interruption.Enabled; interruptionBinary.MaximumCreaturesToSpawn = interruption.MaximumCreaturesToSpawn; interruptionBinary.Name = new array32(interruption.Name); interruptionBinary.NightProbability = interruption.NightProbability; interruptionBinary.RemovalTime = interruption.RemovalTime; interruptionBinary.ResRef1 = new array8(interruption.ResRef1); interruptionBinary.ResRef2 = new array8(interruption.ResRef2); interruptionBinary.ResRef3 = new array8(interruption.ResRef3); interruptionBinary.ResRef4 = new array8(interruption.ResRef4); interruptionBinary.ResRef5 = new array8(interruption.ResRef5); interruptionBinary.ResRef6 = new array8(interruption.ResRef6); interruptionBinary.ResRef7 = new array8(interruption.ResRef7); interruptionBinary.ResRef8 = new array8(interruption.ResRef8); interruptionBinary.ResRef9 = new array8(interruption.ResRef9); interruptionBinary.ResRef10 = new array8(interruption.ResRef10); interruptionBinary.RestrictionDistance = interruption.RestrictionDistance; interruptionBinary.Text1 = interruption.Text1; interruptionBinary.Text2 = interruption.Text2; interruptionBinary.Text3 = interruption.Text3; interruptionBinary.Text4 = interruption.Text4; interruptionBinary.Text5 = interruption.Text5; interruptionBinary.Text6 = interruption.Text6; interruptionBinary.Text7 = interruption.Text7; interruptionBinary.Text8 = interruption.Text8; interruptionBinary.Text9 = interruption.Text9; interruptionBinary.Text10 = interruption.Text10; interruptionBinary.Unknown = interruption.Unknown; interruptions.Add(interruptionBinary); } foreach (var song in areFile.songs) { AreSongBinary songBinary = new AreSongBinary(); songBinary.BattleSong = song.BattleSong; songBinary.DayAmbient1Wav = new array8(song.DayAmbient1Wav); songBinary.DayAmbient2Wav = new array8(song.DayAmbient2Wav); songBinary.DayAmbientVolume = song.DayAmbientVolume; songBinary.DaySong = song.DaySong; songBinary.LoseSong = song.LoseSong; songBinary.NightAmbient1Wav = new array8(song.NightAmbient1Wav); songBinary.NightAmbient2Wav = new array8(song.NightAmbient2Wav); songBinary.NightAmbientVolume = song.NightAmbientVolume; songBinary.NightSong = song.NightSong; songBinary.Reverb = song.Reverb; songBinary.Unknown1 = song.Unknown1; songBinary.Unknown2 = song.Unknown2; songBinary.Unknown3 = song.Unknown3; songBinary.Unknown4 = song.Unknown4; songBinary.Unknown5 = song.Unknown5; songBinary.Unknown6 = song.Unknown6; songBinary.WinSong = song.WinSong; songs.Add(songBinary); } foreach (var projectile in areFile.projectiles) { AreProjectileBinary projectileBinary = new AreProjectileBinary(); projectileBinary.EATarget = projectile.EATarget; projectileBinary.EffectOffset = projectile.EffectOffset; projectileBinary.EffectSize = projectile.EffectSize; projectileBinary.MissileId = projectile.MissileId; projectileBinary.PartyOwnerIndex = projectile.PartyOwnerIndex; projectileBinary.Resref = new array8(projectile.Resref); projectileBinary.TickUntilTriggerCheck = projectile.TickUntilTriggerCheck; projectileBinary.TriggersRemaining = projectile.TriggersRemaining; projectileBinary.XCoordinate = projectile.XCoordinate; projectileBinary.YCoordinate = projectile.YCoordinate; projectileBinary.ZCoordinate = projectile.ZCoordinate; projectiles.Add(projectileBinary); } foreach (var tiledObject in areFile.tiledObjects) { AreTiledObjectBinary tiledObjectBinary = new AreTiledObjectBinary(); tiledObjectBinary.ClosedSearchCount = tiledObject.ClosedSearchCount; tiledObjectBinary.ClosedSearchOffset = tiledObject.ClosedSearchOffset; tiledObjectBinary.Name = new array32(tiledObject.Name); tiledObjectBinary.OpenSearchCount = tiledObject.OpenSearchCount; tiledObjectBinary.OpenSearchOffset = tiledObject.OpenSearchOffset; tiledObjectBinary.Unknown1 = tiledObject.Unknown1; tiledObjectBinary.Unknown2 = tiledObject.Unknown2; tiledObjectBinary.Unknown3 = tiledObject.Unknown3; tiledObjects.Add(tiledObjectBinary); } foreach (var note in areFile.notes) { AreNoteBinary noteBinary = new AreNoteBinary(); noteBinary.Colour = note.Colour; noteBinary.Location = note.Location; //noteBinary.NoteCountPlus = note.NoteCountPlus; noteBinary.Text = Common.WriteString(note.Text, TlkFile); noteBinary.XCoordinate = note.XCoordinate; noteBinary.YCoordinate = note.YCoordinate; notes.Add(noteBinary); } foreach (var animation in areFile.animations) { AreAnimationBinary animationBinary = new AreAnimationBinary(); animationBinary.AnimationAppearenceSchedule = animation.AnimationAppearenceSchedule; animationBinary.BamAnimation = new array8(animation.BamAnimation); animationBinary.BamFrame = animation.BamFrame; animationBinary.BamSequence = animation.BamSequence; animationBinary.Flags = animation.Flags; animationBinary.Height = animation.Height; animationBinary.LoopChance = animation.LoopChance; animationBinary.Name = new array32(animation.Name); animationBinary.Palette = new array8(animation.Palette); animationBinary.SkipCycles = animation.SkipCycles; animationBinary.StartFrame = animation.StartFrame; animationBinary.Transparency = animation.Transparency; animationBinary.Unknown = animation.Unknown; animationBinary.XCoordinate = animation.XCoordinate; animationBinary.YCoordinate = animation.YCoordinate; animations.Add(animationBinary); } foreach (var door in areFile.doors) { AreDoorBinary doorBinary = new AreDoorBinary(); doorBinary.ClosedBoundingBoxBottom = door.ClosedBoundingBoxBottom; doorBinary.ClosedBoundingBoxLeft = door.ClosedBoundingBoxLeft; doorBinary.ClosedBoundingBoxRight = door.ClosedBoundingBoxRight; doorBinary.ClosedBoundingBoxTop = door.ClosedBoundingBoxTop; doorBinary.ClosedVertexBlockCount = door.ClosedVertexBlockCount; doorBinary.ClosedVertexBlockIndex = door.ClosedVertexBlockIndex; doorBinary.ClosedVertexCount = door.ClosedVertexCount; doorBinary.ClosedVertexIndex = door.ClosedVertexIndex; doorBinary.Cursor = door.Cursor; doorBinary.DialogName = Common.WriteString(door.DialogName, TlkFile); doorBinary.DialogResref = new array8(door.DialogResref); doorBinary.DoorCloseSound = new array8(door.DoorCloseSound); doorBinary.DoorId = new array8(door.DoorId); doorBinary.DoorOpenSound = new array8(door.DoorOpenSound); doorBinary.DoorScript = new array8(door.DoorScript); doorBinary.DoorState1X = door.DoorState1X; doorBinary.DoorState1Y = door.DoorState1Y; doorBinary.DoorState2X = door.DoorState2X; doorBinary.DoorState2Y = door.DoorState2Y; doorBinary.Flags = door.Flags; doorBinary.IsTrap = door.IsTrap; doorBinary.KeyItem = new array8(door.KeyItem); doorBinary.LockDifficulty = door.LockDifficulty; doorBinary.LockpickString = Common.WriteString(door.LockpickString, TlkFile); doorBinary.Name = new array32(door.Name); doorBinary.OpenBoundingBoxBottom = door.OpenBoundingBoxBottom; doorBinary.OpenBoundingBoxLeft = door.OpenBoundingBoxLeft; doorBinary.OpenBoundingBoxRight = door.OpenBoundingBoxRight; doorBinary.OpenBoundingBoxTop = door.OpenBoundingBoxTop; doorBinary.OpenVertexBlockCount = door.OpenVertexBlockCount; doorBinary.OpenVertexBlockIndex = door.OpenVertexBlockIndex; doorBinary.OpenVertexCount = door.OpenVertexCount; doorBinary.OpenVertexIndex = door.OpenVertexIndex; doorBinary.SecretDoorDetectionDifficulty = door.SecretDoorDetectionDifficulty; doorBinary.TrapDetected = door.TrapDetected; doorBinary.TrapDetectionDifficulty = door.TrapDetectionDifficulty; doorBinary.TrapLaunchXCoordinate = door.TrapLaunchXCoordinate; doorBinary.TrapLaunchYCoordinate = door.TrapLaunchYCoordinate; doorBinary.TrapRemovalDifficulty = door.TrapRemovalDifficulty; //doorBinary.TravelTriggerName = new array24(door.TravelTriggerName); doorBinary.Unknown = door.Unknown; doorBinary.Unused = door.Unused; doors.Add(doorBinary); } foreach (var variable in areFile.variables) { AreVariableBinary variableBinary = new AreVariableBinary(); variableBinary.Name = new array32(variable.Name); variableBinary.Unknown1 = variable.Unknown1; variableBinary.Unknown2 = variable.Unknown2; variableBinary.Value = variable.Value; variables.Add(variableBinary); } foreach (var ambient in areFile.ambients) { AreAmbientBinary ambientBinary = new AreAmbientBinary(); ambientBinary.AmbientAppearenceSchedule = ambient.AmbientAppearenceSchedule; ambientBinary.Flags = ambient.Flags; ambientBinary.FrequencyBase = ambient.FrequencyBase; ambientBinary.FrequencyVariation = ambient.FrequencyVariation; ambientBinary.Height = ambient.Height; ambientBinary.Name = new array32(ambient.Name); ambientBinary.Radius = ambient.Radius; ambientBinary.Resref1 = new array8(ambient.Resref1); ambientBinary.Resref2 = new array8(ambient.Resref2); ambientBinary.Resref3 = new array8(ambient.Resref3); ambientBinary.Resref4 = new array8(ambient.Resref4); ambientBinary.Resref5 = new array8(ambient.Resref5); ambientBinary.Resref6 = new array8(ambient.Resref6); ambientBinary.Resref7 = new array8(ambient.Resref7); ambientBinary.Resref8 = new array8(ambient.Resref8); ambientBinary.Resref9 = new array8(ambient.Resref9); ambientBinary.Resref10 = new array8(ambient.Resref10); ambientBinary.ResRefCount = ambient.ResRefCount; //xx ambientBinary.XCoordinate = ambient.XCoordinate; ambientBinary.YCoordinate = ambient.YCoordinate; ambientBinary.Unknown1 = ambient.Unknown1; ambientBinary.Unknown2 = ambient.Unknown2; ambientBinary.Unknown3 = ambient.Unknown3; ambientBinary.Volume = ambient.Volume; ambients.Add(ambientBinary); } foreach (var container in areFile.containers) { AreContainerBinary containerBinary = new AreContainerBinary(); containerBinary.BoundingBoxBottom = container.BoundingBoxBottom; containerBinary.BoundingBoxLeft = container.BoundingBoxLeft; containerBinary.BoundingBoxRight = container.BoundingBoxRight; containerBinary.BoundingBoxTop = container.BoundingBoxTop; containerBinary.ContainerType = (Int16)container.ContainerType; containerBinary.Flags = container.Flags.Locked ? containerBinary.Flags | Common.Bit0 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit01 ? containerBinary.Flags | Common.Bit1 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit02 ? containerBinary.Flags | Common.Bit2 : containerBinary.Flags; containerBinary.Flags = container.Flags.TrapResets ? containerBinary.Flags | Common.Bit3 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit04 ? containerBinary.Flags | Common.Bit4 : containerBinary.Flags; containerBinary.Flags = container.Flags.Disabled ? containerBinary.Flags | Common.Bit5 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit06 ? containerBinary.Flags | Common.Bit6 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit07 ? containerBinary.Flags | Common.Bit7 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit08 ? containerBinary.Flags | Common.Bit8 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit09 ? containerBinary.Flags | Common.Bit9 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit10 ? containerBinary.Flags | Common.Bit10 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit11 ? containerBinary.Flags | Common.Bit11 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit12 ? containerBinary.Flags | Common.Bit12 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit13 ? containerBinary.Flags | Common.Bit13 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit14 ? containerBinary.Flags | Common.Bit14 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit15 ? containerBinary.Flags | Common.Bit15 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit16 ? containerBinary.Flags | Common.Bit16 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit17 ? containerBinary.Flags | Common.Bit17 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit18 ? containerBinary.Flags | Common.Bit18 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit19 ? containerBinary.Flags | Common.Bit19 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit20 ? containerBinary.Flags | Common.Bit20 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit21 ? containerBinary.Flags | Common.Bit21 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit22 ? containerBinary.Flags | Common.Bit22 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit23 ? containerBinary.Flags | Common.Bit23 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit24 ? containerBinary.Flags | Common.Bit24 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit25 ? containerBinary.Flags | Common.Bit25 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit26 ? containerBinary.Flags | Common.Bit26 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit27 ? containerBinary.Flags | Common.Bit27 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit28 ? containerBinary.Flags | Common.Bit28 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit29 ? containerBinary.Flags | Common.Bit29 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit30 ? containerBinary.Flags | Common.Bit30 : containerBinary.Flags; containerBinary.Flags = container.Flags.Bit31 ? containerBinary.Flags | Common.Bit31 : containerBinary.Flags; containerBinary.IsTrap = container.IsTrap; containerBinary.ItemCount = container.items.Count; containerBinary.ItemIndex = items.Count; for (int j = 0; j < container.items.Count; j++) { AreItemBinary itemBinary = new AreItemBinary(); itemBinary.Charges1 = container.items[j].Charges1; itemBinary.Charges2 = container.items[j].Charges2; itemBinary.Charges3 = container.items[j].Charges3; itemBinary.ExpirationTime = container.items[j].ExpirationTime; itemBinary.Flags = container.items[j].Flags.Identified ? itemBinary.Flags | Common.Bit0 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Unstealable ? itemBinary.Flags | Common.Bit1 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Stolen ? itemBinary.Flags | Common.Bit2 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Undroppable ? itemBinary.Flags | Common.Bit3 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit04 ? itemBinary.Flags | Common.Bit4 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit05 ? itemBinary.Flags | Common.Bit5 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit06 ? itemBinary.Flags | Common.Bit6 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit07 ? itemBinary.Flags | Common.Bit7 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit08 ? itemBinary.Flags | Common.Bit8 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit09 ? itemBinary.Flags | Common.Bit9 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit10 ? itemBinary.Flags | Common.Bit10 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit11 ? itemBinary.Flags | Common.Bit11 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit12 ? itemBinary.Flags | Common.Bit12 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit13 ? itemBinary.Flags | Common.Bit13 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit14 ? itemBinary.Flags | Common.Bit14 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit15 ? itemBinary.Flags | Common.Bit15 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit16 ? itemBinary.Flags | Common.Bit16 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit17 ? itemBinary.Flags | Common.Bit17 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit18 ? itemBinary.Flags | Common.Bit18 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit19 ? itemBinary.Flags | Common.Bit19 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit20 ? itemBinary.Flags | Common.Bit20 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit21 ? itemBinary.Flags | Common.Bit21 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit22 ? itemBinary.Flags | Common.Bit22 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit23 ? itemBinary.Flags | Common.Bit23 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit24 ? itemBinary.Flags | Common.Bit24 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit25 ? itemBinary.Flags | Common.Bit25 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit26 ? itemBinary.Flags | Common.Bit26 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit27 ? itemBinary.Flags | Common.Bit27 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit28 ? itemBinary.Flags | Common.Bit28 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit29 ? itemBinary.Flags | Common.Bit29 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit30 ? itemBinary.Flags | Common.Bit30 : itemBinary.Flags; itemBinary.Flags = container.items[j].Flags.Bit31 ? itemBinary.Flags | Common.Bit31 : itemBinary.Flags; itemBinary.ItemResref = new array8(container.items[j].ItemResref); items.Add(itemBinary); } containerBinary.KeyItem = new array8(container.KeyItem); containerBinary.LockDifficulty = container.LockDifficulty; containerBinary.LockpickString = Common.WriteString(container.LockpickString, TlkFile); containerBinary.Name = new array32(container.Name); containerBinary.TrapDetected = container.TrapDetected; containerBinary.TrapDetectionDifficulty = container.TrapDetectionDifficulty; containerBinary.TrapLaunchXCoordinate = container.TrapLaunchXCoordinate; containerBinary.TrapLaunchYCoordinate = container.TrapLaunchYCoordinate; containerBinary.TrapRemovalDifficulty = container.TrapRemovalDifficulty; containerBinary.TrapScript = new array8(container.TrapScript); containerBinary.Unknown1 = container.Unknown1; containerBinary.Unknown2 = container.Unknown2; containerBinary.Unknown3 = container.Unknown3; containerBinary.VertexCount = container.VertexCount; containerBinary.VertexIndex = container.VertexIndex; containerBinary.XCoordinate = container.XCoordinate; containerBinary.YCoordinate = container.YCoordinate; containers.Add(containerBinary); } foreach (var entrance in areFile.entrances) { AreEntranceBinary entranceBinary = new AreEntranceBinary(); entranceBinary.Name = new array32(entrance.Name); entranceBinary.Orientation = entrance.Orientation; entranceBinary.Unknown = entrance.Unknown; entranceBinary.XCoordinate = entrance.XCoordinate; entranceBinary.YCoordinate = entrance.YCoordinate; entrances.Add(entranceBinary); } foreach (var spawn in areFile.spawns) { AreSpawnPointBinary spawnBinary = new AreSpawnPointBinary(); spawnBinary.ActorRemovalTime = spawn.ActorRemovalTime; spawnBinary.BaseCreatureNumberToSpawn = spawn.BaseCreatureNumberToSpawn; spawnBinary.CreatureSpawnCount = spawn.CreatureSpawnCount; spawnBinary.Enabled = spawn.Enabled; spawnBinary.Frequency = spawn.Frequency; spawnBinary.MaximumCreaturesToSpawn = spawn.MaximumCreaturesToSpawn; spawnBinary.MovementRestrictionDistance = spawn.MovementRestrictionDistance; spawnBinary.MovementRestrictionDistanceToObject = spawn.MovementRestrictionDistanceToObject; spawnBinary.Name = new array32(spawn.Name); spawnBinary.ProbabilityDay = spawn.ProbabilityDay; spawnBinary.ProbabilityNight = spawn.ProbabilityNight; spawnBinary.Resref1 = new array8(spawn.Resref1); spawnBinary.Resref2 = new array8(spawn.Resref2); spawnBinary.Resref3 = new array8(spawn.Resref3); spawnBinary.Resref4 = new array8(spawn.Resref4); spawnBinary.Resref5 = new array8(spawn.Resref5); spawnBinary.Resref6 = new array8(spawn.Resref6); spawnBinary.Resref7 = new array8(spawn.Resref7); spawnBinary.Resref8 = new array8(spawn.Resref8); spawnBinary.Resref9 = new array8(spawn.Resref9); spawnBinary.Resref10 = new array8(spawn.Resref10); spawnBinary.SpawnMethod = spawn.SpawnMethod; spawnBinary.SpawnPointAppearenceSchedule = spawn.SpawnPointAppearenceSchedule; spawnBinary.Unknown = spawn.Unknown; spawnBinary.XCoordinate = spawn.XCoordinate; spawnBinary.YCoordinate = spawn.YCoordinate; spawns.Add(spawnBinary); } foreach (var region in areFile.regions) { AreRegionBinary regionBinary = new AreRegionBinary(); regionBinary.AlternativeUsePointXCoordinate = region.AlternativeUsePointXCoordinate; regionBinary.AlternativeUsePointYCoordinate = region.AlternativeUsePointYCoordinate; regionBinary.BoundingBoxBottom = region.BoundingBoxBottom; regionBinary.BoundingBoxLeft = region.BoundingBoxLeft; regionBinary.BoundingBoxRight = region.BoundingBoxRight; regionBinary.BoundingBoxTop = region.BoundingBoxTop; regionBinary.Cursor = region.Cursor; regionBinary.DestinationArea = new array8(region.DestinationArea); regionBinary.DestinationEntrance = new array32(region.DestinationEntrance); regionBinary.DialogFile = new array8(region.DialogFile); regionBinary.DialogName = Common.WriteString(region.DialogName, TlkFile); regionBinary.Flags = region.Flags.InvisibleTrap ? regionBinary.Flags | Common.Bit0 : regionBinary.Flags; regionBinary.Flags = region.Flags.ResetTrap ? regionBinary.Flags | Common.Bit1 : regionBinary.Flags; regionBinary.Flags = region.Flags.PartyRequired ? regionBinary.Flags | Common.Bit2 : regionBinary.Flags; regionBinary.Flags = region.Flags.Detectable ? regionBinary.Flags | Common.Bit3 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit04 ? regionBinary.Flags | Common.Bit4 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit05 ? regionBinary.Flags | Common.Bit5 : regionBinary.Flags; regionBinary.Flags = region.Flags.NPCCanTrigger ? regionBinary.Flags | Common.Bit6 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit07 ? regionBinary.Flags | Common.Bit7 : regionBinary.Flags; regionBinary.Flags = region.Flags.Deactivated ? regionBinary.Flags | Common.Bit8 : regionBinary.Flags; regionBinary.Flags = region.Flags.NPCCannotPass ? regionBinary.Flags | Common.Bit9 : regionBinary.Flags; regionBinary.Flags = region.Flags.AlternativePoint ? regionBinary.Flags | Common.Bit10 : regionBinary.Flags; regionBinary.Flags = region.Flags.UsedByDoor ? regionBinary.Flags | Common.Bit11 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit12 ? regionBinary.Flags | Common.Bit12 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit13 ? regionBinary.Flags | Common.Bit13 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit14 ? regionBinary.Flags | Common.Bit14 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit15 ? regionBinary.Flags | Common.Bit15 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit16 ? regionBinary.Flags | Common.Bit16 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit17 ? regionBinary.Flags | Common.Bit17 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit18 ? regionBinary.Flags | Common.Bit18 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit19 ? regionBinary.Flags | Common.Bit19 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit20 ? regionBinary.Flags | Common.Bit20 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit21 ? regionBinary.Flags | Common.Bit21 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit22 ? regionBinary.Flags | Common.Bit22 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit23 ? regionBinary.Flags | Common.Bit23 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit24 ? regionBinary.Flags | Common.Bit24 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit25 ? regionBinary.Flags | Common.Bit25 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit26 ? regionBinary.Flags | Common.Bit26 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit27 ? regionBinary.Flags | Common.Bit27 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit28 ? regionBinary.Flags | Common.Bit28 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit29 ? regionBinary.Flags | Common.Bit29 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit30 ? regionBinary.Flags | Common.Bit30 : regionBinary.Flags; regionBinary.Flags = region.Flags.Bit31 ? regionBinary.Flags | Common.Bit31 : regionBinary.Flags; regionBinary.InformationText = Common.WriteString(region.InformationText, TlkFile); regionBinary.IsTrap = region.IsTrap; regionBinary.KeyItem = new array8(region.KeyItem); regionBinary.Name = new array32(region.Name); regionBinary.RegionScript = new array8(region.RegionScript); regionBinary.RegionType = (Int16)region.RegionType; regionBinary.Sound = new array8(region.Sound); regionBinary.TalkLocationXCoordinate = region.TalkLocationXCoordinate; regionBinary.TalkLocationYCoordinate = region.TalkLocationYCoordinate; regionBinary.TrapDetected = region.TrapDetected; regionBinary.TrapDetectionDifficulty = region.TrapDetectionDifficulty; regionBinary.TrapLaunchXCoordinate = region.TrapLaunchXCoordinate; regionBinary.TrapLaunchYCoordinate = region.TrapLaunchYCoordinate; regionBinary.TrapRemovalDifficulty = region.TrapRemovalDifficulty; regionBinary.Unknown1 = region.Unknown1; regionBinary.Unknown2 = region.Unknown2; regionBinary.Unknown3 = region.Unknown3; regionBinary.VertexCount = region.VertexCount; regionBinary.VertexIndex = region.VertexIndex; regions.Add(regionBinary); } foreach (var actor in areFile.actors) { AreActorBinary actorBinary = new AreActorBinary(); actorBinary.ActorAnimation = actor.ActorAnimation; actorBinary.ActorAppearenceSchedule = actor.ActorAppearenceSchedule; actorBinary.Flags = actor.ActorFlags.CreAttached ? actorBinary.Flags | Common.Bit0 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit01 ? actorBinary.Flags | Common.Bit1 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit02 ? actorBinary.Flags | Common.Bit2 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.OverrideScriptName ? actorBinary.Flags | Common.Bit3 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit04 ? actorBinary.Flags | Common.Bit4 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit05 ? actorBinary.Flags | Common.Bit5 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit06 ? actorBinary.Flags | Common.Bit6 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit07 ? actorBinary.Flags | Common.Bit7 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit08 ? actorBinary.Flags | Common.Bit8 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit09 ? actorBinary.Flags | Common.Bit9 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit10 ? actorBinary.Flags | Common.Bit10 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit11 ? actorBinary.Flags | Common.Bit11 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit12 ? actorBinary.Flags | Common.Bit12 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit13 ? actorBinary.Flags | Common.Bit13 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit14 ? actorBinary.Flags | Common.Bit14 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit15 ? actorBinary.Flags | Common.Bit15 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit16 ? actorBinary.Flags | Common.Bit16 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit17 ? actorBinary.Flags | Common.Bit17 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit18 ? actorBinary.Flags | Common.Bit18 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit19 ? actorBinary.Flags | Common.Bit19 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit20 ? actorBinary.Flags | Common.Bit20 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit21 ? actorBinary.Flags | Common.Bit21 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit22 ? actorBinary.Flags | Common.Bit22 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit23 ? actorBinary.Flags | Common.Bit23 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit24 ? actorBinary.Flags | Common.Bit24 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit25 ? actorBinary.Flags | Common.Bit25 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit26 ? actorBinary.Flags | Common.Bit26 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit27 ? actorBinary.Flags | Common.Bit27 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit28 ? actorBinary.Flags | Common.Bit28 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit29 ? actorBinary.Flags | Common.Bit29 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit30 ? actorBinary.Flags | Common.Bit30 : actorBinary.Flags; actorBinary.Flags = actor.ActorFlags.Bit31 ? actorBinary.Flags | Common.Bit31 : actorBinary.Flags; actorBinary.ActorOrientation = actor.ActorOrientation; actorBinary.ActorRemovalTimer = actor.ActorRemovalTimer; actorBinary.CREFile = new array8(actor.CREFile); actorBinary.CreOffset = actor.CreOffset; actorBinary.CreSize = actor.CreSize; actorBinary.CurrentXCoordinate = actor.CurrentXCoordinate; actorBinary.CurrentYCoordinate = actor.CurrentYCoordinate; actorBinary.DestinationXCoordinate = actor.DestinationXCoordinate; actorBinary.DestinationYCoordinate = actor.DestinationYCoordinate; actorBinary.Dialog = new array8(actor.Dialog); actorBinary.FilenameInitialCharacter = actor.FilenameInitialCharacter; actorBinary.HasBeenSpawned = actor.HasBeenSpawned; actorBinary.MovementRestrictionDistance = actor.MovementRestrictionDistance; actorBinary.MovementRestrictionDistanceMoveToObject = actor.MovementRestrictionDistanceMoveToObject; actorBinary.Name = new array32(actor.Name); actorBinary.NumTimesTalkedTo = actor.NumTimesTalkedTo; actorBinary.ScriptClass = new array8(actor.ScriptClass); actorBinary.ScriptDefault = new array8(actor.ScriptDefault); actorBinary.ScriptGeneral = new array8(actor.ScriptGeneral); actorBinary.ScriptOverride = new array8(actor.ScriptOverride); actorBinary.ScriptRace = new array8(actor.ScriptRace); actorBinary.ScriptSpecific = new array8(actor.ScriptSpecific); actorBinary.Unknown = actor.Unknown; actorBinary.Unknown2 = actor.Unknown2; actors.Add(actorBinary); } if (areFile.exploration.Count % 8 != 0) { for (int i = 0; i < areFile.exploration.Count + 1; i++) { areaExplorations.Add(new byte()); } } else { for (int i = 0; i < areFile.exploration.Count; i++) { areaExplorations.Add(new byte()); } } int bitCount = 0; byte currentByte = 0; foreach (var exploration in areFile.exploration) { switch (bitCount) { case 0: currentByte = exploration ? Convert.ToByte(currentByte | (byte)Common.Bit0) : currentByte; break; case 1: currentByte = exploration ? Convert.ToByte(currentByte | (byte)Common.Bit1) : currentByte; break; case 2: currentByte = exploration ? Convert.ToByte(currentByte | (byte)Common.Bit2) : currentByte; break; case 3: currentByte = exploration ? Convert.ToByte(currentByte | (byte)Common.Bit3) : currentByte; break; case 4: currentByte = exploration ? Convert.ToByte(currentByte | (byte)Common.Bit4) : currentByte; break; case 5: currentByte = exploration ? Convert.ToByte(currentByte | (byte)Common.Bit5) : currentByte; break; case 6: currentByte = exploration ? Convert.ToByte(currentByte | (byte)Common.Bit6) : currentByte; break; case 7: currentByte = exploration ? Convert.ToByte(currentByte | (byte)Common.Bit7) : currentByte; break; } if (bitCount == 7) { areaExplorations.Add(currentByte); currentByte = new byte(); } } foreach (var vertex in areFile.vertices) { vertices.Add(vertex); } AreHeaderBinary header = new AreHeaderBinary(); header.AreaFlags = areFile.AreaFlags.SaveAllowed ? header.AreaFlags | Common.Bit0 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.TutorialArea ? header.AreaFlags | Common.Bit1 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.DeadMagicZone ? header.AreaFlags | Common.Bit2 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Dream ? header.AreaFlags | Common.Bit3 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit04 ? header.AreaFlags | Common.Bit4 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit05 ? header.AreaFlags | Common.Bit5 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit06 ? header.AreaFlags | Common.Bit6 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit07 ? header.AreaFlags | Common.Bit7 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit08 ? header.AreaFlags | Common.Bit8 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit09 ? header.AreaFlags | Common.Bit9 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit10 ? header.AreaFlags | Common.Bit10 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit11 ? header.AreaFlags | Common.Bit11 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit12 ? header.AreaFlags | Common.Bit12 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit13 ? header.AreaFlags | Common.Bit13 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit14 ? header.AreaFlags | Common.Bit14 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit15 ? header.AreaFlags | Common.Bit15 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit16 ? header.AreaFlags | Common.Bit16 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit17 ? header.AreaFlags | Common.Bit17 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit18 ? header.AreaFlags | Common.Bit18 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit19 ? header.AreaFlags | Common.Bit19 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit20 ? header.AreaFlags | Common.Bit20 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit21 ? header.AreaFlags | Common.Bit21 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit22 ? header.AreaFlags | Common.Bit22 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit23 ? header.AreaFlags | Common.Bit23 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit24 ? header.AreaFlags | Common.Bit24 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit25 ? header.AreaFlags | Common.Bit25 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit26 ? header.AreaFlags | Common.Bit26 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit27 ? header.AreaFlags | Common.Bit27 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit28 ? header.AreaFlags | Common.Bit28 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit29 ? header.AreaFlags | Common.Bit29 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit30 ? header.AreaFlags | Common.Bit30 : header.AreaFlags; header.AreaFlags = areFile.AreaFlags.Bit31 ? header.AreaFlags | Common.Bit31 : header.AreaFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.Outdoor ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit0) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.DayNight ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit1) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.Weather ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit2) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.City ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit3) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.Forest ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit4) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.Dungeon ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit5) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.ExtendedNight ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit6) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.CanRestIndoors ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit7) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.Bit08 ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit8) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.Bit09 ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit9) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.Bit10 ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit10) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.Bit11 ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit11) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.Bit12 ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit12) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.Bit13 ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit13) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.Bit14 ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit14) : header.AreaTypeFlags; header.AreaTypeFlags = areFile.AreaTypeFlags.Bit15 ? Convert.ToUInt16(header.AreaTypeFlags | Common.Bit15) : header.AreaTypeFlags; header.ftype = new array4() { character1 = 'A', character2 = 'R', character3 = 'E', character4 = 'A' }; header.fversion = new array4() { character1 = 'V', character2 = '1', character3 = '.', character4 = '0' }; header.AreaScript = new array8(areFile.AreaScript); header.AreaToTheEast = new array8(areFile.AreaToTheEast); header.AreaToTheNorth = new array8(areFile.AreaToTheNorth); header.AreaToTheSouth = new array8(areFile.AreaToTheSouth); header.AreaToTheWest = new array8(areFile.AreaToTheWest); header.AreaWED = new array8(areFile.AreaWED); header.LastSaved = areFile.LastSaved; header.RestMovieDay = new array8(areFile.RestMovieDay); header.RestMovieNight = new array8(areFile.RestMovieNight); header.Unknown1 = areFile.Unknown1; header.Unknown2 = areFile.Unknown2; header.Unknown3 = areFile.Unknown3; header.Unknown4 = areFile.Unknown4; header.Unknown5 = areFile.Unknown5; header.Unknown6 = areFile.Unknown6; header.Unknown7 = areFile.Unknown7; header.WeatherProbabilityFog = areFile.WeatherProbabilityFog; header.WeatherProbabilityLightning = areFile.WeatherProbabilityLightning; header.WeatherProbabilityRain = areFile.WeatherProbabilityRain; header.WeatherProbabilitySnow = areFile.WeatherProbabilitySnow; header.ActorCount = Convert.ToInt16(actors.Count); header.ActorOffset = HeaderSize; header.RegionCount = Convert.ToInt16(regions.Count); header.RegionOffset = HeaderSize + (ActorSize * actors.Count); header.SpawnPointCount = Convert.ToInt16(spawns.Count); header.SpawnPointOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count); header.EntrancesCount = Convert.ToInt16(entrances.Count); header.EntrancesOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count); header.ContainerCount = Convert.ToInt16(containers.Count); header.ContainerOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count) + (EntranceSize * entrances.Count); header.ItemCount = Convert.ToInt16(items.Count); header.ItemOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count) + (EntranceSize * entrances.Count) + (ContainerSize * containers.Count); header.AmbientCount = Convert.ToInt16(ambients.Count); header.AmbientOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count) + (EntranceSize * entrances.Count) + (ContainerSize * containers.Count) + (ItemSize * items.Count); header.VariableCount = Convert.ToInt16(variables.Count); header.VariableOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count) + (EntranceSize * entrances.Count) + (ContainerSize * containers.Count) + (ItemSize * items.Count) + (AmbientSize * ambients.Count); header.ExploredBitmaskOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count) + (EntranceSize * entrances.Count) + (ContainerSize * containers.Count) + (ItemSize * items.Count) + (AmbientSize * ambients.Count) + (VariableSize * variables.Count); header.ExploredBitmaskSize = areaExplorations.Count; header.DoorCount = doors.Count; header.DoorOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count) + (EntranceSize * entrances.Count) + (ContainerSize * containers.Count) + (ItemSize * items.Count) + (AmbientSize * ambients.Count) + (VariableSize * variables.Count) + (areaExplorations.Count); header.TiledObjectCount = Convert.ToInt16(tiledObjects.Count); header.TiledObjectOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count) + (EntranceSize * entrances.Count) + (ContainerSize * containers.Count) + (ItemSize * items.Count) + (AmbientSize * ambients.Count) + (VariableSize * variables.Count) + (DoorSize * doors.Count) + (areaExplorations.Count); header.VertexCount = Convert.ToInt16(vertices.Count); header.VertexOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count) + (EntranceSize * entrances.Count) + (ContainerSize * containers.Count) + (ItemSize * items.Count) + (AmbientSize * ambients.Count) + (VariableSize * variables.Count) + (DoorSize * doors.Count) + (areaExplorations.Count) + (TiledObjectSize * tiledObjects.Count); header.AnimationCount = Convert.ToInt16(animations.Count); header.AnimationOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count) + (EntranceSize * entrances.Count) + (ContainerSize * containers.Count) + (ItemSize * items.Count) + (AmbientSize * ambients.Count) + (VariableSize * variables.Count) + (DoorSize * doors.Count) + (4 * vertices.Count) + (areaExplorations.Count) + (TiledObjectSize * tiledObjects.Count); header.SongEntryOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count) + (EntranceSize * entrances.Count) + (ContainerSize * containers.Count) + (ItemSize * items.Count) + (AmbientSize * ambients.Count) + (VariableSize * variables.Count) + (DoorSize * doors.Count) + (4 * vertices.Count) + (AnimationSize * animations.Count) + (areaExplorations.Count) + (TiledObjectSize * tiledObjects.Count); header.RestInterruptionOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count) + (EntranceSize * entrances.Count) + (ContainerSize * containers.Count) + (ItemSize * items.Count) + (AmbientSize * ambients.Count) + (VariableSize * variables.Count) + (DoorSize * doors.Count) + (4 * vertices.Count) + (AnimationSize * animations.Count) + (areaExplorations.Count) + (TiledObjectSize * tiledObjects.Count) + (SongSize * songs.Count); header.AutomatCount = Convert.ToInt16(notes.Count); header.AutomatOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count) + (EntranceSize * entrances.Count) + (ContainerSize * containers.Count) + (ItemSize * items.Count) + (AmbientSize * ambients.Count) + (VariableSize * variables.Count) + (DoorSize * doors.Count) + (4 * vertices.Count) + (AnimationSize * animations.Count) + (areaExplorations.Count) + (TiledObjectSize * tiledObjects.Count) + (InterruptionSize * interruptions.Count) + (SongSize * songs.Count); header.ProjectileCount = Convert.ToInt16(projectiles.Count); header.ProjectileOffset = HeaderSize + (ActorSize * actors.Count) + (RegionSize * regions.Count) + (Spawnsize * spawns.Count) + (EntranceSize * entrances.Count) + (ContainerSize * containers.Count) + (ItemSize * items.Count) + (AmbientSize * ambients.Count) + (VariableSize * variables.Count) + (DoorSize * doors.Count) + (4 * vertices.Count) + (AnimationSize * animations.Count) + (areaExplorations.Count) + (NoteSize * notes.Count) + (TiledObjectSize * tiledObjects.Count); using (MemoryStream s = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(s)) { var headerAsBytes = Common.WriteStruct(header); bw.Write(headerAsBytes); foreach (var actor in actors) { var actorAsBytes = Common.WriteStruct(actor); bw.Write(actorAsBytes); } foreach (var region in regions) { var regionAsBytes = Common.WriteStruct(region); bw.Write(regionAsBytes); } foreach (var spawn in spawns) { var spawnAsBytes = Common.WriteStruct(spawn); bw.Write(spawnAsBytes); } foreach (var entrance in entrances) { var entranceAsBytes = Common.WriteStruct(entrance); bw.Write(entranceAsBytes); } foreach (var container in containers) { var containerAsBytes = Common.WriteStruct(container); bw.Write(containerAsBytes); } foreach (var item in items) { var itemAsBytes = Common.WriteStruct(item); bw.Write(itemAsBytes); } foreach (var ambient in ambients) { var ambientAsBytes = Common.WriteStruct(ambient); bw.Write(ambientAsBytes); } foreach (var variable in variables) { var variableAsBytes = Common.WriteStruct(variable); bw.Write(variableAsBytes); } foreach (var exploration in areaExplorations) { var explorationAsBytes = Common.WriteStruct(exploration); bw.Write(explorationAsBytes); } foreach (var door in doors) { var doorAsBytes = Common.WriteStruct(door); bw.Write(doorAsBytes); } foreach (var tiledObject in tiledObjects) { var tiledObjectAsBytes = Common.WriteStruct(tiledObject); bw.Write(tiledObjectAsBytes); } foreach (var vertex in vertices) { var vertexAsBytes = Common.WriteStruct(vertex); bw.Write(vertexAsBytes); } foreach (var animation in animations) { var animationAsBytes = Common.WriteStruct(animation); bw.Write(animationAsBytes); } foreach (var song in songs) { var songAsBytes = Common.WriteStruct(song); bw.Write(songAsBytes); } foreach (var interruption in interruptions) { var interruptionAsBytes = Common.WriteStruct(interruption); bw.Write(interruptionAsBytes); } foreach (var note in notes) { var noteAsBytes = Common.WriteStruct(note); bw.Write(noteAsBytes); } foreach (var projectile in projectiles) { var projectileAsBytes = Common.WriteStruct(projectile); bw.Write(projectileAsBytes); } if (BackupManger != null) { BackupManger.BackupFile(file, file.Filename, file.FileType, this); } using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write)) { bw.BaseStream.Position = 0; bw.BaseStream.CopyTo(fs); fs.Flush(flushToDisk: true); } } } return true; }
public bool Write(string filename, IEFile file, bool forceSave = false) { if (!(file is CreFile)) throw new ArgumentException("File is not a valid creature file"); var creFile = file as CreFile; if (!(forceSave) && (MD5HashGenerator.GenerateKey(creFile) == creFile.Checksum)) return false; List<CreKnownSpellBinary> creKnownSpells = new List<CreKnownSpellBinary>(); List<CreSpellMemorisationInfoBinary> creSpellMemorisationInfo = new List<CreSpellMemorisationInfoBinary>(); List<CreMemorisedSpellBinary> creMemorisedSpells = new List<CreMemorisedSpellBinary>(); List<Eff1BinaryBinary> creEffects1 = new List<Eff1BinaryBinary>(); List<EmbeddedEffBinary> creEffects2 = new List<EmbeddedEffBinary>(); List<CreItemBinary> creItems = new List<CreItemBinary>(); List<short> creItemSlots = new List<short>(); foreach (var featureBlock in creFile.Effects1) { Eff1BinaryBinary featureBlockBinary = new Eff1BinaryBinary(); featureBlockBinary.DiceSides = featureBlock.DiceSides; featureBlockBinary.DiceThrown = featureBlock.DiceThrown; featureBlockBinary.DispelResistance = featureBlock.DispelResistance; featureBlockBinary.Duration = featureBlock.Duration; featureBlockBinary.Opcode = featureBlock.Opcode; featureBlockBinary.Parameter1 = featureBlock.Parameter1; featureBlockBinary.Parameter2 = featureBlock.Parameter2; featureBlockBinary.Power = featureBlock.Power; featureBlockBinary.Probability1 = featureBlock.Probability1; featureBlockBinary.Probability2 = featureBlock.Probability2; featureBlockBinary.Resource = new array8(featureBlock.resource); featureBlockBinary.SavingThrowBonus = featureBlock.SavingThrowBonus; featureBlockBinary.SavingThrowType = featureBlock.SavingThrowType; featureBlockBinary.TargetType = featureBlock.TargetType; featureBlockBinary.TimingMode = featureBlock.TimingMode; featureBlockBinary.Unknown = featureBlock.Unknown; creEffects1.Add(featureBlockBinary); } foreach (var featureBlock in creFile.Effects2) { EmbeddedEffBinary featureBlockBinary = new EmbeddedEffBinary(); featureBlockBinary.CasterLevel = featureBlock.CasterLevel; featureBlockBinary.CasterXCoordinate = featureBlock.CasterXCoordinate; featureBlockBinary.CasterYCoordinate = featureBlock.CasterYCoordinate; featureBlockBinary.DiceSides = featureBlock.DiceSides; featureBlockBinary.DiceThrown = featureBlock.DiceThrown; featureBlockBinary.Duration = featureBlock.Duration; featureBlockBinary.HighestAffectedLevelFromParent = featureBlock.HighestAffectedLevelFromParent; featureBlockBinary.LowestAffectedLevelFromParent = featureBlock.LowestAffectedLevelFromParent; featureBlockBinary.Opcode = featureBlock.Opcode; featureBlockBinary.Parameter1 = featureBlock.Parameter1; featureBlockBinary.Parameter2 = featureBlock.Parameter2; featureBlockBinary.Parameter3 = featureBlock.Parameter3; featureBlockBinary.Parameter4 = featureBlock.Parameter4; featureBlockBinary.ParentResource = featureBlock.ParentResource; featureBlockBinary.ParentResourceSlot = featureBlock.ParentResourceSlot; featureBlockBinary.Power = featureBlock.Power; featureBlockBinary.PrimaryType = featureBlock.PrimaryType; featureBlockBinary.Probability1 = featureBlock.Probability1; featureBlockBinary.Probability2 = featureBlock.Probability2; featureBlockBinary.Projectile = featureBlock.Projectile; featureBlockBinary.Resistance = featureBlock.Resistance; featureBlockBinary.Resource = featureBlock.Resource; featureBlockBinary.Resource2 = featureBlock.Resource2; featureBlockBinary.Resource3 = featureBlock.Resource3; featureBlockBinary.ResourceTypeFromParent = featureBlock.ResourceTypeFromParent; featureBlockBinary.SavingThrowBonus = featureBlock.SavingThrowBonus; featureBlockBinary.SavingThrowType = featureBlock.SavingThrowType; featureBlockBinary.SecondaryType = featureBlock.SecondaryType; featureBlockBinary.SetLocalVariableIfNonExistant = featureBlock.SetLocalVariableIfNonExistant; featureBlockBinary.TargetType = featureBlock.TargetType; featureBlockBinary.TargetXCoordinate = featureBlock.TargetXCoordinate; featureBlockBinary.TargetYCoordinate = featureBlock.TargetYCoordinate; featureBlockBinary.TimingMode = featureBlock.TimingMode; featureBlockBinary.Unknown = featureBlock.Unknown; featureBlockBinary.Unknown2 = featureBlock.Unknown2; featureBlockBinary.Unknown3 = featureBlock.Unknown3; featureBlockBinary.Unknown4 = featureBlock.Unknown4; featureBlockBinary.Unknown5 = featureBlock.Unknown5; featureBlockBinary.Unknownd4_1 = featureBlock.Unknownd4_1; featureBlockBinary.Unknownd4_2 = featureBlock.Unknownd4_2; featureBlockBinary.Unknownd4_3 = featureBlock.Unknownd4_3; featureBlockBinary.Unknownd4_4 = featureBlock.Unknownd4_4; featureBlockBinary.Unknownd4_5 = featureBlock.Unknownd4_5; featureBlockBinary.Unknownd4_6 = featureBlock.Unknownd4_6; featureBlockBinary.Unknownd4_7 = featureBlock.Unknownd4_7; featureBlockBinary.Unknownd4_8 = featureBlock.Unknownd4_8; featureBlockBinary.Unknownd4_9 = featureBlock.Unknownd4_9; featureBlockBinary.Unknownd4_10 = featureBlock.Unknownd4_10; featureBlockBinary.Unknownd4_11 = featureBlock.Unknownd4_11; featureBlockBinary.Unknownd4_12 = featureBlock.Unknownd4_12; featureBlockBinary.Unknownd4_13 = featureBlock.Unknownd4_13; featureBlockBinary.Unknownd4_14 = featureBlock.Unknownd4_14; featureBlockBinary.Unknownd4_15 = featureBlock.Unknownd4_15; featureBlockBinary.Variable = featureBlock.Variable; creEffects2.Add(featureBlockBinary); } // pre fill the item slot array with 'no item' for (int i = 0; i < 40; i++) { creItemSlots.Add(-1); } short itemCount = 0; if (!String.IsNullOrEmpty(creFile.Items.Helmet.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Helmet.Charges1; itemBinary.Charges2 = creFile.Items.Helmet.Charges2; itemBinary.Charges3 = creFile.Items.Helmet.Charges3; itemBinary.ExpiryHour = creFile.Items.Helmet.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Helmet.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Helmet.Filename); itemBinary.Flags = creFile.Items.Helmet.Flags; creItems.Add(itemBinary); creItemSlots[0] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Armor.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Armor.Charges1; itemBinary.Charges2 = creFile.Items.Armor.Charges2; itemBinary.Charges3 = creFile.Items.Armor.Charges3; itemBinary.ExpiryHour = creFile.Items.Armor.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Armor.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Armor.Filename); itemBinary.Flags = creFile.Items.Armor.Flags; creItems.Add(itemBinary); creItemSlots[1] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Shield.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Shield.Charges1; itemBinary.Charges2 = creFile.Items.Shield.Charges2; itemBinary.Charges3 = creFile.Items.Shield.Charges3; itemBinary.ExpiryHour = creFile.Items.Shield.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Shield.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Shield.Filename); itemBinary.Flags = creFile.Items.Shield.Flags; creItems.Add(itemBinary); creItemSlots[2] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Gloves.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Gloves.Charges1; itemBinary.Charges2 = creFile.Items.Gloves.Charges2; itemBinary.Charges3 = creFile.Items.Gloves.Charges3; itemBinary.ExpiryHour = creFile.Items.Gloves.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Gloves.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Gloves.Filename); itemBinary.Flags = creFile.Items.Gloves.Flags; creItems.Add(itemBinary); creItemSlots[3] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.RingLeft.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.RingLeft.Charges1; itemBinary.Charges2 = creFile.Items.RingLeft.Charges2; itemBinary.Charges3 = creFile.Items.RingLeft.Charges3; itemBinary.ExpiryHour = creFile.Items.RingLeft.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.RingLeft.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.RingLeft.Filename); itemBinary.Flags = creFile.Items.RingLeft.Flags; creItems.Add(itemBinary); creItemSlots[4] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.RingRight.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.RingRight.Charges1; itemBinary.Charges2 = creFile.Items.RingRight.Charges2; itemBinary.Charges3 = creFile.Items.RingRight.Charges3; itemBinary.ExpiryHour = creFile.Items.RingRight.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.RingRight.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.RingRight.Filename); itemBinary.Flags = creFile.Items.RingRight.Flags; creItems.Add(itemBinary); creItemSlots[5] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Amulet.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Amulet.Charges1; itemBinary.Charges2 = creFile.Items.Amulet.Charges2; itemBinary.Charges3 = creFile.Items.Amulet.Charges3; itemBinary.ExpiryHour = creFile.Items.Amulet.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Amulet.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Amulet.Filename); itemBinary.Flags = creFile.Items.Amulet.Flags; creItems.Add(itemBinary); creItemSlots[6] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Belt.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Belt.Charges1; itemBinary.Charges2 = creFile.Items.Belt.Charges2; itemBinary.Charges3 = creFile.Items.Belt.Charges3; itemBinary.ExpiryHour = creFile.Items.Belt.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Belt.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Belt.Filename); itemBinary.Flags = creFile.Items.Amulet.Flags; creItems.Add(itemBinary); creItemSlots[7] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Boots.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Boots.Charges1; itemBinary.Charges2 = creFile.Items.Boots.Charges2; itemBinary.Charges3 = creFile.Items.Boots.Charges3; itemBinary.ExpiryHour = creFile.Items.Boots.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Boots.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Boots.Filename); itemBinary.Flags = creFile.Items.Boots.Flags; creItems.Add(itemBinary); creItemSlots[8] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Weapon1.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Weapon1.Charges1; itemBinary.Charges2 = creFile.Items.Weapon1.Charges2; itemBinary.Charges3 = creFile.Items.Weapon1.Charges3; itemBinary.ExpiryHour = creFile.Items.Weapon1.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Weapon1.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Weapon1.Filename); itemBinary.Flags = creFile.Items.Weapon1.Flags; creItems.Add(itemBinary); creItemSlots[9] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Weapon2.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Weapon2.Charges1; itemBinary.Charges2 = creFile.Items.Weapon2.Charges2; itemBinary.Charges3 = creFile.Items.Weapon2.Charges3; itemBinary.ExpiryHour = creFile.Items.Weapon2.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Weapon2.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Weapon2.Filename); itemBinary.Flags = creFile.Items.Weapon2.Flags; creItems.Add(itemBinary); creItemSlots[10] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Weapon3.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Weapon3.Charges1; itemBinary.Charges2 = creFile.Items.Weapon3.Charges2; itemBinary.Charges3 = creFile.Items.Weapon3.Charges3; itemBinary.ExpiryHour = creFile.Items.Weapon3.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Weapon3.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Weapon3.Filename); itemBinary.Flags = creFile.Items.Weapon3.Flags; creItems.Add(itemBinary); creItemSlots[11] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Weapon4.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Weapon4.Charges1; itemBinary.Charges2 = creFile.Items.Weapon4.Charges2; itemBinary.Charges3 = creFile.Items.Weapon4.Charges3; itemBinary.ExpiryHour = creFile.Items.Weapon4.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Weapon4.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Weapon4.Filename); itemBinary.Flags = creFile.Items.Weapon4.Flags; creItems.Add(itemBinary); creItemSlots[12] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Quiver1.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Quiver1.Charges1; itemBinary.Charges2 = creFile.Items.Quiver1.Charges2; itemBinary.Charges3 = creFile.Items.Quiver1.Charges3; itemBinary.ExpiryHour = creFile.Items.Quiver1.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Quiver1.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Quiver1.Filename); itemBinary.Flags = creFile.Items.Quiver1.Flags; creItems.Add(itemBinary); creItemSlots[13] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Quiver2.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Quiver2.Charges1; itemBinary.Charges2 = creFile.Items.Quiver2.Charges2; itemBinary.Charges3 = creFile.Items.Quiver2.Charges3; itemBinary.ExpiryHour = creFile.Items.Quiver2.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Quiver2.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Quiver2.Filename); itemBinary.Flags = creFile.Items.Quiver2.Flags; creItems.Add(itemBinary); creItemSlots[14] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Quiver3.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Quiver3.Charges1; itemBinary.Charges2 = creFile.Items.Quiver3.Charges2; itemBinary.Charges3 = creFile.Items.Quiver3.Charges3; itemBinary.ExpiryHour = creFile.Items.Quiver3.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Quiver3.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Quiver3.Filename); itemBinary.Flags = creFile.Items.Quiver3.Flags; creItems.Add(itemBinary); creItemSlots[15] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Unknown.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Unknown.Charges1; itemBinary.Charges2 = creFile.Items.Unknown.Charges2; itemBinary.Charges3 = creFile.Items.Unknown.Charges3; itemBinary.ExpiryHour = creFile.Items.Unknown.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Unknown.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Unknown.Filename); itemBinary.Flags = creFile.Items.Unknown.Flags; creItems.Add(itemBinary); creItemSlots[16] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.Cloak.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Cloak.Charges1; itemBinary.Charges2 = creFile.Items.Cloak.Charges2; itemBinary.Charges3 = creFile.Items.Cloak.Charges3; itemBinary.ExpiryHour = creFile.Items.Cloak.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Cloak.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Cloak.Filename); itemBinary.Flags = creFile.Items.Cloak.Flags; creItems.Add(itemBinary); creItemSlots[17] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.QuickItem1.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Amulet.Charges1; itemBinary.Charges2 = creFile.Items.Amulet.Charges2; itemBinary.Charges3 = creFile.Items.Amulet.Charges3; itemBinary.ExpiryHour = creFile.Items.Amulet.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Amulet.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Amulet.Filename); itemBinary.Flags = creFile.Items.Amulet.Flags; creItems.Add(itemBinary); creItemSlots[18] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.QuickItem2.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Amulet.Charges1; itemBinary.Charges2 = creFile.Items.Amulet.Charges2; itemBinary.Charges3 = creFile.Items.Amulet.Charges3; itemBinary.ExpiryHour = creFile.Items.Amulet.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Amulet.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Amulet.Filename); itemBinary.Flags = creFile.Items.Amulet.Flags; creItems.Add(itemBinary); creItemSlots[19] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.QuickItem3.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.Amulet.Charges1; itemBinary.Charges2 = creFile.Items.Amulet.Charges2; itemBinary.Charges3 = creFile.Items.Amulet.Charges3; itemBinary.ExpiryHour = creFile.Items.Amulet.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.Amulet.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.Amulet.Filename); itemBinary.Flags = creFile.Items.Amulet.Flags; creItems.Add(itemBinary); creItemSlots[20] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem1.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem1.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem1.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem1.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem1.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem1.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem1.Filename); itemBinary.Flags = creFile.Items.InventoryItem1.Flags; creItems.Add(itemBinary); creItemSlots[21] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem2.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem2.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem2.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem2.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem2.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem2.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem2.Filename); itemBinary.Flags = creFile.Items.InventoryItem2.Flags; creItems.Add(itemBinary); creItemSlots[22] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem3.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem3.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem3.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem3.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem3.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem3.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem3.Filename); itemBinary.Flags = creFile.Items.InventoryItem3.Flags; creItems.Add(itemBinary); creItemSlots[23] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem4.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem4.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem4.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem4.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem4.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem4.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem4.Filename); itemBinary.Flags = creFile.Items.InventoryItem4.Flags; creItems.Add(itemBinary); creItemSlots[24] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem5.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem5.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem5.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem5.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem5.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem5.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem5.Filename); itemBinary.Flags = creFile.Items.InventoryItem5.Flags; creItems.Add(itemBinary); creItemSlots[25] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem6.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem6.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem6.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem6.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem6.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem6.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem6.Filename); itemBinary.Flags = creFile.Items.InventoryItem6.Flags; creItems.Add(itemBinary); creItemSlots[26] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem7.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem7.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem7.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem7.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem7.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem7.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem7.Filename); itemBinary.Flags = creFile.Items.InventoryItem7.Flags; creItems.Add(itemBinary); creItemSlots[27] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem8.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem8.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem8.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem8.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem8.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem8.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem8.Filename); itemBinary.Flags = creFile.Items.InventoryItem8.Flags; creItems.Add(itemBinary); creItemSlots[28] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem9.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem9.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem9.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem9.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem9.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem9.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem9.Filename); itemBinary.Flags = creFile.Items.InventoryItem9.Flags; creItems.Add(itemBinary); creItemSlots[29] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem10.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem10.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem10.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem10.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem10.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem10.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem10.Filename); itemBinary.Flags = creFile.Items.InventoryItem10.Flags; creItems.Add(itemBinary); creItemSlots[30] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem11.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem11.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem11.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem11.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem11.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem11.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem11.Filename); itemBinary.Flags = creFile.Items.InventoryItem11.Flags; creItems.Add(itemBinary); creItemSlots[31] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem12.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem12.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem12.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem12.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem12.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem12.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem12.Filename); itemBinary.Flags = creFile.Items.InventoryItem12.Flags; creItems.Add(itemBinary); creItemSlots[32] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem13.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem13.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem13.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem13.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem13.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem13.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem13.Filename); itemBinary.Flags = creFile.Items.InventoryItem13.Flags; creItems.Add(itemBinary); creItemSlots[33] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem14.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem14.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem14.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem14.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem14.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem14.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem14.Filename); itemBinary.Flags = creFile.Items.InventoryItem14.Flags; creItems.Add(itemBinary); creItemSlots[34] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem15.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem15.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem15.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem15.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem15.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem15.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem15.Filename); itemBinary.Flags = creFile.Items.InventoryItem15.Flags; creItems.Add(itemBinary); creItemSlots[35] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.InventoryItem16.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.InventoryItem16.Charges1; itemBinary.Charges2 = creFile.Items.InventoryItem16.Charges2; itemBinary.Charges3 = creFile.Items.InventoryItem16.Charges3; itemBinary.ExpiryHour = creFile.Items.InventoryItem16.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.InventoryItem16.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.InventoryItem16.Filename); itemBinary.Flags = creFile.Items.InventoryItem16.Flags; creItems.Add(itemBinary); creItemSlots[36] = itemCount; itemCount++; } if (!String.IsNullOrEmpty(creFile.Items.MagicWeapon.Filename)) { var itemBinary = new CreItemBinary(); itemBinary.Charges1 = creFile.Items.MagicWeapon.Charges1; itemBinary.Charges2 = creFile.Items.MagicWeapon.Charges2; itemBinary.Charges3 = creFile.Items.MagicWeapon.Charges3; itemBinary.ExpiryHour = creFile.Items.MagicWeapon.ExpiryHour; itemBinary.ExpiryValue = creFile.Items.MagicWeapon.ExpiryValue; itemBinary.Filename = new array8(creFile.Items.MagicWeapon.Filename); itemBinary.Flags = creFile.Items.MagicWeapon.Flags; creItems.Add(itemBinary); creItemSlots[37] = itemCount; itemCount++; } creItemSlots[38] = creFile.Items.SelectedWeapon; creItemSlots[39] = creFile.Items.SelectedWeaponAbility; foreach (var memorisedSpell in creFile.MemorisedSpells.MageLevel1) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.MageLevel2) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.MageLevel3) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.MageLevel4) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.MageLevel5) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.MageLevel6) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.MageLevel7) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.MageLevel8) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.MageLevel9) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.PriestLevel1) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.PriestLevel2) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.PriestLevel3) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.PriestLevel4) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.PriestLevel5) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.PriestLevel6) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.PriestLevel7) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } foreach (var memorisedSpell in creFile.MemorisedSpells.Innate) { var memorisedSpellBinary = new CreMemorisedSpellBinary(); memorisedSpellBinary.Filename = new array8(memorisedSpell.Filename); memorisedSpellBinary.Memorised = Convert.ToInt32(memorisedSpell.IsMemorised); creMemorisedSpells.Add(memorisedSpellBinary); } var creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel1.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel1.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel1.Count); creSpellmemorisationInfo.SpellLevel = 0; creSpellmemorisationInfo.SpellOffset = 0; creSpellmemorisationInfo.SpellType = 0; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel2.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel2.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel2.Count); creSpellmemorisationInfo.SpellLevel = 1; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count; creSpellmemorisationInfo.SpellType = 0; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel3.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel3.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel3.Count); creSpellmemorisationInfo.SpellLevel = 2; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count; creSpellmemorisationInfo.SpellType = 0; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel4.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel4.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel4.Count); creSpellmemorisationInfo.SpellLevel = 3; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count; creSpellmemorisationInfo.SpellType = 0; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel5.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel5.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel5.Count); creSpellmemorisationInfo.SpellLevel = 4; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count + creFile.MemorisedSpells.MageLevel4.Count; creSpellmemorisationInfo.SpellType = 0; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel6.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel6.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel6.Count); creSpellmemorisationInfo.SpellLevel = 5; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count + creFile.MemorisedSpells.MageLevel4.Count + creFile.MemorisedSpells.MageLevel5.Count; creSpellmemorisationInfo.SpellType = 0; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel7.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel7.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel7.Count); creSpellmemorisationInfo.SpellLevel = 6; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count + creFile.MemorisedSpells.MageLevel4.Count + creFile.MemorisedSpells.MageLevel5.Count + creFile.MemorisedSpells.MageLevel6.Count; creSpellmemorisationInfo.SpellType = 0; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel8.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel8.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel8.Count); creSpellmemorisationInfo.SpellLevel = 7; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count + creFile.MemorisedSpells.MageLevel4.Count + creFile.MemorisedSpells.MageLevel5.Count + creFile.MemorisedSpells.MageLevel6.Count + creFile.MemorisedSpells.MageLevel7.Count; creSpellmemorisationInfo.SpellType = 0; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel9.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel9.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.MageLevel9.Count); creSpellmemorisationInfo.SpellLevel = 8; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count + creFile.MemorisedSpells.MageLevel4.Count + creFile.MemorisedSpells.MageLevel5.Count + creFile.MemorisedSpells.MageLevel6.Count + creFile.MemorisedSpells.MageLevel7.Count + creFile.MemorisedSpells.MageLevel8.Count; creSpellmemorisationInfo.SpellType = 0; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel1.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel1.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel1.Count); creSpellmemorisationInfo.SpellLevel = 0; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count + creFile.MemorisedSpells.MageLevel4.Count + creFile.MemorisedSpells.MageLevel5.Count + creFile.MemorisedSpells.MageLevel6.Count + creFile.MemorisedSpells.MageLevel7.Count + creFile.MemorisedSpells.MageLevel8.Count + creFile.MemorisedSpells.MageLevel9.Count; creSpellmemorisationInfo.SpellType = 1; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel2.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel2.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel2.Count); creSpellmemorisationInfo.SpellLevel = 1; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count + creFile.MemorisedSpells.MageLevel4.Count + creFile.MemorisedSpells.MageLevel5.Count + creFile.MemorisedSpells.MageLevel6.Count + creFile.MemorisedSpells.MageLevel7.Count + creFile.MemorisedSpells.MageLevel8.Count + creFile.MemorisedSpells.MageLevel9.Count + creFile.MemorisedSpells.PriestLevel1.Count; creSpellmemorisationInfo.SpellType = 1; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel1.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel3.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel3.Count); creSpellmemorisationInfo.SpellLevel = 2; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count + creFile.MemorisedSpells.MageLevel4.Count + creFile.MemorisedSpells.MageLevel5.Count + creFile.MemorisedSpells.MageLevel6.Count + creFile.MemorisedSpells.MageLevel7.Count + creFile.MemorisedSpells.MageLevel8.Count + creFile.MemorisedSpells.MageLevel9.Count + creFile.MemorisedSpells.PriestLevel1.Count + creFile.MemorisedSpells.PriestLevel2.Count; creSpellmemorisationInfo.SpellType = 1; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel1.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel4.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel4.Count); creSpellmemorisationInfo.SpellLevel = 3; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count + creFile.MemorisedSpells.MageLevel4.Count + creFile.MemorisedSpells.MageLevel5.Count + creFile.MemorisedSpells.MageLevel6.Count + creFile.MemorisedSpells.MageLevel7.Count + creFile.MemorisedSpells.MageLevel8.Count + creFile.MemorisedSpells.MageLevel9.Count + creFile.MemorisedSpells.PriestLevel1.Count + creFile.MemorisedSpells.PriestLevel2.Count + creFile.MemorisedSpells.PriestLevel3.Count; creSpellmemorisationInfo.SpellType = 1; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel1.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel5.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel5.Count); creSpellmemorisationInfo.SpellLevel = 4; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count + creFile.MemorisedSpells.MageLevel4.Count + creFile.MemorisedSpells.MageLevel5.Count + creFile.MemorisedSpells.MageLevel6.Count + creFile.MemorisedSpells.MageLevel7.Count + creFile.MemorisedSpells.MageLevel8.Count + creFile.MemorisedSpells.MageLevel9.Count + creFile.MemorisedSpells.PriestLevel1.Count + creFile.MemorisedSpells.PriestLevel2.Count + creFile.MemorisedSpells.PriestLevel3.Count + creFile.MemorisedSpells.PriestLevel4.Count; creSpellmemorisationInfo.SpellType = 1; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel1.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel6.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel6.Count); creSpellmemorisationInfo.SpellLevel = 5; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count + creFile.MemorisedSpells.MageLevel4.Count + creFile.MemorisedSpells.MageLevel5.Count + creFile.MemorisedSpells.MageLevel6.Count + creFile.MemorisedSpells.MageLevel7.Count + creFile.MemorisedSpells.MageLevel8.Count + creFile.MemorisedSpells.MageLevel9.Count + creFile.MemorisedSpells.PriestLevel1.Count + creFile.MemorisedSpells.PriestLevel2.Count + creFile.MemorisedSpells.PriestLevel2.Count + creFile.MemorisedSpells.PriestLevel4.Count + creFile.MemorisedSpells.PriestLevel5.Count; creSpellmemorisationInfo.SpellType = 1; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel1.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel7.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.PriestLevel7.Count); creSpellmemorisationInfo.SpellLevel = 6; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count + creFile.MemorisedSpells.MageLevel4.Count + creFile.MemorisedSpells.MageLevel5.Count + creFile.MemorisedSpells.MageLevel6.Count + creFile.MemorisedSpells.MageLevel7.Count + creFile.MemorisedSpells.MageLevel8.Count + creFile.MemorisedSpells.MageLevel9.Count + creFile.MemorisedSpells.PriestLevel1.Count + creFile.MemorisedSpells.PriestLevel2.Count + creFile.MemorisedSpells.PriestLevel3.Count + creFile.MemorisedSpells.PriestLevel4.Count + creFile.MemorisedSpells.PriestLevel5.Count + creFile.MemorisedSpells.PriestLevel6.Count; creSpellmemorisationInfo.SpellType = 1; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); creSpellmemorisationInfo = new CreSpellMemorisationInfoBinary(); creSpellmemorisationInfo.CurrentSlotCount = Convert.ToInt16(creFile.MemorisedSpells.Innate.Count); creSpellmemorisationInfo.SlotCount = Convert.ToInt16(creFile.MemorisedSpells.Innate.Count); creSpellmemorisationInfo.SpellCount = Convert.ToInt16(creFile.MemorisedSpells.Innate.Count); creSpellmemorisationInfo.SpellLevel = 0; creSpellmemorisationInfo.SpellOffset = creFile.MemorisedSpells.MageLevel1.Count + creFile.MemorisedSpells.MageLevel2.Count + creFile.MemorisedSpells.MageLevel3.Count + creFile.MemorisedSpells.MageLevel4.Count + creFile.MemorisedSpells.MageLevel5.Count + creFile.MemorisedSpells.MageLevel6.Count + creFile.MemorisedSpells.MageLevel7.Count + creFile.MemorisedSpells.MageLevel8.Count + creFile.MemorisedSpells.MageLevel9.Count + creFile.MemorisedSpells.PriestLevel1.Count + creFile.MemorisedSpells.PriestLevel2.Count + creFile.MemorisedSpells.PriestLevel3.Count + creFile.MemorisedSpells.PriestLevel4.Count + creFile.MemorisedSpells.PriestLevel5.Count + creFile.MemorisedSpells.PriestLevel6.Count + creFile.MemorisedSpells.PriestLevel7.Count; creSpellmemorisationInfo.SpellType = 2; creSpellMemorisationInfo.Add(creSpellmemorisationInfo); foreach (var knownSpell in creFile.KnownSpells.MageLevel1) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 0; knownSpellBinary.SpellType = 1; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.MageLevel2) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 1; knownSpellBinary.SpellType = 1; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.MageLevel3) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 2; knownSpellBinary.SpellType = 1; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.MageLevel4) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 3; knownSpellBinary.SpellType = 1; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.MageLevel5) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 4; knownSpellBinary.SpellType = 1; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.MageLevel6) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 5; knownSpellBinary.SpellType = 1; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.MageLevel7) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 6; knownSpellBinary.SpellType = 1; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.MageLevel8) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 7; knownSpellBinary.SpellType = 1; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.MageLevel9) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 8; knownSpellBinary.SpellType = 1; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.PriestLevel1) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 0; knownSpellBinary.SpellType = 0; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.PriestLevel2) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 1; knownSpellBinary.SpellType = 0; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.PriestLevel3) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 2; knownSpellBinary.SpellType = 0; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.PriestLevel4) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 3; knownSpellBinary.SpellType = 0; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.PriestLevel5) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 4; knownSpellBinary.SpellType = 0; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.PriestLevel6) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 5; knownSpellBinary.SpellType = 0; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.PriestLevel7) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 6; knownSpellBinary.SpellType = 0; creKnownSpells.Add(knownSpellBinary); } foreach (var knownSpell in creFile.KnownSpells.Innate) { var knownSpellBinary = new CreKnownSpellBinary(); knownSpellBinary.Filename = new array8(knownSpell.Filename); knownSpellBinary.SpellLevel = 0; knownSpellBinary.SpellType = 2; creKnownSpells.Add(knownSpellBinary); } CreHeaderBinary header = new CreHeaderBinary(); header.Flags = creFile.Flags.ShowLongname ? header.Flags | Common.Bit0 : header.Flags; header.Flags = creFile.Flags.NoCorpse ? header.Flags | Common.Bit1 : header.Flags; header.Flags = creFile.Flags.KeepCorpse ? header.Flags | Common.Bit2 : header.Flags; header.Flags = creFile.Flags.OriginalFighter ? header.Flags | Common.Bit3 : header.Flags; header.Flags = creFile.Flags.OriginalMage ? header.Flags | Common.Bit4 : header.Flags; header.Flags = creFile.Flags.OriginalCleric ? header.Flags | Common.Bit5 : header.Flags; header.Flags = creFile.Flags.OriginalThief ? header.Flags | Common.Bit6 : header.Flags; header.Flags = creFile.Flags.OriginalDruid ? header.Flags | Common.Bit7 : header.Flags; header.Flags = creFile.Flags.OriginalRanger ? header.Flags | Common.Bit8 : header.Flags; header.Flags = creFile.Flags.FallenPaladin ? header.Flags | Common.Bit9 : header.Flags; header.Flags = creFile.Flags.FallenRanger ? header.Flags | Common.Bit10 : header.Flags; header.Flags = creFile.Flags.Exportable ? header.Flags | Common.Bit11 : header.Flags; header.Flags = creFile.Flags.HideInjuryStatus ? header.Flags | Common.Bit12 : header.Flags; header.Flags = creFile.Flags.QuestCritical ? header.Flags | Common.Bit13 : header.Flags; header.Flags = creFile.Flags.CanActivateTriggers ? header.Flags | Common.Bit14 : header.Flags; header.Flags = creFile.Flags.BeenInParty ? header.Flags | Common.Bit15 : header.Flags; header.Flags = creFile.Flags.RestoreItem ? header.Flags | Common.Bit16 : header.Flags; header.Flags = creFile.Flags.ClearRestoreItem ? header.Flags | Common.Bit17 : header.Flags; // unknown...? header.Flags = creFile.Flags.RandomWalkEa ? header.Flags | Common.Bit24 : header.Flags; header.Flags = creFile.Flags.RandomWalkGender ? header.Flags | Common.Bit25 : header.Flags; header.Flags = creFile.Flags.RandomWalkRace ? header.Flags | Common.Bit26 : header.Flags; header.Flags = creFile.Flags.RandomWalkClass ? header.Flags | Common.Bit27 : header.Flags; header.Flags = creFile.Flags.RandomWalkSpecific ? header.Flags | Common.Bit28 : header.Flags; header.Flags = creFile.Flags.RandomWalkGender ? header.Flags | Common.Bit29 : header.Flags; header.Flags = creFile.Flags.RandomWalkAlignment ? header.Flags | Common.Bit30 : header.Flags; header.Flags = creFile.Flags.UnInterruptable ? header.Flags | Common.Bit31 : header.Flags; header.ftype = new array4() { character1 = 'C', character2 = 'R', character3 = 'E', character4 = ' ' }; header.fversion = new array4() { character1 = 'V', character2 = '1', character3 = '.', character4 = '0' }; header.AcidResistance = creFile.AcidResistance; header.Alignment = creFile.Alignment; header.Animation = creFile.Animation; header.ArmorClassEffective = creFile.ArmorClassEffective; header.ArmorClassNatural = creFile.ArmorClassNatural; header.ArmorColourIndex = creFile.ArmorColourIndex; header.Charisma = creFile.Charisma; header.Class = creFile.Class; header.ColdResistance = creFile.ColdResistance; header.Constitution = creFile.Constitution; header.CrushingModifuer = creFile.CrushingModifuer; header.CrushingResistance = creFile.CrushingResistance; header.CurrentHP = creFile.CurrentHP; header.DeathVariable = creFile.DeathVariable; header.DetectIllusion = creFile.DetectIllusion; header.Dexterity = creFile.Dexterity; header.DialogFile = creFile.DialogFile; header.EffectOffset = HeaderSize; header.ElectricityResistance = creFile.ElectricityResistance; header.EnemyAlly = creFile.EnemyAlly; header.Fatigue = creFile.Fatigue; header.FindTraps = creFile.FindTraps; header.FireResistance = creFile.FireResistance; header.Gender = creFile.Gender; header.General = creFile.General; header.GlobalActorEnumeration = creFile.GlobalActorEnumeration; header.Gold = creFile.Gold; header.HairColourIndex = creFile.HairColourIndex; header.HideInShadows = creFile.HideInShadows; header.Intelligence = creFile.Intelligence; header.Intoxication = creFile.Intoxication; header.Kit = creFile.Kit; header.LargePortrait = creFile.LargePortrait; header.LeatherColourIndex = creFile.LeatherColourIndex; header.Level1 = creFile.Level1; header.Level2 = creFile.Level2; header.Level3 = creFile.Level3; header.LocalActorEnumeration = creFile.LocalActorEnumeration; header.LockPicking = creFile.LockPicking; header.LongName = Common.WriteString(creFile.LongName, TlkFile); header.Lore = creFile.Lore; header.Luck = creFile.Luck; header.MagicColdResistance = creFile.MagicColdResistance; header.MagicFireResistance = creFile.MagicFireResistance; header.MagicResistance = creFile.MagicResistance; header.MajorColourIndex = creFile.MajorColourIndex; header.MaximumHP = creFile.MaximumHP; header.MetalColourIndex = creFile.MetalColourIndex; header.MinorColourIndex = creFile.MinorColourIndex; header.MissileModifier = creFile.MissileModifier; header.MissileResistance = creFile.MissileResistance; header.Morale = creFile.Morale; header.MoraleBreak = creFile.MoraleBreak; header.MoraleRecoveryTime = creFile.MoraleRecoveryTime; header.NumberOfAttacks = creFile.NumberOfAttacks; header.ObjectIdRef1 = creFile.ObjectIdRef1; header.ObjectIdRef2 = creFile.ObjectIdRef2; header.ObjectIdRef3 = creFile.ObjectIdRef3; header.ObjectIdRef4 = creFile.ObjectIdRef4; header.ObjectIdRef5 = creFile.ObjectIdRef5; header.PickPockets = creFile.PickPockets; header.PiercingModifier = creFile.PiercingModifier; header.PiercingResistance = creFile.PiercingResistance; header.PowerLevel = creFile.PowerLevel; header.Race = creFile.Race; header.RacialEnemy = creFile.RacialEnemy; header.Reputation = creFile.Reputation; header.SaveVsBreath = creFile.SaveVsBreath; header.SaveVsDeath = creFile.SaveVsDeath; header.SaveVsPolymorph = creFile.SaveVsPolymorph; header.SaveVsSpells = creFile.SaveVsSpells; header.SaveVsWanrds = creFile.SaveVsWanrds; header.ScriptClass = creFile.ScriptClass; header.ScriptDefault = creFile.ScriptDefault; header.ScriptGeneral = creFile.ScriptGeneral; header.ScriptOverride = creFile.ScriptOverride; header.ScriptRace = creFile.ScriptRace; header.SetTraps = creFile.SetTraps; header.Sex = creFile.Sex; header.ShortName = Common.WriteString(creFile.ShortName, TlkFile); header.SkinColourIndex = creFile.SkinColourIndex; header.SlashingResistance = creFile.SlashingResistance; header.SmallPortrait = creFile.SmallPortrait; header.Specific = creFile.Specific; header.StatusFlags = creFile.StatusFlags; header.Stealth = creFile.Stealth; header.Strength = creFile.Strength; header.StrengthBonus = creFile.StrengthBonus; header.Strref1 = Common.WriteString(creFile.Strref1, TlkFile); header.Strref2 = Common.WriteString(creFile.Strref2, TlkFile); header.Strref3 = Common.WriteString(creFile.Strref3, TlkFile); header.Strref4 = Common.WriteString(creFile.Strref4, TlkFile); header.Strref5 = Common.WriteString(creFile.Strref5, TlkFile); header.Strref6 = Common.WriteString(creFile.Strref6, TlkFile); header.Strref7 = Common.WriteString(creFile.Strref7, TlkFile); header.Strref8 = Common.WriteString(creFile.Strref8, TlkFile); header.Strref9 = Common.WriteString(creFile.Strref9, TlkFile); header.Strref10 = Common.WriteString(creFile.Strref10, TlkFile); header.Strref11 = Common.WriteString(creFile.Strref11, TlkFile); header.Strref12 = Common.WriteString(creFile.Strref12, TlkFile); header.Strref13 = Common.WriteString(creFile.Strref13, TlkFile); header.Strref14 = Common.WriteString(creFile.Strref14, TlkFile); header.Strref15 = Common.WriteString(creFile.Strref15, TlkFile); header.Strref16 = Common.WriteString(creFile.Strref16, TlkFile); header.Strref17 = Common.WriteString(creFile.Strref17, TlkFile); header.Strref18 = Common.WriteString(creFile.Strref18, TlkFile); header.Strref19 = Common.WriteString(creFile.Strref19, TlkFile); header.Strref20 = Common.WriteString(creFile.Strref20, TlkFile); header.Strref21 = Common.WriteString(creFile.Strref21, TlkFile); header.Strref22 = Common.WriteString(creFile.Strref22, TlkFile); header.Strref23 = Common.WriteString(creFile.Strref23, TlkFile); header.Strref24 = Common.WriteString(creFile.Strref24, TlkFile); header.Strref25 = Common.WriteString(creFile.Strref25, TlkFile); header.Strref26 = Common.WriteString(creFile.Strref26, TlkFile); header.Strref27 = Common.WriteString(creFile.Strref27, TlkFile); header.Strref28 = Common.WriteString(creFile.Strref28, TlkFile); header.Strref29 = Common.WriteString(creFile.Strref29, TlkFile); header.Strref30 = Common.WriteString(creFile.Strref30, TlkFile); header.Strref31 = Common.WriteString(creFile.Strref31, TlkFile); header.Strref32 = Common.WriteString(creFile.Strref32, TlkFile); header.Strref33 = Common.WriteString(creFile.Strref33, TlkFile); header.Strref34 = Common.WriteString(creFile.Strref34, TlkFile); header.Strref35 = Common.WriteString(creFile.Strref35, TlkFile); header.Strref36 = Common.WriteString(creFile.Strref36, TlkFile); header.Strref37 = Common.WriteString(creFile.Strref37, TlkFile); header.Strref38 = Common.WriteString(creFile.Strref38, TlkFile); header.Strref39 = Common.WriteString(creFile.Strref39, TlkFile); header.Strref40 = Common.WriteString(creFile.Strref40, TlkFile); header.Strref41 = Common.WriteString(creFile.Strref41, TlkFile); header.Strref42 = Common.WriteString(creFile.Strref42, TlkFile); header.Strref43 = Common.WriteString(creFile.Strref43, TlkFile); header.Strref44 = Common.WriteString(creFile.Strref44, TlkFile); header.Strref45 = Common.WriteString(creFile.Strref45, TlkFile); header.Strref46 = Common.WriteString(creFile.Strref46, TlkFile); header.Strref47 = Common.WriteString(creFile.Strref47, TlkFile); header.Strref48 = Common.WriteString(creFile.Strref48, TlkFile); header.Strref49 = Common.WriteString(creFile.Strref49, TlkFile); header.Strref50 = Common.WriteString(creFile.Strref50, TlkFile); header.Strref51 = Common.WriteString(creFile.Strref51, TlkFile); header.Strref52 = Common.WriteString(creFile.Strref52, TlkFile); header.Strref53 = Common.WriteString(creFile.Strref53, TlkFile); header.Strref54 = Common.WriteString(creFile.Strref54, TlkFile); header.Strref55 = Common.WriteString(creFile.Strref55, TlkFile); header.Strref56 = Common.WriteString(creFile.Strref56, TlkFile); header.Strref57 = Common.WriteString(creFile.Strref57, TlkFile); header.Strref58 = Common.WriteString(creFile.Strref58, TlkFile); header.Strref59 = Common.WriteString(creFile.Strref59, TlkFile); header.Strref60 = Common.WriteString(creFile.Strref60, TlkFile); header.Strref61 = Common.WriteString(creFile.Strref61, TlkFile); header.Strref62 = Common.WriteString(creFile.Strref62, TlkFile); header.Strref63 = Common.WriteString(creFile.Strref63, TlkFile); header.Strref64 = Common.WriteString(creFile.Strref64, TlkFile); header.Strref65 = Common.WriteString(creFile.Strref65, TlkFile); header.Strref66 = Common.WriteString(creFile.Strref66, TlkFile); header.Strref67 = Common.WriteString(creFile.Strref67, TlkFile); header.Strref68 = Common.WriteString(creFile.Strref68, TlkFile); header.Strref69 = Common.WriteString(creFile.Strref69, TlkFile); header.Strref70 = Common.WriteString(creFile.Strref70, TlkFile); header.Strref71 = Common.WriteString(creFile.Strref71, TlkFile); header.Strref72 = Common.WriteString(creFile.Strref72, TlkFile); header.Strref73 = Common.WriteString(creFile.Strref73, TlkFile); header.Strref74 = Common.WriteString(creFile.Strref74, TlkFile); header.Strref75 = Common.WriteString(creFile.Strref75, TlkFile); header.Strref76 = Common.WriteString(creFile.Strref76, TlkFile); header.Strref77 = Common.WriteString(creFile.Strref77, TlkFile); header.Strref78 = Common.WriteString(creFile.Strref78, TlkFile); header.Strref79 = Common.WriteString(creFile.Strref79, TlkFile); header.Strref80 = Common.WriteString(creFile.Strref80, TlkFile); header.Strref81 = Common.WriteString(creFile.Strref81, TlkFile); header.Strref82 = Common.WriteString(creFile.Strref82, TlkFile); header.Strref83 = Common.WriteString(creFile.Strref83, TlkFile); header.Strref84 = Common.WriteString(creFile.Strref84, TlkFile); header.Strref85 = Common.WriteString(creFile.Strref85, TlkFile); header.Strref86 = Common.WriteString(creFile.Strref86, TlkFile); header.Strref87 = Common.WriteString(creFile.Strref87, TlkFile); header.Strref88 = Common.WriteString(creFile.Strref88, TlkFile); header.Strref89 = Common.WriteString(creFile.Strref89, TlkFile); header.Strref90 = Common.WriteString(creFile.Strref90, TlkFile); header.Strref91 = Common.WriteString(creFile.Strref91, TlkFile); header.Strref92 = Common.WriteString(creFile.Strref92, TlkFile); header.Strref93 = Common.WriteString(creFile.Strref93, TlkFile); header.Strref94 = Common.WriteString(creFile.Strref94, TlkFile); header.Strref95 = Common.WriteString(creFile.Strref95, TlkFile); header.Strref96 = Common.WriteString(creFile.Strref96, TlkFile); header.Strref97 = Common.WriteString(creFile.Strref97, TlkFile); header.Strref98 = Common.WriteString(creFile.Strref98, TlkFile); header.Strref99 = Common.WriteString(creFile.Strref99, TlkFile); header.Strref100 = Common.WriteString(creFile.Strref100, TlkFile); header.Thac0 = creFile.Thac0; header.Tracking = creFile.Tracking; header.Unknown = creFile.Unknown; header.Unknownx1 = creFile.Unknownx1; header.Unknownx2 = creFile.Unknownx2; header.Unknownx3 = creFile.Unknownx3; header.Unknownx4 = creFile.Unknownx4; header.Unknownx5 = creFile.Unknownx5; header.UnusedAxe = creFile.UnusedAxe; header.UnusedBlunt = creFile.UnusedBlunt; header.UnusedBows = creFile.UnusedBows; header.UnusedLargeSwords = creFile.UnusedLargeSwords; header.UnusedMissile = creFile.UnusedMissile; header.UnusedSmallSwords = creFile.UnusedSmallSwords; header.UnusedSpears = creFile.UnusedSpears; header.UnusedSpiked = creFile.UnusedSpiked; header.Wisdom = creFile.Wisdom; header.XPReward = creFile.XPReward; header.KnownSpellsCount = creKnownSpells.Count; header.KnownSpellsoffset = HeaderSize; header.SpellMemorizationCount = creSpellMemorisationInfo.Count; header.SpellMemorizationOffset = HeaderSize + (creKnownSpells.Count * KnownSpellSize); header.MemorizedSpellsCount = creMemorisedSpells.Count; header.MemorizedSpellsOffset = HeaderSize + (creKnownSpells.Count * KnownSpellSize) + (creSpellMemorisationInfo.Count * memorisedspellinfoSize); int totalEffectBlockSize = 0; if (creEffects1.Count > 1) { header.EffVersion = 0; header.EffectCount = creEffects1.Count; header.EffectOffset = HeaderSize + (creKnownSpells.Count * KnownSpellSize) + (creSpellMemorisationInfo.Count * memorisedspellinfoSize) + (creMemorisedSpells.Count * memorisedspellSize); totalEffectBlockSize = (creEffects1.Count * Eff1Size); } if (creEffects2.Count > 0) { header.EffVersion = 1; header.EffectCount = creEffects2.Count; header.EffectOffset = HeaderSize + (creKnownSpells.Count * KnownSpellSize) + (creSpellMemorisationInfo.Count * memorisedspellinfoSize) + (creMemorisedSpells.Count * memorisedspellSize); totalEffectBlockSize = (creEffects2.Count * Eff2Size); } header.ItemCount = creItems.Count; header.ItemOffset = HeaderSize + (totalEffectBlockSize) + (creKnownSpells.Count * KnownSpellSize) + (creMemorisedSpells.Count * memorisedspellSize) + (creSpellMemorisationInfo.Count * memorisedspellinfoSize); header.ItemSlotOffset = HeaderSize + (totalEffectBlockSize) + (creKnownSpells.Count * KnownSpellSize) + (creMemorisedSpells.Count * memorisedspellSize) + (creSpellMemorisationInfo.Count * memorisedspellinfoSize) + (creItems.Count * ItemSize); using (MemoryStream s = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(s)) { var headerAsBytes = Common.WriteStruct(header); bw.Write(headerAsBytes); foreach (var spell in creKnownSpells) { var spellAsBytes = Common.WriteStruct(spell); bw.Write(spellAsBytes); } foreach (var spell in creSpellMemorisationInfo) { var spellAsBytes = Common.WriteStruct(spell); bw.Write(spellAsBytes); } foreach (var spell in creMemorisedSpells) { var spellAsBytes = Common.WriteStruct(spell); bw.Write(spellAsBytes); } if (creFile.EffVersion == 0) { foreach (var effect in creEffects1) { var effectAsBytes = Common.WriteStruct(effect); bw.Write(effectAsBytes); } } if (creFile.EffVersion == 1) { foreach (var effect in creEffects2) { var effectAsBytes = Common.WriteStruct(effect); bw.Write(effectAsBytes); } } foreach (var item in creItems) { var itemAsBytes = Common.WriteStruct(item); bw.Write(itemAsBytes); } foreach (var itemSlot in creItemSlots) { bw.Write(itemSlot); } if (BackupManger != null) { BackupManger.BackupFile(file, file.Filename, file.FileType, this); } using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write)) { bw.BaseStream.Position = 0; bw.BaseStream.CopyTo(fs); fs.Flush(flushToDisk: true); } } } return true; }
public bool Write(string filename, IEFile file, bool forceSave = false) { if (!(file is TlkFile)) throw new ArgumentException("File is not a valid creature file"); var tlkFile = file as TlkFile; if (!(forceSave) && (MD5HashGenerator.GenerateKey(tlkFile) == tlkFile.Checksum)) return false; List<TlkEntryBinary> stringEntries = new List<TlkEntryBinary>(); List<String> strings = new List<String>(); TlkHeaderBinary header = new TlkHeaderBinary(); header.ftype = new array4() { character1 = 'T', character2 = 'L', character3 = 'K', character4 = ' ' }; header.fversion = new array4() { character1 = 'V', character2 = '1', character3 = ' ', character4 = ' ' }; header.LanguageId = tlkFile.LangugeId; header.StringCount = tlkFile.Strings.Count; header.StringOffset = HeaderSize + (StringInfoSize * tlkFile.Strings.Count); foreach (var stringInfo in tlkFile.Strings) { var stringInfoBinary = new TlkEntryBinary(); stringInfoBinary.Flags = Convert.ToInt16(stringInfo.Flags); stringInfoBinary.PitchVariance = stringInfo.PitchVariance; stringInfoBinary.Sound = new array8(stringInfo.Sound); stringInfoBinary.StringIndex = strings.Count; stringInfoBinary.StringLength = stringInfo.Text.Length; stringInfoBinary.VolumeVariance = stringInfo.VolumeVariance; stringEntries.Add(stringInfoBinary); strings.Add(stringInfo.Text); } using (MemoryStream s = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(s)) { var headerAsBytes = Common.WriteStruct(header); bw.Write(headerAsBytes); foreach (var stringEntry in stringEntries) { var stringEntryAsBytes = Common.WriteStruct(stringEntry); bw.Write(stringEntryAsBytes); } foreach (var text in strings) { bw.Write(text); } if (BackupManger != null) { BackupManger.BackupFile(file, file.Filename, file.FileType, this); } using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write)) { bw.BaseStream.Position = 0; bw.BaseStream.CopyTo(fs); fs.Flush(flushToDisk: true); } } } return true; }