예제 #1
0
        public void CopyFrom(AutoTileArgs a)
        {
            Array.Copy(a.boolMask, 0, boolMask, 0, a.boolMask.Length);

            char[] ch = new char[a.form.Length];
            a.form.CopyTo(0, ch, 0, a.form.Length);
            form = new string(ch);

            type1      = a.type1;
            type2      = a.type2;
            variant    = a.variant;
            aggressive = a.aggressive;
            onlyAll    = a.onlyAll;
            onlyInRect = a.onlyInRect;
            recursive  = a.recursive;
        }
예제 #2
0
        /*
         + Aggressive - не обращать внимание на Frozen tiles
         + OnlyAll - рисовать только если все тайлы подобраны. Не все подбираются, когда, например, нет какой-то одной формы перехода, а остальные есть.
         + OnlyInRect - заменять тайлы только внутри прямоугольника, без соседей.
         * Recursive - рекурсивная проверка соседей. Для того чтобы получить двойные переходы и избежать нестыковок.
         */
        #endregion modes desc



        // Установка автотайла 1x1 и его соседей на готовую тайловую маску.
        // [!!Переделать под GetAllQuartersNeightbors(tx, ty); или его аналог!!]
        public void PlaceAutotileToMask(ref TileType[,] mask, int tx, int ty, AutoTileArgs args)
        {
            // аргумент в отдельные переменные
            TileType type1 = (TileType)args.type1;
            TileType type2 = (TileType)args.type2;

            if (type2 == TileType.Unknown)
            {
                type2 = type1;
            }
            bool[,] bool_mask = args.boolMask;

            int mw = scn.size_map_x * 2;
            int mh = scn.size_map_y * 2;

            // те четвертинки, которые можно заменить в центральном квадрате.
            bool[,] allowed_parts = new bool[, ]       // Сюда будет входить результат проверки на мороженность
            {
                { true, true },                        //
                { true, true }
            };                                         //

            // те четвертинки, которые заменены в центральном квадрате, будут помечены здесь. Для того чтобы знать что менять соседям.
            bool[,] replaced_parts = new bool[, ] {
                { true, true }, { true, true }
            };


            /// Проверяем какие четвертинки в центре можно заменять:
            if (!args.aggressive)
            { // был бы аггресив, можно было бы все заменять без проверки.
                // проверим что рядом с ней нет мороженных четвертинок. (с проверкой на границы)
                // (такое нужно чтобы не сбивались переходы к мороженным)
                if (point_in_rect(tx - 1, ty - 1, 0, 0, mw, mh) && Frozen(mask[tx - 1, ty - 1]) ||
                    point_in_rect(tx - 1, ty, 0, 0, mw, mh) && Frozen(mask[tx - 1, ty]) ||
                    point_in_rect(tx, ty - 1, 0, 0, mw, mh) && Frozen(mask[tx, ty - 1]))
                {
                    allowed_parts[0, 0] = false;
                }

                if (point_in_rect(tx - 1, ty + 1, 0, 0, mw, mh) && Frozen(mask[tx - 1, ty + 1]) ||
                    point_in_rect(tx - 1, ty + 2, 0, 0, mw, mh) && Frozen(mask[tx - 1, ty + 2]) ||
                    point_in_rect(tx, ty + 2, 0, 0, mw, mh) && Frozen(mask[tx, ty + 2]))
                {
                    allowed_parts[0, 1] = false;
                }

                if (point_in_rect(tx + 1, ty - 1, 0, 0, mw, mh) && Frozen(mask[tx + 1, ty - 1]) ||
                    point_in_rect(tx + 2, ty - 1, 0, 0, mw, mh) && Frozen(mask[tx + 2, ty - 1]) ||
                    point_in_rect(tx + 2, ty, 0, 0, mw, mh) && Frozen(mask[tx + 2, ty]))
                {
                    allowed_parts[1, 0] = false;
                }

                if (point_in_rect(tx + 2, ty + 1, 0, 0, mw, mh) && Frozen(mask[tx + 2, ty + 1]) ||
                    point_in_rect(tx + 2, ty + 2, 0, 0, mw, mh) && Frozen(mask[tx + 2, ty + 2]) ||
                    point_in_rect(tx + 1, ty + 2, 0, 0, mw, mh) && Frozen(mask[tx + 1, ty + 2]))
                {
                    allowed_parts[1, 1] = false;
                }
            }

            /// Центр:

            // берем у тайла, который описан в палитре, маску и добавляем её в общий массив
            // но только если тут такое можно делать.
            if (allowed_parts[0, 0])
            {
                if (bool_mask[0, 0])
                {
                    mask[tx, ty] = type1;
                }
                else
                {
                    mask[tx, ty] = type2;
                }
            }
            else
            {
                replaced_parts[0, 0] = false;
            }

            if (allowed_parts[0, 1])
            {
                if (bool_mask[0, 1])
                {
                    mask[tx, ty + 1] = type1;
                }
                else
                {
                    mask[tx, ty + 1] = type2;
                }
            }
            else
            {
                replaced_parts[0, 1] = false;
            }

            if (allowed_parts[1, 0])
            {
                if (bool_mask[1, 0])
                {
                    mask[tx + 1, ty] = type1;
                }
                else
                {
                    mask[tx + 1, ty] = type2;
                }
            }
            else
            {
                replaced_parts[1, 0] = false;
            }

            if (allowed_parts[1, 1])
            {
                if (bool_mask[1, 1])
                {
                    mask[tx + 1, ty + 1] = type1;
                }
                else
                {
                    mask[tx + 1, ty + 1] = type2;
                }
            }
            else
            {
                replaced_parts[1, 1] = false;
            }

            /// Соседи:

            if (!args.onlyInRect) // этот режим отключает соседей.
            {
                // заменяем у соседей прилегающие миниквадраты на значения того что поставили.
                // c проверкой на край карты.
                if (replaced_parts[0, 0])
                {
                    if (point_in_rect(tx - 1, ty - 1, 0, 0, mw, mh))
                    {
                        mask[tx - 1, ty - 1] = mask[tx, ty];
                    }
                    if (point_in_rect(tx, ty - 1, 0, 0, mw, mh))
                    {
                        mask[tx, ty - 1] = mask[tx, ty];
                    }
                    if (point_in_rect(tx - 1, ty, 0, 0, mw, mh))
                    {
                        mask[tx - 1, ty] = mask[tx, ty];
                    }
                }

                if (replaced_parts[1, 0])
                {
                    if (point_in_rect(tx + 1, ty - 1, 0, 0, mw, mh))
                    {
                        mask[tx + 1, ty - 1] = mask[tx + 1, ty];
                    }
                    if (point_in_rect(tx + 2, ty - 1, 0, 0, mw, mh))
                    {
                        mask[tx + 2, ty - 1] = mask[tx + 1, ty];
                    }
                    if (point_in_rect(tx + 2, ty, 0, 0, mw, mh))
                    {
                        mask[tx + 2, ty] = mask[tx + 1, ty];
                    }
                }

                if (replaced_parts[1, 1])
                {
                    if (point_in_rect(tx + 2, ty + 1, 0, 0, mw, mh))
                    {
                        mask[tx + 2, ty + 1] = mask[tx + 1, ty + 1];
                    }
                    if (point_in_rect(tx + 2, ty + 2, 0, 0, mw, mh))
                    {
                        mask[tx + 2, ty + 2] = mask[tx + 1, ty + 1];
                    }
                    if (point_in_rect(tx + 1, ty + 2, 0, 0, mw, mh))
                    {
                        mask[tx + 1, ty + 2] = mask[tx + 1, ty + 1];
                    }
                }

                if (replaced_parts[0, 1])
                {
                    if (point_in_rect(tx, ty + 2, 0, 0, mw, mh))
                    {
                        mask[tx, ty + 2] = mask[tx, ty + 1];
                    }
                    if (point_in_rect(tx - 1, ty + 2, 0, 0, mw, mh))
                    {
                        mask[tx - 1, ty + 2] = mask[tx, ty + 1];
                    }
                    if (point_in_rect(tx - 1, ty + 1, 0, 0, mw, mh))
                    {
                        mask[tx - 1, ty + 1] = mask[tx, ty + 1];
                    }
                }
            }
        }