# Lua-Skript-API von pxstud.io — Tilemaps

> Teil der Lua-Skript-Referenz von pxstud.io, deren Übersicht (https://pxstud.io/de/docs/scripting.md) die Konventionen erklärt. Die Optionsgruppen und Typen, auf die sie verweist, stehen in https://pxstud.io/de/docs/scripting/option-groups.md und https://pxstud.io/de/docs/scripting/types.md. Alles in einer Datei (auf Englisch): https://pxstud.io/llms-full.txt. Das Verzeichnis der ganzen Website (auf Englisch): https://pxstud.io/llms.txt.

### Tilemaps
Tilemap-Ebenen platzieren Tiles aus ihrem eigenen Tileset auf einem Raster. Tiles werden ab 1 nummeriert (0 ist das leere Tile).

#### `app.addTilemapLayer(name?, tileWidth, tileHeight, parentId?, tilesetLayerId?)` — ändert, rückgängig machbar
Erstellt eine neue Tilemap-Ebene mit einem leeren Tileset aus Tiles der Größe tileWidth x tileHeight über allen anderen Ebenen (oder über den Ebenen der Gruppe parentId) und macht sie aktiv. Verwende app.addTilemapTile, um ihr Tiles hinzuzufügen. Mit tilesetLayerId teilt sich die Ebene das Tileset jener Ebene: Das Bearbeiten, Hinzufügen oder Entfernen von Tiles wirkt auf beide.

- `name` (string, optional) — Ebenenname; Standard ist 'Tilemap N'.
- `tileWidth` (number)
- `tileHeight` (number)
- `parentId` (string, optional) — Eine Gruppe, der sie hinzugefügt wird (über ihren Ebenen); ohne Angabe = die oberste Ebene.
- `tilesetLayerId` (string, optional) — Teilt das Tileset dieser bestehenden Tilemap-Ebene, statt ein neues zu erstellen (tileWidth und tileHeight werden dann ignoriert).

Gibt zurück (string): Die ID der neuen Tilemap-Ebene.

#### `app.addTilemapTile(layerId, pixels?)` — ändert, rückgängig machbar
Hängt ein Tile an das Tileset einer Tilemap-Ebene an und gibt seinen Tile-Index zurück (1-basiert; 0 ist das implizite leere Tile). Löst einen Fehler aus, wenn layerId keine Tilemap-Ebene ist.

- `layerId` (string)
- `pixels` (table, optional) — Flacher Pixelpuffer (RGBA = 4 Zahlen pro Pixel, indiziert = 1) in der Größe des Tiles; ohne Angabe ein transparentes Tile.

Gibt zurück (number): Der 1-basierte Index des neuen Tiles.

#### `app.clearTilemapTile(layerId, tileIndex)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Macht ein Tile vollständig transparent. Jede Platzierung davon wird leer.

- `layerId` (string)
- `tileIndex` (number) — 1-basierter Tile-Index.

Gibt nichts zurück.

#### `app.convertToNormalLayer(layerId)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Wandelt eine Tilemap-Ebene in eine Bildebene um und rastert ihre Tile-Platzierungen in jedem Frame in ein Cel (Ebene > In normale Ebene umwandeln). Die Ebene behält ihre ID. Ein Rückgängig-Schritt.

- `layerId` (string) — Eine Tilemap-Ebene.

Gibt nichts zurück.

#### `app.convertToTilemap(layerId, tileWidth, tileHeight, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Wandelt eine Bildebene in eine Tilemap-Ebene um, mit einem neuen Tileset aus Tiles der Größe tileWidth x tileHeight, die aus ihren Cels in jedem Frame geschnitten werden (Ebene > In Tilemap umwandeln). Die Ebene behält ihre ID; ihre Cels werden zu Tile-Platzierungen. Ein Rückgängig-Schritt.

- `layerId` (string) — Eine Bildebene (nicht die Hintergrundebene).
- `tileWidth` (number)
- `tileHeight` (number)
- `opts` (table, optional)
  - `dedupe` (boolean; Standard true) — Identische Tiles gemeinsam nutzen.
  - `matchFlips` (boolean; Standard false) — Nutzt auch Tiles gemeinsam, die gespiegelt oder um 90 Grad gedreht übereinstimmen (und schaltet die Abgleich-Optionen des Tilesets ein).

Gibt nichts zurück.

#### `app.duplicateTilemapTile(layerId, tileIndex)` — ändert, rückgängig machbar
Hängt eine Kopie eines Tiles ans Ende des Tilesets einer Tilemap-Ebene an (ihr Index ist die alte Tile-Anzahl + 1).

- `layerId` (string)
- `tileIndex` (number) — 1-basierter Index des zu kopierenden Tiles.

Gibt zurück (number): Der 1-basierte Tile-Index der Kopie.

#### `app.fillTiles(layerId, frameId, col, row, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Tile-Eimer: füllt die Zellen, die dasselbe Tile wie die Zelle (col, row) enthalten, mit einem Tile (eine leere Zelle ist Tile 0) – genau der Eimer der Oberfläche im Modus Tiles platzieren. Die Füllung bleibt innerhalb des Tile-Rasters der Leinwand.

- `layerId` (string) — Eine Tilemap-Ebene.
- `frameId` (string)
- `col` (number) — Die angeklickte Spalte des Tile-Rasters (kein Sprite-Pixel).
- `row` (number) — Die angeklickte Zeile des Tile-Rasters.
- `opts` (table, optional) Akzeptiert außerdem **Platzierungsoptionen** (siehe „Optionsgruppen“) sowie:
  - `contiguous` (boolean; Standard context.bucketFillMode (true für den Modus Zusammenhängend des Kontexts, false für Global)) — Nur die verbundenen Zellen (true) oder jede Zelle, die das Tile der angeklickten Zelle enthält (false).
  - `tileIndex` (integer ≥ 1; Standard context.tileIndex) — Das 1-basierte Tile, mit dem gefüllt wird.
  - `flipH` (boolean; Standard context.tileFlipH) — Spiegelt platzierte Tiles horizontal.
  - `flipV` (boolean; Standard context.tileFlipV) — Spiegelt platzierte Tiles vertikal.
  - `rotate90` (boolean; Standard context.tileRotate90) — Dreht platzierte Tiles um 90° im Uhrzeigersinn (nur quadratische Tiles).

Gibt nichts zurück.

#### `app.getTilemap(layerId, frameId)` — liest
Die Tile-Platzierungen einer Tilemap-Ebene in einem Frame als { x, y (Zelle des Tile-Rasters), tileIndex, flipH, flipV, rotate90 } – die Form, die app.setTilemapInstances erwartet. Verknüpfte Frames melden ihre gemeinsamen Platzierungen.

- `layerId` (string) — Eine Tilemap-Ebene.
- `frameId` (string)

Gibt zurück (table): Array von Platzierungstabellen.

#### `app.getTilePixels(layerId, tileIndex)` — liest
Das Bild eines Tiles als flache RGBA-Liste (tileWidth*tileHeight*4, zeilenweise; Palettenfarben werden bei indizierten Sprites aufgelöst).

- `layerId` (string) — Eine Tilemap-Ebene.
- `tileIndex` (number) — 1-basiertes Tile.

Gibt zurück (table): Flache RGBA-Liste.

#### `app.getTileset(layerId)` — liest
Das Tileset einer Tilemap-Ebene als { tileWidth, tileHeight, tileCount, matchFlipH, matchFlipV, matchRotate, baseIndex, name?, id? } (die match-Flags sind die Auto-Zeichnen-Optionen, siehe app.setTilesetMatch; baseIndex ist die Nummer, mit der das erste Tile angezeigt wird, siehe app.setTilesetProperties; id ist vorhanden, wenn Ebenen das Tileset teilen, und gleiche IDs bedeuten dasselbe Tileset). Tiles werden 1..tileCount nummeriert (0 = das leere Tile).

- `layerId` (string) — Eine Tilemap-Ebene.

Gibt zurück (table): Tileset-Tabelle.

#### `app.importTilesFromImage(layerId, width, height, pixels, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Schneidet ein Bild in Zellen der Größe tileWidth x tileHeight in das Tileset der Ebene (Randzellen werden mit Transparenz aufgefüllt) und hängt die Tiles an, die noch nicht vorhanden sind. Mit frameId platziert es das Ergebnis auch in diesem Frame. Ein Rückgängig-Schritt.

- `layerId` (string) — Eine Tilemap-Ebene.
- `width` (number) — Bildbreite in Pixeln.
- `height` (number) — Bildhöhe in Pixeln.
- `pixels` (table) — Flache RGBA-Zahlen (4 pro Pixel, width*height Pixel).
- `opts` (table, optional)
  - `dedupe` (boolean; Standard true) — Verwendet identische Tiles wieder, statt Duplikate hinzuzufügen.
  - `matchFlips` (boolean; Standard false) — Mit dedupe: verwendet auch ein Tile wieder, das horizontal/vertikal gespiegelt oder um 90 Grad gedreht übereinstimmt (quadratische Tiles), und platziert es mit den passenden Flags.
  - `skipEmpty` (boolean; Standard true) — Zellen ohne sichtbares Pixel ergeben kein Tile.
  - `frameId` (string) — Platziert die geschnittenen Zellen auch in diesem Frame der Ebene und ersetzt die Zellen, die das Bild abdeckt.
  - `col` (integer; Standard 0) — Tile-Spalte der linken Bildkante beim Platzieren.
  - `row` (integer; Standard 0) — Tile-Zeile der oberen Bildkante beim Platzieren.

Gibt zurück (number): Wie viele Tiles hinzugefügt wurden.

#### `app.moveTilemapTile(layerId, from, to)` — ändert, rückgängig machbar
Verschiebt ein Tile an eine neue Position im Tileset und ordnet jede Platzierung neu zu, sodass sich optisch nichts ändert.

- `layerId` (string)
- `from` (number) — 1-basierter aktueller Tile-Index.
- `to` (number) — 1-basierter Tile-Index nach dem Verschieben.

Gibt nichts zurück.

#### `app.paintTilemapPixels(layerId, frameId, x, y, width, height, pixels, mode)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Malt Pixel im Leinwandraum auf eine Tilemap-Ebene und schreibt dabei durch Spiegelung/Drehung jeder Tile-Platzierung hindurch. Ein Rückgängig-Schritt.

- `layerId` (string)
- `frameId` (string)
- `x` (number) — Linke Kante des geschriebenen Bereichs im Leinwandraum.
- `y` (number) — Obere Kante des geschriebenen Bereichs im Leinwandraum.
- `width` (number)
- `height` (number)
- `pixels` (table) — Flache RGBA-Zahlen (4 pro Pixel, width*height Pixel); Alpha 0 radiert.
- `mode` (TilePaintMode: "edit" | "auto") — "edit" ändert die Tiles, die die Zellen bereits verwenden (alle Platzierungen werden aktualisiert); "auto" arbeitet pro bemalter Zelle wie Aseprite Auto: verwendet ein identisches Tile wieder (oder ein gespiegeltes/gedrehtes, laut app.setTilesetMatch), sonst ein Copy-on-Write-/neues Tile, und entfernt dann Tiles, die die Änderung unbenutzt hinterlassen hat.

Gibt nichts zurück.

#### `app.removeTilemapTile(layerId, tileIndex)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Löscht ein Tile aus dem Tileset einer Tilemap-Ebene. Seine Platzierungen werden geleert; Platzierungen von Tiles mit höherer Nummer rücken um eins nach unten, sodass sie dasselbe Bild zeigen (genau das Löschen des Tileset-Bedienfelds).

- `layerId` (string) — Eine Tilemap-Ebene.
- `tileIndex` (number) — 1-basiertes Tile, das gelöscht wird.

Gibt nichts zurück.

#### `app.setTilemapInstances(layerId, frameId, instances)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Ersetzt die Tile-Platzierungen einer Tilemap-Ebene für einen Frame. x/y sind Koordinaten im Tile-Raster. Löst einen Fehler aus, wenn layerId keine Tilemap-Ebene ist.

- `layerId` (string)
- `frameId` (string)
- `instances` (table) — Array von {x, y, tileIndex, flipH, flipV, rotate90}-Tabellen, die die Platzierungen dieses Frames ersetzen; leer löscht sie.

Gibt nichts zurück.

#### `app.setTilemapTilePixels(layerId, tileIndex, pixels)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Ersetzt die Pixel eines Tiles einer Tilemap-Ebene. Jede Platzierung dieses Tiles (alle Frames, beliebige Spiegelung/Drehung) wird sofort aktualisiert. Löst einen Fehler bei ungültiger layerId, ungültigem Index oder falscher Pixellänge aus.

- `layerId` (string)
- `tileIndex` (number)
- `pixels` (table) — Flacher Pixelpuffer (RGBA = 4 Zahlen pro Pixel, indiziert = 1) in der Größe des Tiles.

Gibt nichts zurück.

#### `app.setTilesetMatch(layerId, flipH, flipV, rotate)` — ändert, rückgängig machbar
Setzt die Optionen „match flips“ des Tilesets: Beim Tilemap-Malen im Modus "auto" verwenden neue Pixel, die einem gespiegelten/gedrehten vorhandenen Tile entsprechen, dieses Tile mit gesetzten Platzierungs-Flags wieder, statt ein Tile zu erstellen.

- `layerId` (string) — Eine Tilemap-Ebene.
- `flipH` (boolean) — Gleicht horizontal gespiegelte Tiles ab.
- `flipV` (boolean) — Gleicht vertikal gespiegelte Tiles ab.
- `rotate` (boolean) — Gleicht um 90 Grad gedrehte Tiles ab (nur quadratische Tiles).

Gibt nichts zurück.

#### `app.setTilesetProperties(layerId, name?, baseIndex?)` — ändert, rückgängig machbar
Setzt Namen und Basisindex eines Tilesets. Der Basisindex ändert nur, wie Tiles im Tileset-Bedienfeld und in Aseprite nummeriert werden; Tile-Indizes in Skripten bleiben 1-basiert. Gilt für jede Ebene, die das Tileset teilt.

- `layerId` (string) — Eine Tilemap-Ebene.
- `name` (string, optional) — Der Name des Tilesets; "" löscht ihn; nil lässt ihn unverändert.
- `baseIndex` (number, optional) — Der Basisindex von Aseprite: die Nummer, mit der das erste Tile angezeigt wird (Standard 1), -32768 bis 32767; nil lässt ihn unverändert.

Gibt nichts zurück.

#### `app.stampTiles(layerId, frameId, cells, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Stempelt ein Tile in die angegebenen Zellen des Tile-Rasters einer Tilemap-Ebene (oder leert sie mit erase) – genau der Tile-Stempel der Oberfläche. Unberührte Zellen behalten ihre Platzierungen. Mit symmetry bekommen die gespiegelten Zellen das gespiegelte Tile (Spiegelungen spiegeln mit); mit respectSelection werden Zellen außerhalb der Auswahl übersprungen.

- `layerId` (string) — Eine Tilemap-Ebene.
- `frameId` (string)
- `cells` (table) — Liste von Zellen des TILE-RASTERS { x = col, y = row } (oder { col, row }) – keine Sprite-Pixel.
- `opts` (table, optional) Akzeptiert außerdem **Platzierungsoptionen** (siehe „Optionsgruppen“) sowie:
  - `tileIndex` (integer ≥ 0; Standard context.tileIndex) — Das 1-basierte Tile, das platziert wird.
  - `flipH` (boolean; Standard context.tileFlipH) — Spiegelt platzierte Tiles horizontal.
  - `flipV` (boolean; Standard context.tileFlipV) — Spiegelt platzierte Tiles vertikal.
  - `rotate90` (boolean; Standard context.tileRotate90) — Dreht platzierte Tiles um 90° im Uhrzeigersinn (nur quadratische Tiles).
  - `erase` (boolean; Standard false) — Entfernt die Platzierungen der Zellen, statt ein Tile zu platzieren.

Gibt nichts zurück.
