Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 3
0
        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");
        }
Ejemplo n.º 4
0
        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;
        }
Ejemplo n.º 5
0
        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;
        }
Ejemplo n.º 6
0
        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;
        }
Ejemplo n.º 7
0
        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;
        }
Ejemplo n.º 8
0
        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;
        }
Ejemplo n.º 9
0
        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;
        }
Ejemplo n.º 10
0
        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;
        }
Ejemplo n.º 11
0
        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;
        }
Ejemplo n.º 12
0
        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;
        }
Ejemplo n.º 13
0
        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;
        }