Jump to content

Automapper/ru: Difference between revisions

From DDraceNetwork
Created page with "'''Правило для размещения тайла''':"
Created page with "<code>Index 42 XFLIP YFLIP ROTATE</code>"
 
(35 intermediate revisions by the same user not shown)
Line 59: Line 59:
Это '''выбирает''' тайл 42 (то есть 3-я строка и 11-й столбец). Несколько индексов можно выбрать, добавляя между ними <code>OR</code>:
Это '''выбирает''' тайл 42 (то есть 3-я строка и 11-й столбец). Несколько индексов можно выбрать, добавляя между ними <code>OR</code>:


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>INDEX 42 OR 43</code>
<code>INDEX 42 OR 43</code>
</div>


'''Изменение тайла''':
'''Изменение тайла''':


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>Index 42 XFLIP YFLIP ROTATE</code>
<code>Index 42 XFLIP YFLIP ROTATE</code>
</div>


<code>XFLIP</code> зеркально отражает тайл по вертикали, а <code>YFLIP</code> — по горизонтали. <code>ROTATE</code> поворачивает тайл на 90° один раз.
<code>XFLIP</code> зеркально отражает тайл по вертикали, а <code>YFLIP</code> — по горизонтали. <code>ROTATE</code> поворачивает тайл на 90° один раз.
Line 81: Line 77:
'''Правило для размещения тайла''':
'''Правило для размещения тайла''':


<div lang="en" dir="ltr" class="mw-content-ltr">
Выбранный тайл размещается, если выполняются '''все''' следующие правила.
The selected tile gets placed if '''all''' following rules apply.
Правило для размещения тайла всегда начинается с координат, за которыми следует правило:
A rule for placing the tile always starts with coordinates followed by a rule:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>POS 0 -1 FULL</code>
<code>POS 0 -1 FULL</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Это правило выбирает тайл с координатой ''X'' 0 и ''Y'' -1 '''относительно''' [[#Processing|текущей позиции сканирования]] автомаппера. Если тайл '''над''' позицией сканирования равен <code>FULL</code>, то '''выбранный тайл''' будет размещён (если выполнятся все следующие правила). Если тайл равен <code>EMPTY</code>, он размещён не будет.
This rule selects the tile with ''X'' coordinate 0 and ''Y'' coordinate -1 '''relative to the''' [[#Processing|scanning position]] of the automapper. If the tile '''above''' the scanning position is <code>FULL</code>, the '''selected tile''' will be placed (if all following rules apply). If it's <code>EMPTY</code>, it won't be placed.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Вместо использования <code>FULL</code> или <code>EMPTY</code> можно выбрать другой тайл с помощью ключевого слова <code>INDEX</code>:
Instead of using <code>FULL</code> or <code>EMPTY</code>, you can select another tile with the <code>INDEX</code> keyword:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>POS 0 -1 INDEX 12</code>
<code>POS 0 -1 INDEX 12</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Если тайл над [[#Processing|позицией сканирования]] имеет индекс 12, он будет размещён. Несколько индексов можно выбрать, добавляя между ними <code>OR</code>:
If the tile above the [[#Processing|scanning position]] has index 12, it will be placed. Multiple indices can be selected by adding an <code>OR</code> between each index:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>POS 0 -1 INDEX 12 OR 13</code>
<code>POS 0 -1 INDEX 12 OR 13</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Аналогично, для исключения тайла можно использовать <code>NOTINDEX</code>.
Similarly <code>NOTINDEX</code> can be used to exclude a tile.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''Случайное правило''':
'''Random rule''':
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Вы можете сделать так, чтобы выбранный тайл применялся случайным образом, добавив случайное правило:
You can make a selected tile randomly apply to rules by adding a random rule:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>RANDOM 20%</code>
<code>RANDOM 20%</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Случайное правило ожидает значение от 0% до 100%. Это значение представляет вероятность размещения тайла<ref name="RandomRule">[https://github.com/ddnet/ddnet/blob/0abb32514b6e9643154dc6bcdc4a754defbf2321/src/game/editor/auto_map.cpp#L312 Реализация случайного правила]</ref>.
The random rule expects a value between 0% and 100%. This value represents the probability, that a tile is placed<ref name="RandomRule">[https://github.com/ddnet/ddnet/blob/0abb32514b6e9643154dc6bcdc4a754defbf2321/src/game/editor/auto_map.cpp#L312 Random rule implementation]</ref>.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Если указать ''значение'' '''без''' символа <code>%</code>, вероятность будет рассчитываться не в процентах, а по следующей формуле:
If you put a ''value'' into it '''without''' a <code>%</code> symbol, the probability will not be parsed in terms of percentages, but with this formula:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>percentage = 1.0 / value</code>
<code>percentage = 1.0 / value</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Это позволяет задавать более редкое размещение тайлов с вероятностями от 0% до 1% при ''значении'' > 100.
This allows for rarer tile placements with probabilities between 0% and 1% and a ''value'' > 100.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Например, <code>RANDOM 150</code> будет иметь вероятность <code>1.0 / 150 ≈ 0.67</code> (процента).
For example <code>RANDOM 150</code> will have a probability of <code>1.0 / 150 ≈ 0.67</code> (percent).
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''Modulo''':
'''Modulo''':
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
С помощью оператора <code>MODULO x\_pattern y\_pattern x\_offset y\_offset</code> можно создавать повторяющиеся шаблоны в зависимости от координат X и Y тайла. Например, <code>MODULO 2 3 0 -1</code> использует \[[https://en.wikipedia.org/wiki/Modular\_arithmetic](https://en.wikipedia.org/wiki/Modular_arithmetic) модульную арифметику], чтобы задать каждый второй тайл по оси X (<code>x\_pattern</code>) и каждый третий тайл по оси Y (<code>y\_pattern</code>). Третий и четвёртый параметры позволяют смещать координаты X (здесь 0) и Y (здесь -1), изменяя положение шаблона. Тайл будет размещён только если выполняются оба следующих правила:
With the <code>MODULO x_pattern y_pattern x_offset y_offset</code> operator you can create a repeating pattern depending on the X and Y coordinate of a tile. For example <code>MODULO 2 3 0 -1</code> uses  [https://en.wikipedia.org/wiki/Modular_arithmetic modular arithmetic] in order to set every second tile on the X-Axis (<code>x_pattern</code>) and every third tile on the Y-Axis (<code>y_pattern</code>). The third and fourth parameter can be used to offset the X (here 0) and Y (here -1) coordinate and move the pattern around. A tile will only be placed, if both the following rules are true:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>(x + x_offset) % x_pattern == 0</code>
<code>(x + x_offset) % x_pattern == 0</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>(y + y\_offset) % y\_pattern == 0</code>
<code>(y + y_offset) % y_pattern == 0</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Здесь <code>%</code> — это [https://en.wikipedia.org/wiki/Modulo оператор modulo].
Here <code>%</code> is the [https://en.wikipedia.org/wiki/Modulo modulo operator].
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''Правило условия по умолчанию''':
'''Default condition rule''':
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
По умолчанию игра предполагает, что каждое правило применяется к полному тайлу, то есть всегда подразумевается следующее правило:
By default the game assumes, that you want to apply each rule to a full tile, meaning that the following rule is always implied:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>POS 0 0 FULL</code>
<code>POS 0 0 FULL</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Вы можете отключить это, добавив следующую строку '''под''' выбором тайла:
You can deactivate this by adding the following line '''under''' the tile selection:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>NoDefaultRule</code>
<code>NoDefaultRule</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''NewRun''':
'''NewRun''':
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Добавление <code>NewRun</code> в раздел заставит раздел выполняться дополнительно столько раз, сколько раз этот ключевой слово добавлено в раздел. Это можно использовать для установки базовых тайлов в первом проходе и более сложных — во втором.
Adding <code>NewRun</code> in a section will make the section run an additional time for each time this keyword gets added to the section. This can be used to set some basic tiles in the first run, and more complex ones in the second.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''NoLayerCopy''':
'''NoLayerCopy''':
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Добавление <code>NoLayerCopy</code> в раздел приведёт к выполнению [https://en.wikipedia.org/wiki/In-place_algorithm алгоритма на месте]. Это значительно улучшит производительность, так как автомаппер не будет копировать свои изменения в буферную память перед применением. Но это может вызвать нежелательные побочные эффекты!
Adding <code>NoLayerCopy</code> in a section will cause it to run [https://en.wikipedia.org/wiki/In-place_algorithm in-place]. This can drastically improve performance, because the automapper doesn't copy it's changes into buffer memory before applying it. But it can cause unintended side effects!
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Tools"></span>
==Tools==
==Инструменты==
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Существуют некоторые инструменты для создания правил автомаппера:
Some tools in order to create automapper rules exist:
*[https://github.com/AssassinTee/SimpleDDNetAutomapper SimpleDDNetAutomapper] — небольшое приложение с интерфейсом, которое предлагает более удобный подход для очень простых правил и тайлсетов. Не поддерживает случайность или правила <code>POS INDEX</code>, но поддерживает <code>EMPTY</code> и <code>FULL</code>.
*[https://github.com/AssassinTee/SimpleDDNetAutomapper SimpleDDNetAutomapper] - a small UI application, which tries a more user friendly approach for very basic rules and tilesets. It does not support randomness, or <code>POS INDEX</code> rules, but <code>EMPTY</code> and <code>FULL</code>.
*[https://github.com/k2d222/twwe Teeworlds Web Editor] — редактирование автомаппера и просмотр в реальном времени<ref name="twwe">[https://github.com/k2d222/twwe/blob/main/README.md#unique-features Уникальные функции Teeworlds web editor]</ref>.
*[https://github.com/k2d222/twwe Teeworlds Web Editor] - Automapper edit and live-preview<ref name="twwe">[https://github.com/k2d222/twwe/blob/main/README.md#unique-features Teeworlds web editor unique features]</ref>.
*[https://github.com/Aerll/rpp rpp] rules++ — небольшой эксперимент, направленный на то, чтобы сделать мапперов максимально ленивыми, раскрывая полный потенциал правил DDNet. Предназначен быть простым, читаемым и, что самое главное, правильным, всё остальное не важно<ref name="rpp">[https://github.com/Aerll/rpp/blob/main/README.md#about Правила++ о проекте]</ref>.
*[https://github.com/Aerll/rpp rpp] - rules++ is a small experiment, aiming to make mappers utterly lazy, by unlocking the full potential of DDNet's rules. It is meant to be simple, readable and most importantly correct, everything else is irrelevant<ref name="rpp">[https://github.com/Aerll/rpp/blob/main/README.md#about rules++ about]</ref>.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Resources"></span>
==Resources==
==Ресурсы==
</div>




<references />
<references />

Latest revision as of 15:17, 15 June 2025

"Автомаппер" - это инструмент, облегчающий создание карт. Вместо того чтобы вручную расставлять круглые края фриза, вы можете сделать простое правило автомаппера, которое применяет правила ко всему слою тайлов. Каждое правило создается для определенного набора тайлов, и каждый набор тайлов может иметь несколько правил. Все правила находятся в teeworlds по адресу data/editor/automap/[1][2].


Файл правил

Для каждого набора тайлов, у которого есть автомаппер, существует текстовый файл tileset.rules. Каждый файл tileset.rules может содержать несколько автомапперов. Файл правил в общих чертах следует формату INI-файла. Внутри файла каждый автомаппер начинается с строки [automapper_name]. Например, в файле grass_main.rules есть автомаппер под названием Grass, который начинается со строки [Grass] в этом файле. Чтобы использовать его, нужно создать слой тайлов с набором тайлов grass_main в редакторе карт. Кликните правой кнопкой по слою и выберите "Auto map". Чтобы начать автомаппинг, нажмите "Grass".

Имя файла автомаппера должно соответствовать имени файла набора тайлов.

Автомаппер Grass[3]:

[Grass]
Index 1

#top
Index 16
Pos 0 -1 EMPTY
...

Обработка

Автомаппер будет считывать файл правил и сканировать каждую позицию слоя. Если для выбранного тайла выполняются все правила, тайл будет размещён в просканированной позиции автомаппера. Если совпадают несколько тайлов и их правила, применяется только последнее правило (так как оно перезапишет остальные). Если не отключено, автомаппер сначала поместит свои изменения в буфер, а затем применит их.

Обзор индексов набора тайлов

Индексы тайлов

Каждый набор тайлов содержит 16 строк и 16 столбцов, и каждый тайл можно адресовать по его индексу. Индекс тайла напрямую зависит от его позиции и может быть вычислен по формуле index = 16 * row + column, где значения row и column находятся в пределах от 0 до 15. Тайл с индексом 0 всегда считается EMPTY. Обычно эта часть не содержит текстур в наборах тайлов. Каждый другой тайл всегда считается FULL, даже если он не содержит текстур и полностью прозрачен.

Индекс используется для ключевого слова INDEX в автомаппере.

Синтаксис

Название вашего правила автомаппера:

Аналогично ini-файлам, вы можете создать свой собственный раздел для правила автомаппера:

[your-automapper-rule]

Несколько выборок индексов с последующими правилами могут входить в раздел.

Написание комментария:

#this is a comment

Выбор тайла, который вы хотите разместить:

INDEX 42

Это выбирает тайл 42 (то есть 3-я строка и 11-й столбец). Несколько индексов можно выбрать, добавляя между ними OR:

INDEX 42 OR 43

Изменение тайла:

Index 42 XFLIP YFLIP ROTATE

XFLIP зеркально отражает тайл по вертикали, а YFLIP — по горизонтали. ROTATE поворачивает тайл на 90° один раз.

Если вы хотите повернуть тайл на 180°, достаточно установить XFLIP и YFLIP, но не ROTATE.

Если вы хотите повернуть на 270°, нужно установить XFLIP, YFLIP и ROTATE.

Модификации тайла всегда находятся в той же строке, что и выбор.

Если вы хотите выбрать тайл без поворотов и отражений, можно использовать NONE. В противном случае будут выбраны все тайлы с указанным INDEX.

Правило для размещения тайла:

Выбранный тайл размещается, если выполняются все следующие правила. Правило для размещения тайла всегда начинается с координат, за которыми следует правило:

POS 0 -1 FULL

Это правило выбирает тайл с координатой X 0 и Y -1 относительно текущей позиции сканирования автомаппера. Если тайл над позицией сканирования равен FULL, то выбранный тайл будет размещён (если выполнятся все следующие правила). Если тайл равен EMPTY, он размещён не будет.

Вместо использования FULL или EMPTY можно выбрать другой тайл с помощью ключевого слова INDEX:

POS 0 -1 INDEX 12

Если тайл над позицией сканирования имеет индекс 12, он будет размещён. Несколько индексов можно выбрать, добавляя между ними OR:

POS 0 -1 INDEX 12 OR 13

Аналогично, для исключения тайла можно использовать NOTINDEX.

Случайное правило:

Вы можете сделать так, чтобы выбранный тайл применялся случайным образом, добавив случайное правило:

RANDOM 20%

Случайное правило ожидает значение от 0% до 100%. Это значение представляет вероятность размещения тайла[4].

Если указать значение без символа %, вероятность будет рассчитываться не в процентах, а по следующей формуле:

percentage = 1.0 / value

Это позволяет задавать более редкое размещение тайлов с вероятностями от 0% до 1% при значении > 100.

Например, RANDOM 150 будет иметь вероятность 1.0 / 150 ≈ 0.67 (процента).

Modulo:

С помощью оператора MODULO x\_pattern y\_pattern x\_offset y\_offset можно создавать повторяющиеся шаблоны в зависимости от координат X и Y тайла. Например, MODULO 2 3 0 -1 использует \[[1](https://en.wikipedia.org/wiki/Modular_arithmetic) модульную арифметику], чтобы задать каждый второй тайл по оси X (x\_pattern) и каждый третий тайл по оси Y (y\_pattern). Третий и четвёртый параметры позволяют смещать координаты X (здесь 0) и Y (здесь -1), изменяя положение шаблона. Тайл будет размещён только если выполняются оба следующих правила:

(x + x_offset) % x_pattern == 0

(y + y\_offset) % y\_pattern == 0

Здесь % — это оператор modulo.

Правило условия по умолчанию:

По умолчанию игра предполагает, что каждое правило применяется к полному тайлу, то есть всегда подразумевается следующее правило:

POS 0 0 FULL

Вы можете отключить это, добавив следующую строку под выбором тайла:

NoDefaultRule

NewRun:

Добавление NewRun в раздел заставит раздел выполняться дополнительно столько раз, сколько раз этот ключевой слово добавлено в раздел. Это можно использовать для установки базовых тайлов в первом проходе и более сложных — во втором.

NoLayerCopy:

Добавление NoLayerCopy в раздел приведёт к выполнению алгоритма на месте. Это значительно улучшит производительность, так как автомаппер не будет копировать свои изменения в буферную память перед применением. Но это может вызвать нежелательные побочные эффекты!

Инструменты

Существуют некоторые инструменты для создания правил автомаппера:

  • SimpleDDNetAutomapper — небольшое приложение с интерфейсом, которое предлагает более удобный подход для очень простых правил и тайлсетов. Не поддерживает случайность или правила POS INDEX, но поддерживает EMPTY и FULL.
  • Teeworlds Web Editor — редактирование автомаппера и просмотр в реальном времени[5].
  • rpp — rules++ — небольшой эксперимент, направленный на то, чтобы сделать мапперов максимально ленивыми, раскрывая полный потенциал правил DDNet. Предназначен быть простым, читаемым и, что самое главное, правильным, всё остальное не важно[6].

Ресурсы