Exemple #1
0
    // Swaps two items on each move.
    static void Swap(string[,] arr, pos from, pos to)
    {
        string val = arr[to.row, to.col];

        arr[to.row, to.col]     = arr[from.row, from.col];
        arr[from.row, from.col] = val;
    }
Exemple #2
0
 public Move(pos oldPosition, pos newPosition, FigID movedID, FigID removedID)
 {
     oldPos         = oldPosition;
     newPos         = newPosition;
     this.movedID   = movedID;
     this.removedID = removedID;
 }
Exemple #3
0
        //Just for testing the to-be dll:
        static void Main()
        {
            //Stopwatch stopwatch = Stopwatch.StartNew();

            var Boardy      = new Board(new StdChessStartState());
            var aa          = new pos(3, 3);
            var TestFigure  = new Pawn(Boardy.state, new pos(2, 1), Color.black);
            var TestFigure2 = new Pawn(Boardy.state, new pos(2, 6), Color.white);
            var bb          = new Lpos();
            var cc          = new Lpos();

            for (int i = 0; i < 1; i++)
            {
                bb = TestFigure.PossibleFieldsToMove();
                cc = TestFigure2.PossibleFieldsToMove();
            }
            var jj = Boardy.state;

            jj[3, 0] = FigID.empty;
            jj[4, 4] = FigID.empty;
            jj[4, 5] = FigID.wPawnEnPassantable;

            Boardy.TryMove(new pos(1, 0), new pos(2, 2), FigID.wKnight);
            Boardy.TryRevertLastMove();
            Boardy.TryMove(new pos(1, 0), new pos(2, 2), FigID.wKnight);

            //stopwatch.Stop();
            //Console.WriteLine(stopwatch.ElapsedMilliseconds);
        }
        public void posWithoutCapabilityAndEntryMode()
        {
            var authorization = new authorization();
            authorization.reportGroup = "Planets";
            authorization.orderId = "12344";
            authorization.amount = 106;
            authorization.orderSource = orderSourceType.ecommerce;
            var pos = new pos();
            pos.cardholderId = posCardholderIdTypeEnum.pin;
            authorization.pos = pos;
            var card = new cardType();
            card.type = methodOfPaymentTypeEnum.VI;
            card.number = "4100000000000002";
            card.expDate = "1210";
            authorization.card = card; //This needs to compile

            var cb = new customBilling();
            cb.phone = "1112223333"; //This needs to compile too

            try
            {
                litle.Authorize(authorization);
                //expected exception;
            }
            catch (LitleOnlineException e)
            {
                Assert.True(e.Message.StartsWith("Error validating xml data against the schema"));
            }
        }
 public Figure(State givenState, pos givenPosition, Color givenTeam)
 {
     state    = givenState;
     position = givenPosition;
     team     = givenTeam != Color.none ? givenTeam : throw new ArgumentException("Figure can't have Color.none");
     teamSign = team == Color.white ? 1 : -1;
 }
        public void trackData()
        {
            authorization authorization = new authorization();

            authorization.id          = "AX54321678";
            authorization.reportGroup = "RG27";
            authorization.orderId     = "12z58743y1";
            authorization.amount      = 12522L;
            authorization.orderSource = orderSourceType.retail;
            contact billToAddress = new contact();

            billToAddress.zip           = "95032";
            authorization.billToAddress = billToAddress;
            cardType card = new cardType();

            card.track         = "%B40000001^Doe/JohnP^06041...?;40001=0604101064200?";
            authorization.card = card;
            pos pos = new pos();

            pos.capability    = posCapabilityTypeEnum.magstripe;
            pos.entryMode     = posEntryModeTypeEnum.completeread;
            pos.cardholderId  = posCardholderIdTypeEnum.signature;
            authorization.pos = pos;

            authorizationResponse response = litle.Authorize(authorization);

            Assert.AreEqual("Approved", response.message);
        }
        public void posWithoutCapabilityAndEntryMode()
        {
            authorization authorization = new authorization();

            authorization.reportGroup = "Planets";
            authorization.orderId     = "12344";
            authorization.amount      = 106;
            authorization.orderSource = orderSourceType.ecommerce;
            pos pos = new pos();

            pos.cardholderId  = posCardholderIdTypeEnum.pin;
            authorization.pos = pos;
            cardType card = new cardType();

            card.type          = methodOfPaymentTypeEnum.VI;
            card.number        = "4100000000000002";
            card.expDate       = "1210";
            authorization.card = card; //This needs to compile

            customBilling cb = new customBilling();

            cb.phone = "1112223333"; //This needs to compile too

            try
            {
                litle.Authorize(authorization);
                //expected exception;
            }
            catch (LitleOnlineException e)
            {
                Assert.True(e.Message.StartsWith("Error validating xml data against the schema"));
            }
        }
Exemple #8
0
    //Synchronous receive dataflow and return the pos value to the Update Threaing
    static pos Receive()
    {
        pos rec = new pos()
        {
            x = 0, y = 0
        };

        for (int i = 0; i < 20; i++)
        {
            int recvv = sp.ReadByte();
            if (recvv != 2 && recvv != 14 && recvv != 16 && recvv != 18 && recvv != 35 && recvv != 48)
            {
                if (i == 14)
                {
                    rec.x = recvv;
                }
                if (i == 15 && recvv == 255)
                {
                    rec.x = rec.x - 255;
                }
                if (i == 16)
                {
                    rec.y = recvv;
                }
                if (i == 17 && recvv == 254)
                {
                    rec.y = rec.y - 255;
                }
            }
        }


        return(rec);
    }
Exemple #9
0
    protected override void ComputeVelocity()
    {
        if (start)
        {
            //Debug.Log("X" + (data.x - origin.x));
            //Debug.Log("Y" + (data.y - origin.y));
            if (!drag)
            {
                if (data.x != 0 || data.y != 0)
                {
                    origin = data;
                    drag   = true;
                }
            }

            /* if (jump == 1)
             * {
             *
             *   if (grounded) { velocity.y = jumpTakeOffSpeed; jump = 0; }
             *
             *   else if (!grounded && velocity.y > 0) { velocity.y = velocity.y * 0.5f; jump = 0; }
             *
             * }*/
            if (drag)
            {
                vect.x = data.x - origin.x;
                vect.y = data.y - origin.y;

                // if (data.y < 152)
                // {
                if (vect.y > threshold)
                {
                    transform.Translate(Vector3.forward * speed * (vect.y / threshold) * Time.deltaTime);
                }
                if (vect.y < -threshold)
                {
                    transform.Translate(Vector3.back * speed * (vect.y / threshold) * Time.deltaTime);
                }
                // }
                if (vect.x < -threshold)
                {
                    transform.Translate(Vector3.left * speed * (vect.x / threshold) * Time.deltaTime);
                }
                if (vect.x > threshold)
                {
                    transform.Translate(Vector3.right * speed * (vect.x / threshold) * Time.deltaTime);
                }
            }

            bool flipSprite = (spriteRenderer.flipX ? (velocity.x > 0.01f) : (velocity.x < -0.01f));
            if (flipSprite)
            {
                spriteRenderer.flipX = !spriteRenderer.flipX;
            }

            animator.SetBool("grounded", grounded);
            animator.SetFloat("velocityX", Mathf.Abs(velocity.x) / speed);
        }
    }
 private void Filltabel_multi(Position position)
 {
     if (position != null)
     {
         if (position.ProfitPortfolioPersent > 0 && position.Direction == Side.Buy)
         {
             pos p = stopPositions.FindLast(x => x.Side == Side.Buy);
             if (dealsDataDictionary.ContainsKey(p.dealID.ToString()))
             {
                 tabel_multi.Add("0" + delim + dealsDataDictionary[p.dealID.ToString()]);
                 dealsDataDictionary.Remove(p.dealID.ToString());
             }
         }
         else if (position.ProfitPortfolioPersent < 0 && position.Direction == Side.Buy)
         {
             pos p = stopPositions.FindLast(x => x.Side == Side.Buy);
             if (dealsDataDictionary.ContainsKey(p.dealID.ToString()))
             {
                 tabel_multi.Add("1" + delim + dealsDataDictionary[p.dealID.ToString()]);
                 dealsDataDictionary.Remove(p.dealID.ToString());
             }
         }
         else if (position.ProfitPortfolioPersent > 0 && position.Direction == Side.Sell)
         {
             pos p = stopPositions.FindLast(x => x.Side == Side.Sell);
             if (dealsDataDictionary.ContainsKey(p.dealID.ToString()))
             {
                 tabel_multi.Add("3" + delim + dealsDataDictionary[p.dealID.ToString()]);
                 dealsDataDictionary.Remove(p.dealID.ToString());
             }
         }
         else if (position.ProfitPortfolioPersent < 0 && position.Direction == Side.Sell)
         {
             pos p = stopPositions.FindLast(x => x.Side == Side.Sell);
             if (dealsDataDictionary.ContainsKey(p.dealID.ToString()))
             {
                 tabel_multi.Add("4" + delim + dealsDataDictionary[p.dealID.ToString()]);
                 dealsDataDictionary.Remove(p.dealID.ToString());
             }
         }
     }
     else
     {
         foreach (var el in stopPositions)
         {
             if (el.Side == Side.Buy && dealsDataDictionary.ContainsKey(el.dealID.ToString()))
             {
                 tabel_multi.Add("1" + delim + dealsDataDictionary[el.dealID.ToString()]);
                 dealsDataDictionary.Remove(el.dealID.ToString());
             }
             if (el.Side == Side.Sell && dealsDataDictionary.ContainsKey(el.dealID.ToString()))
             {
                 tabel_multi.Add("4" + delim + dealsDataDictionary[el.dealID.ToString()]);
                 dealsDataDictionary.Remove(el.dealID.ToString());
             }
         }
     }
     stopPositions.Clear();
 }
Exemple #11
0
        static pos CalculatePosition(int size)
        {
            pos p = new pos();

            p.x = size / 2;
            p.y = size - 1;
            return(p);
        }
Exemple #12
0
    static void Move(string[,] arr, pos from, pos to)
    {
        MoveV(arr, from, to);
        PrintArray(arr);

        MoveH(arr, from, to);
        PrintArray(arr);
    }
 public PhysicalObject(string name_, char symbol_, Color color_)
 {
     p = new pos(-1, -1);
     row = -1;
     col = -1;
     SetName(name_);
     symbol = string.FromCharCode(symbol_);
     color = color_;
     light_radius = 0;
 }
 public PhysicalObject()
 {
     row = -1;
     col = -1;
     name = "";
     a_name = "";
     the_name = "";
     symbol = '%';
     color = Color.White;
     light_radius = 0;
     sprite_offset = new pos(0,1);
 }
 public PhysicalObject()
 {
     p = new pos(-1, -1);
     row=-1;
     col=-1;
     name="";
     a_name="";
     the_name="";
     symbol="%";
     color=Color.White;
     light_radius = 0;
 }
Exemple #16
0
        static int BFS()
        {
            Queue <pos> q = new Queue <pos>();

            q.Enqueue(new pos(0, 0, 1, 0));

            while (q.Count != 0)
            {
                pos temp = q.Dequeue();

                if (temp.x == n - 1 && temp.y == m - 1)
                {
                    return(temp.d);
                }

                for (int d = 0; d < 4; d++)
                {
                    int xx = temp.x + dx[d];
                    int yy = temp.y + dy[d];

                    if (xx < 0 || yy < 0 || xx >= n || yy >= m)
                    {
                        continue;
                    }

                    if (mat[xx, yy] == 0)
                    {
                        //이미 방문한 길인 경우 pass
                        if (visited[xx, yy, temp.k])
                        {
                            continue;
                        }

                        q.Enqueue(new pos(xx, yy, temp.d + 1, temp.k));
                        visited[xx, yy, temp.k] = true;
                    }
                    else
                    {
                        // 벽을 부술 수 없거나, 이미 왔던 길일 경우 pass
                        if (temp.k != 0 || visited[xx, yy, temp.k + 1])
                        {
                            continue;
                        }
                        // 벽을 부술 수 있다면 부수고 이동
                        q.Enqueue(new pos(xx, yy, temp.d + 1, temp.k + 1));
                        visited[xx, yy, temp.k + 1] = true;
                    }
                }
            }

            return(-1);
        }
        protected pos DownOne()
        {
            var retVal = erroneousTuple;

            if (AllowExecution())
            {
                if (position.Item2 > 0 && state.ColorOfField(position.Item1, position.Item2 - 1) != team)
                {
                    retVal = new pos(position.Item1, (byte)(position.Item2 - 1));
                }
            }
            return(retVal);
        }
        protected pos SouthEastOne()
        {
            var retVal = erroneousTuple;

            if (AllowExecution() && (position.Item1 < xwidth - 1 && position.Item2 > 0))
            {
                if (state.ColorOfField(position.Item1 + 1, position.Item2 - 1) != team)
                {
                    retVal = new pos((byte)(position.Item1 + 1), (byte)(position.Item2 - 1));
                }
            }
            return(retVal);
        }
        protected pos LeftOne()
        {
            var retVal = erroneousTuple;

            if (AllowExecution())
            {
                if (position.Item1 > 0 && state.ColorOfField(position.Item1 - 1, position.Item2) != team)
                {
                    retVal = new pos((byte)(position.Item1 - 1), position.Item2);
                }
            }
            return(retVal);
        }
Exemple #20
0
    //単に矢印操作する系
    private bool SimpleAllowControl(ConsoleKey k)
    {
        pos diff = k switch {
            ConsoleKey.UpArrow => pos.From(0, -1),
            ConsoleKey.DownArrow => pos.From(0, 1),
            ConsoleKey.LeftArrow => pos.From(-1, 0),
            ConsoleKey.RightArrow => pos.From(1, 0),
            _ => pos.From(0, 0),
        };

        this.cursor += diff;
        return(true);
    }
        protected pos NorthWestOne()
        {
            var retVal = erroneousTuple;

            if (AllowExecution() && (position.Item1 > 0 && position.Item2 < ywidth - 1))
            {
                if (state.ColorOfField(position.Item1 - 1, position.Item2 + 1) != team)
                {
                    retVal = new pos((byte)(position.Item1 - 1), (byte)(position.Item2 + 1));
                }
            }
            return(retVal);
        }
Exemple #22
0
    protected override void ComputeVelocity()
    {
        if (start)
        {
            if (!drag)
            {
                if (data.x != 0 || data.y != 0)
                {
                    origin = data;
                    drag   = true;
                }
            }
            else
            {
                if (data.y < 200)
                {
                    if (data.y - origin.y > y_thres)
                    {
                        if (grounded)
                        {
                            velocity.y = jumpTakeOffSpeed;
                        }
                    }
                    else if (!grounded && velocity.y > 0)
                    {
                        velocity.y = velocity.y * 0.5f;
                    }                                                                         //Jump and hold
                }

                if (data.x - origin.x < -x_thres)
                {
                    velocity.x = speed;     //RIGHT
                }
                if (data.x - origin.x > x_thres)
                {
                    velocity.x = -speed;    //LEFT
                }
            }
        }

        bool flipSprite = (spriteRenderer.flipX ? (velocity.x > 0.01f) : (velocity.x < -0.01f));

        if (flipSprite)
        {
            spriteRenderer.flipX = !spriteRenderer.flipX;
        }

        animator.SetBool("grounded", grounded);
        animator.SetFloat("velocityX", Mathf.Abs(velocity.x) / speed);
    }
Exemple #23
0
        static void f**k(object data)
        {
            pos   para = (pos)data;
            int   cnt  = 0;
            int   now  = 0;
            crack fk   = new crack();

            for (int i = para.from; i <= para.to;)
            {
                if (ans != 0)
                {
                    break;
                }
                Thread.Sleep(delay);
                fk.init(para.url);
                int res = fk.trypwd(hash.Hash2Str(i));
                //Console.WriteLine("线程" + para.num + ":" + i + " " + hash.Hash2Str(i) + " " + res);
                if (res == -1)
                {
                    Console.WriteLine("线程" + para.num + ":网络错误!重试中……");
                }
                else if (res == 0)
                {
                    ++i;
                    if ((int)(((double)(i - para.from + 1) / (para.to - para.from + 1)) * 100) - now > 10)
                    {
                        now = (int)(((double)(i - para.from + 1) / (para.to - para.from + 1)) * 100);
                        if (now > 100)
                        {
                            now = 100;
                        }
                        Console.WriteLine("线程" + para.num + ":" + now + "%");
                    }
                }
                else
                {
                    ans = i;
                    using (StreamWriter sw = new StreamWriter("pwd.txt"))
                        sw.WriteLine(hash.Hash2Str(ans));
                    break;
                }
                ++cnt;
                if (cnt == 3)
                {
                    fk  = new crack();
                    cnt = 0;
                }
            }
            Console.WriteLine("线程" + para.num + "退出...");
        }
Exemple #24
0
        internal override void BeginFigure(double x, double y, double? z)
        {
            var coords=new List<double>(new double[] { x, y });
            if (z.HasValue)
            {
                srsDimension=3;
                coords.Add(z.Value);
            }

            pos=new pos();
            pos.Untyped.Value=string.Join(
                " ",
                coords.Select<double, string>(d => d.ToString(CultureInfo.InvariantCulture))
            );
        }
    public void OnUpdate()
    {
        if (_playerCurrentWP.next != null)
        {
            var dirToNextWP = _playerCurrentWP.next.transform.position - _playerCurrentWP.transform.position;

            //saco un vector perpendicular a la direccion del current al next y el up del mundo
            var cross = Vector3.Cross(dirToNextWP, Vector3.up);

            //saco un punto para el current y el next sobre el vector cross en el cual el player esta parado y sacamos de la ecuacion el eje Y
            var nearestPointOnLineCurrent = NearestPointOnLine(cross, _objToLookAtDollyPath.position, _playerCurrentWP.transform.position);
            nearestPointOnLineCurrent.y = 0f;
            var nearestPointOnLineNext = NearestPointOnLine(cross, _objToLookAtDollyPath.position, _playerCurrentWP.next.transform.position);
            nearestPointOnLineNext.y = 0f;

            //saco la distancia entre el current y el next
            var _fullDistanceBetweenCurrentAndNext = Vector3.Distance(nearestPointOnLineCurrent, nearestPointOnLineNext);
            //sacamos aca tambien de la ecuacion el eje Y
            var posPlayerWhitowY = new Vector3(_objToLookAtDollyPath.position.x, 0f, _objToLookAtDollyPath.position.z);
            //saco la distancia entre el player y el punto sobre el current waypoint y no la normalizo
            var distanceNoNormalized = Vector3.Distance(nearestPointOnLineCurrent, posPlayerWhitowY);

            //normalizo la distancia recorrida para que me de un numero entre 0 y 1
            _currentProgressBetweenCurrentAndNext = distanceNoNormalized / _fullDistanceBetweenCurrentAndNext;

            //seteo cual va a ser el punto a mirar sobre la linea de waypoints del player(NO DE LA CAMARA)


            if (aheadOrBehindCurrent == pos.Ahead)
            {
                lookAtTarget = _playerCurrentWP.transform.position + dirToNextWP.normalized * distanceNoNormalized;
            }

            //me fijo de que lado del waypoint esta si delante o detras
            aheadOrBehindCurrent = AngleDir(cross, _playerCurrentWP.transform.position - _objToLookAtDollyPath.transform.position, Vector3.up);
            aheadOrBehindNext    = AngleDir(cross, _playerCurrentWP.next.transform.position - _objToLookAtDollyPath.transform.position, Vector3.up);
        }
        else
        {
            //saco la direccion para atras y pregunto si es null para poder hacer el camino hacia atras
            if (_playerCurrentWP.prev != null)
            {
                var dirToPrevWP = _playerCurrentWP.prev.transform.position - _playerCurrentWP.transform.position;
                var cross       = Vector3.Cross(dirToPrevWP, Vector3.up);
                aheadOrBehindCurrent = AngleDir(cross, _playerCurrentWP.transform.position - _objToLookAtDollyPath.transform.position, Vector3.up);
            }
        }
    }
    static void MoveV(string[,] arr, pos from, pos to)
    {
        int delta = to.row - from.row;
        int mov   = Math.Sign(delta);

        for (int row = from.row, i = 0; i < Math.Abs(delta); row += mov, i++)
        {
            Swap(arr, new pos()
            {
                row = row, col = from.col
            }, new pos()
            {
                row = row + mov, col = from.col
            });
        }
    }
Exemple #27
0
    public pos GetTouch(int ID)
    {
        pos tempPos = new pos();

        tempPos.position = Input.mousePosition;

        if(Input.GetMouseButtonDown(ID))
            tempPos.phase = iPhoneTouchPhase.Began;
        else if(Input.GetMouseButton(ID))
            tempPos.phase = iPhoneTouchPhase.Moved;

        if(Input.GetMouseButtonUp(ID))
            tempPos.phase = iPhoneTouchPhase.Ended;

        return tempPos;
    }
Exemple #28
0
        internal override void BeginFigure(double x, double y, double?z)
        {
            var coords = new List <double>(new double[] { x, y });

            if (z.HasValue)
            {
                srsDimension = 3;
                coords.Add(z.Value);
            }

            pos = new pos();
            pos.Untyped.Value = string.Join(
                " ",
                coords.Select <double, string>(d => d.ToString(CultureInfo.InvariantCulture))
                );
        }
Exemple #29
0
 protected void SecondThread()
 {
     start = false;
     spSet();
     spConf();
     spRecal();
     spStart();
     start = true;
     while (!end)
     {
         data = Receive();
     }
     start = false;
     spStop();
     next = true;
 }
Exemple #30
0
    // Moves an item horizonataly.
    static void MoveH(string[,] arr, pos from, pos to)
    {
        int delta = to.col - from.col;
        int mov   = Math.Sign(delta);

        for (int col = from.col, i = 0; i < Math.Abs(delta); col += mov, i++)
        {
            Swap(arr, new pos()
            {
                row = to.row, col = col
            }, new pos()
            {
                row = to.row, col = col + mov
            });
        }
    }
 static void Move(string[,] arr, pos from, pos to)
 {
     MoveV(arr, new pos()
     {
         row = 2, col = 1
     }, new pos()
     {
         row = 0, col = 3
     });
     MoveH(arr, new pos()
     {
         row = 2, col = 1
     }, new pos()
     {
         row = 0, col = 3
     });
 }
        /// <summary>
        /// Returns null if could not be converted.
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public static string InternalToConsoleOutput(pos from, pos to, FigID figID)
        {
            try
            {
                var xFrom           = char.ToLower((char)(from.Item1 + 65));
                var yFrom           = (from.Item2 + 1).ToString();
                var xTo             = char.ToLower((char)(to.Item1 + 65));
                var yTo             = (to.Item2 + 1).ToString();
                var outputShorthand = Constants.BlackIDToShorthand[figID];

                return(outputShorthand + xFrom + yFrom + "," + xTo + yTo);
            }
            catch
            {
                return(null);
            }
        }
Exemple #33
0
    //Este cambio es para una matriz en general
    bool cambio(pos x, ref pieza[,] matriz, ref pieza Hueco)
    {
        int  valor;
        bool cambiado = false;

        if (dameCasilla(x, matriz, Hueco, out valor))
        {
            switch (x)
            {
            case pos.arriba:

                Hueco.SetIJ(Hueco.i - 1, Hueco.j);
                matriz[Hueco.i, Hueco.j].valor     = Hueco.valor;
                matriz[Hueco.i + 1, Hueco.j].valor = valor;

                break;

            case pos.abajo:
                Hueco.SetIJ(Hueco.i + 1, Hueco.j);
                matriz[Hueco.i, Hueco.j].valor     = Hueco.valor;
                matriz[Hueco.i - 1, Hueco.j].valor = valor;


                break;

            case pos.izquierda:
                Hueco.SetIJ(Hueco.i, Hueco.j - 1);
                matriz[Hueco.i, Hueco.j].valor     = Hueco.valor;
                matriz[Hueco.i, Hueco.j + 1].valor = valor;
                cambiado = true;
                break;

            case pos.derecha:

                Hueco.SetIJ(Hueco.i, Hueco.j + 1);
                matriz[Hueco.i, Hueco.j].valor     = Hueco.valor;
                matriz[Hueco.i, Hueco.j - 1].valor = valor;
                break;
            }
            cambiado = true;
        }
        //Método que ilustra el cambio

        return(cambiado);
    }
Exemple #34
0
        public long Part1()
        {
            int horizontal            = 0;
            int vertical              = 0;
            Dictionary <pos, int> map = new Dictionary <pos, int>();

            map.Add(new pos(0, 0), 1);

            foreach (var move in input)
            {
                int count = 0;
                switch (move)
                {
                case '>':
                    horizontal++;
                    break;

                case '<':
                    horizontal--;
                    break;

                case '^':
                    vertical++;
                    break;

                case 'v':
                    vertical--;
                    break;
                }
                var key    = new pos(horizontal, vertical);
                var exists = map.TryGetValue(key, out count);
                count++;
                if (exists)
                {
                    map[key] = count;
                }
                else
                {
                    map.Add(key, count);
                }
            }

            return(map.Count());
        }
Exemple #35
0
    // Moves an item verticaly.
    static void MoveV(string[,] arr, pos from, pos to)
    {
        // Gets the distance to move.
        int delta = to.row - from.row;
        // Gets the direction of the movement (+ or -)
        int mov = Math.Sign(delta);

        // Moves an item.
        for (int row = from.row, i = 0; i < Math.Abs(delta); row += mov, i++)
        {
            Swap(arr, new pos()
            {
                row = row, col = from.col
            }, new pos()
            {
                row = row + mov, col = from.col
            });
        }
    }
Exemple #36
0
    //Synchronous receive dataflow and return the pos value to the Update Threaing
    static pos Receive()
    {
        pos rec = new pos()
        {
            x = 0, y = 0
        };

        for (int i = 0; i < 20; i++)
        {
            int recvv = sp.ReadByte();

            if (i == 14)
            {
                rec.x = recvv;
            }
            if (i == 15 && recvv == 255)
            {
                rec.x = rec.x - 255;
            }
            if (i == 16)
            {
                rec.y = recvv;
            }
            if (i == 17 && recvv == 254)
            {
                rec.y = rec.y - 255;
            }
        }

        if (rec.x == 0 && rec.y == 0)
        {
            drag   = false;
            origin = rec;
        }



        return(rec);
    }
Exemple #37
0
 public static Actor GetActor(pos p)
 {
     return GetActor(p.row,p.col);
 }
        // line = 151, colunm = 110
        public void AnimeSPrite(ref KeyboardState keyboard)
        {
            if (vie > 0)
            {
                if (keyboard.IsKeyDown(Keys.Left)) //court vers la gauche
                {
                    this.Effects = SpriteEffects.FlipHorizontally;
                    dir = true;
                    if (!in_air)
                    {
                        current = walk;
                    }
                    else
                        if (keyboard.IsKeyUp(Keys.Space)) //phase descendante
                        {
                            current = fall;
                        }
                        else                              //phase ascendante
                        {
                            current = jump;
                        }
                }
                else if (keyboard.IsKeyDown(Keys.Right)) //court vers la droite
                {
                    dir = false;
                    this.Effects = SpriteEffects.None;
                    if (!in_air)
                    {
                        current = walk;
                    }
                    else
                        if (keyboard.IsKeyUp(Keys.Space)) //phase descendante
                        {
                            current = fall;
                        }
                        else                              //phase ascendante
                        {
                            current = jump;
                        }
                }
                else if (keyboard.IsKeyDown(Keys.X)) //attaque
                {
                    current = atk;
                }
                else if (keyboard.IsKeyUp(Keys.Space) && chute ^ jump_off) //saut phase descendante
                {
                    current = fall;
                }
                else
                    if (!in_air)
                    {
                        current = walk;
                    }
                    else
                        if (keyboard.IsKeyUp(Keys.Space)) //phase descendante
                        {
                            current = fall;
                        }
                        else                              //phase ascendante
                        {
                            current = jump;
                        }

                if ((keyboard.IsKeyUp(Keys.Left) && keyboard.IsKeyUp(Keys.Right) && keyboard.IsKeyUp(Keys.X) && !in_air) ||
                (keyboard.IsKeyDown(Keys.Left) && keyboard.IsKeyDown(Keys.Right))) //cas ou aucune touche n est appuyée ou touche gauche et droite ensemble : ne fais rien
                {
                    current = idle;
                }
                if (current.lstart != last.lstart || current.cstart != last.cstart || current.cend != last.cend)
                {
                    FrameColumn = current.cstart;
                    FrameLine = current.lstart;
                }
                Animated();
            }
            else
            {
                if (timer_dead == 199)
                {
                    FrameColumn = die.cstart;
                    FrameLine = die.lstart ;
                }
                if (FrameColumn != die.cend  && this.Timer == this.AnimationSpeed)
                {
                    this.Timer = 0;
                    this.FrameColumn++;
                }
                this.Timer++;
            }
            last = current;
        }
 void MouseMoveHandler(object sender,MouseMoveEventArgs args)
 {
     if(MouseUI.IgnoreMouseMovement){
         return;
     }
     int row;
     int col;
     if(FullScreen){
         row = (int)(args.Y - ClientRectangle.Height * ((1.0f - screen_multiplier_h)*0.5f)) / cell_h; //todo: give this its own var?
         col = (int)(args.X - ClientRectangle.Width * ((1.0f - screen_multiplier_w)*0.5f)) / cell_w;
     }
     else{
         row = args.Y / cell_h;
         col = args.X / cell_w;
     }
     switch(MouseUI.Mode){
     case MouseMode.Targeting:
     {
         int map_row = row - Global.MAP_OFFSET_ROWS;
         int map_col = col - Global.MAP_OFFSET_COLS;
         Button b = MouseUI.GetButton(row,col);
         if(MouseUI.Highlighted != null && MouseUI.Highlighted != b){
             MouseUI.RemoveHighlight();
         }
         if(args.XDelta == 0 && args.YDelta == 0){
             return; //don't re-highlight immediately after a click
         }
         if(b != null){
             if(b != MouseUI.Highlighted){
                 MouseUI.Highlighted = b;
                 colorchar[,] array = new colorchar[b.height,b.width];
                 for(int i=0;i<b.height;++i){
                     for(int j=0;j<b.width;++j){
                         array[i,j] = Screen.Char(i + b.row,j + b.col);
                         array[i,j].bgcolor = Color.Blue;
                     }
                 }
                 Screen.UpdateGLBuffer(b.row,b.col,array);
             }
         }
         else{
             if(!Input.KeyPressed){
                 if(!MouseUI.mouselook_objects.BoundsCheck(row,col)){
                     //UI.MapCursor = new pos(-1,-1);
                     Input.KeyPressed = true;
                     ConsoleKey key = ConsoleKey.F22;
                     Input.LastKey = new ConsoleKeyInfo(Input.GetChar(key,false),key,false,false,false);
                 }
                 else{
                     if(map_row >= 0 && map_row < Global.ROWS && map_col >= 0 && map_col < Global.COLS){
                         if(map_row != UI.MapCursor.row || map_col != UI.MapCursor.col){
                             UI.MapCursor = new pos(map_row,map_col);
                             Input.KeyPressed = true;
                             ConsoleKey key = ConsoleKey.F21;
                             Input.LastKey = new ConsoleKeyInfo(Input.GetChar(key,false),key,false,false,false);
                         }
                     }
                     else{
                         PhysicalObject o = MouseUI.mouselook_objects[row,col];
                         if(o != null){
                             if(!o.p.Equals(UI.MapCursor)){
                                 UI.SetMapCursor(o.p,map_col < 0);
                                 Input.KeyPressed = true;
                                 ConsoleKey key = ConsoleKey.F21;
                                 Input.LastKey = new ConsoleKeyInfo(Input.GetChar(key,false),key,false,false,false);
                             }
                         }
                         else{ // off the map, and not hovering over a status bar object
                             if(map_row != UI.MapCursor.row || map_col != UI.MapCursor.col){
                                 //UI.MapCursor = new pos(map_row,map_col);
                                 Input.KeyPressed = true;
                                 ConsoleKey key = ConsoleKey.F22;
                                 Input.LastKey = new ConsoleKeyInfo(Input.GetChar(key,false),key,false,false,false);
                             }
                         }
                     }
                 }
             }
             /*if(!Input.KeyPressed && (map_row != UI.MapCursor.row || map_col != UI.MapCursor.col) && !KeyIsDown(Key.LControl) && !KeyIsDown(Key.RControl)){
                 UI.MapCursor = new pos(map_row,map_col);
                 Input.KeyPressed = true;
                 if(map_row >= 0 && map_row < Global.ROWS && map_col >= 0 && map_col < Global.COLS){
                     ConsoleKey key = ConsoleKey.F21;
                     Input.LastKey = new ConsoleKeyInfo(Input.GetChar(key,false),key,false,false,false);
                 }
                 else{
                     ConsoleKey key = ConsoleKey.F22;
                     Input.LastKey = new ConsoleKeyInfo(Input.GetChar(key,false),key,false,false,false);
                 }
             }*/
         }
         break;
     }
     case MouseMode.Directional:
     {
         int map_row = row - Global.MAP_OFFSET_ROWS;
         int map_col = col - Global.MAP_OFFSET_COLS;
         if(map_row >= 0 && map_row < Global.ROWS && map_col >= 0 && map_col < Global.COLS){
             int dir = Actor.player.DirectionOf(new pos(map_row,map_col));
             pos p = Actor.player.p.PosInDir(dir);
             Button dir_b = MouseUI.GetButton(Global.MAP_OFFSET_ROWS + p.row,Global.MAP_OFFSET_COLS + p.col);
             if(MouseUI.Highlighted != null && MouseUI.Highlighted != dir_b){
                 MouseUI.RemoveHighlight();
             }
             if(dir_b != null && dir_b != MouseUI.Highlighted){
                 MouseUI.Highlighted = dir_b;
                 colorchar[,] array = new colorchar[1,1];
                 array[0,0] = Screen.Char(Global.MAP_OFFSET_ROWS + p.row,Global.MAP_OFFSET_COLS + p.col);
                 array[0,0].bgcolor = Color.Blue;
                 Screen.UpdateGLBuffer(dir_b.row,dir_b.col,array);
             }
         }
         else{
             if(MouseUI.Highlighted != null){
                 MouseUI.RemoveHighlight();
             }
         }
         break;
     }
     default:
     {
         Button b = MouseUI.GetButton(row,col);
         if(MouseUI.Highlighted != null && MouseUI.Highlighted != b){
             MouseUI.RemoveHighlight();
         }
         if(args.XDelta == 0 && args.YDelta == 0){
             return; //don't re-highlight immediately after a click
         }
         if(b != null && b != MouseUI.Highlighted){
             MouseUI.Highlighted = b;
             colorchar[,] array = new colorchar[b.height,b.width];
             for(int i=0;i<b.height;++i){
                 for(int j=0;j<b.width;++j){
                     array[i,j] = Screen.Char(i + b.row,j + b.col);
                     array[i,j].bgcolor = Color.Blue;
                 }
             }
             Screen.UpdateGLBuffer(b.row,b.col,array);
         }
         else{
             if(MouseUI.Mode == MouseMode.Map){
                 if(!MouseUI.mouselook_objects.BoundsCheck(row,col)){
                     UI.MapCursor = new pos(-1,-1);
                     break;
                 }
                 PhysicalObject o = MouseUI.mouselook_objects[row,col];
                 int map_row = row - Global.MAP_OFFSET_ROWS;
                 int map_col = col - Global.MAP_OFFSET_COLS;
                 if(MouseUI.VisiblePath && o == null){
                     if(map_row >= 0 && map_row < Global.ROWS && map_col >= 0 && map_col < Global.COLS){
                         o = Actor.M.tile[map_row,map_col];
                     }
                 }
                 if(MouseUI.mouselook_current_target != null && (o == null || !o.p.Equals(MouseUI.mouselook_current_target.p))){
                     MouseUI.RemoveMouseover();
                 }
                 if(o == null){
                     UI.MapCursor = new pos(-1,-1);
                 }
                 else{
                     if(MouseUI.mouselook_current_target == null || !o.p.Equals(MouseUI.mouselook_current_target.p)){
                         UI.SetMapCursor(o.p,map_col < 0);
                         MouseUI.mouselook_current_target = o;
                         bool description_on_right = false;
                         int max_length = MouseUI.MaxDescriptionBoxLength;
                         if(o.col <= 32){
                             description_on_right = true;
                         }
                         List<colorstring> desc_box = null;
                         Actor a = o as Actor;
                         if(a != null){
                             desc_box = Actor.MonsterDescriptionBox(a,true,max_length);
                         }
                         else{
                             Item i = o as Item;
                             if(i != null){
                                 desc_box = UI.ItemDescriptionBox(i,true,true,max_length);
                             }
                         }
                         if(desc_box != null){
                             int h = desc_box.Count;
                             int w = desc_box[0].Length();
                             MouseUI.mouselook_current_desc_area = new System.Drawing.Rectangle(description_on_right? Global.COLS - w : 0,0,w,h);
                             int player_r = Actor.player.row;
                             int player_c = Actor.player.col;
                             colorchar[,] array = new colorchar[h,w];
                             if(description_on_right){
                                 for(int i=0;i<h;++i){
                                     for(int j=0;j<w;++j){
                                         array[i,j] = desc_box[i][j];
                                         if(i == player_r && j + Global.COLS - w == player_c){
                                             Screen.CursorVisible = false;
                                             player_r = -1; //to prevent further attempts to set CV to false
                                         }
                                     }
                                 }
                                 Screen.UpdateGLBuffer(Global.MAP_OFFSET_ROWS,Global.MAP_OFFSET_COLS + Global.COLS - w,array);
                             }
                             else{
                                 for(int i=0;i<h;++i){
                                     for(int j=0;j<w;++j){
                                         array[i,j] = desc_box[i][j];
                                         if(i == player_r && j == player_c){
                                             Screen.CursorVisible = false;
                                             player_r = -1;
                                         }
                                     }
                                 }
                                 Screen.UpdateGLBuffer(Global.MAP_OFFSET_ROWS,Global.MAP_OFFSET_COLS,array);
                             }
                         }
                         if(MouseUI.VisiblePath){
                             if(o != Actor.player && o.p.Equals(Actor.player.p)){
                                 MouseUI.mouse_path = new List<pos>{o.p};
                             }
                             else{
                                 MouseUI.mouse_path = Actor.player.GetPlayerTravelPath(o.p);
                                 if(MouseUI.mouse_path.Count == 0){
                                     foreach(Tile t in Actor.M.TilesByDistance(o.row,o.col,true,true)){
                                         if(t.passable){
                                             MouseUI.mouse_path = Actor.player.GetPlayerTravelPath(t.p);
                                             break;
                                         }
                                     }
                                 }
                             }
                             pos box_start = new pos(0,0);
                             int box_h = -1;
                             int box_w = -1;
                             if(desc_box != null){
                                 box_h = desc_box.Count;
                                 box_w = desc_box[0].Length();
                                 if(description_on_right){
                                     box_start = new pos(0,Global.COLS - box_w);
                                 }
                             }
                             foreach(pos p in MouseUI.mouse_path){
                                 if(desc_box != null && p.row < box_start.row + box_h && p.row >= box_start.row && p.col < box_start.col + box_w && p.col >= box_start.col){
                                     continue;
                                 }
                                 colorchar cch = Screen.MapChar(p.row,p.col);
                                 cch.bgcolor = Color.DarkGreen;
                                 if(cch.color == Color.DarkGreen){
                                     cch.color = Color.Black;
                                 }
                                 //Game.gl.UpdateVertexArray(p.row+Global.MAP_OFFSET_ROWS,p.col+Global.MAP_OFFSET_COLS,text_surface,0,(int)cch.c);
                                 Game.gl.UpdateVertexArray(p.row+Global.MAP_OFFSET_ROWS,p.col+Global.MAP_OFFSET_COLS,text_surface,0,(int)cch.c,cch.color.GetFloatValues(),cch.bgcolor.GetFloatValues());
                             }
                             if(MouseUI.mouse_path != null && MouseUI.mouse_path.Count == 0){
                                 MouseUI.mouse_path = null;
                             }
                         }
                     }
                 }
             }
         }
         break;
     }
     }
 }
 public static void PlaceUnitsByInitiative(List<Actor> units,int corner)
 {
     List<Actor> ordered_units = new List<Actor>(units);
     ordered_units.Sort((f1,f2) => {
         int init_order = f1.initiative.CompareTo(f2.initiative);
         if(init_order == 0){
             return units.IndexOf(f1).CompareTo(units.IndexOf(f2)); //lower index in 'units', lower index in this list.
         }
         return -init_order; //lower initiative, higher index in this list.
     });
     int placement_n = 0;
     int p_row = 0;
     while(ordered_units.Count > 0){
         Actor ac = ordered_units.RemoveLast();
         pos p = new pos(p_row,placement_n - p_row).Rotate(corner);
         M.actor[p] = ac;
         ac.p = p;
         ++p_row;
         if(p_row > placement_n){
             ++placement_n;
             p_row = 0;
         }
     }
 }
Exemple #41
0
 public static void SetMapCursor(pos p,bool from_status_bar)
 {
     if(!internal_map_cursor.Equals(p)){
         internal_map_cursor = p;
         status_hover = from_status_bar;
         DisplayStatusBarObjects();
     }
 }
Exemple #42
0
 public static void ChangeMapOffset(int dx,int dy)
 {
     map_offset = new pos(map_offset.row + dy,map_offset.col + dx);
     G.terrain.SetOffsetInPixels(map_offset.col + 7,map_offset.row + 40);
     G.undead.SetOffsetInPixels(map_offset.col + 11,map_offset.row - 21);
     G.living.SetOffsetInPixels(map_offset.col + 11,map_offset.row - 21);
     foreach(IMouseTarget t in dragged_objects){
         t.Move(dx,dy);
     }
 }
Exemple #43
0
 public Tile(TileType type_,string name_,char symbol_,Color color_,bool passable_,bool opaque_,TileType? toggles_into_)
 {
     type = type_;
     name = name_;
     the_name = "the " + name;
     switch(name[0]){
     case 'a':
     case 'e':
     case 'i':
     case 'o':
     case 'u':
     case 'A':
     case 'E':
     case 'I':
     case 'O':
     case 'U':
         a_name = "an " + name;
         break;
     default:
         a_name = "a " + name;
         break;
     }
     symbol = symbol_;
     color = color_;
     passable = passable_;
     opaque = opaque_;
     seen = false;
     solid_rock = false;
     revealed_by_light = false;
     if(Is(TileType.STAIRS,TileType.CHEST,TileType.FIREPIT,TileType.POOL_OF_RESTORATION)){
         revealed_by_light = true;
     }
     light_value = 0;
     toggles_into = toggles_into_;
     inv = null;
     light_radius = 0;
     direction_exited = 0;
     if(type >= TileType.COMBAT_SHRINE && type <= TileType.STEALTH_SHRINE){
         int diff = type - TileType.COMBAT_SHRINE;
         sprite_offset = new pos(11,diff);
     }
     else{
         if(type >= TileType.FIRE_TRAP && type <= TileType.STONE_RAIN_TRAP){
             int diff = type - TileType.FIRE_TRAP;
             sprite_offset = new pos(14 + diff/16,diff%16);
         }
         else{
             if(passable){
                 sprite_offset = new pos(8,0);
             }
             else{
                 sprite_offset = new pos(0,0);
             }
             switch(type){
             case TileType.BARREL:
                 sprite_offset = new pos(12,14);
                 break;
             case TileType.BLAST_FUNGUS:
                 sprite_offset = new pos(12,5);
                 break;
             case TileType.BREACHED_WALL:
                 sprite_offset = new pos(9,0);
                 break;
             case TileType.BRUSH:
                 sprite_offset = new pos(12,0);
                 break;
             case TileType.CHASM:
                 sprite_offset = new pos(11,14);
                 break;
             case TileType.CHEST:
                 sprite_offset = new pos(10,4);
                 break;
             case TileType.CRACKED_WALL:
                 sprite_offset = new pos(0,1);
                 break;
             case TileType.DEMONIC_IDOL:
                 sprite_offset = new pos(13,1);
                 break;
             case TileType.DOOR_C:
                 sprite_offset = new pos(10,0);
                 break;
             case TileType.DOOR_O:
                 sprite_offset = new pos(10,2);
                 break;
             case TileType.FIRE_GEYSER:
                 sprite_offset = new pos(11,8);
                 break;
             case TileType.FIREPIT:
                 sprite_offset = new pos(10,12);
                 break;
             case TileType.FLOOR:
                 sprite_offset = new pos(8,0);
                 break;
             case TileType.FOG_VENT:
                 sprite_offset = new pos(11,9);
                 break;
             case TileType.GLOWING_FUNGUS:
                 sprite_offset = new pos(12,10);
                 break;
             case TileType.GRAVE_DIRT:
                 sprite_offset = new pos(12,13);
                 break;
             case TileType.GRAVEL:
                 sprite_offset = new pos(10,15);
                 break;
             case TileType.ICE:
                 sprite_offset = new pos(11,11);
                 break;
             case TileType.JUNGLE:
                 sprite_offset = new pos(0,0); //unused
                 break;
             case TileType.POISON_BULB:
                 sprite_offset = new pos(13,0);
                 break;
             case TileType.POISON_GAS_VENT:
                 sprite_offset = new pos(11,10);
                 break;
             case TileType.POOL_OF_RESTORATION:
                 sprite_offset = new pos(13,5);
                 break;
             case TileType.POPPY_FIELD:
                 sprite_offset = new pos(12,4);
                 break;
             case TileType.RUBBLE:
                 sprite_offset = new pos(10,14);
                 break;
             case TileType.STAIRS:
                 sprite_offset = new pos(13,6);
                 break;
             case TileType.STALAGMITE:
                 sprite_offset = new pos(10,13);
                 break;
             case TileType.STANDING_TORCH:
                 sprite_offset = new pos(12,15);
                 break;
             case TileType.STATUE:
                 sprite_offset = new pos(10,8);
                 break;
             case TileType.STONE_SLAB:
                 sprite_offset = new pos(11,12);
                 break;
             case TileType.TOMBSTONE:
                 sprite_offset = new pos(12,12);
                 break;
             case TileType.VINE:
                 sprite_offset = new pos(0,8);
                 break;
             case TileType.WALL:
             case TileType.HIDDEN_DOOR:
                 sprite_offset = new pos(0,0);
                 break;
             case TileType.WATER:
                 sprite_offset = new pos(0,4);
                 break;
             case TileType.WAX_WALL:
                 sprite_offset = new pos(0,12);
                 break;
             }
         }
     }
 }
Exemple #44
0
 public static Actor ActorFromDrawingPosition(pos drawing_position)
 {
     return ActorFromDrawingPosition(drawing_position.row,drawing_position.col);
 }
 public int EstimatedEuclideanDistanceFromX10(pos p)
 {
     return EstimatedEuclideanDistanceFromX10(p.row,p.col);
 }
 public int DistanceFrom(pos p)
 {
     return DistanceFrom(p.row,p.col);
 }
Exemple #47
0
 public static bool BoundsCheck(pos p,bool disallow_map_edges = false)
 {
     return BoundsCheck(p.row,p.col,disallow_map_edges);
 }
 public void AlterRooms(int no_change_freq,int add_pillars_freq,int cross_room_freq,int cave_widen_freq,int cave_fill_freq)
 {
     List<int> modification = new List<int>();
     for(int i=0;i<no_change_freq;++i){
         modification.Add(0);
     }
     for(int i=0;i<add_pillars_freq;++i){
         modification.Add(1);
     }
     for(int i=0;i<cross_room_freq;++i){
         modification.Add(2);
     }
     for(int i=0;i<cave_widen_freq;++i){
         modification.Add(3);
     }
     for(int i=0;i<cave_fill_freq;++i){
         modification.Add(4);
     }
     if(modification.Count == 0){
         return;
     }
     ForEachRectangularRoom((start_r,start_c,end_r,end_c) => {
         int mod = modification.Random();
         switch(mod){
         case 0:
             return true;
         case 1:
         {
             int height = end_r - start_r + 1;
             int width = end_c - start_c + 1;
             if(height > 3 || width > 3){
                 List<PillarArrangement> layouts = new List<PillarArrangement>();
                 if(height % 2 == 1 && width % 2 == 1){
                     layouts.Add(PillarArrangement.Single);
                 }
                 if((height % 2 == 1 || width % 2 == 1) && height != 4 && width != 4){
                     layouts.Add(PillarArrangement.Row);
                 }
                 if(height >= 5 && width >= 5){
                     layouts.Add(PillarArrangement.Corners);
                 }
                 if(height > 2 && width > 2 && height != 4 && width != 4){
                     layouts.Add(PillarArrangement.Full);
                 }
                 if((width % 2 == 1 && width >= 5) || (height % 2 == 1 && height >= 5)){
                     layouts.Add(PillarArrangement.StatueEdges);
                 }
                 if(layouts.Count == 0 || CoinFlip()){ //otherwise they're too common
                     layouts.Add(PillarArrangement.StatueCorners);
                 }
                 if(layouts.Count > 0){
                     CellType pillar = CellType.Pillar;
                     switch(layouts.Random()){
                     case PillarArrangement.Single:
                         map[(start_r + end_r)/2,(start_c + end_c)/2] = pillar;
                         break;
                     case PillarArrangement.Row:
                     {
                         bool vertical;
                         if(width % 2 == 1 && height % 2 == 0){
                             vertical = true;
                         }
                         else{
                             if(height % 2 == 1 && width % 2 == 0){
                                 vertical = false;
                             }
                             else{
                                 vertical = CoinFlip();
                             }
                         }
                         if(vertical){
                             if(height % 2 == 1){
                                 for(int i=start_r+1;i<=end_r-1;i+=2){
                                     map[i,(start_c + end_c)/2] = pillar;
                                 }
                             }
                             else{
                                 int offset = 0;
                                 if(height % 4 == 0){
                                     offset = Roll(2) - 1;
                                 }
                                 for(int i=start_r+1+offset;i<(start_r + end_r)/2;i+=2){
                                     map[i,(start_c + end_c)/2] = pillar;
                                 }
                                 for(int i=end_r-1-offset;i>(start_r + end_r)/2+1;i-=2){
                                     map[i,(start_c + end_c)/2] = pillar;
                                 }
                             }
                         }
                         else{
                             if(width % 2 == 1){
                                 for(int i=start_c+1;i<=end_c-1;i+=2){
                                     map[(start_r + end_r)/2,i] = pillar;
                                 }
                             }
                             else{
                                 int offset = 0;
                                 if(width % 4 == 0){
                                     offset = Roll(2) - 1;
                                 }
                                 for(int i=start_c+1+offset;i<(start_c + end_c)/2;i+=2){
                                     map[(start_r + end_r)/2,i] = pillar;
                                 }
                                 for(int i=end_c-1-offset;i>(start_c + end_c)/2+1;i-=2){
                                     map[(start_r + end_r)/2,i] = pillar;
                                 }
                             }
                         }
                         break;
                     }
                     case PillarArrangement.Corners:
                     {
                         int v_offset = 0;
                         int h_offset = 0;
                         if(height % 4 == 0){
                             v_offset = Roll(2) - 1;
                         }
                         if(width % 4 == 0){
                             h_offset = Roll(2) - 1;
                         }
                         map[start_r + 1 + v_offset,start_c + 1 + h_offset] = pillar;
                         map[start_r + 1 + v_offset,end_c - 1 - h_offset] = pillar;
                         map[end_r - 1 - v_offset,start_c + 1 + h_offset] = pillar;
                         map[end_r - 1 - v_offset,end_c - 1 - h_offset] = pillar;
                         break;
                     }
                     case PillarArrangement.Full:
                     {
                         int v_offset = 0;
                         int h_offset = 0;
                         if(height % 4 == 0){
                             v_offset = Roll(2) - 1;
                         }
                         if(width % 4 == 0){
                             h_offset = Roll(2) - 1;
                         }
                         int half_r = (start_r + end_r)/2;
                         int half_c = (start_c + end_c)/2;
                         int half_r_offset = (start_r + end_r + 1)/2;
                         int half_c_offset = (start_c + end_c + 1)/2;
                         for(int i=start_r+1+v_offset;i<half_r;i+=2){
                             for(int j=start_c+1+h_offset;j<half_c;j+=2){
                                 map[i,j] = pillar;
                             }
                         }
                         for(int i=start_r+1+v_offset;i<half_r;i+=2){
                             for(int j=end_c-1-h_offset;j>half_c_offset;j-=2){
                                 map[i,j] = pillar;
                             }
                         }
                         for(int i=end_r-1-v_offset;i>half_r_offset;i-=2){
                             for(int j=start_c+1+h_offset;j<half_c;j+=2){
                                 map[i,j] = pillar;
                             }
                         }
                         for(int i=end_r-1-v_offset;i>half_r_offset;i-=2){
                             for(int j=end_c-1-h_offset;j>half_c_offset;j-=2){
                                 map[i,j] = pillar;
                             }
                         }
                         if((width+1) % 4 == 0){
                             if(height % 2 == 1){
                                 for(int i=start_r+1;i<=end_r-1;i+=2){
                                     map[i,half_c] = pillar;
                                 }
                             }
                             else{
                                 int offset = 0;
                                 if(height % 4 == 0){
                                     offset = Roll(2) - 1;
                                 }
                                 for(int i=start_r+1+offset;i<half_r;i+=2){
                                     map[i,half_c] = pillar;
                                 }
                                 for(int i=end_r-1-offset;i>half_r_offset;i-=2){
                                     map[i,half_c] = pillar;
                                 }
                             }
                         }
                         if((height+1) % 4 == 0){
                             if(width % 2 == 1){
                                 for(int i=start_c+1;i<=end_c-1;i+=2){
                                     map[half_r,i] = pillar;
                                 }
                             }
                             else{
                                 int offset = 0;
                                 if(width % 4 == 0){
                                     offset = Roll(2) - 1;
                                 }
                                 for(int i=start_c+1+offset;i<half_c;i+=2){
                                     map[half_r,i] = pillar;
                                 }
                                 for(int i=end_c-1-offset;i>half_c_offset;i-=2){
                                     map[half_r,i] = pillar;
                                 }
                             }
                         }
                         break;
                     }
                     case PillarArrangement.StatueCorners:
                         map[start_r,start_c] = CellType.Statue;
                         map[start_r,end_c] = CellType.Statue;
                         map[end_r,start_c] = CellType.Statue;
                         map[end_r,end_c] = CellType.Statue;
                         break;
                     case PillarArrangement.StatueEdges:
                     {
                         map[start_r,start_c] = CellType.Statue;
                         map[start_r,end_c] = CellType.Statue;
                         map[end_r,start_c] = CellType.Statue;
                         map[end_r,end_c] = CellType.Statue;
                         if(width % 2 == 1 && width > 3){
                             int half_c = (start_c + end_c)/2;
                             int corridors = new pos(start_r,half_c).CardinalAdjacentPositions().Where(x => BoundsCheck(x) && map[x].IsCorridorType()).Count;
                             if(corridors == 0){
                                 map[start_r,half_c] = CellType.Statue;
                             }
                             corridors = new pos(end_r,half_c).CardinalAdjacentPositions().Where(x => BoundsCheck(x) && map[x].IsCorridorType()).Count;
                             if(corridors == 0){
                                 map[end_r,half_c] = CellType.Statue;
                             }
                         }
                         if(height % 2 == 1 && height > 3){
                             int half_r = (start_r + end_r)/2;
                             int corridors = new pos(half_r,start_c).CardinalAdjacentPositions().Where(x => BoundsCheck(x) && map[x].IsCorridorType()).Count;
                             if(corridors == 0){
                                 map[half_r,start_c] = CellType.Statue;
                             }
                             corridors = new pos(half_r,end_c).CardinalAdjacentPositions().Where(x => BoundsCheck(x) && map[x].IsCorridorType()).Count;
                             if(corridors == 0){
                                 map[half_r,end_c] = CellType.Statue;
                             }
                         }
                         break;
                     }
                     default:
                         break;
                     }
                 }
             }
             return true;
         }
         case 2:
         {
             int height = end_r - start_r + 1;
             int width = end_c - start_c + 1;
             if(height < 4 || width < 4){ //nothing happens until we get above 4x4
                 return true;
             }
             int rows_to_convert = Roll((height/2)-1);
             int cols_to_convert = Roll((width/2)-1);
             if(rows_to_convert == 1 && cols_to_convert == 1){
                 return true;
             }
             List<pos> blocked = new List<pos>();
             for(int i=start_r;i<=end_r;++i){
                 for(int j=start_c;j<=end_c;++j){
                     if((i < start_r + rows_to_convert || i > end_r - rows_to_convert) && (j < start_c + cols_to_convert || j > end_c - cols_to_convert)){
                         pos p = new pos(i,j);
                         foreach(pos neighbor in p.CardinalAdjacentPositions()){
                             if(map[neighbor].IsCorridorType()){
                                 blocked.Add(p);
                             }
                         }
                         map[i,j] = CellType.Wall;
                     }
                 }
             }
             blocked.Randomize();
             foreach(pos p in blocked){
                 bool done = false;
                 foreach(pos neighbor in p.CardinalAdjacentPositions()){
                     if(map[neighbor].IsRoomType()){
                         map[p] = CellType.RoomInterior;
                         done = true;
                         break;
                     }
                 }
                 if(!done){
                     List<int> valid_dirs = new List<int>();
                     foreach(int dir in U.FourDirections){
                         pos next = p.PosInDir(dir);
                         while(next.row >= start_r && next.row <= end_r && next.col >= start_c && next.col <= end_c){
                             if(next.CardinalAdjacentPositions().Any(x=>map[x].IsRoomType())){
                                 valid_dirs.Add(dir);
                                 break;
                             }
                             next = next.PosInDir(dir);
                         }
                     }
                     int valid_dir = valid_dirs.RandomOrDefault();
                     pos next2 = p.PosInDir(valid_dir);
                     List<pos> new_corridor = new List<pos>{p};
                     while(true){
                         new_corridor.Add(next2);
                         if(next2.CardinalAdjacentPositions().Any(x=>map[x].IsRoomType())){
                             break;
                         }
                         next2 = next2.PosInDir(valid_dir);
                     }
                     foreach(pos p2 in new_corridor){
                         map[p2] = CellType.RoomInterior;
                     }
                 }
             }
             return true;
         }
         case 3:
         {
             List<pos> list = map.PositionsWhere(x=>x.row >= start_r && x.row <= end_r && x.col >= start_c && x.col <= end_c);
             PosArray<CellType> old_map = new PosArray<CellType>(H,W);
             foreach(pos p in list){
                 old_map[p] = map[p];
                 map[p] = CellType.Wall;
             }
             PosArray<bool> rock = new PosArray<bool>(H,W);
             for(int i=0;i<H;++i){
                 for(int j=0;j<W;++j){
                     pos p = new pos(i,j);
                     rock[p] = true;
                     if(BoundsCheck(i,j,false)){
                         foreach(pos neighbor in p.AdjacentPositionsClockwise()){
                             if(map[neighbor] != CellType.Wall){
                                 rock[p] = false;
                                 break;
                             }
                         }
                     }
                 }
             }
             foreach(pos p in list){
                 map[p] = CellType.RoomInterior; //todo: might this step be extraneous?
             }
             List<pos> frontier = new List<pos>();
             {
                 PosArray<bool> in_list = new PosArray<bool>(H,W);
                 foreach(pos p in list){
                     in_list[p] = true;
                 }
                 for(int i=0;i<H;++i){
                     for(int j=0;j<W;++j){
                         pos p = new pos(i,j);
                         if(in_list[p]){
                             foreach(pos neighbor in p.PositionsAtDistance(1,in_list)){
                                 if(!in_list[neighbor]){
                                     frontier.Add(p);
                                     break;
                                 }
                             }
                         }
                     }
                 }
             }
             int fail_counter = 0;
             int num_added = 0;
             bool finished = false;
             while(!finished){
                 if(frontier.Count == 0 || num_added >= 30){ //todo check this value
                     finished = true;
                     break;
                 }
                 pos f = frontier.RemoveRandom();
                 foreach(pos neighbor in f.CardinalAdjacentPositions()){
                     if(!BoundsCheck(neighbor,false) || !rock[neighbor.row,neighbor.col]){
                         ++fail_counter; //this might now be unreachable
                         if(!BoundsCheck(neighbor,false)){
                             fail_counter += 25; //fail quicker when against the edge of the map to prevent ugliness
                         } //however, this doesn't actually fail as quickly as it should - i've overlooked something.
                         if(fail_counter >= 50){
                             finished = true;
                             break;
                         }
                     }
                     else{
                         if(map[neighbor] != CellType.RoomInterior){
                             map[neighbor] = CellType.RoomInterior;
                             ++num_added;
                             bool add_neighbor = true;
                             foreach(pos n2 in neighbor.CardinalAdjacentPositions()){
                                 if(!BoundsCheck(n2,false) || !rock[n2.row,n2.col]){
                                     add_neighbor = false;
                                     ++fail_counter; //this might now be unreachable
                                     if(!BoundsCheck(neighbor,false)){
                                         fail_counter += 25; //fail quicker when against the edge of the map to prevent ugliness
                                     } //however, this doesn't actually fail as quickly as it should - i've overlooked something.
                                     if(fail_counter >= 50){
                                         finished = true;
                                     }
                                     break;
                                 }
                             }
                             if(finished){
                                 break;
                             }
                             if(add_neighbor){
                                 frontier.Add(neighbor);
                             }
                         }
                     }
                 }
             }
             foreach(pos p in list){
                 map[p] = old_map[p];
             }
             return true;
         }
         case 4:
         {
             List<pos> list = map.PositionsWhere(x=>x.row >= start_r && x.row <= end_r && x.col >= start_c && x.col <= end_c);
             Dungeon room = new Dungeon((end_r - start_r) + 3,(end_c - start_c) + 3); //includes borders
             List<pos> map_exits = list.Where(x=>x.CardinalAdjacentPositions().Any(y=>map[y].IsCorridorType())); //grab the positions from list that have any adjacent corridor-type cells
             if(map_exits.Count < 2){
                 return true;
             }
             List<pos> room_exits = new List<pos>();
             foreach(pos exit in map_exits){
                 room_exits.Add(new pos(exit.row-start_r+1,exit.col-start_c+1));
             }
             int tries = 0;
             while(true){
                 room.FillWithRandomWalls(25);
                 room.ApplyCellularAutomataXYRule(3);
                 room.ConnectDiagonals();
                 room.RemoveDeadEndCorridors();
                 room.RemoveUnconnectedAreas();
                 bool exits_open = true;
                 foreach(pos p in room_exits){
                     if(!room[p].IsPassable()){
                         exits_open = false;
                     }
                 }
                 if(exits_open){
                     for(int i=start_r;i<=end_r;++i){
                         for(int j=start_c;j<=end_c;++j){
                             if(list.Contains(new pos(i,j))){
                                 map[i,j] = room[(i-start_r)+1,(j-start_c)+1];
                             }
                         }
                     }
                     break;
                 }
                 ++tries;
                 if(tries > 50){
                     return false;
                 }
             }
             return true;
         }
         default:
             break;
         }
         return true;
     });
 }
 public void AddPillars(int percent_chance_per_room)
 {
     //currently does 50% 'pillar', 25% 'statue', and 25% 'other', where relevant.
     ForEachRectangularRoom((start_r,start_c,end_r,end_c) => {
         if(PercentChance(percent_chance_per_room)){
             int height = end_r - start_r + 1;
             int width = end_c - start_c + 1;
             if(height > 3 || width > 3){
                 List<PillarArrangement> layouts = new List<PillarArrangement>();
                 if(height % 2 == 1 && width % 2 == 1){
                     layouts.Add(PillarArrangement.Single);
                 }
                 if((height % 2 == 1 || width % 2 == 1) && height != 4 && width != 4){
                     layouts.Add(PillarArrangement.Row);
                 }
                 if(height >= 5 && width >= 5){
                     layouts.Add(PillarArrangement.Corners);
                 }
                 if(height > 2 && width > 2 && height != 4 && width != 4){
                     layouts.Add(PillarArrangement.Full);
                 }
                 if((width % 2 == 1 && width >= 5) || (height % 2 == 1 && height >= 5)){
                     layouts.Add(PillarArrangement.StatueEdges);
                 }
                 if(layouts.Count == 0 || CoinFlip()){ //otherwise they're too common
                     layouts.Add(PillarArrangement.StatueCorners);
                 }
                 if(layouts.Count > 0){
                     CellType pillar = CellType.Pillar;
                     /*switch(Roll(4)){ //this part should be done later. Until then, they should remain pillars.
                     case 1:
                     case 2:
                         pillar = CellType.Pillar;
                         break;
                     case 3:
                         pillar = CellType.Statue;
                         break;
                     case 4:
                         pillar = CellType.OtherRoomFeature;
                         break;
                     }*/
                     switch(layouts.Random()){
                     case PillarArrangement.Single:
                         map[(start_r + end_r)/2,(start_c + end_c)/2] = pillar;
                         break;
                     case PillarArrangement.Row:
                     {
                         bool vertical;
                         if(width % 2 == 1 && height % 2 == 0){
                             vertical = true;
                         }
                         else{
                             if(height % 2 == 1 && width % 2 == 0){
                                 vertical = false;
                             }
                             else{
                                 vertical = CoinFlip();
                             }
                         }
                         if(vertical){
                             if(height % 2 == 1){
                                 for(int i=start_r+1;i<=end_r-1;i+=2){
                                     map[i,(start_c + end_c)/2] = pillar;
                                 }
                             }
                             else{
                                 int offset = 0;
                                 if(height % 4 == 0){
                                     offset = Roll(2) - 1;
                                 }
                                 for(int i=start_r+1+offset;i<(start_r + end_r)/2;i+=2){
                                     map[i,(start_c + end_c)/2] = pillar;
                                 }
                                 for(int i=end_r-1-offset;i>(start_r + end_r)/2+1;i-=2){
                                     map[i,(start_c + end_c)/2] = pillar;
                                 }
                             }
                         }
                         else{
                             if(width % 2 == 1){
                                 for(int i=start_c+1;i<=end_c-1;i+=2){
                                     map[(start_r + end_r)/2,i] = pillar;
                                 }
                             }
                             else{
                                 int offset = 0;
                                 if(width % 4 == 0){
                                     offset = Roll(2) - 1;
                                 }
                                 for(int i=start_c+1+offset;i<(start_c + end_c)/2;i+=2){
                                     map[(start_r + end_r)/2,i] = pillar;
                                 }
                                 for(int i=end_c-1-offset;i>(start_c + end_c)/2+1;i-=2){
                                     map[(start_r + end_r)/2,i] = pillar;
                                 }
                             }
                         }
                         break;
                     }
                     case PillarArrangement.Corners:
                     {
                         int v_offset = 0;
                         int h_offset = 0;
                         if(height % 4 == 0){
                             v_offset = Roll(2) - 1;
                         }
                         if(width % 4 == 0){
                             h_offset = Roll(2) - 1;
                         }
                         map[start_r + 1 + v_offset,start_c + 1 + h_offset] = pillar;
                         map[start_r + 1 + v_offset,end_c - 1 - h_offset] = pillar;
                         map[end_r - 1 - v_offset,start_c + 1 + h_offset] = pillar;
                         map[end_r - 1 - v_offset,end_c - 1 - h_offset] = pillar;
                         break;
                     }
                     case PillarArrangement.Full:
                     {
                         int v_offset = 0;
                         int h_offset = 0;
                         if(height % 4 == 0){
                             v_offset = Roll(2) - 1;
                         }
                         if(width % 4 == 0){
                             h_offset = Roll(2) - 1;
                         }
                         int half_r = (start_r + end_r)/2;
                         int half_c = (start_c + end_c)/2;
                         int half_r_offset = (start_r + end_r + 1)/2;
                         int half_c_offset = (start_c + end_c + 1)/2;
                         for(int i=start_r+1+v_offset;i<half_r;i+=2){
                             for(int j=start_c+1+h_offset;j<half_c;j+=2){
                                 map[i,j] = pillar;
                             }
                         }
                         for(int i=start_r+1+v_offset;i<half_r;i+=2){
                             for(int j=end_c-1-h_offset;j>half_c_offset;j-=2){
                                 map[i,j] = pillar;
                             }
                         }
                         for(int i=end_r-1-v_offset;i>half_r_offset;i-=2){
                             for(int j=start_c+1+h_offset;j<half_c;j+=2){
                                 map[i,j] = pillar;
                             }
                         }
                         for(int i=end_r-1-v_offset;i>half_r_offset;i-=2){
                             for(int j=end_c-1-h_offset;j>half_c_offset;j-=2){
                                 map[i,j] = pillar;
                             }
                         }
                         if((width+1) % 4 == 0){
                             if(height % 2 == 1){
                                 for(int i=start_r+1;i<=end_r-1;i+=2){
                                     map[i,half_c] = pillar;
                                 }
                             }
                             else{
                                 int offset = 0;
                                 if(height % 4 == 0){
                                     offset = Roll(2) - 1;
                                 }
                                 for(int i=start_r+1+offset;i<half_r;i+=2){
                                     map[i,half_c] = pillar;
                                 }
                                 for(int i=end_r-1-offset;i>half_r_offset;i-=2){
                                     map[i,half_c] = pillar;
                                 }
                             }
                         }
                         if((height+1) % 4 == 0){
                             if(width % 2 == 1){
                                 for(int i=start_c+1;i<=end_c-1;i+=2){
                                     map[half_r,i] = pillar;
                                 }
                             }
                             else{
                                 int offset = 0;
                                 if(width % 4 == 0){
                                     offset = Roll(2) - 1;
                                 }
                                 for(int i=start_c+1+offset;i<half_c;i+=2){
                                     map[half_r,i] = pillar;
                                 }
                                 for(int i=end_c-1-offset;i>half_c_offset;i-=2){
                                     map[half_r,i] = pillar;
                                 }
                             }
                         }
                         break;
                     }
                     case PillarArrangement.StatueCorners:
                         map[start_r,start_c] = CellType.Statue;
                         map[start_r,end_c] = CellType.Statue;
                         map[end_r,start_c] = CellType.Statue;
                         map[end_r,end_c] = CellType.Statue;
                         break;
                     case PillarArrangement.StatueEdges:
                     {
                         map[start_r,start_c] = CellType.Statue;
                         map[start_r,end_c] = CellType.Statue;
                         map[end_r,start_c] = CellType.Statue;
                         map[end_r,end_c] = CellType.Statue;
                         if(width % 2 == 1 && width > 3){
                             int half_c = (start_c + end_c)/2;
                             int corridors = new pos(start_r,half_c).CardinalAdjacentPositions().Where(x => BoundsCheck(x) && map[x].IsCorridorType()).Count;
                             if(corridors == 0){
                                 map[start_r,half_c] = CellType.Statue;
                             }
                             corridors = new pos(end_r,half_c).CardinalAdjacentPositions().Where(x => BoundsCheck(x) && map[x].IsCorridorType()).Count;
                             if(corridors == 0){
                                 map[end_r,half_c] = CellType.Statue;
                             }
                         }
                         if(height % 2 == 1 && height > 3){
                             int half_r = (start_r + end_r)/2;
                             int corridors = new pos(half_r,start_c).CardinalAdjacentPositions().Where(x => BoundsCheck(x) && map[x].IsCorridorType()).Count;
                             if(corridors == 0){
                                 map[half_r,start_c] = CellType.Statue;
                             }
                             corridors = new pos(half_r,end_c).CardinalAdjacentPositions().Where(x => BoundsCheck(x) && map[x].IsCorridorType()).Count;
                             if(corridors == 0){
                                 map[half_r,end_c] = CellType.Statue;
                             }
                         }
                         break;
                     }
                     default:
                         break;
                     }
                 }
             }
         }
         return true;
     });
 }
        public int DirectionOf(pos obj)
        {
            int dy = Math.Abs(obj.row - row);
            int dx = Math.Abs(obj.col - col);
            if(dy == 0){
                if(col < obj.col){
                    return 6;
                }
                if(col > obj.col){
                    return 4;
                }
                else{
                    if(dx == 0){
                        return 5;
                    }
                }
            }
            if(dx == 0){
                if(row > obj.row){
                    return 8;
                }
                else{
                    if(row < obj.row){
                        return 2;
                    }
                }
            }
            if(row+col == obj.row+obj.col){ //slope is -1
                if(row > obj.row){
                    return 9;
                }
                else{
                    if(row < obj.row){
                        return 1;
                    }
                }
            }
            if(row-col == obj.row-obj.col){ //slope is 1
                if(row > obj.row){
                    return 7;
                }
                else{
                    if(row < obj.row){
                        return 3;
                    }
                }
            }
            // calculate all other dirs here
            /*.................flipped y
            ........m........
            .......l|n.......
            ........|........
            .....k..|..o.....
            ......\.|./......
            ...j...\|/...p...
            [email protected]
            ...h.../|\...b.2.
            ....../.|.\.B.3..
            .....g..|..c.4...
            ........|...5....
            .......f|d.......
            ........e........

            @-------------...
            |\;..b.2.........
            |.\.B.3..........
            |..\.4;..........
            |...\...;........
            |....\....;6.....
            |.....\.....;....
            |......\.....5;..
            rise:	run:	ri/ru:	angle(flipped y):
            b:	1	5	1/5		(obviously the dividing line should be 22.5 degrees here)
            d:	5	1	5		67.5
            f:	5	-1	-5		112.5
            h:	1	-5	-1/5		157.5
            j:	-1	-5	1/5		202.5
            l:	-5	-1	5		247.5
            n:	-5	1	-5		292.5
            p:	-1	5	-1/5		337.5
            algorithm for determining direction...			(for b)		(for 4)		(for 6)		(for 5)		(for B)
            first, determine 'major' direction - NSEW		E		E		E		E		E
            then, determine 'minor' direction - diagonals		SE		SE		SE		SE		SE
            find the ratio of d-major/d(other dir) (both positive)	1/5		3/5		5/11		7/13		2/4
            compare this number to 1/2:  if less than 1/2, major.
            if more than 1/2, minor.
            if exactly 1/2, tiebreaker.
                            major(E)	minor(SE)	major(E)	minor(SE)	tiebreak

            */
            int primary; //orthogonal
            int secondary; //diagonal
            int dprimary = Math.Min(dy,dx);
            int dsecondary = Math.Max(dy,dx);
            if(row < obj.row){ //down
                if(col < obj.col){ //right
                    secondary = 3;
                    if(dx > dy){ //slope less than 1
                        primary = 6;
                    }
                    else{ //slope greater than 1
                        primary = 2;
                    }
                }
                else{ //left
                    secondary = 1;
                    if(dx > dy){ //slope less than 1
                        primary = 4;
                    }
                    else{ //slope greater than 1
                        primary = 2;
                    }
                }
            }
            else{ //up
                if(col < obj.col){ //right
                    secondary = 9;
                    if(dx > dy){ //slope less than 1
                        primary = 6;
                    }
                    else{ //slope greater than 1
                        primary = 8;
                    }
                }
                else{ //left
                    secondary = 7;
                    if(dx > dy){ //slope less than 1
                        primary = 4;
                    }
                    else{ //slope greater than 1
                        primary = 8;
                    }
                }
            }
            int tiebreaker = primary;
            float ratio = (float)dprimary / (float)dsecondary;
            if(ratio < 0.5f){
                return primary;
            }
            else{
                if(ratio > 0.5f){
                    return secondary;
                }
                else{
                    return tiebreaker;
                }
            }
        }
 public bool AddRockFormations(int percent_chance_per_room,int minimum_distance_from_wall)
 {
     return ForEachRoom(list => {
         if(PercentChance(percent_chance_per_room)){
             int start_r = list.WhereLeast(x=>x.row)[0].row;
             int end_r = list.WhereGreatest(x=>x.row)[0].row;
             int start_c = list.WhereLeast(x=>x.col)[0].col;
             int end_c = list.WhereGreatest(x=>x.col)[0].col;
             Dungeon room = new Dungeon((end_r - start_r) + 3,(end_c - start_c) + 3); //includes borders
             while(true){
                 room.FillWithRandomWalls(25);
                 room.ApplyCellularAutomataXYRule(3);
                 for(int i=start_r;i<=end_r;++i){
                     for(int j=start_c;j<=end_c;++j){
                         pos p = new pos(i,j);
                         if(!p.PositionsWithinDistance(minimum_distance_from_wall-1,room.map).All(x=>list.Contains(x))){ //todo: I probably broke this.
                             room[i-start_r+1,j-start_c+1] = CellType.RoomInterior;
                         }
                     }
                 }
                 room.ConnectDiagonals();
                 room.RemoveDeadEndCorridors();
                 room.RemoveUnconnectedAreas();
                 for(int i=start_r;i<=end_r;++i){
                     for(int j=start_c;j<=end_c;++j){
                         if(list.Contains(new pos(i,j))){
                             map[i,j] = room[(i-start_r)+1,(j-start_c)+1];
                         }
                     }
                 }
                 break;
             }
         }
         return true;
     });
 }
Exemple #52
0
 public static Tile TileFromDrawingPosition(pos drawing_position)
 {
     return TileFromDrawingPosition(drawing_position.row,drawing_position.col);
 }
Exemple #53
0
 public void CheckForSpriteUpdate()
 {
     //makes walls face the right way, for instance.
     switch(type){
     case TileType.WALL:
     case TileType.HIDDEN_DOOR:
         if(row < ROWS-1 && M.tile[row+1,col].seen && !M.tile[row+1,col].IsVisuallyWall()){
             sprite_offset = new pos(2,0);
         }
         else{
             bool side_wall = false;
             if(col > 0){
                 if(row < ROWS-1 && M.tile[row+1,col-1].seen && !M.tile[row+1,col-1].IsVisuallyWall()){
                     side_wall = true;
                 }
                 if(!side_wall && M.tile[row,col-1].seen && !M.tile[row,col-1].IsVisuallyWall()){
                     side_wall = true;
                 }
             }
             if(!side_wall && col < COLS-1){
                 if(row < ROWS-1 && M.tile[row+1,col+1].seen && !M.tile[row+1,col+1].IsVisuallyWall()){
                     side_wall = true;
                 }
                 if(!side_wall && M.tile[row,col+1].seen && !M.tile[row,col+1].IsVisuallyWall()){
                     side_wall = true;
                 }
             }
             if(side_wall){
                 sprite_offset = new pos(1,0);
             }
             else{
                 sprite_offset = new pos(0,0);
             }
         }
         break;
     case TileType.CRACKED_WALL:
         if(row < ROWS-1 && M.tile[row+1,col].seen && !M.tile[row+1,col].IsVisuallyWall()){
             sprite_offset = new pos(2,1);
         }
         else{
             bool side_wall = false;
             if(col > 0){
                 if(row < ROWS-1 && M.tile[row+1,col-1].seen && !M.tile[row+1,col-1].IsVisuallyWall()){
                     side_wall = true;
                 }
                 if(!side_wall && M.tile[row,col-1].seen && !M.tile[row,col-1].IsVisuallyWall()){
                     side_wall = true;
                 }
             }
             if(!side_wall && col < COLS-1){
                 if(row < ROWS-1 && M.tile[row+1,col+1].seen && !M.tile[row+1,col+1].IsVisuallyWall()){
                     side_wall = true;
                 }
                 if(!side_wall && M.tile[row,col+1].seen && !M.tile[row,col+1].IsVisuallyWall()){
                     side_wall = true;
                 }
             }
             if(side_wall){
                 sprite_offset = new pos(1,1);
             }
             else{
                 sprite_offset = new pos(0,1);
             }
         }
         break;
     case TileType.DOOR_C:
         if(!M.tile[row+1,col].passable || !M.tile[row-1,col].passable){
             sprite_offset = new pos(10,0);
         }
         else{
             sprite_offset = new pos(10,1);
         }
         break;
     case TileType.DOOR_O:
         if(!M.tile[row+1,col].passable || !M.tile[row-1,col].passable){
             sprite_offset = new pos(10,2);
         }
         else{
             sprite_offset = new pos(10,3);
         }
         break;
     }
 }
Exemple #54
0
 public static void SetMapOffset(int x,int y)
 {
     int dx = x - map_offset.col;
     int dy = y - map_offset.row;
     map_offset = new pos(y,x);
     G.terrain.SetOffsetInPixels(map_offset.col + 7,map_offset.row + 40);
     G.undead.SetOffsetInPixels(map_offset.col + 11,map_offset.row - 21);
     G.living.SetOffsetInPixels(map_offset.col + 11,map_offset.row - 21);
     foreach(IMouseTarget t in dragged_objects){
         t.Move(dx,dy);
     }
 }
		public static void AnimateStorm(pos origin,int radius,int num_frames,int num_per_frame,string c,Color color){
			AnimateStorm(origin,radius,num_frames,num_per_frame,new colorchar(c,color));
		}
		public static void AnimateStorm(pos origin,int radius,int num_frames,int num_per_frame,colorchar ch){
			for(int i=0;i<num_frames;++i){
				List<pos> cells = new List<pos>();
				List<pos> nearby = origin.PositionsWithinDistance(radius);
				for(int j=0;j<num_per_frame;++j){
					cells.Add(nearby.RemoveRandom());
				}
				Screen.AnimateMapCells(cells,ch);
			}
		}
 public colorchar this[pos p]
 {
     get{
         return memory[p];
     }
     set{
         if(!memory[p].Equals(value)){
             memory[p] = value;
             if(!NoUpdate){
                 UpdateSurface(p.col + p.row * memory.objs.GetLength(1)); //todo: can UpdateSurface get a 2d version?
             }
         }
     }
 }
Exemple #58
0
 public static Tile GetTile(pos p)
 {
     return GetTile(p.row,p.col);
 }
        public void trackData()
        {
            var authorization = new authorization();
            authorization.id = "AX54321678";
            authorization.reportGroup = "RG27";
            authorization.orderId = "12z58743y1";
            authorization.amount = 12522L;
            authorization.orderSource = orderSourceType.retail;
            var billToAddress = new contact();
            billToAddress.zip = "95032";
            authorization.billToAddress = billToAddress;
            var card = new cardType();
            card.track = "%B40000001^Doe/JohnP^06041...?;40001=0604101064200?";
            authorization.card = card;
            var pos = new pos();
            pos.capability = posCapabilityTypeEnum.magstripe;
            pos.entryMode = posEntryModeTypeEnum.completeread;
            pos.cardholderId = posCardholderIdTypeEnum.signature;
            authorization.pos = pos;

            var response = litle.Authorize(authorization);
            Assert.AreEqual("Approved", response.message);
        }
        public sprite_broillon(Texture2D n_textture, Rectangle n_rectangle, Collision n_collision, ContentManager Content, char type)
        {
            test = Content.Load<Texture2D>("ListBoxBG");
            texture = n_textture;
            rectangle_C = new Rectangle(n_rectangle.X + 49, n_rectangle.Y + 4, 30, n_rectangle.Height);
            rectangle = n_rectangle;
            poid = 10;
            in_air = false;
            jump_off = false;
            collision = n_collision;
            impulse = 150;
            pos_marche = rectangle.Y;
            marchell = Content.Load<Song>("hero//jogging");
            MediaPlayer.Play(marchell);

            this.FrameLine = 1;
            this.FrameColumn = 1;
            this.Timer = 0;
            vie = 100;

            upsidedown = 10;
            atq = false;
            longattaque = 17;
            dead = false;
            timer_dead = 200;

            if (type == '2')
            {
                colunm = 151;
                line = 110;
                largeurX = 22;
                hauteurY = 40;
                decallageX = 50;
                decallageY = 34;
                idle = new pos(1, 1, 4);
                walk = new pos(1, 5, 10);
                atk = new pos(9, 5, 10);
                die = new pos(3, 5, 9);
                jump = new pos(2, 8, 8);
                fall = new pos(2, 9, 9);

            }
            else
            {
                colunm = 125;
                line = 93;
                largeurX = 17;
                hauteurY = 50;
                decallageX = 55;
                decallageY = 31;
                idle = new pos(1, 1, 3);
                walk = new pos(2, 1, 3);
                atk = new pos(8, 1, 3);
                die = new pos(6, 1, 5);
                jump = new pos(3, 1, 2);
                fall = new pos(5, 1, 3);
            }
            current = fall;
            last = current;
        }