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; }
/* + 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]; } } } }