Ejemplo n.º 1
0
        public void Render(ConsoleInstance console)
        {
            if (HasValidDimension() == false)
            {
                return;
            }
            UpdateConsoleData();

            UpdateFooter(console);

            ScreenBuffer buffer = new ScreenBuffer(ScreenWidth, ScreenHeight);

            if (forceRender || console.Writer.HasUpdate)
            {
                RenderView(buffer, console);
            }
            if (forceRender || changeInput)
            {
                RenderInput(buffer);
            }
            if (forceRender || changeFooter)
            {
                RenderFooter(buffer);
            }

            IEnumerable <ShortRect> rects = GetRects(
                forceRender | console.Writer.HasUpdate,
                forceRender | changeInput,
                forceRender | changeFooter);

            foreach (ShortRect rect in rects)
            {
                ShortRect refRect = rect;
                bool      b       = WriteConsoleOutput(fileHandle, buffer.Buffer,
                                                       new Coord()
                {
                    X = (byte)ScreenWidth, Y = (byte)ScreenHeight
                },
                                                       new Coord()
                {
                    X = rect.Left, Y = rect.Top
                },
                                                       ref refRect);
            }

            console.Writer.ResetUpdate();
            changeFooter = false;
            changeInput  = false;
            forceRender  = false;
        }
Ejemplo n.º 2
0
        private bool IsCloseToBorder(ShortRect window, ShortPoint playerPos, Player player,
                                     float borderAreaSpacePart)
        {
            int horzSpace = (int)(window.Width / borderAreaSpacePart);
            int vertSpace = (int)(window.Height / borderAreaSpacePart);

            return((playerPos.X <= window.X + horzSpace && playerPos.X - horzSpace >= 0 &&
                    (player.Direction == D.W || player.Direction == D.NW || player.Direction == D.SW)) ||
                   (playerPos.X >= window.X + window.Width - horzSpace && playerPos.X + horzSpace < _width &&
                    (player.Direction == D.E || player.Direction == D.NE || player.Direction == D.SE)) ||
                   (playerPos.Y <= window.Y + vertSpace && playerPos.Y - vertSpace >= 0 &&
                    (player.Direction == D.N || player.Direction == D.NE || player.Direction == D.NW)) ||
                   (playerPos.Y >= window.Y + window.Height - vertSpace && playerPos.Y + vertSpace < _height &&
                    (player.Direction == D.S || player.Direction == D.SE || player.Direction == D.SW)));
        }
Ejemplo n.º 3
0
        public bool HasValidDimension()
        {
            //bool supported = (Console.WindowWidth == ScreenWidth) && (Console.WindowHeight == ScreenHeight);
            bool supported = (Console.WindowWidth > 59) && (Console.WindowHeight > 29);

            if (!supported)
            {
                suspended = true;
                ScreenBuffer buffer = new ScreenBuffer(Console.WindowWidth, Console.WindowHeight);
                buffer.SetRowColors(0, 0, Console.WindowWidth, ConsoleColor.Cyan, ConsoleColor.Black);
                buffer.SetRowColors(1, 0, Console.WindowWidth, ConsoleColor.Gray, ConsoleColor.Black);
                buffer.SetRowColors(2, 0, Console.WindowWidth, ConsoleColor.Gray, ConsoleColor.Black);
                buffer.SetRowColors(3, 0, Console.WindowWidth, ConsoleColor.DarkGray, ConsoleColor.Black);
                buffer.WriteAt(0, "ConsoleAsync");
                buffer.WriteAt(1, "Support minumum 60x30 console window");
                buffer.WriteAt(3, "Press escape key to resize window");

                ShortRect rect = CreateRect(0, 0, Console.WindowWidth, Console.WindowHeight);

                bool b = WriteConsoleOutput(fileHandle, buffer.Buffer,
                                            new Coord()
                {
                    X = (byte)Console.WindowWidth, Y = (byte)Console.WindowHeight
                },
                                            new Coord()
                {
                    X = 0, Y = 0
                },
                                            ref rect);
            }

            if (suspended && supported)
            {
                forceRender = true;
                suspended   = false;
            }

            return(supported);
        }
Ejemplo n.º 4
0
 private static extern bool WriteConsoleOutput(
     SafeFileHandle hConsoleOutput,
     CharInfo[] lpBuffer,
     Coord dwBufferSize,
     Coord dwBufferCoord,
     ref ShortRect lpWriteRegion);
Ejemplo n.º 5
0
        public void AppendMapData(byte[] data, ShortRect window)
        {
            if (data == null)
            {
                return;
            }

            int startX = window.X, startY = window.Y;
            Dictionary<ushort, Tile> tilesSet = new Dictionary<ushort, Tile>();

            fixed (byte* bData = data)
            {
                int pos = 0;

                //Read tiles set
                ushort tilesInSet;
                Serializer.Read(bData, out tilesInSet, ref pos);
                for (ushort i = 0; i < tilesInSet; i++)
                {
                    Tile tile = new Tile();
                    tile.Deserialize(bData, ref pos);
                    tilesSet.Add(i, tile);
                }

                //Read tiles list
                int tilesCnt, curIdx = 0;
                Serializer.Read(bData, out tilesCnt, ref pos);
                for (int i = 0; i < tilesCnt; i++)
                {
                    //Read tile series length
                    byte rleMark;
                    ushort seriesLength;
                    Serializer.Read(bData, out rleMark, ref pos);
                    if ((rleMark | 0x80) == rleMark)
                    {
                        byte rleMark2;
                        Serializer.Read(bData, out rleMark2, ref pos);
                        seriesLength = (ushort)((rleMark & ~0x80) << 8 | rleMark2);
                    }
                    else
                    {
                        seriesLength = rleMark;
                    }

                    //Match tile
                    ushort tileIdx;
                    Serializer.Read(bData, out tileIdx, ref pos);
                    Tile tile = tilesSet[tileIdx];
                    tileIdx = AppendTile(ref tile);

                    //Fill tiles list
                    int maxIdx = curIdx + seriesLength;
                    for (; curIdx < maxIdx; curIdx++)
                    {
                        ushort x = (ushort)(startX + (curIdx % window.Width));
                        ushort y = (ushort)(startY + (curIdx / window.Width));
                        int tileCoordMark = y << 16 | x;
                        if (_map.ContainsKey(tileCoordMark))
                        {
                            _map[tileCoordMark] = tileIdx;
                            FlagClearBorders(x, y);
                        }
                        else
                        {
                            _map.Add(tileCoordMark, tileIdx);
                            _rtFlags.Add(tileCoordMark, 0);
                        }
                    }
                }
            }

            _windows.Add(window);
        }
Ejemplo n.º 6
0
 private bool IsCloseToBorder(ShortRect window, ShortPoint playerPos, Player player,
     float borderAreaSpacePart)
 {
     int horzSpace = (int) (window.Width/borderAreaSpacePart);
     int vertSpace = (int) (window.Height/borderAreaSpacePart);
     return (playerPos.X <= window.X + horzSpace && playerPos.X - horzSpace >= 0 &&
             (player.Direction == D.W || player.Direction == D.NW || player.Direction == D.SW)) ||
            (playerPos.X >= window.X + window.Width - horzSpace && playerPos.X + horzSpace < _width &&
             (player.Direction == D.E || player.Direction == D.NE || player.Direction == D.SE)) ||
            (playerPos.Y <= window.Y + vertSpace && playerPos.Y - vertSpace >= 0 &&
             (player.Direction == D.N || player.Direction == D.NE || player.Direction == D.NW)) ||
            (playerPos.Y >= window.Y + window.Height - vertSpace && playerPos.Y + vertSpace < _height &&
             (player.Direction == D.S || player.Direction == D.SE || player.Direction == D.SW));
 }
Ejemplo n.º 7
0
        public void AppendMapData(byte[] data, ShortRect window)
        {
            if (data == null)
            {
                return;
            }

            int startX = window.X, startY = window.Y;
            Dictionary <ushort, Tile> tilesSet = new Dictionary <ushort, Tile>();

            fixed(byte *bData = data)
            {
                int pos = 0;

                //Read tiles set
                ushort tilesInSet;

                Serializer.Read(bData, out tilesInSet, ref pos);
                for (ushort i = 0; i < tilesInSet; i++)
                {
                    Tile tile = new Tile();
                    tile.Deserialize(bData, ref pos);
                    tilesSet.Add(i, tile);
                }

                //Read tiles list
                int tilesCnt, curIdx = 0;

                Serializer.Read(bData, out tilesCnt, ref pos);
                for (int i = 0; i < tilesCnt; i++)
                {
                    //Read tile series length
                    byte   rleMark;
                    ushort seriesLength;
                    Serializer.Read(bData, out rleMark, ref pos);
                    if ((rleMark | 0x80) == rleMark)
                    {
                        byte rleMark2;
                        Serializer.Read(bData, out rleMark2, ref pos);
                        seriesLength = (ushort)((rleMark & ~0x80) << 8 | rleMark2);
                    }
                    else
                    {
                        seriesLength = rleMark;
                    }

                    //Match tile
                    ushort tileIdx;
                    Serializer.Read(bData, out tileIdx, ref pos);
                    Tile tile = tilesSet[tileIdx];
                    tileIdx = AppendTile(ref tile);

                    //Fill tiles list
                    int maxIdx = curIdx + seriesLength;
                    for (; curIdx < maxIdx; curIdx++)
                    {
                        ushort x             = (ushort)(startX + (curIdx % window.Width));
                        ushort y             = (ushort)(startY + (curIdx / window.Width));
                        int    tileCoordMark = y << 16 | x;
                        if (_map.ContainsKey(tileCoordMark))
                        {
                            _map[tileCoordMark] = tileIdx;
                            FlagClearBorders(x, y);
                        }
                        else
                        {
                            _map.Add(tileCoordMark, tileIdx);
                            _rtFlags.Add(tileCoordMark, 0);
                        }
                    }
                }
            }

            _windows.Add(window);
        }
Ejemplo n.º 8
0
        public byte[] MapWindowGet(PlayerDataEx playerData, out ShortRect mapWindow)
        {
            const float resCoef = MAP_WINDOW_RES_COEF / ConstMap.PIXEL_SIZE;

            float      dStartX, dStartY;
            float      dWidth  = playerData.ScreenRes.Width * resCoef;
            float      dHeight = playerData.ScreenRes.Height * resCoef;
            ShortPoint pos     = playerData.Player.Position.ToShortPoint(ConstMap.PIXEL_SIZE);

            switch (playerData.Player.Direction)
            {
            case Direction.N:
                dStartX = pos.X - dWidth / 2;
                dStartY = pos.Y - dHeight;
                break;

            case Direction.S:
                dStartX = pos.X - dWidth / 2;
                dStartY = pos.Y;
                break;

            case Direction.W:
                dStartX = pos.X - dWidth;
                dStartY = pos.Y - dHeight / 2;
                break;

            case Direction.E:
                dStartX = pos.X;
                dStartY = pos.Y - dHeight / 2;
                break;

            case Direction.NW:
                dStartX = pos.X - dWidth / 1.1f;
                dStartY = pos.Y - dHeight / 1.1f;
                break;

            case Direction.NE:
                dStartX = pos.X - dWidth * 0.1f;
                dStartY = pos.Y - dHeight / 1.1f;
                break;

            case Direction.SW:
                dStartX = pos.X - dWidth / 1.1f;
                dStartY = pos.Y - dHeight * 0.1f;
                break;

            case Direction.SE:
                dStartX = pos.X - dWidth * 0.1f;
                dStartY = pos.Y - dHeight * 0.1f;
                break;

            default:
                dStartX = pos.X - dWidth / 2;
                dStartY = pos.Y - dHeight / 2;
                break;
            }

            int mapWidth = playerData.Map.Width, mapHeight = playerData.Map.Height;

            ushort startX = (ushort)Math.Max(dStartX, 0);
            ushort startY = (ushort)Math.Max(dStartY, 0);
            ushort width  = (ushort)Math.Floor(startX + dWidth > mapWidth
                ? dWidth - (startX + dWidth - mapWidth)
                : dWidth);
            ushort height = (ushort)Math.Floor(startY + dHeight > mapHeight
                ? dHeight - (startY + dHeight - mapHeight)
                : dHeight);

            mapWindow = new ShortRect(startX, startY, width, height);
            return(playerData.Map.GetWindow(mapWindow.X, mapWindow.Y, mapWindow.Width, mapWindow.Height));
        }
Ejemplo n.º 9
0
 public static void Read(byte *bData, out ShortRect val, ref int pos)
 {
     val  = *(ShortRect *)&bData[pos];
     pos += sizeof(ShortRect);
 }
Ejemplo n.º 10
0
 public static void Write(byte *bData, ShortRect val, ref int pos)
 {
     (*(ShortRect *)&bData[pos]) = val;
     pos += sizeof(ShortRect);
 }
Ejemplo n.º 11
0
        public byte[] MapWindowGet(PlayerDataEx playerData, out ShortRect mapWindow)
        {
            const float resCoef = MAP_WINDOW_RES_COEF/ConstMap.PIXEL_SIZE;

            float dStartX, dStartY;
            float dWidth = playerData.ScreenRes.Width*resCoef;
            float dHeight = playerData.ScreenRes.Height*resCoef;
            ShortPoint pos = playerData.Player.Position.ToShortPoint(ConstMap.PIXEL_SIZE);
            switch (playerData.Player.Direction)
            {
                case Direction.N:
                    dStartX = pos.X - dWidth/2;
                    dStartY = pos.Y - dHeight;
                    break;
                case Direction.S:
                    dStartX = pos.X - dWidth/2;
                    dStartY = pos.Y;
                    break;
                case Direction.W:
                    dStartX = pos.X - dWidth;
                    dStartY = pos.Y - dHeight/2;
                    break;
                case Direction.E:
                    dStartX = pos.X;
                    dStartY = pos.Y - dHeight/2;
                    break;
                case Direction.NW:
                    dStartX = pos.X - dWidth/1.1f;
                    dStartY = pos.Y - dHeight/1.1f;
                    break;
                case Direction.NE:
                    dStartX = pos.X - dWidth*0.1f;
                    dStartY = pos.Y - dHeight/1.1f;
                    break;
                case Direction.SW:
                    dStartX = pos.X - dWidth/1.1f;
                    dStartY = pos.Y - dHeight*0.1f;
                    break;
                case Direction.SE:
                    dStartX = pos.X - dWidth*0.1f;
                    dStartY = pos.Y - dHeight*0.1f;
                    break;
                default:
                    dStartX = pos.X - dWidth/2;
                    dStartY = pos.Y - dHeight/2;
                    break;
            }

            int mapWidth = playerData.Map.Width, mapHeight = playerData.Map.Height;

            ushort startX = (ushort) Math.Max(dStartX, 0);
            ushort startY = (ushort) Math.Max(dStartY, 0);
            ushort width = (ushort) Math.Floor(startX + dWidth > mapWidth
                ? dWidth - (startX + dWidth - mapWidth)
                : dWidth);
            ushort height = (ushort) Math.Floor(startY + dHeight > mapHeight
                ? dHeight - (startY + dHeight - mapHeight)
                : dHeight);

            mapWindow = new ShortRect(startX, startY, width, height);
            return playerData.Map.GetWindow(mapWindow.X, mapWindow.Y, mapWindow.Width, mapWindow.Height);
        }