Jump to content

Automapper/zh: Difference between revisions

From DDraceNetwork
Darkh (talk | contribs)
Created page with "将您的规则组命名:"
FuzzyBot (talk | contribs)
Updating to match new version of source page
(73 intermediate revisions by 3 users not shown)
Line 2: Line 2:
<languages />
<languages />


'''自动贴图'''是一个方便作者制作地图的工具。只需在贴图层简单地制定一些[[#Rules File|贴图规则]]编纂成组运用,就能省去诸如手动在冻结区域边角放置圆角贴图此类的麻烦。每组贴图规则需要指定一个贴图资源文件,但是单个贴图资源文件可以预设多种规则以备选用。所有规则文件位于游戏路径'''data/editor/automap/'''<ref name="Automapper">[https://forum.ddnet.org/viewtopic.php?t=2428 自动贴图教程]</ref><ref name="ddnet-automapperfiles">[https://github.com/ddnet/ddnet/tree/master/data/editor/automap 自动贴图文件]</ref>
'''自动贴图'''是一个方便作者制作地图的工具。只需在贴图层简单地制定一些[[Special:MyLanguage/Automapper#Rules File|贴图规则]]编纂成组运用,就能省去诸如手动在冻结区域边角放置圆角贴图此类的麻烦。每组贴图规则需要指定一个贴图集(tileset),一般由一个导入的贴图资源文件构成;单个贴图可以预设多种规则以备选用。所有规则文件位于游戏路径'''data/editor/automap/'''<ref name="Automapper">[https://forum.ddnet.org/viewtopic.php?t=2428 自动贴图教程]</ref><ref name="ddnet-automapperfiles">[https://github.com/ddnet/ddnet/tree/master/data/editor/automap 自动贴图文件]</ref>




Line 8: Line 8:
==贴图规则文件==
==贴图规则文件==


作为贴图资源的图片文件,其自动贴图规则通常会写在另一个文本文件中,后缀固定为'''.rules''',规则文件名必须和资源文件名相同;每个'''贴图规则'''文件内可以写入多组自动贴图规则。此规则文件大致遵循 [https://en.wikipedia.org/wiki/INI_file INI 文件格式],文件中每组贴图规则以方括号括住规则组的名字为首行,并附带多行具体规则于其后,首行语法为<code>[规则组名]</code>。例如,在文件'''grass_main.rules'''中,有一组名为'''Grass''' 的贴图规则,它在文件中以 <code>[Grass]</code> 开头。要使用这组规则,您需要在地图编辑器中创建一个使用'''grass_main'''文件作为贴图资源的贴图层:首先要新建一个[[Special:MyLanguage/Mapping#Layers|贴图层]](tile layer),然后右键单击此贴图层并选择资源图片(Image)为'''grass_main''',在此图层画好主体部分后,再次打开刚才的右键菜单并点击'''Auto Rule''',然后在下拉选项中选择'''Grass'''规则组,最后点击'''Auto map'''自动贴图。
作为贴图的图片资源文件,其自动贴图规则通常会写在另一个文本文件中,后缀固定为'''.rules''',规则文件名必须和资源文件名相同;每个'''贴图规则'''文件内可以写入多组自动贴图规则。此规则文件大致遵循 [https://en.wikipedia.org/wiki/INI_file INI 文件格式],文件中每组贴图规则以方括号括住规则组的名字为首行,并附带多行具体规则于其后,首行语法为<code>[规则组名]</code>。例如,在文件'''grass_main.rules'''中,有一组名为'''Grass''' 的贴图规则,它在文件中以 <code>[Grass]</code> 开头。要使用这组规则,您需要在地图编辑器中创建一个使用'''grass_main'''文件作为贴图的贴图层:首先要新建一个[[Special:MyLanguage/Mapping#Layers|贴图层]](tile layer),然后右键单击此贴图层并选择资源图片(Image)为'''grass_main''',在此图层画好主体部分后,再次打开刚才的右键菜单并点击'''Auto Rule''',然后在下拉选项中选择'''Grass'''规则组,最后点击'''Auto map'''自动贴图。


强调:贴图规则的文件名'''必须'''和贴图资源的文件名保持一致。
强调:贴图规则的文件名'''必须'''和贴图资源的文件名保持一致。
Line 27: Line 27:
==贴图规则执行过程==
==贴图规则执行过程==


自动贴图读取规则扫描图层的每个'''位置'''。如果所选方块的所有规则都适用,则该方块将被放在自动贴图扫描的位置。如果多个方块及其规则匹配,则新的规则会生效(因为之前的规则会被覆盖)。[[#Syntax|除非禁用]],否则自动贴图会将其更改先放入缓冲区后再应用。
自动贴图时,从上往下读取规则组的每条规则依次自动执行替换:
[[File:Indices.png|thumb|227x227px|<span lang="en" dir="ltr" class="mw-content-ltr">Tileset indices overview</span>]]
* 规则一般以方块编号开头,并尾随一系列位置关系描述等替换条
* 扫描图层,将同时符合此条规则所有替换条件替换成句首指定编号贴图(此时可能会覆盖先前规则替换好的方块,最后表现为同一位置只执行了后一条规则)。
[[Special:MyLanguage/Automapper#Syntax|除非禁用图层缓存]],否则在同组规则执行时,会先暂时将替换贴图的每个步骤放入缓存而非立即改变图层先前执行规则发生的改变不会立即被后续规则扫描到,最后再将所有变化应用于图层
 
[[File:Indices.png|thumb|227x227px|资源文件分块编号一览]]


<span id="Tile_indices"></span>
<span id="Tile_indices"></span>
==方块索引==
==方块索引==


每个资源文件导入后会被分割成16行16列,以左上角为0号方块,之后从左往右由0到15依次给第一行方块编号,每行编号完毕再到下一行,第二行左边开头为16号方块,依此类推。容易看出方块每次向右一格+1,向下一格+16,对应计算公式为<code>'''编号 = 16 * 行数 + 列数'''</code>(注意第一行和第一列在计算机中默认为第0行和第0列)。资源文件中0号方块的位置通常留空,贴图规则会将它称为<code>EMPTY</code>(空);其余位置的方块无论置空与否都会被当作<code>FULL</code>(满)。
每个资源文件导入后会被分割成16行16列的贴图集,以左上角为0号方块,之后从左往右由0到15依次给第一行方块编号,每行编号完毕再到下一行,第二行左边开头为16号方块,依此类推。容易看出方块每次向右一格+1,向下一格+16,对应计算公式为<code>'''编号 = 16 * 行数 + 列数'''</code>(注意第一行和第一列在计算机中默认为第0行和第0列)。资源文件中0号方块的位置通常留空,贴图规则会将它称为<code>EMPTY</code>(空);其余位置的方块无论置空与否都会被当作<code>FULL</code>(满)。


在规则文件中,编号的关键字是<code>INDEX</code>。  
在规则文件中,编号的关键字是<code>INDEX</code>。  
Line 40: Line 44:
==语法==
==语法==


将您的规则组命名:
'''将您的规则组命名'''


<div lang="en" dir="ltr" class="mw-content-ltr">
与INI文件类似,您可以给贴图规则分段:
Similar to ini-files, you can create your own section for your automapper rule:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>[您的规则组名]</code>
<code>[your-automapper-rule]</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
多个编号选择及其替换条件可以作为一个段落。
Multiple index selections followed by rules can be part of a section.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''如何注释'''
'''Writing a comment''':
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
请使用#号开头,例如:
<code>#this is a comment</code>
<code>#这是一条注释。</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''选择要用于贴图替换的方块编号'''
'''Selecting a tile you want to place''':
</div>


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


<div lang="en" dir="ltr" class="mw-content-ltr">
这一行'''选中'''了42号方块(第三行第11列)。使用<code>OR</code>可以同时选中多个编号,例如同时选中42和43号:
This '''selects''' tile 42 (meaning the 3rd row and 11th column. 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>INDEX 42 OR 43</code>
<code>INDEX 42 OR 43</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''对贴图微调'''
'''Modifying the tile''':
 
</div>
将42号方块做水平和竖直翻转:<code>Index 42 XFLIP YFLIP ROTATE</code>


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>XFLIP</code> 水平翻转;
<code>Index 42 XFLIP YFLIP ROTATE</code>
<code>YFLIP</code> 竖直翻转;
</div>
<code>ROTATE</code> 90°旋转。


<div lang="en" dir="ltr" class="mw-content-ltr">
如果您要将方块旋转180°,可以同时使用<code>XFLIP</code><code>YFLIP</code>,而'''不是'''<code>ROTATE</code>
<code>XFLIP</code> mirrors the tile vertically and <code>YFLIP</code> mirrors the tile horizontally. <code>ROTATE</code> rotates the tile a single time by 90°.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
如果您要将方块旋转270°,可以同时使用<code>XFLIP</code><code>YFLIP</code><code>ROTATE</code>
IF you want to rotate a tile by 180°, you only need to set <code>XFLIP</code> and <code>YFLIP</code> '''but not''' <code>ROTATE</code>.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
方块必须在选中的同时进行微调。
If you want to rotate by 270°, you need to set <code>XFLIP</code>, <code>YFLIP</code> and <code>ROTATE</code>.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
Tile modifications are always in the same line as the selection.
If you want to select a tile without any rotations or flips, you can use <code>NONE</code>. Otherwise all tiles with the given <code>INDEX</code> will be selected.
</div>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''替换条件'''
'''Rule for placing the tile''':
</div>


<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的图块属性是<code>FULL</code>,也就是说[[Special:MyLanguage/Automapper#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">
如果[[Special:MyLanguage/Automapper#Processing|相对位置]]上方存在12号方块,就会满足替换条件。使用<code>OR</code>连接编号来扩大判断条件,例如判断上方有没有12或13号方块其中之一:
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>
如果您在取值的时候'''忘记'''添加<code>%</code>,概率计算时不会除以100,而是按照如下公式:
 
<code>概率 = 1.0 / 取值</code>
 
取值大于100时可以表示更稀有的处于0和1%之间的概率。
 
例如:<code>RANDOM 150</code>得到的概率大约是<code>1.0 / 150 ≈ 0.67</code>。
 
'''模运算'''


<div lang="en" dir="ltr" class="mw-content-ltr">
使用<code>MODULO x的重复周期 y的重复周期 x的偏移坐标 y的偏移坐标</code>,你可以根据图块的X和Y坐标创建一个重复的图案。例如,<code>MODULO 2 3 0 -1</code>使用[https://en.wikipedia.org/wiki/Modular_arithmetic 模运算] 来设置X轴每2个图块重复一次(<code>x的重复周期</code>)上和Y轴每3个图块重复一次(<code>y的重复周期</code>)。第三和第四个参数可以用来X的偏移坐标(这里是0)和Y的偏移坐标(这里是-1),从而移动图案。只有当以下两个规则都成立时,图块才会被放置:
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>(x + x的偏移坐标) % x的重复周期 == 0</code>
<code>percentage = 1.0 / value</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<code>(y + y的偏移坐标) % y的重复周期 == 0</code>
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>%</code>是[https://en.wikipedia.org/wiki/Modulo 模运算符]。
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">
'''默认规则'''
'''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''':
</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''':
</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>


<span id="Tools"></span>
<span id="Tools"></span>
==工具==
==工具==


<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>EMPTY</code><code>FULL</code>,不支持随机贴图和<code>POS INDEX</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 rules++ 介绍]</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>


<span id="Resources"></span>
<span id="Resources"></span>

Revision as of 17:29, 5 May 2025

自動貼圖是一個方便作者製作地圖的工具。只需在貼圖層簡單地制定一些貼圖規則編纂成組運用,就能省去諸如手動在凍結區域邊角放置圓角貼圖此類的麻煩。每組貼圖規則需要指定一個貼圖集(tileset),一般由一個導入的貼圖資源文件構成;單個貼圖集可以預設多種規則以備選用。所有規則文件位於遊戲路徑data/editor/automap/[1][2]


貼圖規則文件

作為貼圖集的圖片資源文件,其自動貼圖規則通常會寫在另一個文本文件中,後綴固定為.rules,規則文件名必須和資源文件名相同;每個貼圖規則文件內可以寫入多組自動貼圖規則。此規則文件大致遵循 INI 文件格式,文件中每組貼圖規則以方括號括住規則組的名字為首行,並附帶多行具體規則於其後,首行語法為[规则组名]。例如,在文件grass_main.rules中,有一組名為Grass 的貼圖規則,它在文件中以 [Grass] 開頭。要使用這組規則,您需要在地圖編輯器中創建一個使用grass_main文件作為貼圖集的貼圖層:首先要新建一個貼圖層(tile layer),然後右鍵單擊此貼圖層並選擇資源圖片(Image)為grass_main,在此圖層畫好主體部分後,再次打開剛才的右鍵菜單並點擊Auto Rule,然後在下拉選項中選擇Grass規則組,最後點擊Auto map自動貼圖。

強調:貼圖規則的文件名必須和貼圖資源的文件名保持一致。

示例的 Grass 自動貼圖規則如下[3]:

[Grass]
Index 1

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

貼圖規則執行過程

自動貼圖時,從上往下讀取規則組的每條規則依次自動執行替換:

  • 規則一般以方塊編號開頭,並尾隨一系列位置關係描述等替換條件;
  • 掃描圖層,將同時符合此條規則所有替換條件的圖塊替換成句首指定的編號貼圖(此時可能會覆蓋先前規則替換好的方塊位置,最後表現為同一位置只執行了最後一條規則)。

除非禁用圖層緩存,否則在同組規則執行時,會先暫時將替換貼圖的每個步驟放入緩存而非立即改變圖層,先前執行規則發生的改變不會立即被後續規則掃描到,最後再將所有變化應用於圖層。

資源文件分塊編號一覽

方塊索引

每個資源文件導入後會被分割成16行16列的貼圖集,以左上角為0號方塊,之後從左往右由0到15依次給第一行方塊編號,每行編號完畢再到下一行,第二行左邊開頭為16號方塊,依此類推。容易看出方塊每次向右一格+1,向下一格+16,對應計算公式為编号 = 16 * 行数 + 列数(注意第一行和第一列在計算機中默認為第0行和第0列)。資源文件中0號方塊的位置通常留空,貼圖規則會將它稱為EMPTY(空);其餘位置的方塊無論置空與否都會被當作FULL(滿)。

在規則文件中,編號的關鍵字是INDEX

語法

將您的規則組命名

與INI文件類似,您可以給貼圖規則分段:

[您的规则组名]

多個編號選擇及其替換條件可以作為一個段落。

如何註釋

請使用#號開頭,例如: #这是一条注释。

選擇要用於貼圖替換的方塊編號

INDEX 42

這一行選中了42號方塊(第三行第11列)。使用OR可以同時選中多個編號,例如同時選中42和43號:

INDEX 42 OR 43

對貼圖微調

將42號方塊做水平和豎直翻轉:Index 42 XFLIP YFLIP ROTATE

XFLIP 水平翻轉; YFLIP 豎直翻轉; ROTATE 90°旋轉。

如果您要將方塊旋轉180°,可以同時使用XFLIPYFLIP,而不是ROTATE

如果您要將方塊旋轉270°,可以同時使用XFLIPYFLIPROTATE

方塊必須在選中的同時進行微調。

If you want to select a tile without any rotations or flips, you can use NONE. Otherwise all tiles with the given INDEX will be selected.

替換條件

在編號選擇的語句下方有一系列替換條件,如果一個圖塊符合所有條件就會被該編號貼圖替換。 例如下方採用相對坐標的位置描述:

POS 0 -1 FULL

這條規則描述替換條件是在X坐標為0、Y坐標為-1的圖塊屬性是FULL,也就是說相對位置上方一格有FULL圖塊的方塊會被編號方塊替換(其它位置條件也滿足時)。如果上方是EMPTY則不會。

除了FULLEMPTY之外,您還可以直接指定方塊編號INDEX

POS 0 -1 INDEX 12

如果相對位置上方存在12號方塊,就會滿足替換條件。使用OR連接編號來擴大判斷條件,例如判斷上方有沒有12或13號方塊其中之一:

POS 0 -1 INDEX 12 OR 13

類似可以用NOTINDEX來反選一個編號。

隨機規則

通過添加隨機規則,您可以讓一些方塊按照一定概率出現在貼圖中:

RANDOM 20%

隨機規則可以從0到100%取值,這個值是此編號的替換概率[4]

如果您在取值的時候忘記添加%,概率計算時不會除以100,而是按照如下公式:

概率 = 1.0 / 取值

取值大於100時可以表示更稀有的處於0和1%之間的概率。

例如:RANDOM 150得到的概率大約是1.0 / 150 ≈ 0.67

模運算

使用MODULO x的重复周期 y的重复周期 x的偏移坐标 y的偏移坐标,你可以根據圖塊的X和Y坐標創建一個重複的圖案。例如,MODULO 2 3 0 -1使用模運算 來設置X軸每2個圖塊重複一次(x的重复周期)上和Y軸每3個圖塊重複一次(y的重复周期)。第三和第四個參數可以用來X的偏移坐標(這裏是0)和Y的偏移坐標(這裏是-1),從而移動圖案。只有當以下兩個規則都成立時,圖塊才會被放置:

(x + x的偏移坐标) % x的重复周期 == 0

(y + y的偏移坐标) % y的重复周期 == 0

這裏%模運算符

默認規則

遊戲會自動在所有規則下默認添加一條替換條件,用於判斷被替換處原本是否有方塊,如果原本就是空的,默認也不會更改此處。即默認添加如下條件:

POS 0 0 FULL

如果你想把圖層空白處也納入替換範圍,可以添加下方的替換條件:

NoDefaultRule

釋放緩存

通過在段落中添加代碼NewRun,當自動貼圖執行到這一行時,會立即將緩存好的變化應用於圖層,後續規則會受到前面貼圖改變情況的影響。簡單用法是在這一行前面完成基礎造型,後面進行細緻裝飾(例如在一些邊角額外添加可能會超出原有貼圖範圍的裝飾)。

禁用圖層緩存

通過在段落中添加代碼NoLayerCopy可以快速替換貼圖,顯著改善性能,因為自動貼圖每條規則替換都直接應用於圖層,而不會暫時緩存。但是也可能會造成一些意外結果!

工具

下面是一些方便製作貼圖規則的工具:

  • SimpleDDNetAutomapper:一個帶圖形界面的簡單應用,有助於處理基本貼圖規則和貼圖集。但是它只支持EMPTYFULL,不支持隨機貼圖和POS INDEX規則。
  • Teeworlds Web Editor:自動貼圖編輯和實時預覽[5]
  • rpp:rules++是一個小嘗試,致力於通過激發DDNet貼圖規則的潛能把地圖作者變成懶狗。也就是說它非常簡單、易讀並極重視正確性,就別管其它了[6]

參考資料