コード例 #1
0
 /// <summary>Read a pattern number from the stream.</summary>
 /// <param name="stream"></param>
 /// <param name="patternCode"></param>
 /// <param name="patternNumber"></param>
 /// <returns></returns>
 protected static byte ReadPatternNumber(Stream stream, PicturePatternFlags patternCode, ref byte patternNumber)
 {
     if ((patternCode & PicturePatternFlags.UsePattern) != 0)
     {
         patternNumber = (byte)((ReadByte(stream) >> 1) & 0x7F);
     }
     return(patternNumber);
 }
コード例 #2
0
 /// <summary>Initialise the instruction.</summary>
 /// <param name="opcode"></param>
 /// <param name="patternFlags"></param>
 /// <param name="drawLocations"></param>
 public DrawPatterns(PictureOpcode opcode, PicturePatternFlags patternFlags, List <PicturePatternDrawLocation> drawLocations)
     : base(opcode)
 {
     if (drawLocations == null)
     {
         throw new ArgumentNullException("drawLocations");
     }
     this.PatternFlags  = patternFlags;
     this.DrawLocations = drawLocations;
 }
コード例 #3
0
        /// <summary>Read an instruction from the stream.</summary>
        /// <param name="stream"></param>
        /// <param name="patternFlags"></param>
        /// <param name="patternNumber"></param>
        /// <returns></returns>
        public static PictureInstruction ReadInstruction(Stream stream, ref PicturePatternFlags patternFlags, ref byte patternNumber)
        {
            PictureOpcode opcode = (PictureOpcode)ReadByte(stream);

            switch (opcode)
            {
            case PictureOpcode.SetColor: return(new SetColor(stream));

            case PictureOpcode.DisableVisual: return(new DisableVisual());

            case PictureOpcode.SetPriority: return(new SetPriority(stream));

            case PictureOpcode.DisablePriority: return(new DisablePriority());

            case PictureOpcode.DrawFloodfill: return(new DrawFloodfill(stream));

            case PictureOpcode.SetPatternFlags: return(new SetPatternFlags(stream, ref patternFlags));

            case PictureOpcode.SetControl: return(new SetControl(stream));

            case PictureOpcode.DisableControl: return(new DisableControl());

            case PictureOpcode.DrawRelativeMediumLines:
            case PictureOpcode.DrawRelativeLongLines:
            case PictureOpcode.DrawRelativeShortLines: return(new DrawLines(opcode, stream));

            case PictureOpcode.DrawRelativeMediumPatterns:
            case PictureOpcode.DrawRelativePatterns:
            case PictureOpcode.DrawAbsolutePatterns: return(new DrawPatterns(opcode, stream, patternFlags, ref patternNumber));

            case PictureOpcode.ExtendedOpcode:
                var extendedOpcode = (PictureExtendedOpcode)ReadByte(stream);
                switch (extendedOpcode)
                {
                case PictureExtendedOpcode.SetPaletteEntry:
                case PictureExtendedOpcode.SetPalette: return(new SetPalette(stream, extendedOpcode));

                case PictureExtendedOpcode.Mono0: return(new Mono0(stream));

                case PictureExtendedOpcode.Mono1:
                case PictureExtendedOpcode.Mono2:
                case PictureExtendedOpcode.Mono3: return(new Mono123(stream, extendedOpcode));

                default: throw new Exception(String.Format("Unknown extended opcode 0x{0:X2} ({1})", (int)opcode, opcode));
                }

            case PictureOpcode.Quit: return(new Quit());

            default: throw new Exception(String.Format("Unknown opcode 0x{0:X2} ({1}).", (int)opcode, opcode));
            }
        }
コード例 #4
0
        internal Picture(AssetLoader loader)
            : base(loader)
        {
            BinaryReader reader = loader.Reader;
            ushort       check  = reader.ReadUInt16();
            Codex <PictureInstruction> instructions = new Codex <PictureInstruction>();
            Codex <PictureCel>         cels         = new Codex <PictureCel>();

            if (check == 0x0E)               // VGA picture
            {
                int celCount = reader.ReadUInt16();
                Unknowns.ReadInt16s(reader, 1);                 // 0x2A
                int paletteOffset = reader.ReadInt32();
                Dimensions = new Vector2i(reader.ReadUInt16(), reader.ReadUInt16());

                reader.BaseStream.Position = paletteOffset;
                Palette = new Palette(loader);
                AddChild(Palette);

                for (int celIndex = 0; celIndex < celCount; celIndex++)
                {
                    PictureCel cel = new PictureCel(this, celIndex, loader);

                    cels.Add(cel);
                    AddChild(cel);
                    instructions.Add(new PictureInstruction.DrawCel(cel));
                }
            }
            else
            {
                Dimensions = new Vector2i(320, 190);
                reader.BaseStream.Seek(-2, SeekOrigin.Current);
                byte[] data   = reader.ReadBytes(checked ((int)reader.BaseStream.Length));
                Stream stream = new MemoryStream(data, false);
                PicturePatternFlags patternFlags = PicturePatternFlags.None;
                byte patternNumber = 0;

                while (true)
                {
                    PictureInstruction instruction = PictureInstruction.ReadInstruction(stream, ref patternFlags, ref patternNumber);
                    instructions.Add(instruction);
                    if (instruction.IsQuit)
                    {
                        break;
                    }
                }
            }

            Cels         = cels;
            Instructions = instructions;
        }
コード例 #5
0
 static PicturePatternFlags Read(Stream stream, ref PicturePatternFlags patternCode)
 {
     return(patternCode = (PicturePatternFlags)(ReadByte(stream) & 0x37));
 }
コード例 #6
0
 static PicturePatternFlags Read(Stream stream, ref PicturePatternFlags patternCode)
 {
     return patternCode = (PicturePatternFlags)(ReadByte(stream) & 0x37);
 }
コード例 #7
0
 /// <summary>Read the instruction.</summary>
 /// <param name="stream"></param>
 /// <param name="patternCode"></param>
 public SetPatternFlags(Stream stream, ref PicturePatternFlags patternCode) : this(Read(stream, ref patternCode))
 {
 }
コード例 #8
0
 /// <summary>Initialise the instruction.</summary>
 /// <param name="patternFlags"></param>
 public SetPatternFlags(PicturePatternFlags patternFlags) : base(PictureOpcode.SetPatternFlags)
 {
     PatternFlags = patternFlags;
 }
コード例 #9
0
 /// <summary>Read a pattern number from the stream.</summary>
 /// <param name="stream"></param>
 /// <param name="patternCode"></param>
 /// <param name="patternNumber"></param>
 /// <returns></returns>
 protected static byte ReadPatternNumber(Stream stream, PicturePatternFlags patternCode, ref byte patternNumber)
 {
     if ((patternCode & PicturePatternFlags.UsePattern) != 0)
         patternNumber = (byte)((ReadByte(stream) >> 1) & 0x7F);
     return patternNumber;
 }
コード例 #10
0
            static List <PicturePatternDrawLocation> ReadPositions(Stream stream, PictureOpcode opcode, PicturePatternFlags patternFlags, ref byte patternNumber)
            {
                List <PicturePatternDrawLocation> list = new List <PicturePatternDrawLocation>();
                Vector2i position;

                ReadPatternNumber(stream, patternFlags, ref patternNumber);
                position = ReadAbsoluteCoordinates(stream);
                list.Add(new PicturePatternDrawLocation(patternNumber, position));

                while (PeekContinue(stream))
                {
                    ReadPatternNumber(stream, patternFlags, ref patternNumber);

                    switch (opcode)
                    {
                    case PictureOpcode.DrawRelativePatterns: position = ReadShortRelativeCoordinates(stream, position); break;

                    case PictureOpcode.DrawAbsolutePatterns: position = ReadAbsoluteCoordinates(stream); break;

                    case PictureOpcode.DrawRelativeMediumPatterns: position = ReadMediumRelativeCoordinates(stream, position); break;

                    default: throw new NotSupportedException();
                    }
                    list.Add(new PicturePatternDrawLocation(patternNumber, position));
                }
                return(list);
            }
コード例 #11
0
 /// <summary>Initialise the instruction.</summary>
 /// <param name="opcode"></param>
 /// <param name="stream"></param>
 /// <param name="patternFlags"></param>
 /// <param name="patternNumber"></param>
 public DrawPatterns(PictureOpcode opcode, Stream stream, PicturePatternFlags patternFlags, ref byte patternNumber)
     : this(opcode, patternFlags, ReadPositions(stream, opcode, patternFlags, ref patternNumber))
 {
 }
コード例 #12
0
 /// <summary>Initialise the instruction.</summary>
 /// <param name="opcode"></param>
 /// <param name="stream"></param>
 /// <param name="patternFlags"></param>
 /// <param name="patternNumber"></param>
 public DrawPatterns(PictureOpcode opcode, Stream stream, PicturePatternFlags patternFlags, ref byte patternNumber)
     : this(opcode, patternFlags, ReadPositions(stream, opcode, patternFlags, ref patternNumber))
 {
 }
コード例 #13
0
        /// <summary>Read an instruction from the stream.</summary>
        /// <param name="stream"></param>
        /// <param name="patternFlags"></param>
        /// <param name="patternNumber"></param>
        /// <returns></returns>
        public static PictureInstruction ReadInstruction(Stream stream, ref PicturePatternFlags patternFlags, ref byte patternNumber)
        {
            PictureOpcode opcode = (PictureOpcode)ReadByte(stream);

            switch (opcode) {
                case PictureOpcode.SetColor: return new SetColor(stream);
                case PictureOpcode.DisableVisual: return new DisableVisual();
                case PictureOpcode.SetPriority: return new SetPriority(stream);
                case PictureOpcode.DisablePriority: return new DisablePriority();
                case PictureOpcode.DrawFloodfill: return new DrawFloodfill(stream);
                case PictureOpcode.SetPatternFlags: return new SetPatternFlags(stream, ref patternFlags);
                case PictureOpcode.SetControl: return new SetControl(stream);
                case PictureOpcode.DisableControl: return new DisableControl();

                case PictureOpcode.DrawRelativeMediumLines:
                case PictureOpcode.DrawRelativeLongLines:
                case PictureOpcode.DrawRelativeShortLines: return new DrawLines(opcode, stream);

                case PictureOpcode.DrawRelativeMediumPatterns:
                case PictureOpcode.DrawRelativePatterns:
                case PictureOpcode.DrawAbsolutePatterns: return new DrawPatterns(opcode, stream, patternFlags, ref patternNumber);

                case PictureOpcode.ExtendedOpcode:
                    var extendedOpcode = (PictureExtendedOpcode)ReadByte(stream);
                    switch (extendedOpcode) {
                        case PictureExtendedOpcode.SetPaletteEntry:
                        case PictureExtendedOpcode.SetPalette: return new SetPalette(stream, extendedOpcode);

                        case PictureExtendedOpcode.Mono0: return new Mono0(stream);
                        case PictureExtendedOpcode.Mono1:
                        case PictureExtendedOpcode.Mono2:
                        case PictureExtendedOpcode.Mono3: return new Mono123(stream, extendedOpcode);

                        default: throw new Exception(String.Format("Unknown extended opcode 0x{0:X2} ({1})", (int)opcode, opcode));
                    }

                case PictureOpcode.Quit: return new Quit();
                default: throw new Exception(String.Format("Unknown opcode 0x{0:X2} ({1}).", (int)opcode, opcode));
            }
        }
コード例 #14
0
 /// <summary>Initialise the instruction.</summary>
 /// <param name="patternFlags"></param>
 public SetPatternFlags(PicturePatternFlags patternFlags)
     : base(PictureOpcode.SetPatternFlags)
 {
     PatternFlags = patternFlags;
 }
コード例 #15
0
 /// <summary>Read the instruction.</summary>
 /// <param name="stream"></param>
 /// <param name="patternCode"></param>
 public SetPatternFlags(Stream stream, ref PicturePatternFlags patternCode)
     : this(Read(stream, ref patternCode))
 {
 }
コード例 #16
0
            static List<PicturePatternDrawLocation> ReadPositions(Stream stream, PictureOpcode opcode, PicturePatternFlags patternFlags, ref byte patternNumber)
            {
                List<PicturePatternDrawLocation> list = new List<PicturePatternDrawLocation>();
                Vector2i position;

                ReadPatternNumber(stream, patternFlags, ref patternNumber);
                position = ReadAbsoluteCoordinates(stream);
                list.Add(new PicturePatternDrawLocation(patternNumber, position));

                while (PeekContinue(stream)) {
                    ReadPatternNumber(stream, patternFlags, ref patternNumber);

                    switch (opcode) {
                        case PictureOpcode.DrawRelativePatterns: position = ReadShortRelativeCoordinates(stream, position); break;
                        case PictureOpcode.DrawAbsolutePatterns: position = ReadAbsoluteCoordinates(stream); break;
                        case PictureOpcode.DrawRelativeMediumPatterns: position = ReadMediumRelativeCoordinates(stream, position); break;
                        default: throw new NotSupportedException();
                    }
                    list.Add(new PicturePatternDrawLocation(patternNumber, position));
                }
                return list;
            }
コード例 #17
0
 /// <summary>Initialise the instruction.</summary>
 /// <param name="opcode"></param>
 /// <param name="patternFlags"></param>
 /// <param name="drawLocations"></param>
 public DrawPatterns(PictureOpcode opcode, PicturePatternFlags patternFlags, List<PicturePatternDrawLocation> drawLocations)
     : base(opcode)
 {
     if (drawLocations == null)
         throw new ArgumentNullException("drawLocations");
     this.PatternFlags = patternFlags;
     this.DrawLocations = drawLocations;
 }