diff --git a/Extensions/TileMap/AbstractTileMapRuntimeObject.ts b/Extensions/TileMap/AbstractTileMapRuntimeObject.ts
new file mode 100644
index 000000000000..fdffe0689bc9
--- /dev/null
+++ b/Extensions/TileMap/AbstractTileMapRuntimeObject.ts
@@ -0,0 +1,567 @@
+///
+namespace gdjs {
+ /**
+ * Displays a Tilemap object (LDtk and Tiled).
+ * @category Objects > Tile Map
+ */
+ export abstract class AbstractTileMapRuntimeObject
+ extends gdjs.RuntimeObject
+ implements gdjs.TileMap
+ {
+ /**
+ * A reusable Point to avoid allocations.
+ */
+ private static readonly workingPoint: FloatPoint = [0, 0];
+
+ private _sceneToTileMapTransformation: gdjs.AffineTransformation =
+ new gdjs.AffineTransformation();
+ private _tileMapToSceneTransformation: gdjs.AffineTransformation =
+ new gdjs.AffineTransformation();
+ private _transformationIsUpToDate: boolean = false;
+
+ constructor(
+ instanceContainer: gdjs.RuntimeInstanceContainer,
+ objectData: ObjectData,
+ instanceData?: InstanceData
+ ) {
+ super(instanceContainer, objectData, instanceData);
+ }
+
+ abstract getTileMap(): TileMapHelper.EditableTileMap | null;
+
+ /**
+ * Return a tile map that is safe to modify.
+ */
+ abstract getTileMapForEdition(): TileMapHelper.EditableTileMap | null;
+
+ abstract getCollisionTileMap(): gdjs.TileMap.TransformedCollisionTileMap | null;
+
+ /**
+ * Return the layer that is used to edit and read tiles.
+ */
+ abstract getEditedLayerIndex(): integer;
+
+ abstract getCollisionMaskTag(): string;
+
+ abstract getScaleX(): float;
+
+ abstract getScaleY(): float;
+
+ abstract invalidateTileMap(): void;
+
+ /**
+ * This method is expensive and should not be called.
+ * Prefer using {@link getHitBoxesAround} rather than getHitBoxes.
+ */
+ override getHitBoxes(): gdjs.Polygon[] {
+ return super.getHitBoxes();
+ }
+
+ override updateHitBoxes(): void {
+ this.updateTransformation();
+ const collisionTileMap = this.getCollisionTileMap();
+ if (!collisionTileMap) return;
+ this.hitBoxes = Array.from(
+ collisionTileMap.getAllHitboxes(this.getCollisionMaskTag())
+ );
+ this.hitBoxesDirty = false;
+ this.updateAABB();
+ }
+
+ // This implementation doesn't use updateHitBoxes.
+ // It's important for good performances.
+ override getAABB(): AABB {
+ // It's fine to compute it every time because tile maps are rarely rotated.
+ // It avoids calling updateHitBoxes to rely on hitBoxesDirty to know when
+ // to update.
+ this.updateAABB();
+ return this.aabb;
+ }
+
+ // This implementation doesn't use updateHitBoxes.
+ // It's important for good performances.
+ override updateAABB(): void {
+ if (this.getAngle() === 0) {
+ // Fast computation of AABB for non rotated object
+ this.aabb.min[0] = this.x;
+ this.aabb.min[1] = this.y;
+ this.aabb.max[0] = this.aabb.min[0] + this.getWidth();
+ this.aabb.max[1] = this.aabb.min[1] + this.getHeight();
+ } else {
+ const collisionTileMap = this.getCollisionTileMap();
+ if (!collisionTileMap) return;
+ const affineTransformation = collisionTileMap.getTransformation();
+
+ const left = 0;
+ const right = collisionTileMap.getWidth();
+ const top = 0;
+ const bottom = collisionTileMap.getHeight();
+
+ const workingPoint = this.aabb.min;
+
+ workingPoint[0] = left;
+ workingPoint[1] = top;
+ affineTransformation.transform(workingPoint, workingPoint);
+ const topLeftX = workingPoint[0];
+ const topLeftY = workingPoint[1];
+
+ workingPoint[0] = right;
+ workingPoint[1] = top;
+ affineTransformation.transform(workingPoint, workingPoint);
+ const topRightX = workingPoint[0];
+ const topRightY = workingPoint[1];
+
+ workingPoint[0] = right;
+ workingPoint[1] = bottom;
+ affineTransformation.transform(workingPoint, workingPoint);
+ const bottomRightX = workingPoint[0];
+ const bottomRightY = workingPoint[1];
+
+ workingPoint[0] = left;
+ workingPoint[1] = bottom;
+ affineTransformation.transform(workingPoint, workingPoint);
+ const bottomLeftX = workingPoint[0];
+ const bottomLeftY = workingPoint[1];
+
+ this.aabb.min[0] = Math.min(
+ topLeftX,
+ topRightX,
+ bottomRightX,
+ bottomLeftX
+ );
+ this.aabb.max[0] = Math.max(
+ topLeftX,
+ topRightX,
+ bottomRightX,
+ bottomLeftX
+ );
+ this.aabb.min[1] = Math.min(
+ topLeftY,
+ topRightY,
+ bottomRightY,
+ bottomLeftY
+ );
+ this.aabb.max[1] = Math.max(
+ topLeftY,
+ topRightY,
+ bottomRightY,
+ bottomLeftY
+ );
+ }
+ }
+
+ getHitBoxesAround(
+ left: float,
+ top: float,
+ right: float,
+ bottom: float
+ ): Iterable {
+ // This implementation doesn't call updateHitBoxes.
+ // It's important for good performances because there is no need to
+ // update the whole collision mask where only a few hitboxes must be
+ // checked.
+ this.updateTransformation();
+ const collisionTileMap = this.getCollisionTileMap();
+ if (!collisionTileMap) {
+ return [];
+ }
+ return collisionTileMap.getHitboxesAround(
+ this.getCollisionMaskTag(),
+ left,
+ top,
+ right,
+ bottom
+ );
+ }
+
+ override isSpatiallyIndexed(): boolean {
+ return true;
+ }
+
+ invalidateTransformation(): void {
+ this._transformationIsUpToDate = false;
+ }
+
+ updateTransformation() {
+ if (this._transformationIsUpToDate) {
+ return;
+ }
+
+ this._tileMapToSceneTransformation.setToIdentity();
+ this._tileMapToSceneTransformation.translate(this.getX(), this.getY());
+ this._tileMapToSceneTransformation.rotateAround(
+ (this.getAngle() * Math.PI) / 180,
+ this.getCenterX(),
+ this.getCenterY()
+ );
+ this._tileMapToSceneTransformation.scale(
+ Math.abs(this.getScaleX()),
+ Math.abs(this.getScaleY())
+ );
+ const collisionTileMap = this.getCollisionTileMap();
+ if (collisionTileMap) {
+ const collisionTileMapTransformation =
+ collisionTileMap.getTransformation();
+ collisionTileMapTransformation.copyFrom(
+ this._tileMapToSceneTransformation
+ );
+ collisionTileMap.setTransformation(collisionTileMapTransformation);
+ }
+ this._sceneToTileMapTransformation.copyFrom(
+ this._tileMapToSceneTransformation
+ );
+ this._sceneToTileMapTransformation.invert();
+ this._transformationIsUpToDate = true;
+ }
+
+ /**
+ * The returned array is alway the same.
+ */
+ getGridCoordinatesFromSceneCoordinates(
+ x: float,
+ y: float
+ ): [integer, integer] {
+ this.updateTransformation();
+ const result = AbstractTileMapRuntimeObject.workingPoint;
+ const tileMap = this.getTileMap();
+ if (!tileMap) {
+ result[0] = 0;
+ result[1] = 0;
+ return result;
+ }
+ this._sceneToTileMapTransformation.transform([x, y], result);
+
+ result[0] = Math.floor(result[0] / tileMap.getTileWidth());
+ result[1] = Math.floor(result[1] / tileMap.getTileHeight());
+ return result;
+ }
+
+ getGridRowCount(): integer {
+ const tileMap = this.getTileMap();
+ return tileMap ? tileMap.getDimensionY() : 0;
+ }
+
+ getGridColumnCount(): integer {
+ const tileMap = this.getTileMap();
+ return tileMap ? tileMap.getDimensionX() : 0;
+ }
+
+ /**
+ * @param x The layer column.
+ * @param y The layer row.
+ * @param layerIndex The layer index.
+ * @returns The tile's id.
+ */
+ private getTileId(x: integer, y: integer, layerIndex: integer): integer {
+ const tileMap = this.getTileMap();
+ if (!tileMap) return -1;
+ return tileMap.getTileId(x, y, layerIndex);
+ }
+
+ /**
+ * @param x The layer column.
+ * @param y The layer row.
+ * @param layerIndex The layer index.
+ */
+ private isTileFlippedOnX(
+ x: integer,
+ y: integer,
+ layerIndex: integer
+ ): boolean {
+ const tileMap = this.getTileMap();
+ if (!tileMap) return false;
+ return tileMap.isTileFlippedOnX(x, y, layerIndex);
+ }
+
+ /**
+ * @param x The layer column.
+ * @param y The layer row.
+ * @param layerIndex The layer index.
+ */
+ private isTileFlippedOnY(
+ x: integer,
+ y: integer,
+ layerIndex: integer
+ ): boolean {
+ const tileMap = this.getTileMap();
+ if (!tileMap) return false;
+ return tileMap.isTileFlippedOnY(x, y, layerIndex);
+ }
+
+ getSceneXCoordinateOfTileCenter(
+ columnIndex: integer,
+ rowIndex: integer
+ ): float {
+ const tileMap = this.getTileMap();
+ if (!tileMap) {
+ return 0;
+ }
+ const sceneCoordinates: FloatPoint =
+ AbstractTileMapRuntimeObject.workingPoint;
+ this._tileMapToSceneTransformation.transform(
+ [
+ (columnIndex + 0.5) * tileMap.getTileWidth(),
+ (rowIndex + 0.5) * tileMap.getTileHeight(),
+ ],
+ sceneCoordinates
+ );
+ return sceneCoordinates[0];
+ }
+
+ getSceneYCoordinateOfTileCenter(
+ columnIndex: integer,
+ rowIndex: integer
+ ): float {
+ const tileMap = this.getTileMap();
+ if (!tileMap) {
+ return 0;
+ }
+ const sceneCoordinates: FloatPoint =
+ AbstractTileMapRuntimeObject.workingPoint;
+ this._tileMapToSceneTransformation.transform(
+ [
+ (columnIndex + 0.5) * tileMap.getTileWidth(),
+ (rowIndex + 0.5) * tileMap.getTileHeight(),
+ ],
+ sceneCoordinates
+ );
+ return sceneCoordinates[1];
+ }
+
+ getColumnIndexAtPosition(x: float, y: float): integer {
+ return this.getGridCoordinatesFromSceneCoordinates(x, y)[0];
+ }
+
+ getRowIndexAtPosition(x: float, y: float): integer {
+ return this.getGridCoordinatesFromSceneCoordinates(x, y)[1];
+ }
+
+ getTileAtPosition(x: float, y: float): integer {
+ const [columnIndex, rowIndex] =
+ this.getGridCoordinatesFromSceneCoordinates(x, y);
+ return this.getTileAtGridCoordinates(columnIndex, rowIndex);
+ }
+
+ getTileAtGridCoordinates(columnIndex: integer, rowIndex: integer): integer {
+ return this.getTileId(columnIndex, rowIndex, this.getEditedLayerIndex());
+ }
+
+ setTileAtPosition(tileId: number, x: float, y: float) {
+ const [columnIndex, rowIndex] =
+ this.getGridCoordinatesFromSceneCoordinates(x, y);
+ this.setTileAtGridCoordinates(tileId, columnIndex, rowIndex);
+ }
+
+ setTileAtGridCoordinates(
+ tileId: number,
+ columnIndex: integer,
+ rowIndex: integer
+ ) {
+ const tileMap = this.getTileMapForEdition();
+ if (!tileMap) {
+ return;
+ }
+ const layer = tileMap.getTileLayer(this.getEditedLayerIndex());
+ if (!layer) {
+ return;
+ }
+ const oldTileId = layer.getTileId(columnIndex, rowIndex);
+ if (tileId === oldTileId) {
+ return;
+ }
+ layer.setTile(columnIndex, rowIndex, tileId);
+
+ const collisionTileMap = this.getCollisionTileMap();
+ if (collisionTileMap) {
+ const oldTileDefinition =
+ oldTileId !== undefined && tileMap.getTileDefinition(oldTileId);
+ const newTileDefinition = tileMap.getTileDefinition(tileId);
+ const hadFullHitBox =
+ !!oldTileDefinition &&
+ oldTileDefinition.hasFullHitBox(this.getCollisionMaskTag());
+ const haveFullHitBox =
+ !!newTileDefinition &&
+ newTileDefinition.hasFullHitBox(this.getCollisionMaskTag());
+ if (hadFullHitBox !== haveFullHitBox) {
+ collisionTileMap.invalidateTile(
+ this.getEditedLayerIndex(),
+ columnIndex,
+ rowIndex
+ );
+ }
+ }
+ this.invalidateTileMap();
+ }
+
+ flipTileOnYAtPosition(x: float, y: float, flip: boolean) {
+ const [columnIndex, rowIndex] =
+ this.getGridCoordinatesFromSceneCoordinates(x, y);
+ this.flipTileOnYAtGridCoordinates(columnIndex, rowIndex, flip);
+ }
+
+ flipTileOnXAtPosition(x: float, y: float, flip: boolean) {
+ const [columnIndex, rowIndex] =
+ this.getGridCoordinatesFromSceneCoordinates(x, y);
+ this.flipTileOnXAtGridCoordinates(columnIndex, rowIndex, flip);
+ }
+
+ flipTileOnYAtGridCoordinates(
+ columnIndex: integer,
+ rowIndex: integer,
+ flip: boolean
+ ) {
+ this.flipTileOnY(columnIndex, rowIndex, this.getEditedLayerIndex(), flip);
+ this.invalidateTileMap();
+ // No need to invalidate hit boxes since at the moment, collision mask
+ // cannot be configured on each tile.
+ }
+
+ flipTileOnXAtGridCoordinates(
+ columnIndex: integer,
+ rowIndex: integer,
+ flip: boolean
+ ) {
+ this.flipTileOnX(columnIndex, rowIndex, this.getEditedLayerIndex(), flip);
+ this.invalidateTileMap();
+ // No need to invalidate hit boxes since at the moment, collision mask
+ // cannot be configured on each tile.
+ }
+
+ /**
+ * @param x The layer column.
+ * @param y The layer row.
+ * @param layerIndex The layer index.
+ * @param flip true if the tile should be flipped.
+ */
+ private flipTileOnY(
+ x: integer,
+ y: integer,
+ layerIndex: integer,
+ flip: boolean
+ ) {
+ const tileMap = this.getTileMapForEdition();
+ if (!tileMap) return;
+ tileMap.flipTileOnY(x, y, layerIndex, flip);
+ }
+
+ /**
+ * @param x The layer column.
+ * @param y The layer row.
+ * @param layerIndex The layer index.
+ * @param flip true if the tile should be flipped.
+ */
+ private flipTileOnX(
+ x: integer,
+ y: integer,
+ layerIndex: integer,
+ flip: boolean
+ ) {
+ const tileMap = this.getTileMapForEdition();
+ if (!tileMap) return;
+ tileMap.flipTileOnX(x, y, layerIndex, flip);
+ }
+
+ isTileFlippedOnXAtPosition(x: float, y: float) {
+ const [columnIndex, rowIndex] =
+ this.getGridCoordinatesFromSceneCoordinates(x, y);
+
+ return this.isTileFlippedOnX(
+ columnIndex,
+ rowIndex,
+ this.getEditedLayerIndex()
+ );
+ }
+
+ isTileFlippedOnXAtGridCoordinates(columnIndex: integer, rowIndex: integer) {
+ return this.isTileFlippedOnX(
+ columnIndex,
+ rowIndex,
+ this.getEditedLayerIndex()
+ );
+ }
+
+ isTileFlippedOnYAtPosition(x: float, y: float) {
+ const [columnIndex, rowIndex] =
+ this.getGridCoordinatesFromSceneCoordinates(x, y);
+
+ return this.isTileFlippedOnY(
+ columnIndex,
+ rowIndex,
+ this.getEditedLayerIndex()
+ );
+ }
+
+ isTileFlippedOnYAtGridCoordinates(columnIndex: integer, rowIndex: integer) {
+ return this.isTileFlippedOnY(
+ columnIndex,
+ rowIndex,
+ this.getEditedLayerIndex()
+ );
+ }
+
+ removeTileAtPosition(x: float, y: float) {
+ const [columnIndex, rowIndex] =
+ this.getGridCoordinatesFromSceneCoordinates(x, y);
+ this.removeTileAtGridCoordinates(columnIndex, rowIndex);
+ }
+
+ removeTileAtGridCoordinates(columnIndex: integer, rowIndex: integer) {
+ const tileMap = this.getTileMapForEdition();
+ if (!tileMap) {
+ return;
+ }
+ const layer = tileMap.getTileLayer(this.getEditedLayerIndex());
+ if (!layer) {
+ return;
+ }
+ const oldTileId = layer.getTileId(columnIndex, rowIndex);
+ if (oldTileId === undefined) {
+ return;
+ }
+ layer.removeTile(columnIndex, rowIndex);
+
+ const collisionTileMap = this.getCollisionTileMap();
+ if (collisionTileMap) {
+ const oldTileDefinition =
+ oldTileId !== undefined && tileMap.getTileDefinition(oldTileId);
+ const hadFullHitBox =
+ !!oldTileDefinition &&
+ oldTileDefinition.hasFullHitBox(this.getCollisionMaskTag());
+ if (hadFullHitBox) {
+ collisionTileMap.invalidateTile(
+ this.getEditedLayerIndex(),
+ columnIndex,
+ rowIndex
+ );
+ }
+ }
+ this.invalidateTileMap();
+ }
+
+ setGridRowCount(targetRowCount: integer) {
+ const tileMap = this.getTileMapForEdition();
+ if (targetRowCount <= 0) return;
+ if (!tileMap) return;
+ tileMap.setDimensionY(targetRowCount);
+ const collisionTileMap = this.getCollisionTileMap();
+ if (collisionTileMap) {
+ collisionTileMap.updateDimensions();
+ }
+ this.invalidateTileMap();
+ this.invalidateHitboxes();
+ }
+
+ setGridColumnCount(targetColumnCount: integer) {
+ const tileMap = this.getTileMapForEdition();
+ if (targetColumnCount <= 0) return;
+ if (!tileMap) return;
+ tileMap.setDimensionX(targetColumnCount);
+ const collisionTileMap = this.getCollisionTileMap();
+ if (collisionTileMap) {
+ collisionTileMap.updateDimensions();
+ }
+ this.invalidateTileMap();
+ this.invalidateHitboxes();
+ }
+ }
+}
diff --git a/Extensions/TileMap/JsExtension.js b/Extensions/TileMap/JsExtension.js
index e31f2f6f5ffe..ddb66b23f7c5 100644
--- a/Extensions/TileMap/JsExtension.js
+++ b/Extensions/TileMap/JsExtension.js
@@ -20,7 +20,341 @@
* @param {(translationSource: string) => string} _
* @param {GDNamespace} gd
*/
-const defineTileMap = function (extension, _, gd) {
+const defineTileMapCapability = function (extension, _, gd) {
+ const capability = extension
+ .addBehavior(
+ 'TileMapBehavior',
+ _('Tile map capability'),
+ 'TileMap',
+ _('Common features for all tile map objects.'),
+ '',
+ 'JsPlatform/Extensions/tile_map.svg',
+ 'TileMapBehavior',
+ new gd.Behavior(),
+ new gd.BehaviorsSharedData()
+ )
+ .setHidden()
+ .setIncludeFile('Extensions/TileMap/TileMapBehavior.js');
+
+ capability
+ .addExpression(
+ 'TileCenterX',
+ _('Scene X coordinate of tile'),
+ _('Get the scene X position of the center of the tile.'),
+ '',
+ 'JsPlatform/Extensions/tile_map.svg'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Grid X'), '', false)
+ .addParameter('number', _('Grid Y'), '', false)
+ .setFunctionName('getSceneXCoordinateOfTileCenter');
+
+ capability
+ .addExpression(
+ 'TileCenterY',
+ _('Scene Y coordinate of tile'),
+ _('Get the scene Y position of the center of the tile.'),
+ '',
+ 'JsPlatform/Extensions/tile_map.svg'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Grid X'), '', false)
+ .addParameter('number', _('Grid Y'), '', false)
+ .setFunctionName('getSceneYCoordinateOfTileCenter');
+
+ capability
+ .addExpression(
+ 'GridX',
+ _('Tile map grid column coordinate'),
+ _(
+ 'Get the grid column coordinates in the tile map corresponding to the scene coordinates.'
+ ),
+ '',
+ 'JsPlatform/Extensions/tile_map.svg'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Position X'), '', false)
+ .addParameter('number', _('Position Y'), '', false)
+ .setFunctionName('getColumnIndexAtPosition');
+
+ capability
+ .addExpression(
+ 'GridY',
+ _('Tile map grid row coordinate'),
+ _(
+ 'Get the grid row coordinates in the tile map corresponding to the scene coordinates.'
+ ),
+ '',
+ 'JsPlatform/Extensions/tile_map.svg'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Position X'), '', false)
+ .addParameter('number', _('Position Y'), '', false)
+ .setFunctionName('getRowIndexAtPosition');
+
+ capability
+ .addExpressionAndConditionAndAction(
+ 'number',
+ 'TileIdAtPosition',
+ _('Tile (at position)'),
+ _('the id of the tile at the scene coordinates'),
+ _('the tile id in _PARAM0_ at scene coordinates _PARAM4_ ; _PARAM5_'),
+ '',
+ 'JsPlatform/Extensions/tile_map.svg'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
+ .addParameter('number', _('Position X'), '', false)
+ .addParameter('number', _('Position Y'), '', false)
+ .setFunctionName('setTileAtPosition')
+ .setGetter('getTileAtPosition');
+
+ capability
+ .addScopedAction(
+ 'FlipTileOnYAtPosition',
+ _('Flip tile vertically (at position)'),
+ _('Flip tile vertically at scene coordinates.'),
+ _(
+ 'Flip tile vertically in _PARAM0_ at scene coordinates _PARAM2_ ; _PARAM3_: _PARAM4_'
+ ),
+ _('Effects'),
+ 'res/actions/flipY24.png',
+ 'res/actions/flipY.png'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Position X'), '', false)
+ .addParameter('number', _('Position Y'), '', false)
+ .addParameter('yesorno', _('Flip vertically'), '', false)
+ .setDefaultValue('false')
+ .setFunctionName('flipTileOnYAtPosition');
+
+ capability
+ .addScopedAction(
+ 'FlipTileOnXAtPosition',
+ _('Flip tile horizontally (at position)'),
+ _('Flip tile horizontally at scene coordinates.'),
+ _(
+ 'Flip tile horizontally in _PARAM0_ at scene coordinates _PARAM2_ ; _PARAM3_: _PARAM4_'
+ ),
+ _('Effects'),
+ 'res/actions/flipX24.png',
+ 'res/actions/flipX.png'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Position X'), '', false)
+ .addParameter('number', _('Position Y'), '', false)
+ .addParameter('yesorno', _('Flip horizontally'), '', false)
+ .setDefaultValue('false')
+ .setFunctionName('flipTileOnXAtPosition');
+
+ capability
+ .addScopedAction(
+ 'RemoveTileAtPosition',
+ _('Remove tile (at position)'),
+ _('Remove the tile at the scene coordinates.'),
+ _('Remove tile in _PARAM0_ at scene coordinates _PARAM2_ ; _PARAM3_'),
+ '',
+ 'JsPlatform/Extensions/tile_map.svg',
+ 'JsPlatform/Extensions/tile_map.svg'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Position X'), '', false)
+ .addParameter('number', _('Position Y'), '', false)
+ .setFunctionName('removeTileAtPosition');
+
+ capability
+ .addExpressionAndConditionAndAction(
+ 'number',
+ 'TileIdAtGrid',
+ _('Tile (on the grid)'),
+ _('the id of the tile at the grid coordinates'),
+ _('the tile id at grid coordinates _PARAM3_ ; _PARAM4_'),
+ '',
+ 'JsPlatform/Extensions/tile_map.svg'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
+ .addParameter('number', _('Grid X'), '', false)
+ .addParameter('number', _('Grid Y'), '', false)
+ .setFunctionName('setTileAtGridCoordinates')
+ .setGetter('getTileAtGridCoordinates');
+
+ capability
+ .addScopedAction(
+ 'FlipTileOnYAtGridCoordinates',
+ _('Flip tile vertically (on the grid)'),
+ _('Flip tile vertically at grid coordinates.'),
+ _(
+ 'Flip tile vertically in _PARAM0_ at grid coordinates _PARAM2_ ; _PARAM3_: _PARAM4_'
+ ),
+ _('Effects'),
+ 'res/actions/flipY24.png',
+ 'res/actions/flipY.png'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Grid X'), '', false)
+ .addParameter('number', _('Grid Y'), '', false)
+ .addParameter('yesorno', _('Flip vertically'), '', false)
+ .setDefaultValue('false')
+ .setFunctionName('flipTileOnYAtGridCoordinates');
+
+ capability
+ .addScopedAction(
+ 'FlipTileOnXAtGridCoordinates',
+ _('Flip tile horizontally (on the grid)'),
+ _('Flip tile horizontally at grid coordinates.'),
+ _(
+ 'Flip tile horizontally in _PARAM0_ at grid coordinates _PARAM2_ ; _PARAM3_: _PARAM4_'
+ ),
+ _('Effects'),
+ 'res/actions/flipX24.png',
+ 'res/actions/flipX.png'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Grid X'), '', false)
+ .addParameter('number', _('Grid Y'), '', false)
+ .addParameter('yesorno', _('Flip horizontally'), '', false)
+ .setDefaultValue('false')
+ .setFunctionName('flipTileOnXAtGridCoordinates');
+
+ capability
+ .addScopedAction(
+ 'RemoveTileAtGridCoordinates',
+ _('Remove tile (on the grid)'),
+ _('Remove the tile at the grid coordinates.'),
+ _('Remove tile in _PARAM0_ at grid coordinates _PARAM2_ ; _PARAM3_'),
+ '',
+ 'JsPlatform/Extensions/tile_map.svg',
+ 'JsPlatform/Extensions/tile_map.svg'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Grid X'), '', false)
+ .addParameter('number', _('Grid Y'), '', false)
+ .setFunctionName('removeTileAtGridCoordinates');
+
+ capability
+ .addScopedCondition(
+ 'IsTileFlippedOnXAtPosition',
+ _('Tile flipped horizontally (at position)'),
+ _('Check if tile at scene coordinates is flipped horizontally.'),
+ _(
+ 'The tile in _PARAM0_ at scene coordinates _PARAM2_ ; _PARAM3_ is flipped horizontally'
+ ),
+ _('Effects'),
+ 'res/actions/flipX24.png',
+ 'res/actions/flipX.png'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Position X'), '', false)
+ .addParameter('number', _('Position Y'), '', false)
+ .setFunctionName('isTileFlippedOnXAtPosition');
+
+ capability
+ .addScopedCondition(
+ 'IsTileFlippedOnYAtPosition',
+ _('Tile flipped vertically (at position)'),
+ _('Check if tile at scene coordinates is flipped vertically.'),
+ _(
+ 'The tile in _PARAM0_ at scene coordinates _PARAM2_ ; _PARAM3_ is flipped vertically'
+ ),
+ _('Effects'),
+ 'res/actions/flipY24.png',
+ 'res/actions/flipY.png'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Position X'), '', false)
+ .addParameter('number', _('Position Y'), '', false)
+ .setFunctionName('isTileFlippedOnYAtPosition');
+
+ capability
+ .addScopedCondition(
+ 'IsTileFlippedOnXAtGridCoordinates',
+ _('Tile flipped horizontally (on the grid)'),
+ _('Check if tile at grid coordinates is flipped horizontally.'),
+ _(
+ 'The tile in _PARAM0_ at grid coordinates _PARAM2_ ; _PARAM3_ is flipped horizontally'
+ ),
+ _('Effects'),
+ 'res/actions/flipX24.png',
+ 'res/actions/flipX.png'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Grid X'), '', false)
+ .addParameter('number', _('Grid Y'), '', false)
+ .setFunctionName('isTileFlippedOnXAtGridCoordinates');
+
+ capability
+ .addScopedCondition(
+ 'IsTileFlippedOnYAtGridCoordinates',
+ _('Tile flipped vertically (on the grid)'),
+ _('Check if tile at grid coordinates is flipped vertically.'),
+ _(
+ 'The tile in _PARAM0_ at grid coordinates _PARAM2_ ; _PARAM3_ is flipped vertically'
+ ),
+ _('Effects'),
+ 'res/actions/flipY24.png',
+ 'res/actions/flipY.png'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .addParameter('number', _('Grid X'), '', false)
+ .addParameter('number', _('Grid Y'), '', false)
+ .setFunctionName('isTileFlippedOnYAtGridCoordinates');
+
+ capability
+ .addExpressionAndConditionAndAction(
+ 'number',
+ 'GridRowCount',
+ _('Grid row count'),
+ _('the grid row count in the tile map'),
+ _('the grid row count'),
+ _('Size'),
+ 'res/actions/scaleHeight24_black.png'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
+ .setFunctionName('setGridRowCount')
+ .setGetter('getGridRowCount');
+
+ capability
+ .addExpressionAndConditionAndAction(
+ 'number',
+ 'GridColumnCount',
+ _('Grid column count'),
+ _('the grid column count in the tile map'),
+ _('the grid column count'),
+ _('Size'),
+ 'res/actions/scaleWidth24_black.png'
+ )
+ .addParameter('object', _('Tile map'), '', false)
+ .addParameter('behavior', _('Behavior'), 'TileMapBehavior')
+ .useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
+ .setFunctionName('setGridColumnCount')
+ .setGetter('getGridColumnCount');
+};
+
+/**
+ * @param {gd.PlatformExtension} extension
+ * @param {(translationSource: string) => string} _
+ * @param {GDNamespace} gd
+ */
+const defineExternalTileMap = function (extension, _, gd) {
var objectTileMap = new gd.ObjectJsImplementation();
objectTileMap.updateProperty = function (propertyName, newValue) {
const objectContent = this.content;
@@ -64,6 +398,14 @@ const defineTileMap = function (extension, _, gd) {
objectContent.animationFps = parseFloat(newValue);
return true;
}
+ if (propertyName === 'collisionMaskTag') {
+ objectContent.collisionMaskTag = newValue;
+ return true;
+ }
+ if (propertyName === 'isCollisionMaskEnabled') {
+ objectContent.isCollisionMaskEnabled = newValue === '1';
+ return true;
+ }
return false;
};
@@ -150,6 +492,33 @@ const defineTileMap = function (extension, _, gd) {
.setLabel(_('Animation FPS'))
.setGroup(_('Animation'))
);
+ objectProperties.set(
+ 'collisionMaskTag',
+ new gd.PropertyDescriptor(objectContent.collisionMaskTag || '')
+ .setType('string')
+ .setLabel(_('Class filter'))
+ .setDescription(
+ _(
+ 'Only the tiles with the given class (set in Tiled 1.9+) will have hitboxes created.'
+ )
+ )
+ .setGroup(_('Collision'))
+ );
+ objectProperties.set(
+ 'isCollisionMaskEnabled',
+ new gd.PropertyDescriptor(
+ // Compatibility with GD <= 5.6.273
+ objectContent.isCollisionMaskEnabled === undefined
+ ? 'false'
+ : // end of compatibility code
+ objectContent.isCollisionMaskEnabled
+ ? 'true'
+ : 'false'
+ )
+ .setType('boolean')
+ .setLabel(_('Enable collision'))
+ .setGroup(_('Collision'))
+ );
return objectProperties;
};
@@ -162,6 +531,8 @@ const defineTileMap = function (extension, _, gd) {
levelIndex: 0,
animationSpeedScale: 1,
animationFps: 4,
+ collisionMaskTag: '',
+ isCollisionMaskEnabled: true,
};
objectTileMap.updateInitialInstanceProperty = function (
@@ -185,10 +556,12 @@ const defineTileMap = function (extension, _, gd) {
objectTileMap
)
.setCategory('Advanced')
+ .addDefaultBehavior('TileMap::TileMapBehavior')
.addDefaultBehavior('ResizableCapability::ResizableBehavior')
.addDefaultBehavior('ScalableCapability::ScalableBehavior')
.addDefaultBehavior('OpacityCapability::OpacityBehavior')
- .setIncludeFile('Extensions/TileMap/tilemapruntimeobject.js')
+ .addIncludeFile('Extensions/TileMap/AbstractTileMapRuntimeObject.js')
+ .addIncludeFile('Extensions/TileMap/tilemapruntimeobject.js')
.addIncludeFile('Extensions/TileMap/TileMapRuntimeManager.js')
.addIncludeFile('Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js')
.addIncludeFile('Extensions/TileMap/pixi-tilemap/dist/pixi-tilemap.umd.js')
@@ -325,7 +698,7 @@ const defineTileMap = function (extension, _, gd) {
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
- .setFunctionName('getLayerIndex');
+ .setFunctionName('getDisplayedLayerIndex');
object
.addAction(
@@ -343,8 +716,8 @@ const defineTileMap = function (extension, _, gd) {
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
- .setFunctionName('setLayerIndex')
- .setGetter('getLayerIndex');
+ .setFunctionName('setDisplayedLayerIndex')
+ .setGetter('getDisplayedLayerIndex');
object
.addExpression(
@@ -356,7 +729,7 @@ const defineTileMap = function (extension, _, gd) {
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.getCodeExtraInformation()
- .setFunctionName('getLayerIndex');
+ .setFunctionName('getDisplayedLayerIndex');
object
.addExpressionAndCondition(
@@ -732,10 +1105,12 @@ const defineSimpleTileMap = function (extension, _, gd) {
)
.setCategory('General')
.setOpenFullEditorLabel(_('Edit tileset and collisions'))
+ .addDefaultBehavior('TileMap::TileMapBehavior')
.addDefaultBehavior('ResizableCapability::ResizableBehavior')
.addDefaultBehavior('ScalableCapability::ScalableBehavior')
.addDefaultBehavior('OpacityCapability::OpacityBehavior')
- .setIncludeFile('Extensions/TileMap/simpletilemapruntimeobject.js')
+ .addIncludeFile('Extensions/TileMap/AbstractTileMapRuntimeObject.js')
+ .addIncludeFile('Extensions/TileMap/simpletilemapruntimeobject.js')
.addIncludeFile('Extensions/TileMap/TileMapRuntimeManager.js')
.addIncludeFile('Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js')
.addIncludeFile('Extensions/TileMap/pixi-tilemap/dist/pixi-tilemap.umd.js')
@@ -773,6 +1148,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'',
'JsPlatform/Extensions/tile_map.svg'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Grid X'), '', false)
.addParameter('number', _('Grid Y'), '', false)
@@ -786,6 +1162,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'',
'JsPlatform/Extensions/tile_map.svg'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Grid X'), '', false)
.addParameter('number', _('Grid Y'), '', false)
@@ -801,6 +1178,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'',
'JsPlatform/Extensions/tile_map.svg'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Position X'), '', false)
.addParameter('number', _('Position Y'), '', false)
@@ -816,6 +1194,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'',
'JsPlatform/Extensions/tile_map.svg'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Position X'), '', false)
.addParameter('number', _('Position Y'), '', false)
@@ -831,6 +1210,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'',
'JsPlatform/Extensions/tile_map.svg'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.addParameter('number', _('Position X'), '', false)
@@ -850,6 +1230,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'res/actions/flipY24.png',
'res/actions/flipY.png'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Position X'), '', false)
.addParameter('number', _('Position Y'), '', false)
@@ -869,6 +1250,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'res/actions/flipX24.png',
'res/actions/flipX.png'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Position X'), '', false)
.addParameter('number', _('Position Y'), '', false)
@@ -886,10 +1268,10 @@ const defineSimpleTileMap = function (extension, _, gd) {
'JsPlatform/Extensions/tile_map.svg',
'JsPlatform/Extensions/tile_map.svg'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Position X'), '', false)
.addParameter('number', _('Position Y'), '', false)
- .getCodeExtraInformation()
.setFunctionName('removeTileAtPosition');
object
@@ -902,6 +1284,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'',
'JsPlatform/Extensions/tile_map.svg'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.addParameter('number', _('Grid X'), '', false)
@@ -921,6 +1304,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'res/actions/flipY24.png',
'res/actions/flipY.png'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Grid X'), '', false)
.addParameter('number', _('Grid Y'), '', false)
@@ -940,6 +1324,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'res/actions/flipX24.png',
'res/actions/flipX.png'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Grid X'), '', false)
.addParameter('number', _('Grid Y'), '', false)
@@ -957,6 +1342,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'JsPlatform/Extensions/tile_map.svg',
'JsPlatform/Extensions/tile_map.svg'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Grid X'), '', false)
.addParameter('number', _('Grid Y'), '', false)
@@ -975,6 +1361,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'res/actions/flipX24.png',
'res/actions/flipX.png'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Position X'), '', false)
.addParameter('number', _('Position Y'), '', false)
@@ -993,6 +1380,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'res/actions/flipY24.png',
'res/actions/flipY.png'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Position X'), '', false)
.addParameter('number', _('Position Y'), '', false)
@@ -1011,6 +1399,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'res/actions/flipX24.png',
'res/actions/flipX.png'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Grid X'), '', false)
.addParameter('number', _('Grid Y'), '', false)
@@ -1029,6 +1418,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
'res/actions/flipY24.png',
'res/actions/flipY.png'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.addParameter('number', _('Grid X'), '', false)
.addParameter('number', _('Grid Y'), '', false)
@@ -1045,6 +1435,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
_('Size'),
'res/actions/scaleHeight24_black.png'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setGridRowCount')
@@ -1060,6 +1451,7 @@ const defineSimpleTileMap = function (extension, _, gd) {
_('Size'),
'res/actions/scaleWidth24_black.png'
)
+ .setHidden()
.addParameter('object', _('Tile map'), 'SimpleTileMap', false)
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setGridColumnCount')
@@ -1542,7 +1934,8 @@ module.exports = {
.addInstructionOrExpressionGroupMetadata(_('Tilemap'))
.setIcon('JsPlatform/Extensions/tile_map.svg');
- defineTileMap(extension, _, gd);
+ defineTileMapCapability(extension, _, gd);
+ defineExternalTileMap(extension, _, gd);
defineSimpleTileMap(extension, _, gd);
defineCollisionMask(extension, _, gd);
diff --git a/Extensions/TileMap/TileMapBehavior.ts b/Extensions/TileMap/TileMapBehavior.ts
new file mode 100644
index 000000000000..6d91f7013807
--- /dev/null
+++ b/Extensions/TileMap/TileMapBehavior.ts
@@ -0,0 +1,231 @@
+/*
+ * GDevelop JS Platform
+ * Copyright 2013-2023 Florian Rival (Florian.Rival@gmail.com). All rights reserved.
+ * This project is released under the MIT License.
+ */
+namespace gdjs {
+ /** @category Objects > Tile Map */
+ export interface TileMap {
+ getSceneXCoordinateOfTileCenter(
+ columnIndex: integer,
+ rowIndex: integer
+ ): float;
+
+ getSceneYCoordinateOfTileCenter(
+ columnIndex: integer,
+ rowIndex: integer
+ ): float;
+
+ getColumnIndexAtPosition(x: float, y: float): integer;
+
+ getRowIndexAtPosition(x: float, y: float): integer;
+
+ getTileAtPosition(x: float, y: float): integer;
+
+ getTileAtGridCoordinates(columnIndex: integer, rowIndex: integer): integer;
+
+ setTileAtPosition(tileId: number, x: float, y: float): void;
+
+ setTileAtGridCoordinates(
+ tileId: number,
+ columnIndex: integer,
+ rowIndex: integer
+ ): void;
+
+ flipTileOnYAtPosition(x: float, y: float, flip: boolean): void;
+
+ flipTileOnXAtPosition(x: float, y: float, flip: boolean): void;
+
+ flipTileOnYAtGridCoordinates(
+ columnIndex: integer,
+ rowIndex: integer,
+ flip: boolean
+ ): void;
+
+ flipTileOnXAtGridCoordinates(
+ columnIndex: integer,
+ rowIndex: integer,
+ flip: boolean
+ ): void;
+
+ isTileFlippedOnXAtPosition(x: float, y: float): boolean;
+
+ isTileFlippedOnXAtGridCoordinates(
+ columnIndex: integer,
+ rowIndex: integer
+ ): boolean;
+
+ isTileFlippedOnYAtPosition(x: float, y: float): boolean;
+
+ isTileFlippedOnYAtGridCoordinates(
+ columnIndex: integer,
+ rowIndex: integer
+ ): boolean;
+
+ removeTileAtPosition(x: float, y: float): void;
+
+ removeTileAtGridCoordinates(columnIndex: integer, rowIndex: integer): void;
+
+ setGridRowCount(targetRowCount: integer): void;
+
+ setGridColumnCount(targetColumnCount: integer): void;
+
+ getGridRowCount(): integer;
+
+ getGridColumnCount(): integer;
+ }
+
+ /**
+ * A behavior that forwards the Resizable interface to its object.
+ * @category Behaviors > Default behaviors
+ */
+ export class TileMapBehavior extends gdjs.RuntimeBehavior implements TileMap {
+ private object: gdjs.RuntimeObject & TileMap;
+
+ constructor(
+ instanceContainer: gdjs.RuntimeInstanceContainer,
+ behaviorData,
+ owner: gdjs.RuntimeObject & TileMap
+ ) {
+ super(instanceContainer, behaviorData, owner);
+ this.object = owner;
+ }
+
+ usesLifecycleFunction(): boolean {
+ return false;
+ }
+
+ override applyBehaviorOverriding(behaviorData): boolean {
+ // Nothing to update.
+ return true;
+ }
+
+ onDeActivate() {}
+
+ onDestroy() {}
+
+ doStepPreEvents(instanceContainer: gdjs.RuntimeInstanceContainer) {}
+
+ doStepPostEvents(instanceContainer: gdjs.RuntimeInstanceContainer) {}
+
+ getSceneXCoordinateOfTileCenter(
+ columnIndex: integer,
+ rowIndex: integer
+ ): float {
+ return this.object.getSceneXCoordinateOfTileCenter(columnIndex, rowIndex);
+ }
+
+ getSceneYCoordinateOfTileCenter(
+ columnIndex: integer,
+ rowIndex: integer
+ ): float {
+ return this.object.getSceneYCoordinateOfTileCenter(columnIndex, rowIndex);
+ }
+
+ getColumnIndexAtPosition(x: float, y: float): integer {
+ return this.object.getColumnIndexAtPosition(x, y);
+ }
+
+ getRowIndexAtPosition(x: float, y: float): integer {
+ return this.object.getRowIndexAtPosition(x, y);
+ }
+
+ getTileAtPosition(x: float, y: float): integer {
+ return this.object.getTileAtPosition(x, y);
+ }
+
+ getTileAtGridCoordinates(columnIndex: integer, rowIndex: integer): integer {
+ return this.object.getTileAtGridCoordinates(columnIndex, rowIndex);
+ }
+
+ setTileAtPosition(tileId: number, x: float, y: float): void {
+ this.object.setTileAtPosition(tileId, x, y);
+ }
+
+ setTileAtGridCoordinates(
+ tileId: number,
+ columnIndex: integer,
+ rowIndex: integer
+ ): void {
+ this.object.setTileAtGridCoordinates(tileId, columnIndex, rowIndex);
+ }
+
+ flipTileOnYAtPosition(x: float, y: float, flip: boolean): void {
+ this.object.flipTileOnYAtPosition(x, y, flip);
+ }
+
+ flipTileOnXAtPosition(x: float, y: float, flip: boolean): void {
+ this.object.flipTileOnXAtPosition(x, y, flip);
+ }
+
+ flipTileOnYAtGridCoordinates(
+ columnIndex: integer,
+ rowIndex: integer,
+ flip: boolean
+ ): void {
+ this.object.flipTileOnYAtGridCoordinates(columnIndex, rowIndex, flip);
+ }
+
+ flipTileOnXAtGridCoordinates(
+ columnIndex: integer,
+ rowIndex: integer,
+ flip: boolean
+ ): void {
+ this.object.flipTileOnXAtGridCoordinates(columnIndex, rowIndex, flip);
+ }
+
+ isTileFlippedOnXAtPosition(x: float, y: float): boolean {
+ return this.object.isTileFlippedOnXAtPosition(x, y);
+ }
+
+ isTileFlippedOnXAtGridCoordinates(
+ columnIndex: integer,
+ rowIndex: integer
+ ): boolean {
+ return this.object.isTileFlippedOnXAtGridCoordinates(
+ columnIndex,
+ rowIndex
+ );
+ }
+
+ isTileFlippedOnYAtPosition(x: float, y: float): boolean {
+ return this.object.isTileFlippedOnYAtPosition(x, y);
+ }
+
+ isTileFlippedOnYAtGridCoordinates(
+ columnIndex: integer,
+ rowIndex: integer
+ ): boolean {
+ return this.object.isTileFlippedOnYAtGridCoordinates(
+ columnIndex,
+ rowIndex
+ );
+ }
+
+ removeTileAtPosition(x: float, y: float): void {
+ this.object.removeTileAtPosition(x, y);
+ }
+
+ removeTileAtGridCoordinates(columnIndex: integer, rowIndex: integer): void {
+ this.object.removeTileAtGridCoordinates(columnIndex, rowIndex);
+ }
+
+ setGridRowCount(targetRowCount: integer): void {
+ this.object.setGridRowCount(targetRowCount);
+ }
+
+ setGridColumnCount(targetColumnCount: integer): void {
+ this.object.setGridColumnCount(targetColumnCount);
+ }
+
+ getGridRowCount(): integer {
+ return this.object.getGridRowCount();
+ }
+
+ getGridColumnCount(): integer {
+ return this.object.getGridColumnCount();
+ }
+ }
+
+ gdjs.registerBehavior('TileMap::TileMapBehavior', gdjs.TileMapBehavior);
+}
diff --git a/Extensions/TileMap/helper/TileMapHelper.js b/Extensions/TileMap/helper/TileMapHelper.js
index 42e8acd81131..e809031bb679 100644
--- a/Extensions/TileMap/helper/TileMapHelper.js
+++ b/Extensions/TileMap/helper/TileMapHelper.js
@@ -1,2 +1,2 @@
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TileMapHelper={})}(this,function(e){"use strict";const t=2147483648,i=1073741824,s=536870912;var l;function n(e){const t=l.isFlippedDiagonally(e),i=l.isFlippedHorizontally(e),s=l.isFlippedVertically(e);let n=0;return t?(n=10,!i&&s?n=2:i&&!s?n=6:i&&s&&(n=14)):(n=0,!i&&s?n=8:i&&!s?n=12:i&&s&&(n=4)),n}function o(e,l,n,o){let r=e;return l&&(r|=t),n&&(r|=i),o&&(r|=s),r}!function(e){e.tileIdMask=536870911,e.getTileId=function(t){return t&e.tileIdMask},e.setFlippedHorizontally=function(e,i){return e&=2147483647,i&&(e|=t),e},e.setFlippedVertically=function(e,t){return e&=-1073741825,t&&(e|=i),e},e.setFlippedDiagonally=function(e,t){return e&=-536870913,t&&(e|=s),e},e.isFlippedHorizontally=function(e){return 0!==(e&t)},e.isFlippedVertically=function(e){return 0!==(e&i)},e.isFlippedDiagonally=function(e){return 0!==(e&s)}}(l||(l={}));class r{constructor(e,t,i,s,l){this.tileWidth=e,this.tileHeight=t,this.dimX=i,this.dimY=s,this._tileSet=l,this._layers=[]}static from(e,{tileSize:t,tileSetColumnCount:i,tileSetRowCount:s}){const l=new Map;if(!Number.isInteger(i)||i<=0||!Number.isInteger(s)||s<=0)throw new Error(`Tilemap object badly configured. Tile size ${t} is not compatible with atlas image dimensions, resulting in having ${i} columns and ${s} rows.`);new Array(i*s).fill(0).forEach((e,t)=>{l.set(t,new u(0))});const n=new r(t||e.tileWidth,t||e.tileHeight,e.dimX||1,e.dimY||1,l);return e.layers?e.layers.forEach(e=>{n.addTileLayer(h.from(e,n,e=>ee.toJSObject())}}getWidth(){return this.tileWidth*this.dimX}getHeight(){return this.tileHeight*this.dimY}getTileHeight(){return this.tileHeight}getTileWidth(){return this.tileWidth}getDimensionX(){return this.dimX}getDimensionY(){return this.dimY}setDimensionX(e){if(e===this.dimX)return;const t=e-this.dimX;for(const e of this.getLayers())e instanceof h&&(t>0?e.increaseDimensions(t,0,0,0):e.reduceDimensions(-t,0,0,0));this.dimX=e}increaseDimensions(e,t,i,s){if(!(e<0||t<0||i<0||s<0||0===e&&0===t&&0===i&&0===s)){for(const l of this.getLayers())l instanceof h&&l.increaseDimensions(e,t,i,s);this.dimX=this.dimX+e+t,this.dimY=this.dimY+i+s}}setDimensionY(e){if(e===this.dimY)return;const t=e-this.dimY;for(const e of this.getLayers())e instanceof h&&(t>0?e.increaseDimensions(0,0,t,0):e.reduceDimensions(0,0,-t,0));this.dimY=e}getTileDefinition(e){return this._tileSet.get(e)}getTileDefinitions(){return this._tileSet.values()}addNewTileLayer(e){const t=new h(this,e);return this._layers.push(t),t}addTileLayer(e){this._layers.push(e)}getTileLayer(e){const t=this._layers.find(t=>t.id===e);return t instanceof h?t:null}addObjectLayer(e){const t=new d(this,e);return this._layers.push(t),t}getBackgroundResourceName(){return this._backgroundResourceName}getLayers(){return this._layers}pointIsInsideTile(e,t,i){const s=Math.floor(e/this.tileWidth),l=Math.floor(t/this.tileHeight);for(const e of this._layers){const t=e;if(!t)continue;const n=t.getTileId(s,l);if(void 0===n)return!1;if(this._tileSet.get(n).hasTaggedHitBox(i))return!0}return!1}setBackgroundResourceName(e){this._backgroundResourceName=e}isEmpty(){return this._layers.every(e=>e.isEmpty())}getTileId(e,t,i){const s=this.getTileLayer(i);if(!s)return-1;const l=s.getTileId(e,t);return void 0===l?-1:l}setTile(e,t,i,s){const l=this.getTileLayer(i);l&&l.setTile(e,t,s)}flipTileOnY(e,t,i,s){const l=this.getTileLayer(i);l&&l.setFlippedVertically(e,t,s)}flipTileOnX(e,t,i,s){const l=this.getTileLayer(i);l&&l.setFlippedHorizontally(e,t,s)}isTileFlippedOnX(e,t,i){const s=this.getTileLayer(i);return!!s&&s.isFlippedHorizontally(e,t)}isTileFlippedOnY(e,t,i){const s=this.getTileLayer(i);return!!s&&s.isFlippedVertically(e,t)}removeTile(e,t,i){if(e<0||e>=this.dimX||t<0||t>=this.dimY)return;const s=this.getTileLayer(i);s&&s.removeTile(e,t)}trimEmptyColumnsAndRowToFitLayer(e){const t=this.getTileLayer(e);if(!t)return;const i=this.dimY,s=this.dimX;if(t.isEmpty()&&1===this._layers.length)return t.buildEmptyLayer(1,1),this.dimX=1,this.dimY=1,{shiftedRows:0,shiftedColumns:0,poppedRows:i-1,poppedColumns:s-1};const l=t.getTrimmingData();for(const e of this.getLayers())e instanceof h&&e.reduceDimensions(l.columnsToPop,l.columnsToShift,l.rowsToPop,l.rowsToShift);return this.dimX=s-l.columnsToPop-l.columnsToShift,this.dimY=i-l.rowsToPop-l.rowsToShift,{poppedRows:l.rowsToPop,poppedColumns:l.columnsToPop,shiftedRows:l.rowsToShift,shiftedColumns:l.columnsToShift}}}class a{constructor(e,t){this.visible=!0,this.tileMap=e,this.id=t}setVisible(e){this.visible=e}toJSObject(){return{id:this.id,alpha:0,tiles:[]}}isVisible(){return this.visible}isEmpty(){return!0}}class d extends a{constructor(e,t){super(e,t),this.objects=[]}add(e){this.objects.push(e)}isEmpty(){return 0===this.objects.length}}class c{constructor(e,t,i){this.tileId=i,this.x=e,this.y=t}getTileId(){return l.getTileId(this.tileId)}setFlippedHorizontally(e){this.tileId=l.setFlippedHorizontally(this.tileId,e)}setFlippedVertically(e){this.tileId=l.setFlippedVertically(this.tileId,e)}setFlippedDiagonally(e){this.tileId=l.setFlippedDiagonally(this.tileId,e)}isFlippedHorizontally(){return l.isFlippedHorizontally(this.tileId)}isFlippedVertically(){return l.isFlippedVertically(this.tileId)}isFlippedDiagonally(){return l.isFlippedDiagonally(this.tileId)}}class h extends a{constructor(e,t){super(e,t),this.buildEmptyLayer(this.tileMap.getDimensionX(),this.tileMap.getDimensionY()),this._alpha=1}buildEmptyLayer(e,t){this._tiles=[],this._tiles.length=t;for(let t=0;te.forEach((e,n)=>{const o=l.getTileId(e);i(o)&&s.setTileGID(n,t,e)})),s}toJSObject(){return{id:this.id,alpha:this._alpha,tiles:this._tiles.map((e,t)=>Array.from(e.map((e,i)=>{const s=this.getTileGID(i,t);return void 0===s?-1:s})))}}getAlpha(){return this._alpha}setAlpha(e){this._alpha=e}isEmpty(){return this._tiles.every(e=>e.every(e=>0===e))}reduceDimensions(e,t,i,s){(i>0||s>0)&&(this._tiles=this._tiles.slice(s,i?-i:void 0)),(e>0||t>0)&&this._tiles.forEach((i,s)=>{this._tiles[s]=this._tiles[s].slice(t,e?-e:void 0)})}increaseDimensions(e,t,i,s){const l=this._tiles.length,n=this._tiles[0].length;if((e>0||t>0)&&this._tiles.forEach((i,s)=>{const l=new Int32Array(n+e+t).fill(0);l.set(i,t),this._tiles[s]=l}),i>0||s>0){this._tiles.unshift(...new Array(s).fill(0).map(()=>new Int32Array(n+e+t).fill(0))),this._tiles.length=l+i+s;for(let i=l+s;i=s.length||(s[e]=i+1)}setTileGID(e,t,i){const s=this._tiles[t];!s||e>=s.length||(s[e]=i+1)}getTrimmingData(){let e=0,t=0;const i=this.getDimensionX(),s=this.getDimensionY(),l=new Array(this._tiles.length).fill(this._tiles[0].length),n=new Array(this._tiles.length).fill(this._tiles[0].length);let o=!1;for(let i=0;i=i.length||(i[e]=0)}setFlippedHorizontally(e,t,i){const s=this._tiles[t];if(!s||e>=s.length)return;const n=s[e];0!==n&&(s[e]=l.setFlippedHorizontally(n,i))}setFlippedVertically(e,t,i){const s=this._tiles[t];if(!s||e>=s.length)return;const n=s[e];0!==n&&(s[e]=l.setFlippedVertically(n,i))}setFlippedDiagonally(e,t,i){const s=this._tiles[t];if(!s||e>=s.length)return;const n=s[e];0!==n&&(s[e]=l.setFlippedDiagonally(n,i))}isFlippedHorizontally(e,t){const i=this._tiles[t];return!(!i||e>=i.length)&&l.isFlippedHorizontally(i[e])}isFlippedVertically(e,t){const i=this._tiles[t];return!(!i||e>=i.length)&&l.isFlippedVertically(i[e])}isFlippedDiagonally(e,t){const i=this._tiles[t];return!(!i||e>=i.length)&&l.isFlippedDiagonally(i[e])}getTileGID(e,t){const i=this._tiles[t];if(i&&!(e>=i.length)&&0!==i[e])return i[e]-1}getTileId(e,t){const i=this._tiles[t];if(!i||e>=i.length||0===i[e])return;return l.getTileId(i[e]-1)}getDimensionX(){return 0===this._tiles.length?0:this._tiles[0].length}getDimensionY(){return this._tiles.length}getWidth(){return this.tileMap.getWidth()}getHeight(){return this.tileMap.getHeight()}}class u{constructor(e){this.taggedHitBoxes=[],this.animationLength=null!=e?e:0,this.stackedTiles=[]}addHitBox(e,t,i){let s=this.taggedHitBoxes.find(t=>t.tag===e);s||(s={tag:e,polygons:[],hasFullHitBox:!1},this.taggedHitBoxes.push(s)),s.hasFullHitBox||(s.hasFullHitBox=i),s.polygons.push(t)}hasTaggedHitBox(e){return this.taggedHitBoxes.some(t=>t.tag===e)}getHitBoxes(e){const t=this.taggedHitBoxes.find(t=>t.tag===e);return t&&t.polygons}hasFullHitBox(e){const t=this.taggedHitBoxes.find(t=>t.tag===e);return t&&t.hasFullHitBox}getAnimationLength(){return this.animationLength}getStackTileId(){return this.stackTileId}getStackedTiles(){return this.stackedTiles}hasStackedTiles(){return this.stackedTiles.length>0}setStackedTiles(e,...t){this.stackedTiles=t,this.stackTileId=e}}class p{constructor(){this._cachedValues=new Map,this._callbacks=new Map}getOrLoad(e,t,i){{const t=this._cachedValues.get(e);if(t)return void i(t)}{const t=this._callbacks.get(e);if(t)return void t.push(i);this._callbacks.set(e,[i])}t(t=>{t&&this._cachedValues.set(e,t);const i=this._callbacks.get(e);this._callbacks.delete(e);for(const e of i)e(t)})}}class g{constructor(){this._levelBackgroundTextures=new Map,this._textures=new Map}setTexture(e,t){this._textures.set(e,t)}getTexture(e){return this._textures.get(e)}getLevelBackgroundTexture(e){return this._levelBackgroundTextures.get(e)}setLevelBackgroundTexture(e,t){this._levelBackgroundTextures.set(e,t)}}const f=(e,t)=>{const{data:i,compression:s}=t;if(!i)return i;let l=4;const n=[];let o=atob(i).split("").map(function(e){return e.charCodeAt(0)});try{const t=(e,t)=>e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24)>>>0;if("zlib"===s){const i=new Uint8Array(o),s=e.inflate(i);for(;l<=s.length;)n.push(t(s,l-4)),l+=4}else{if("zstd"===s)return console.error("Zstandard compression is not supported for layers in a Tilemap. Use instead zlib compression or no compression."),null;for(;l<=o.length;)n.push(t(o,l-4)),l+=4}return n}catch(e){return console.error("Failed to decompress and unzip base64 layer.data string",e),null}},y=e=>{const l=e&t,n=e&i,o=e&s;return{id:T(536870911&e),flippedHorizontally:!!l,flippedVertically:!!n,flippedDiagonally:!!o}};function T(e){return 0===e?void 0:e-1}var m,_,w,x,I;function M(e,t){let i=e<<16;return i+=t,i}function b(e,t,i,s){var l;if(e[s])return e[s];let n=null;const o=t[s];return(null==o?void 0:o.relPath)?(n=i(o.relPath),"res/invalid_texture.png"===(null===(l=n.baseTexture)||void 0===l?void 0:l.cacheId)&&(console.error(`The atlas texture "${o.relPath}" can't be loaded`),n=null)):console.error(`The tileset "${o.identifier}" doesn't seems to contain an atlas texture`),e[s]=n,n}!function(e){e.parseAtlas=function(e,t,i,s){if(!e.tiledversion)return console.warn("The loaded Tiled map does not contain a 'tiledversion' key. Are you sure this file has been exported from Tiled (mapeditor.org)?"),null;if(!e.tilesets.length||"source"in e.tilesets[0])return console.warn("The loaded Tiled map seems not to contain any tileset data (nothing in 'tilesets' key)."),null;const l=e.tilesets[0],{tilewidth:n,tileheight:o,tilecount:r,image:a,columns:d,spacing:c,margin:h}=l,u=void 0===l.firstgid?1:l.firstgid;i||(i=s(a));const p=r/d,f=n*d+c*(d-1)+2*h,y=o*p+c*(p-1)+2*h;if(i.width-1?t:0];if(!l||!l.layerInstances)return null;const n={};for(const t of e.defs.tilesets)n[t.uid]=t;const o=new g,r={},a={};for(let e=l.layerInstances.length-1;e>=0;--e){const t=l.layerInstances[e];if("Entities"===t.__type)continue;const i=t.__tilesetDefUid;if("number"!=typeof i)continue;const d=n[i],c=b(a,n,s,i);if(!c)continue;const h={},u=d.tileGridSize;for(const e of[...t.autoLayerTiles,...t.gridTiles]){if(h[e.t])continue;const t=M(i,e.t);if(r[t])h[e.t]=!0;else{try{const[i,s]=e.src,l=new PIXI.Rectangle(i,s,u,u),n=new PIXI.Texture(c,l);o.setTexture(t,n)}catch(e){console.error("An error occurred while creating a PIXI.Texture to be used in a TileMap:",e)}h[e.t]=!0,r[t]=!0}}}if(l.bgRelPath){const e=s(l.bgRelPath),t=new PIXI.Rectangle(0,0,l.pxWid,l.pxHei),i=new PIXI.Texture(e,t);o.setLevelBackgroundTexture(l.bgRelPath,i)}return o}}(_||(_={})),e.PixiTileMapHelper=void 0,function(e){function t(e,t,i,s,l){const n=t.tileMap,o=n.getTileWidth(),r=n.getTileHeight();for(let a=0;a0&&o.tileAnimX(s,u.getAnimationLength())}}}},e.updatePixiCollisionMask=function(e,i,s,l,n,o,r,a,d){if(e)if(e.clear(),e.lineStyle(n,o,r),e.drawRect(0,0,i.getWidth(),i.getHeight()),l){t(e,i.getTileLayer(l),s,a,d)}else for(const l of i.getLayers())l instanceof h&&t(e,l,s,a,d)}}(e.PixiTileMapHelper||(e.PixiTileMapHelper={})),function(e){e.load=function(e,t){const i=e.levels[t>-1?t:0];if(!i||!i.layerInstances)return null;const s=new Map;let l=0,n=0,a=0;for(let e=i.layerInstances.length-1;e>=0;--e){const t=i.layerInstances[e],o=t.__tilesetDefUid,r={};for(const e of[...t.autoLayerTiles,...t.gridTiles]){if(r[e.t])continue;const t=M(o,e.t);if(s.has(t)){r[e.t]=!0;continue}const i=new u(0);r[e.t]=!0,s.set(t,i)}"IntGrid"!==t.__type&&"AutoLayer"!==t.__type&&"Tiles"!==t.__type||(0===l?(l=t.__gridSize,n=t.__cWid,a=t.__cHei):t.__gridSize!==l&&console.warn("Grid size is different across layers. Only the first layer grid size will be followed."))}const d=new r(l,l,n,a,s),c=new Map;let h=268435455;for(let e=i.layerInstances.length-1;e>=0;--e){const t=i.layerInstances[e],l=t.__gridSize,n=t.__tilesetDefUid,r=d.addNewTileLayer(e);r.setAlpha(t.__opacity),r.setVisible(t.visible);for(const e of[...t.autoLayerTiles,...t.gridTiles]){const t=Math.floor(e.px[0]/l),i=Math.floor(e.px[1]/l),a=M(n,e.t),d=r.getTileId(t,i);if(void 0===d)r.setTile(t,i,a),r.setFlippedHorizontally(t,i,1===e.f||3===e.f),r.setFlippedVertically(t,i,2===e.f||3===e.f);else{const l=o(a,1===e.f||3===e.f,2===e.f||3===e.f,!1),n=s.get(d);if(null==n?void 0:n.hasStackedTiles()){const e=`${n.getStackedTiles().map(e=>`${e}`).join(";")};${l}`,o=c.get(e);if(o)r.setTile(t,i,o.getStackTileId());else{const o=new u(0);o.setStackedTiles(h,...n.getStackedTiles(),l),s.set(h,o),h-=1,c.set(e,o),r.setTile(t,i,o.getStackTileId())}}else{const e=r.getTileGID(t,i),n=`${e};${l}`,o=new u(0);o.setStackedTiles(h,e,l),s.set(h,o),h-=1,c.set(n,o),r.setTile(t,i,o.getStackTileId())}}}}return i.bgRelPath&&d.setBackgroundResourceName(i.bgRelPath),d}}(w||(w={})),function(e){e.load=function(e,t){if(!e.tiledversion)return console.warn("The loaded Tiled map does not contain a 'tiledversion' key. Are you sure this file has been exported from Tiled (mapeditor.org)?"),null;const i=new Map;for(const t of e.tilesets){const s=void 0===t.firstgid?1:t.firstgid;if(t.tiles)for(const l of t.tiles){const t=new u(l.animation?l.animation.length:0),n=l.type||l.class;if(l.objectgroup)for(const i of l.objectgroup.objects){const s=i.type||i.class||n;if(!s||0===s.length)continue;let l=null,o=!1;if(i.polygon){const e=i.rotation*Math.PI/180;let t=Math.cos(e),s=Math.sin(e);-1!==t&&1!==t||(s=0),-1!==s&&1!==s||(t=0),l=i.polygon.map(e=>[i.x+e.x*t-e.y*s,i.y+e.x*s+e.y*t])}else void 0!==i.x&&void 0!==i.y&&void 0!==i.width&&void 0!==i.height&&(l=[[i.x,i.y],[i.x,i.y+i.height],[i.x+i.width,i.y+i.height],[i.x+i.width,i.y]],o=0===i.x&&0===i.y&&i.width===e.tilewidth&&i.height===e.tileheight);l&&t.addHitBox(s,l,o)}else if(n){const i=[[0,0],[0,e.tileheight],[e.tilewidth,e.tileheight],[e.tilewidth,0]];t.addHitBox(n,i,!0)}i.set(T(s+l.id),t)}for(let e=0;e{e(t,i,e=>{if(!e)return void n(null);const t=I.load(e,s,l);n(t)})},n)}getOrLoadSimpleTileMap(e,t,i,s,l,n){n(r.from(e,{tileSize:i,tileSetColumnCount:s,tileSetRowCount:l}))}getOrLoadTextureCache(t,i,s,l,n,o,r){const a=l+"|"+n+"|"+s+"|"+o;this._textureCacheCaches.getOrLoad(a,r=>{t(l,n,t=>{if(!t)return void r(null);const l=s?i(s):null,n=e.PixiTileMapHelper.parseAtlas(t,o,l,i);r(n)})},r)}getOrLoadSimpleTileMapTextureCache(t,i,s,l,n,o){const r=`${i}|${s}|${l}|${n}`;this._textureCacheCaches.getOrLoad(r,o=>{if(!i)return void o(null);const r=t(i);o(e.PixiTileMapHelper.parseSimpleTileMapAtlas(r,l,n,s))},o)}clearCaches(){this._tileMapCache=new p,this._textureCacheCaches=new p}}e.EditableTileMap=r,e.EditableTileMapLayer=h,e.TileDefinition=u,e.TileMapManager=k,e.TileTextureCache=g,Object.defineProperty(e,"__esModule",{value:!0})});
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TileMapHelper={})}(this,function(e){"use strict";const t=2147483648,i=1073741824,s=536870912;var l;function n(e){const t=l.isFlippedDiagonally(e),i=l.isFlippedHorizontally(e),s=l.isFlippedVertically(e);let n=0;return t?(n=10,!i&&s?n=2:i&&!s?n=6:i&&s&&(n=14)):(n=0,!i&&s?n=8:i&&!s?n=12:i&&s&&(n=4)),n}function o(e,l,n,o){let r=e;return l&&(r|=t),n&&(r|=i),o&&(r|=s),r}!function(e){e.tileIdMask=536870911,e.getTileId=function(t){return t&e.tileIdMask},e.setFlippedHorizontally=function(e,i){return e&=2147483647,i&&(e|=t),e},e.setFlippedVertically=function(e,t){return e&=-1073741825,t&&(e|=i),e},e.setFlippedDiagonally=function(e,t){return e&=-536870913,t&&(e|=s),e},e.isFlippedHorizontally=function(e){return 0!==(e&t)},e.isFlippedVertically=function(e){return 0!==(e&i)},e.isFlippedDiagonally=function(e){return 0!==(e&s)}}(l||(l={}));class r{constructor(e,t,i,s,l){this._backgroundResourceName=null,this.tileWidth=e,this.tileHeight=t,this.dimX=i,this.dimY=s,this._tileSet=l,this._layers=[]}clone(){const e=new r(this.tileWidth,this.tileHeight,this.dimX,this.dimY,this._tileSet);for(const t of this._layers)e._layers.push(t.clone(e,t.id));return e}static from(e,{tileSize:t,tileSetColumnCount:i,tileSetRowCount:s}){const l=new Map;if(!Number.isInteger(i)||i<=0||!Number.isInteger(s)||s<=0)throw new Error(`Tilemap object badly configured. Tile size ${t} is not compatible with atlas image dimensions, resulting in having ${i} columns and ${s} rows.`);new Array(i*s).fill(0).forEach((e,t)=>{l.set(t,new u(0))});const n=new r(t||e.tileWidth,t||e.tileHeight,e.dimX||1,e.dimY||1,l);return e.layers?e.layers.forEach(e=>{n.addTileLayer(d.from(e,n,e=>ee.toJSObject())}}getWidth(){return this.tileWidth*this.dimX}getHeight(){return this.tileHeight*this.dimY}getTileHeight(){return this.tileHeight}getTileWidth(){return this.tileWidth}getDimensionX(){return this.dimX}getDimensionY(){return this.dimY}setDimensionX(e){if(e===this.dimX)return;const t=e-this.dimX;for(const e of this.getLayers())e instanceof d&&(t>0?e.increaseDimensions(t,0,0,0):e.reduceDimensions(-t,0,0,0));this.dimX=e}increaseDimensions(e,t,i,s){if(!(e<0||t<0||i<0||s<0||0===e&&0===t&&0===i&&0===s)){for(const l of this.getLayers())l instanceof d&&l.increaseDimensions(e,t,i,s);this.dimX=this.dimX+e+t,this.dimY=this.dimY+i+s}}setDimensionY(e){if(e===this.dimY)return;const t=e-this.dimY;for(const e of this.getLayers())e instanceof d&&(t>0?e.increaseDimensions(0,0,t,0):e.reduceDimensions(0,0,-t,0));this.dimY=e}getTileDefinition(e){return this._tileSet.get(e)}getTileDefinitions(){return this._tileSet.values()}addNewTileLayer(e){const t=new d(this,e);return this._layers.push(t),t}addTileLayer(e){this._layers.push(e)}getTileLayer(e){const t=this._layers.find(t=>t.id===e);return t instanceof d?t:null}addObjectLayer(e){const t=new c(this,e);return this._layers.push(t),t}getBackgroundResourceName(){return this._backgroundResourceName}getLayers(){return this._layers}pointIsInsideTile(e,t,i){const s=Math.floor(e/this.tileWidth),l=Math.floor(t/this.tileHeight);for(const e of this._layers){const t=e;if(!t)continue;const n=t.getTileId(s,l);if(void 0===n)return!1;if(this._tileSet.get(n).hasTaggedHitBox(i))return!0}return!1}setBackgroundResourceName(e){this._backgroundResourceName=e}isEmpty(){return this._layers.every(e=>e.isEmpty())}getTileId(e,t,i){const s=this.getTileLayer(i);if(!s)return-1;const l=s.getTileId(e,t);return void 0===l?-1:l}setTile(e,t,i,s){const l=this.getTileLayer(i);l&&l.setTile(e,t,s)}flipTileOnY(e,t,i,s){const l=this.getTileLayer(i);l&&l.setFlippedVertically(e,t,s)}flipTileOnX(e,t,i,s){const l=this.getTileLayer(i);l&&l.setFlippedHorizontally(e,t,s)}isTileFlippedOnX(e,t,i){const s=this.getTileLayer(i);return!!s&&s.isFlippedHorizontally(e,t)}isTileFlippedOnY(e,t,i){const s=this.getTileLayer(i);return!!s&&s.isFlippedVertically(e,t)}removeTile(e,t,i){if(e<0||e>=this.dimX||t<0||t>=this.dimY)return;const s=this.getTileLayer(i);s&&s.removeTile(e,t)}trimEmptyColumnsAndRowToFitLayer(e){const t=this.getTileLayer(e);if(!t)return;const i=this.dimY,s=this.dimX;if(t.isEmpty()&&1===this._layers.length)return t.increaseDimensions(1,0,1,0),this.dimX=1,this.dimY=1,{shiftedRows:0,shiftedColumns:0,poppedRows:i-1,poppedColumns:s-1};const l=t.getTrimmingData();for(const e of this.getLayers())e instanceof d&&e.reduceDimensions(l.columnsToPop,l.columnsToShift,l.rowsToPop,l.rowsToShift);return this.dimX=s-l.columnsToPop-l.columnsToShift,this.dimY=i-l.rowsToPop-l.rowsToShift,{poppedRows:l.rowsToPop,poppedColumns:l.columnsToPop,shiftedRows:l.rowsToShift,shiftedColumns:l.columnsToShift}}}class a{constructor(e,t){this.visible=!0,this.tileMap=e,this.id=t}setVisible(e){this.visible=e}toJSObject(){return{id:this.id,alpha:0,tiles:[]}}isVisible(){return this.visible}isEmpty(){return!0}}class c extends a{constructor(e,t){super(e,t),this.objects=[]}clone(e,t){const i=new c(e,t);return i.objects.push.apply(this.objects),i}add(e){this.objects.push(e)}isEmpty(){return 0===this.objects.length}}class h{constructor(e,t,i){this.tileId=i,this.x=e,this.y=t}getTileId(){return l.getTileId(this.tileId)}setFlippedHorizontally(e){this.tileId=l.setFlippedHorizontally(this.tileId,e)}setFlippedVertically(e){this.tileId=l.setFlippedVertically(this.tileId,e)}setFlippedDiagonally(e){this.tileId=l.setFlippedDiagonally(this.tileId,e)}isFlippedHorizontally(){return l.isFlippedHorizontally(this.tileId)}isFlippedVertically(){return l.isFlippedVertically(this.tileId)}isFlippedDiagonally(){return l.isFlippedDiagonally(this.tileId)}}class d extends a{constructor(e,t){super(e,t);const i=this.tileMap.getDimensionX(),s=this.tileMap.getDimensionY();this._tiles=[],this._tiles.length=s;for(let e=0;ee.forEach((e,n)=>{const o=l.getTileId(e);i(o)&&s.setTileGID(n,t,e)})),s}toJSObject(){return{id:this.id,alpha:this._alpha,tiles:this._tiles.map((e,t)=>Array.from(e.map((e,i)=>{const s=this.getTileGID(i,t);return void 0===s?-1:s})))}}getAlpha(){return this._alpha}setAlpha(e){this._alpha=e}isEmpty(){return this._tiles.every(e=>e.every(e=>0===e))}reduceDimensions(e,t,i,s){(i>0||s>0)&&(this._tiles=this._tiles.slice(s,i?-i:void 0)),(e>0||t>0)&&this._tiles.forEach((i,s)=>{this._tiles[s]=this._tiles[s].slice(t,e?-e:void 0)})}increaseDimensions(e,t,i,s){const l=this._tiles.length,n=this._tiles[0].length;if((e>0||t>0)&&this._tiles.forEach((i,s)=>{const l=new Int32Array(n+e+t).fill(0);l.set(i,t),this._tiles[s]=l}),i>0||s>0){this._tiles.unshift(...new Array(s).fill(0).map(()=>new Int32Array(n+e+t).fill(0))),this._tiles.length=l+i+s;for(let i=l+s;i=s.length||(s[e]=i+1)}setTileGID(e,t,i){const s=this._tiles[t];!s||e>=s.length||(s[e]=i+1)}getTrimmingData(){let e=0,t=0;const i=this.getDimensionX(),s=this.getDimensionY(),l=new Array(this._tiles.length).fill(this._tiles[0].length),n=new Array(this._tiles.length).fill(this._tiles[0].length);let o=!1;for(let i=0;i=i.length||(i[e]=0)}setFlippedHorizontally(e,t,i){const s=this._tiles[t];if(!s||e>=s.length)return;const n=s[e];0!==n&&(s[e]=l.setFlippedHorizontally(n,i))}setFlippedVertically(e,t,i){const s=this._tiles[t];if(!s||e>=s.length)return;const n=s[e];0!==n&&(s[e]=l.setFlippedVertically(n,i))}setFlippedDiagonally(e,t,i){const s=this._tiles[t];if(!s||e>=s.length)return;const n=s[e];0!==n&&(s[e]=l.setFlippedDiagonally(n,i))}isFlippedHorizontally(e,t){const i=this._tiles[t];return!(!i||e>=i.length)&&l.isFlippedHorizontally(i[e])}isFlippedVertically(e,t){const i=this._tiles[t];return!(!i||e>=i.length)&&l.isFlippedVertically(i[e])}isFlippedDiagonally(e,t){const i=this._tiles[t];return!(!i||e>=i.length)&&l.isFlippedDiagonally(i[e])}getTileGID(e,t){const i=this._tiles[t];if(i&&!(e>=i.length)&&0!==i[e])return i[e]-1}getTileId(e,t){const i=this._tiles[t];if(!i||e>=i.length||0===i[e])return;return l.getTileId(i[e]-1)}getDimensionX(){return 0===this._tiles.length?0:this._tiles[0].length}getDimensionY(){return this._tiles.length}getWidth(){return this.tileMap.getWidth()}getHeight(){return this.tileMap.getHeight()}}class u{constructor(e){this.taggedHitBoxes=[],this.animationLength=null!=e?e:0,this.stackedTiles=[]}addHitBox(e,t,i){let s=this.taggedHitBoxes.find(t=>t.tag===e);s||(s={tag:e,polygons:[],hasFullHitBox:!1},this.taggedHitBoxes.push(s)),s.hasFullHitBox||(s.hasFullHitBox=i),s.polygons.push(t)}hasTaggedHitBox(e){return this.taggedHitBoxes.some(t=>t.tag===e)}getHitBoxes(e){const t=this.taggedHitBoxes.find(t=>t.tag===e);return t&&t.polygons}hasFullHitBox(e){const t=this.taggedHitBoxes.find(t=>t.tag===e);return!!t&&t.hasFullHitBox}getAnimationLength(){return this.animationLength}getStackTileId(){return this.stackTileId}getStackedTiles(){return this.stackedTiles}hasStackedTiles(){return this.stackedTiles.length>0}setStackedTiles(e,...t){this.stackedTiles=t,this.stackTileId=e}}class p{constructor(){this._cachedValues=new Map,this._callbacks=new Map}getOrLoad(e,t,i){{const t=this._cachedValues.get(e);if(t)return void i(t)}{const t=this._callbacks.get(e);if(t)return void t.push(i);this._callbacks.set(e,[i])}t(t=>{t&&this._cachedValues.set(e,t);const i=this._callbacks.get(e);this._callbacks.delete(e);for(const e of i)e(t)})}}class g{constructor(){this._levelBackgroundTextures=new Map,this._textures=new Map}setTexture(e,t){this._textures.set(e,t)}getTexture(e){return this._textures.get(e)}getLevelBackgroundTexture(e){return this._levelBackgroundTextures.get(e)}setLevelBackgroundTexture(e,t){this._levelBackgroundTextures.set(e,t)}}const f=(e,t)=>{const{data:i,compression:s}=t;if(!i)return i;let l=4;const n=[];let o=atob(i).split("").map(function(e){return e.charCodeAt(0)});try{const t=(e,t)=>e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24)>>>0;if("zlib"===s){const i=new Uint8Array(o),s=e.inflate(i);for(;l<=s.length;)n.push(t(s,l-4)),l+=4}else{if("zstd"===s)return console.error("Zstandard compression is not supported for layers in a Tilemap. Use instead zlib compression or no compression."),null;for(;l<=o.length;)n.push(t(o,l-4)),l+=4}return n}catch(e){return console.error("Failed to decompress and unzip base64 layer.data string",e),null}},y=e=>{const l=e&t,n=e&i,o=e&s;return{id:T(536870911&e),flippedHorizontally:!!l,flippedVertically:!!n,flippedDiagonally:!!o}};function T(e){return 0===e?void 0:e-1}var m,_,w,x,I;function b(e,t){let i=e<<16;return i+=t,i}function M(e,t,i,s){var l;if(e[s])return e[s];let n=null;const o=t[s];return(null==o?void 0:o.relPath)?(n=i(o.relPath),"res/invalid_texture.png"===(null===(l=n.baseTexture)||void 0===l?void 0:l.cacheId)&&(console.error(`The atlas texture "${o.relPath}" can't be loaded`),n=null)):console.error(`The tileset "${o.identifier}" doesn't seems to contain an atlas texture`),e[s]=n,n}!function(e){e.parseAtlas=function(e,t,i,s){if(!e.tiledversion)return console.warn("The loaded Tiled map does not contain a 'tiledversion' key. Are you sure this file has been exported from Tiled (mapeditor.org)?"),null;if(!e.tilesets.length||"source"in e.tilesets[0])return console.warn("The loaded Tiled map seems not to contain any tileset data (nothing in 'tilesets' key)."),null;const l=e.tilesets[0],{tilewidth:n,tileheight:o,tilecount:r,image:a,columns:c,spacing:h,margin:d}=l,u=void 0===l.firstgid?1:l.firstgid;i||(i=s(a));const p=r/c,f=n*c+h*(c-1)+2*d,y=o*p+h*(p-1)+2*d;if(i.width-1?t:0];if(!l||!l.layerInstances)return null;const n={};for(const t of e.defs.tilesets)n[t.uid]=t;const o=new g,r={},a={};for(let e=l.layerInstances.length-1;e>=0;--e){const t=l.layerInstances[e];if("Entities"===t.__type)continue;const i=t.__tilesetDefUid;if("number"!=typeof i)continue;const c=n[i],h=M(a,n,s,i);if(!h)continue;const d={},u=c.tileGridSize;for(const e of[...t.autoLayerTiles,...t.gridTiles]){if(d[e.t])continue;const t=b(i,e.t);if(r[t])d[e.t]=!0;else{try{const[i,s]=e.src,l=new PIXI.Rectangle(i,s,u,u),n=new PIXI.Texture(h,l);o.setTexture(t,n)}catch(e){console.error("An error occurred while creating a PIXI.Texture to be used in a TileMap:",e)}d[e.t]=!0,r[t]=!0}}}if(l.bgRelPath){const e=s(l.bgRelPath),t=new PIXI.Rectangle(0,0,l.pxWid,l.pxHei),i=new PIXI.Texture(e,t);o.setLevelBackgroundTexture(l.bgRelPath,i)}return o}}(_||(_={})),e.PixiTileMapHelper=void 0,function(e){function t(e,t,i,s,l){const n=t.tileMap,o=n.getTileWidth(),r=n.getTileHeight();for(let a=0;a0&&o.tileAnimX(s,u.getAnimationLength())}}}},e.updatePixiCollisionMask=function(e,i,s,l,n,o,r,a,c){if(e)if(e.clear(),e.lineStyle(n,o,r),e.drawRect(0,0,i.getWidth(),i.getHeight()),l){t(e,i.getTileLayer(l),s,a,c)}else for(const l of i.getLayers())l instanceof d&&t(e,l,s,a,c)}}(e.PixiTileMapHelper||(e.PixiTileMapHelper={})),function(e){e.load=function(e,t){const i=e.levels[t>-1?t:0];if(!i||!i.layerInstances)return null;const s=new Map;let l=0,n=0,a=0;for(let e=i.layerInstances.length-1;e>=0;--e){const t=i.layerInstances[e],o=t.__tilesetDefUid,r={};for(const e of[...t.autoLayerTiles,...t.gridTiles]){if(r[e.t])continue;const t=b(o,e.t);if(s.has(t)){r[e.t]=!0;continue}const i=new u(0);r[e.t]=!0,s.set(t,i)}"IntGrid"!==t.__type&&"AutoLayer"!==t.__type&&"Tiles"!==t.__type||(0===l?(l=t.__gridSize,n=t.__cWid,a=t.__cHei):t.__gridSize!==l&&console.warn("Grid size is different across layers. Only the first layer grid size will be followed."))}const c=new r(l,l,n,a,s),h=new Map;let d=268435455;for(let e=i.layerInstances.length-1;e>=0;--e){const t=i.layerInstances[e],l=t.__gridSize,n=t.__tilesetDefUid,r=c.addNewTileLayer(e);r.setAlpha(t.__opacity),r.setVisible(t.visible);for(const e of[...t.autoLayerTiles,...t.gridTiles]){const t=Math.floor(e.px[0]/l),i=Math.floor(e.px[1]/l),a=b(n,e.t),c=r.getTileId(t,i);if(void 0===c)r.setTile(t,i,a),r.setFlippedHorizontally(t,i,1===e.f||3===e.f),r.setFlippedVertically(t,i,2===e.f||3===e.f);else{const l=o(a,1===e.f||3===e.f,2===e.f||3===e.f,!1),n=s.get(c);if(null==n?void 0:n.hasStackedTiles()){const e=`${n.getStackedTiles().map(e=>`${e}`).join(";")};${l}`,o=h.get(e);if(o)r.setTile(t,i,o.getStackTileId());else{const o=new u(0);o.setStackedTiles(d,...n.getStackedTiles(),l),s.set(d,o),d-=1,h.set(e,o),r.setTile(t,i,o.getStackTileId())}}else{const e=r.getTileGID(t,i),n=`${e};${l}`,o=new u(0);o.setStackedTiles(d,e,l),s.set(d,o),d-=1,h.set(n,o),r.setTile(t,i,o.getStackTileId())}}}}return i.bgRelPath&&c.setBackgroundResourceName(i.bgRelPath),c}}(w||(w={})),function(e){e.load=function(e,t){if(!e.tiledversion)return console.warn("The loaded Tiled map does not contain a 'tiledversion' key. Are you sure this file has been exported from Tiled (mapeditor.org)?"),null;const i=new Map;for(const t of e.tilesets){const s=void 0===t.firstgid?1:t.firstgid;if(t.tiles)for(const l of t.tiles){const t=new u(l.animation?l.animation.length:0),n=l.type||l.class;if(l.objectgroup&&l.objectgroup.objects)for(const i of l.objectgroup.objects){const s=i.type||i.class||n||"";let l=null,o=!1;if(i.polygon){const e=i.rotation*Math.PI/180;let t=Math.cos(e),s=Math.sin(e);-1!==t&&1!==t||(s=0),-1!==s&&1!==s||(t=0),l=i.polygon.map(e=>[i.x+e.x*t-e.y*s,i.y+e.x*s+e.y*t])}else void 0!==i.x&&void 0!==i.y&&void 0!==i.width&&void 0!==i.height&&(l=[[i.x,i.y],[i.x,i.y+i.height],[i.x+i.width,i.y+i.height],[i.x+i.width,i.y]],o=0===i.x&&0===i.y&&i.width===e.tilewidth&&i.height===e.tileheight);l&&t.addHitBox(s,l,o)}else if(n){const i=[[0,0],[0,e.tileheight],[e.tilewidth,e.tileheight],[e.tilewidth,0]];t.addHitBox(n,i,!0)}i.set(T(s+l.id),t)}for(let e=0;e{e(t,i,e=>{if(!e)return void n(null);const t=I.load(e,s,l);n(t)})},n)}getOrLoadSimpleTileMap(e,t,i,s,l,n){n(r.from(e,{tileSize:i,tileSetColumnCount:s,tileSetRowCount:l}))}getOrLoadTextureCache(t,i,s,l,n,o,r){const a=l+"|"+n+"|"+s+"|"+o;this._textureCacheCaches.getOrLoad(a,r=>{t(l,n,t=>{if(!t)return void r(null);const l=s?i(s):null,n=e.PixiTileMapHelper.parseAtlas(t,o,l,i);r(n)})},r)}getOrLoadSimpleTileMapTextureCache(t,i,s,l,n,o){const r=`${i}|${s}|${l}|${n}`;this._textureCacheCaches.getOrLoad(r,o=>{if(!i)return void o(null);const r=t(i);o(e.PixiTileMapHelper.parseSimpleTileMapAtlas(r,l,n,s))},o)}clearCaches(){this._tileMapCache=new p,this._textureCacheCaches=new p}}e.EditableTileMap=r,e.EditableTileMapLayer=d,e.TileDefinition=u,e.TileMapManager=k,e.TileTextureCache=g,Object.defineProperty(e,"__esModule",{value:!0})});
//# sourceMappingURL=TileMapHelper.js.map
diff --git a/Extensions/TileMap/helper/TileMapHelper.js.map b/Extensions/TileMap/helper/TileMapHelper.js.map
index 85599c23dd50..0a661ba63064 100644
--- a/Extensions/TileMap/helper/TileMapHelper.js.map
+++ b/Extensions/TileMap/helper/TileMapHelper.js.map
@@ -1 +1 @@
-{"version":3,"file":"TileMapHelper.js","sources":["../../../SharedLibs/src/model/GID.ts","../../../SharedLibs/src/model/TileMapModel.ts","../../../SharedLibs/src/render/ResourceCache.ts","../../../SharedLibs/src/render/TileTextureCache.ts","../../../SharedLibs/src/load/tiled/TiledTileMapLoaderHelper.ts","../../../SharedLibs/src/render/tiled/TiledPixiHelper.ts","../../../SharedLibs/src/render/ldtk/LDtkPixiHelper.ts","../../../SharedLibs/src/load/ldtk/LDtkTileMapLoader.ts","../../../SharedLibs/src/load/tiled/TiledTileMapLoader.ts","../../../SharedLibs/src/load/TileMapLoader.ts","../../../SharedLibs/src/load/ldtk/LDtkTileMapLoaderHelper.ts","../../../SharedLibs/src/render/TileMapPixiHelper.ts","../../../SharedLibs/src/render/TileMapManager.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["FLIPPED_HORIZONTALLY_FLAG","FLIPPED_VERTICALLY_FLAG","FLIPPED_DIAGONALLY_FLAG","FlippingHelper","getPixiRotate","tileGID","flippedDiagonally","isFlippedDiagonally","flippedHorizontally","isFlippedHorizontally","flippedVertically","isFlippedVertically","rotate","getTileGID","tileId","tileIdMask","getTileId","setFlippedHorizontally","setFlippedVertically","setFlippedDiagonally","EditableTileMap","constructor","tileWidth","tileHeight","dimX","dimY","tileSet","this","_tileSet","_layers","from","editableTileMapAsJsObject","tileSize","tileSetColumnCount","tileSetRowCount","Map","Number","isInteger","Error","Array","fill","forEach","_","index","set","TileDefinition","tileMap","layers","layerAsJsObject","addTileLayer","EditableTileMapLayer","addNewTileLayer","toJSObject","map","layer","getWidth","getHeight","getTileHeight","getTileWidth","getDimensionX","getDimensionY","setDimensionX","dim","columnDelta","getLayers","increaseDimensions","reduceDimensions","columnsToAppend","columnsToUnshift","rowsToAppend","rowsToUnshift","setDimensionY","rowDelta","getTileDefinition","get","getTileDefinitions","values","id","push","getTileLayer","matchingLayer","find","addObjectLayer","EditableObjectLayer","getBackgroundResourceName","_backgroundResourceName","pointIsInsideTile","x","y","tag","indexX","Math","floor","indexY","tileLayer","undefined","hasTaggedHitBox","setBackgroundResourceName","resourceName","isEmpty","every","layerId","setTile","flipTileOnY","flip","flipTileOnX","isTileFlippedOnX","isTileFlippedOnY","removeTile","trimEmptyColumnsAndRowToFitLayer","initialRowCount","initialColumnCount","length","buildEmptyLayer","shiftedRows","shiftedColumns","poppedRows","poppedColumns","trimmingData","getTrimmingData","columnsToPop","columnsToShift","rowsToPop","rowsToShift","AbstractEditableLayer","visible","setVisible","alpha","tiles","isVisible","super","objects","add","object","TileObject","_alpha","dimensionX","dimensionY","_tiles","Int32Array","editableTileMapLayerAsJsObject","isTileIdValid","setAlpha","row","setTileGID","getAlpha","cell","slice","rowIndex","newRow","unshift","console","error","tilesRow","initialDimensionX","initialDimensionY","columnsToShiftByRow","columnsToPopByRow","isFirstNonEmptyRowFound","isFirstNonEmptyColumnFound","min","animationLength","taggedHitBoxes","stackedTiles","addHitBox","polygon","hasFullHitBox","taggedHitBox","hitbox","polygons","some","getHitBoxes","getAnimationLength","getStackTileId","stackTileId","getStackedTiles","hasStackedTiles","setStackedTiles","ResourceCache","_cachedValues","_callbacks","getOrLoad","key","load","callback","value","callbacks","delete","TileTextureCache","_levelBackgroundTextures","_textures","setTexture","texture","getTexture","getLevelBackgroundTexture","name","setLevelBackgroundTexture","decodeBase64LayerData","pako","tiledLayer","data","compression","decodedData","step1","atob","split","charCodeAt","decodeArray","arr","binData","Uint8Array","decompressedData","inflate","extractTileUidFlippedStates","globalTileUid","getTileIdFromTiledGUI","tiledGUI","TiledPixiHelper","LDtkPixiHelper","LDtkTileMapLoader","TiledTileMapLoader","TileMapLoader","getLDtkTileId","tileSetId","uniqueId","getAtlasTexture","atlasTextures","tilesetCache","tilesetId","tileset","relPath","_a","baseTexture","cacheId","identifier","parseAtlas","levelIndex","atlasTexture","tiledversion","warn","tilesets","tiledSet","tilewidth","tileheight","tilecount","image","columns","spacing","margin","firstGid","firstgid","rows","expectedAtlasWidth","expectedAtlasHeight","width","height","textureCache","tileSetIndex","rect","PIXI","Rectangle","Texture","level","levels","layerInstances","defs","uid","levelTileCache","iLayer","__type","__tilesetDefUid","layerTileCache","gridSize","tileGridSize","tile","autoLayerTiles","gridTiles","t","src","bgRelPath","pxWid","pxHei","exports","PixiTileMapHelper","drawCollisionLayer","pixiGraphics","typeFilter","fillColor","fillOpacity","xPos","yPos","tileDefinition","hitboxes","vertices","beginFill","vertexX","vertexY","swap","moveTo","lineTo","closePath","endFill","kind","parseSimpleTileMapAtlas","columnCount","rowCount","updatePixiTileMap","untypedPixiTileMap","displayMode","layerIndex","leftBound","rightBound","topBound","bottomBound","pixiTileMap","clear","bgResourceName","objectLayer","minY","max","maxY","ceil","minX","maxX","tileTexture","pixiTilemapFrame","tileAnimX","updatePixiCollisionMask","outlineSize","outlineColor","outlineOpacity","lineStyle","drawRect","ldtkTileMap","ldtkLevel","tileCache","has","tileDef","__gridSize","__cWid","__cHei","editableTileMap","composedTileMap","nextComposedTileId","editableTileLayer","__opacity","px","oldTileId","f","oldTileDef","hash","join","oldTileGID","tiledTileMap","definitions","tiledTileSet","animation","tileClass","type","class","objectgroup","angle","rotation","PI","cos","sin","point","tileIndex","collisionTileMap","tiledObject","gid","tileGid","tileSlotIndex","layerData","encoding","collisionTileLayer","opacity","tileUid","tileMapFileContent","TileMapManager","_tileMapCache","_textureCacheCaches","getManager","instanceHolder","tileMapCollisionMaskManager","identify","info","__header__","app","getOrLoadTileMap","loadTileMap","tileMapJsonResourceName","tileSetJsonResourceName","getOrLoadSimpleTileMap","tileMapAsJsObject","objectName","getOrLoadTextureCache","atlasImageResourceName","getOrLoadSimpleTileMapTextureCache","textureCacheLoadingCallback","clearCaches"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"TileMapHelper.js","sources":["../../../SharedLibs/src/model/GID.ts","../../../SharedLibs/src/model/TileMapModel.ts","../../../SharedLibs/src/render/ResourceCache.ts","../../../SharedLibs/src/render/TileTextureCache.ts","../../../SharedLibs/src/load/tiled/TiledTileMapLoaderHelper.ts","../../../SharedLibs/src/render/tiled/TiledPixiHelper.ts","../../../SharedLibs/src/render/ldtk/LDtkPixiHelper.ts","../../../SharedLibs/src/load/ldtk/LDtkTileMapLoader.ts","../../../SharedLibs/src/load/tiled/TiledTileMapLoader.ts","../../../SharedLibs/src/load/TileMapLoader.ts","../../../SharedLibs/src/load/ldtk/LDtkTileMapLoaderHelper.ts","../../../SharedLibs/src/render/TileMapPixiHelper.ts","../../../SharedLibs/src/render/TileMapManager.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["FLIPPED_HORIZONTALLY_FLAG","FLIPPED_VERTICALLY_FLAG","FLIPPED_DIAGONALLY_FLAG","FlippingHelper","getPixiRotate","tileGID","flippedDiagonally","isFlippedDiagonally","flippedHorizontally","isFlippedHorizontally","flippedVertically","isFlippedVertically","rotate","getTileGID","tileId","tileIdMask","getTileId","setFlippedHorizontally","setFlippedVertically","setFlippedDiagonally","EditableTileMap","constructor","tileWidth","tileHeight","dimX","dimY","tileSet","this","_backgroundResourceName","_tileSet","_layers","clone","tileMap","layer","push","id","from","editableTileMapAsJsObject","tileSize","tileSetColumnCount","tileSetRowCount","Map","Number","isInteger","Error","Array","fill","forEach","_","index","set","TileDefinition","layers","layerAsJsObject","addTileLayer","EditableTileMapLayer","addNewTileLayer","toJSObject","map","getWidth","getHeight","getTileHeight","getTileWidth","getDimensionX","getDimensionY","setDimensionX","dim","columnDelta","getLayers","increaseDimensions","reduceDimensions","columnsToAppend","columnsToUnshift","rowsToAppend","rowsToUnshift","setDimensionY","rowDelta","getTileDefinition","get","getTileDefinitions","values","getTileLayer","matchingLayer","find","addObjectLayer","EditableObjectLayer","getBackgroundResourceName","pointIsInsideTile","x","y","tag","indexX","Math","floor","indexY","tileLayer","undefined","hasTaggedHitBox","setBackgroundResourceName","resourceName","isEmpty","every","layerId","setTile","flipTileOnY","flip","flipTileOnX","isTileFlippedOnX","isTileFlippedOnY","removeTile","trimEmptyColumnsAndRowToFitLayer","initialRowCount","initialColumnCount","length","shiftedRows","shiftedColumns","poppedRows","poppedColumns","trimmingData","getTrimmingData","columnsToPop","columnsToShift","rowsToPop","rowsToShift","AbstractEditableLayer","visible","setVisible","alpha","tiles","isVisible","super","objects","apply","add","object","TileObject","dimensionX","dimensionY","_tiles","Int32Array","_alpha","editableTileMapLayerAsJsObject","isTileIdValid","setAlpha","row","setTileGID","getAlpha","cell","slice","rowIndex","newRow","unshift","console","error","tilesRow","initialDimensionX","initialDimensionY","columnsToShiftByRow","columnsToPopByRow","isFirstNonEmptyRowFound","isFirstNonEmptyColumnFound","min","animationLength","taggedHitBoxes","stackedTiles","addHitBox","polygon","hasFullHitBox","taggedHitBox","hitbox","polygons","some","getHitBoxes","getAnimationLength","getStackTileId","stackTileId","getStackedTiles","hasStackedTiles","setStackedTiles","ResourceCache","_cachedValues","_callbacks","getOrLoad","key","load","callback","value","callbacks","delete","TileTextureCache","_levelBackgroundTextures","_textures","setTexture","texture","getTexture","getLevelBackgroundTexture","name","setLevelBackgroundTexture","decodeBase64LayerData","pako","tiledLayer","data","compression","decodedData","step1","atob","split","charCodeAt","decodeArray","arr","binData","Uint8Array","decompressedData","inflate","extractTileUidFlippedStates","globalTileUid","getTileIdFromTiledGUI","tiledGUI","TiledPixiHelper","LDtkPixiHelper","LDtkTileMapLoader","TiledTileMapLoader","TileMapLoader","getLDtkTileId","tileSetId","uniqueId","getAtlasTexture","atlasTextures","tilesetCache","tilesetId","tileset","relPath","_a","baseTexture","cacheId","identifier","parseAtlas","levelIndex","atlasTexture","tiledversion","warn","tilesets","tiledSet","tilewidth","tileheight","tilecount","image","columns","spacing","margin","firstGid","firstgid","rows","expectedAtlasWidth","expectedAtlasHeight","width","height","textureCache","tileSetIndex","rect","PIXI","Rectangle","Texture","level","levels","layerInstances","defs","uid","levelTileCache","iLayer","__type","__tilesetDefUid","layerTileCache","gridSize","tileGridSize","tile","autoLayerTiles","gridTiles","t","src","bgRelPath","pxWid","pxHei","exports","PixiTileMapHelper","drawCollisionLayer","pixiGraphics","typeFilter","fillColor","fillOpacity","xPos","yPos","tileDefinition","hitboxes","vertices","beginFill","vertexX","vertexY","swap","moveTo","lineTo","closePath","endFill","kind","parseSimpleTileMapAtlas","columnCount","rowCount","updatePixiTileMap","untypedPixiTileMap","displayMode","layerIndex","leftBound","rightBound","topBound","bottomBound","pixiTileMap","clear","bgResourceName","objectLayer","minY","max","maxY","ceil","minX","maxX","tileTexture","pixiTilemapFrame","tileAnimX","updatePixiCollisionMask","outlineSize","outlineColor","outlineOpacity","lineStyle","drawRect","ldtkTileMap","ldtkLevel","tileCache","has","tileDef","__gridSize","__cWid","__cHei","editableTileMap","composedTileMap","nextComposedTileId","editableTileLayer","__opacity","px","oldTileId","f","oldTileDef","hash","join","oldTileGID","tiledTileMap","definitions","tiledTileSet","animation","tileClass","type","class","objectgroup","angle","rotation","PI","cos","sin","point","tileIndex","collisionTileMap","tiledObject","gid","tileGid","tileSlotIndex","layerData","encoding","collisionTileLayer","opacity","tileUid","tileMapFileContent","TileMapManager","_tileMapCache","_textureCacheCaches","getManager","instanceHolder","tileMapCollisionMaskManager","identify","info","__header__","app","getOrLoadTileMap","loadTileMap","tileMapJsonResourceName","tileSetJsonResourceName","getOrLoadSimpleTileMap","tileMapAsJsObject","objectName","getOrLoadTextureCache","atlasImageResourceName","getOrLoadSimpleTileMapTextureCache","textureCacheLoadingCallback","clearCaches"],"mappings":"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"}
\ No newline at end of file
diff --git a/Extensions/TileMap/helper/dts/load/tiled/TiledTileMapLoaderHelper.d.ts b/Extensions/TileMap/helper/dts/load/tiled/TiledTileMapLoaderHelper.d.ts
index ccc11f494c2b..742a14bcb674 100644
--- a/Extensions/TileMap/helper/dts/load/tiled/TiledTileMapLoaderHelper.d.ts
+++ b/Extensions/TileMap/helper/dts/load/tiled/TiledTileMapLoaderHelper.d.ts
@@ -32,6 +32,6 @@ export declare const extractTileUidFlippedStates: (
* @return the tile identifier.
*/
export declare function getTileIdFromTiledGUI(
- tiledGUI: number | undefined
+ tiledGUI: number
): number | undefined;
//# sourceMappingURL=TiledTileMapLoaderHelper.d.ts.map
diff --git a/Extensions/TileMap/helper/dts/load/tiled/TiledTileMapLoaderHelper.d.ts.map b/Extensions/TileMap/helper/dts/load/tiled/TiledTileMapLoaderHelper.d.ts.map
index 9cf795f6e979..7f037143848c 100644
--- a/Extensions/TileMap/helper/dts/load/tiled/TiledTileMapLoaderHelper.d.ts.map
+++ b/Extensions/TileMap/helper/dts/load/tiled/TiledTileMapLoaderHelper.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"TiledTileMapLoaderHelper.d.ts","sourceRoot":"","sources":["../../../src/load/tiled/TiledTileMapLoaderHelper.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,SAAU,GAAG,cAAc,UAAU,aAgDtE,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,OAAO,CAAC;IACZ,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,kBACvB,OAAO,KACrB,QAmBF,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,GAAG,SAAS,CAEpB"}
\ No newline at end of file
+{"version":3,"file":"TiledTileMapLoaderHelper.d.ts","sourceRoot":"","sources":["../../../src/load/tiled/TiledTileMapLoaderHelper.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,SAAU,GAAG,cAAc,UAAU,aAgDtE,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,OAAO,CAAC;IACZ,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,kBACvB,OAAO,KACrB,QAmBF,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAEpB"}
\ No newline at end of file
diff --git a/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts b/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts
index 73a631940460..05fab2e46cb2 100644
--- a/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts
+++ b/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts
@@ -14,7 +14,7 @@ import {
* This allows to support new file format with only a new parser.
*/
export declare class EditableTileMap {
- private _backgroundResourceName?;
+ private _backgroundResourceName;
private _tileSet;
private _layers;
/**
@@ -51,6 +51,7 @@ export declare class EditableTileMap {
dimY: integer,
tileSet: Map
);
+ clone(): EditableTileMap;
/**
* Loads EditableTileMap from serialized data.
* Uses object configuration as the source of truth as the serialized data
@@ -145,7 +146,7 @@ export declare class EditableTileMap {
/**
* @returns The resource name of the background
*/
- getBackgroundResourceName(): string;
+ getBackgroundResourceName(): string | null;
/**
* @returns All the layers of the tile map.
*/
@@ -204,6 +205,7 @@ declare abstract class AbstractEditableLayer {
* @param id The layer identifier.
*/
constructor(tileMap: EditableTileMap, id: integer);
+ abstract clone(tileMap: EditableTileMap, id: integer): AbstractEditableLayer;
setVisible(visible: boolean): void;
toJSObject(): EditableTileMapLayerAsJsObject;
/**
@@ -222,6 +224,7 @@ export declare class EditableObjectLayer extends AbstractEditableLayer {
* @param id The layer identifier.
*/
constructor(tileMap: EditableTileMap, id: integer);
+ clone(tileMap: EditableTileMap, id: integer): EditableObjectLayer;
add(object: TileObject): void;
isEmpty(): boolean;
}
@@ -278,7 +281,7 @@ export declare class EditableTileMapLayer extends AbstractEditableLayer {
* @param id The layer identifier.
*/
constructor(tileMap: EditableTileMap, id: integer);
- buildEmptyLayer(dimensionX: number, dimensionY: number): void;
+ clone(tileMap: EditableTileMap, id: integer): EditableTileMapLayer;
static from(
editableTileMapLayerAsJsObject: EditableTileMapLayerAsJsObject,
tileMap: EditableTileMap,
diff --git a/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts.map b/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts.map
index 3ab3bb617c6c..18558f016df2 100644
--- a/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts.map
+++ b/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"TileMapModel.d.ts","sourceRoot":"","sources":["../../src/model/TileMapModel.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"TileMapModel.d.ts","sourceRoot":"","sources":["../../src/model/TileMapModel.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/Extensions/TileMap/simpletilemapruntimeobject.ts b/Extensions/TileMap/simpletilemapruntimeobject.ts
index 0224a2c10955..733a8fe39cea 100644
--- a/Extensions/TileMap/simpletilemapruntimeobject.ts
+++ b/Extensions/TileMap/simpletilemapruntimeobject.ts
@@ -33,19 +33,16 @@ namespace gdjs {
export type SimpleTileMapNetworkSyncData = ObjectNetworkSyncData &
SimpleTileMapNetworkSyncDataType;
+ const hitBoxTag: string = 'collision';
+
/**
* Displays a SimpleTileMap object.
* @category Objects > Tile Map
*/
export class SimpleTileMapRuntimeObject
- extends gdjs.RuntimeObject
+ extends gdjs.AbstractTileMapRuntimeObject
implements gdjs.Resizable, gdjs.Scalable, gdjs.OpacityHandler
{
- /**
- * A reusable Point to avoid allocations.
- */
- private static readonly workingPoint: FloatPoint = [0, 0];
-
_opacity: float = 255;
_atlasImage: string;
_tileMapManager: gdjs.TileMap.TileMapRuntimeManager;
@@ -54,18 +51,10 @@ namespace gdjs {
readonly _rowCount: number;
readonly _columnCount: number;
readonly _tileSize: number;
- _displayMode = 'all';
- _layerIndex = 0;
_initialTileMapAsJsObject: TileMapHelper.EditableTileMapAsJsObject;
readonly _initialTilesWithHitBox: number[];
_isTileMapDirty: boolean = false;
- _sceneToTileMapTransformation: gdjs.AffineTransformation =
- new gdjs.AffineTransformation();
- _tileMapToSceneTransformation: gdjs.AffineTransformation =
- new gdjs.AffineTransformation();
_collisionTileMap: gdjs.TileMap.TransformedCollisionTileMap | null = null;
- _hitBoxTag: string = 'collision';
- private _transformationIsUpToDate: boolean = false;
// TODO: Add a debug mode like for TileMapCollisionMaskRuntimeObject to draw?
@@ -106,7 +95,7 @@ namespace gdjs {
this._collisionTileMap = new gdjs.TileMap.TransformedCollisionTileMap(
tileMap,
- this._hitBoxTag
+ hitBoxTag
);
this.updateTransformation();
@@ -217,7 +206,7 @@ namespace gdjs {
this._collisionTileMap =
new gdjs.TileMap.TransformedCollisionTileMap(
tileMap,
- this._hitBoxTag
+ hitBoxTag
);
}
@@ -263,13 +252,10 @@ namespace gdjs {
this._collisionTileMap.updateFromTileMap(tileMap);
} else {
this._collisionTileMap =
- new gdjs.TileMap.TransformedCollisionTileMap(
- tileMap,
- this._hitBoxTag
- );
+ new gdjs.TileMap.TransformedCollisionTileMap(tileMap, hitBoxTag);
}
- this._transformationIsUpToDate = false;
+ this.invalidateTransformation();
this.updateTransformation();
this.invalidateHitboxes();
}
@@ -303,7 +289,7 @@ namespace gdjs {
return;
}
tileDefinition.addHitBox(
- this._hitBoxTag,
+ hitBoxTag,
[
[0, 0],
[0, tileMap.getTileHeight()],
@@ -355,7 +341,7 @@ namespace gdjs {
setWidth(width: float): void {
if (this.getWidth() === width) return;
- this._transformationIsUpToDate = false;
+ this.invalidateTransformation();
this._renderer.setWidth(width);
this.invalidateHitboxes();
}
@@ -363,7 +349,7 @@ namespace gdjs {
setHeight(height: float): void {
if (this.getHeight() === height) return;
- this._transformationIsUpToDate = false;
+ this.invalidateTransformation();
this._renderer.setHeight(height);
this.invalidateHitboxes();
}
@@ -371,7 +357,6 @@ namespace gdjs {
setSize(newWidth: float, newHeight: float): void {
this.setWidth(newWidth);
this.setHeight(newHeight);
- this._transformationIsUpToDate = false;
}
/**
@@ -393,7 +378,6 @@ namespace gdjs {
setScale(scale: float): void {
this.setScaleX(scale);
this.setScaleY(scale);
- this._transformationIsUpToDate = false;
}
/**
@@ -409,7 +393,7 @@ namespace gdjs {
this._renderer.setScaleX(scaleX);
this.invalidateHitboxes();
- this._transformationIsUpToDate = false;
+ this.invalidateTransformation();
}
/**
@@ -425,25 +409,25 @@ namespace gdjs {
this._renderer.setScaleY(scaleY);
this.invalidateHitboxes();
- this._transformationIsUpToDate = false;
+ this.invalidateTransformation();
}
setX(x: float): void {
super.setX(x);
this._renderer.updatePosition();
- this._transformationIsUpToDate = false;
+ this.invalidateTransformation();
}
setY(y: float): void {
super.setY(y);
this._renderer.updatePosition();
- this._transformationIsUpToDate = false;
+ this.invalidateTransformation();
}
setAngle(angle: float): void {
super.setAngle(angle);
this._renderer.updateAngle();
- this._transformationIsUpToDate = false;
+ this.invalidateTransformation();
}
setOpacity(opacity: float): void {
@@ -465,11 +449,13 @@ namespace gdjs {
}
override getOriginalWidth(): float {
- return this.getTileMapWidth();
+ const tileMap = this._tileMap;
+ return tileMap ? tileMap.getWidth() : 20;
}
override getOriginalHeight(): float {
- return this.getTileMapHeight();
+ const tileMap = this._tileMap;
+ return tileMap ? tileMap.getHeight() : 20;
}
getScaleX(): float {
@@ -480,404 +466,6 @@ namespace gdjs {
return this._renderer.getScaleY();
}
- /**
- * This method is expensive and should not be called.
- * Prefer using {@link getHitBoxesAround} rather than getHitBoxes.
- */
- override getHitBoxes(): gdjs.Polygon[] {
- return super.getHitBoxes();
- }
-
- override updateHitBoxes(): void {
- this.updateTransformation();
- if (!this._collisionTileMap) return;
- this.hitBoxes = Array.from(
- this._collisionTileMap.getAllHitboxes(this._hitBoxTag)
- );
- this.hitBoxesDirty = false;
- this.updateAABB();
- }
-
- // This implementation doesn't use updateHitBoxes.
- // It's important for good performances.
- override getAABB(): AABB {
- // It's fine to compute it every time because tile maps are rarely rotated.
- // It avoids calling updateHitBoxes to rely on hitBoxesDirty to know when
- // to update.
- this.updateAABB();
- return this.aabb;
- }
-
- // This implementation doesn't use updateHitBoxes.
- // It's important for good performances.
- override updateAABB(): void {
- if (this.getAngle() === 0) {
- // Fast computation of AABB for non rotated object
- this.aabb.min[0] = this.x;
- this.aabb.min[1] = this.y;
- this.aabb.max[0] = this.aabb.min[0] + this.getWidth();
- this.aabb.max[1] = this.aabb.min[1] + this.getHeight();
- } else {
- if (!this._collisionTileMap) return;
- const affineTransformation = this._collisionTileMap.getTransformation();
-
- const left = 0;
- const right = this._collisionTileMap.getWidth();
- const top = 0;
- const bottom = this._collisionTileMap.getHeight();
-
- const workingPoint = this.aabb.min;
-
- workingPoint[0] = left;
- workingPoint[1] = top;
- affineTransformation.transform(workingPoint, workingPoint);
- const topLeftX = workingPoint[0];
- const topLeftY = workingPoint[1];
-
- workingPoint[0] = right;
- workingPoint[1] = top;
- affineTransformation.transform(workingPoint, workingPoint);
- const topRightX = workingPoint[0];
- const topRightY = workingPoint[1];
-
- workingPoint[0] = right;
- workingPoint[1] = bottom;
- affineTransformation.transform(workingPoint, workingPoint);
- const bottomRightX = workingPoint[0];
- const bottomRightY = workingPoint[1];
-
- workingPoint[0] = left;
- workingPoint[1] = bottom;
- affineTransformation.transform(workingPoint, workingPoint);
- const bottomLeftX = workingPoint[0];
- const bottomLeftY = workingPoint[1];
-
- this.aabb.min[0] = Math.min(
- topLeftX,
- topRightX,
- bottomRightX,
- bottomLeftX
- );
- this.aabb.max[0] = Math.max(
- topLeftX,
- topRightX,
- bottomRightX,
- bottomLeftX
- );
- this.aabb.min[1] = Math.min(
- topLeftY,
- topRightY,
- bottomRightY,
- bottomLeftY
- );
- this.aabb.max[1] = Math.max(
- topLeftY,
- topRightY,
- bottomRightY,
- bottomLeftY
- );
- }
- }
-
- getHitBoxesAround(
- left: float,
- top: float,
- right: float,
- bottom: float
- ): Iterable {
- // This implementation doesn't call updateHitBoxes.
- // It's important for good performances because there is no need to
- // update the whole collision mask where only a few hitboxes must be
- // checked.
- this.updateTransformation();
- if (!this._collisionTileMap) return [];
- return this._collisionTileMap.getHitboxesAround(
- this._hitBoxTag,
- left,
- top,
- right,
- bottom
- );
- }
-
- override isSpatiallyIndexed(): boolean {
- return true;
- }
-
- updateTransformation() {
- if (this._transformationIsUpToDate) {
- return;
- }
- const absScaleX = Math.abs(this._renderer.getScaleX());
- const absScaleY = Math.abs(this._renderer.getScaleY());
-
- this._tileMapToSceneTransformation.setToIdentity();
-
- // Translation
- this._tileMapToSceneTransformation.translate(this.getX(), this.getY());
-
- // Rotation
- const angleInRadians = (this.getAngle() * Math.PI) / 180;
- this._tileMapToSceneTransformation.rotateAround(
- angleInRadians,
- this.getCenterX(),
- this.getCenterY()
- );
-
- // Scale
- this._tileMapToSceneTransformation.scale(absScaleX, absScaleY);
- if (this._collisionTileMap) {
- const collisionTileMapTransformation =
- this._collisionTileMap.getTransformation();
- collisionTileMapTransformation.copyFrom(
- this._tileMapToSceneTransformation
- );
- this._collisionTileMap.setTransformation(
- collisionTileMapTransformation
- );
- }
- this._sceneToTileMapTransformation.copyFrom(
- this._tileMapToSceneTransformation
- );
- this._sceneToTileMapTransformation.invert();
- this._transformationIsUpToDate = true;
- }
-
- getSceneXCoordinateOfTileCenter(
- columnIndex: integer,
- rowIndex: integer
- ): float {
- const sceneCoordinates: FloatPoint =
- SimpleTileMapRuntimeObject.workingPoint;
- this._tileMapToSceneTransformation.transform(
- [
- (columnIndex + 0.5) * this._tileSize,
- (rowIndex + 0.5) * this._tileSize,
- ],
- sceneCoordinates
- );
- return sceneCoordinates[0];
- }
-
- getSceneYCoordinateOfTileCenter(
- columnIndex: integer,
- rowIndex: integer
- ): float {
- const sceneCoordinates: FloatPoint =
- SimpleTileMapRuntimeObject.workingPoint;
- this._tileMapToSceneTransformation.transform(
- [
- (columnIndex + 0.5) * this._tileSize,
- (rowIndex + 0.5) * this._tileSize,
- ],
- sceneCoordinates
- );
- return sceneCoordinates[1];
- }
-
- getGridCoordinatesFromSceneCoordinates(
- x: float,
- y: float
- ): [integer, integer] {
- this.updateTransformation();
-
- const gridCoordinates: FloatPoint =
- SimpleTileMapRuntimeObject.workingPoint;
- this._sceneToTileMapTransformation.transform([x, y], gridCoordinates);
-
- const columnIndex = Math.floor(gridCoordinates[0] / this._tileSize);
- const rowIndex = Math.floor(gridCoordinates[1] / this._tileSize);
-
- return [columnIndex, rowIndex];
- }
-
- getColumnIndexAtPosition(x: float, y: float): integer {
- return this.getGridCoordinatesFromSceneCoordinates(x, y)[0];
- }
-
- getRowIndexAtPosition(x: float, y: float): integer {
- return this.getGridCoordinatesFromSceneCoordinates(x, y)[1];
- }
-
- getTileAtPosition(x: float, y: float): integer {
- const [columnIndex, rowIndex] =
- this.getGridCoordinatesFromSceneCoordinates(x, y);
- return this.getTileAtGridCoordinates(columnIndex, rowIndex);
- }
-
- getTileAtGridCoordinates(columnIndex: integer, rowIndex: integer): integer {
- return this.getTileId(columnIndex, rowIndex, 0);
- }
-
- setTileAtPosition(tileId: number, x: float, y: float) {
- const [columnIndex, rowIndex] =
- this.getGridCoordinatesFromSceneCoordinates(x, y);
- this.setTileAtGridCoordinates(tileId, columnIndex, rowIndex);
- }
-
- setTileAtGridCoordinates(
- tileId: number,
- columnIndex: integer,
- rowIndex: integer
- ) {
- if (!this._tileMap) {
- return;
- }
- const layer = this._tileMap.getTileLayer(this._layerIndex);
- if (!layer) {
- return;
- }
- const oldTileId = layer.getTileId(columnIndex, rowIndex);
- if (tileId === oldTileId) {
- return;
- }
- layer.setTile(columnIndex, rowIndex, tileId);
-
- if (this._collisionTileMap) {
- const oldTileDefinition =
- oldTileId !== undefined && this._tileMap.getTileDefinition(oldTileId);
- const newTileDefinition = this._tileMap.getTileDefinition(tileId);
- const hadFullHitBox =
- !!oldTileDefinition &&
- oldTileDefinition.hasFullHitBox(this._hitBoxTag);
- const haveFullHitBox =
- !!newTileDefinition &&
- newTileDefinition.hasFullHitBox(this._hitBoxTag);
- if (hadFullHitBox !== haveFullHitBox) {
- this._collisionTileMap.invalidateTile(
- this._layerIndex,
- columnIndex,
- rowIndex
- );
- }
- }
- this._isTileMapDirty = true;
- }
-
- flipTileOnYAtPosition(x: float, y: float, flip: boolean) {
- const [columnIndex, rowIndex] =
- this.getGridCoordinatesFromSceneCoordinates(x, y);
- this.flipTileOnYAtGridCoordinates(columnIndex, rowIndex, flip);
- }
-
- flipTileOnXAtPosition(x: float, y: float, flip: boolean) {
- const [columnIndex, rowIndex] =
- this.getGridCoordinatesFromSceneCoordinates(x, y);
- this.flipTileOnXAtGridCoordinates(columnIndex, rowIndex, flip);
- }
-
- flipTileOnYAtGridCoordinates(
- columnIndex: integer,
- rowIndex: integer,
- flip: boolean
- ) {
- this.flipTileOnY(columnIndex, rowIndex, 0, flip);
- this._isTileMapDirty = true;
- // No need to invalidate hit boxes since at the moment, collision mask
- // cannot be configured on each tile.
- }
-
- flipTileOnXAtGridCoordinates(
- columnIndex: integer,
- rowIndex: integer,
- flip: boolean
- ) {
- this.flipTileOnX(columnIndex, rowIndex, 0, flip);
- this._isTileMapDirty = true;
- // No need to invalidate hit boxes since at the moment, collision mask
- // cannot be configured on each tile.
- }
-
- isTileFlippedOnXAtPosition(x: float, y: float) {
- const [columnIndex, rowIndex] =
- this.getGridCoordinatesFromSceneCoordinates(x, y);
-
- return this.isTileFlippedOnX(columnIndex, rowIndex, 0);
- }
-
- isTileFlippedOnXAtGridCoordinates(columnIndex: integer, rowIndex: integer) {
- return this.isTileFlippedOnX(columnIndex, rowIndex, 0);
- }
-
- isTileFlippedOnYAtPosition(x: float, y: float) {
- const [columnIndex, rowIndex] =
- this.getGridCoordinatesFromSceneCoordinates(x, y);
-
- return this.isTileFlippedOnY(columnIndex, rowIndex, 0);
- }
-
- isTileFlippedOnYAtGridCoordinates(columnIndex: integer, rowIndex: integer) {
- return this.isTileFlippedOnY(columnIndex, rowIndex, 0);
- }
-
- removeTileAtPosition(x: float, y: float) {
- const [columnIndex, rowIndex] =
- this.getGridCoordinatesFromSceneCoordinates(x, y);
- this.removeTileAtGridCoordinates(columnIndex, rowIndex);
- }
-
- removeTileAtGridCoordinates(columnIndex: integer, rowIndex: integer) {
- if (!this._tileMap) {
- return;
- }
- const layer = this._tileMap.getTileLayer(this._layerIndex);
- if (!layer) {
- return;
- }
- const oldTileId = layer.getTileId(columnIndex, rowIndex);
- if (oldTileId === undefined) {
- return;
- }
- layer.removeTile(columnIndex, rowIndex);
- if (this._collisionTileMap) {
- const oldTileDefinition =
- oldTileId !== undefined && this._tileMap.getTileDefinition(oldTileId);
- const hadFullHitBox =
- !!oldTileDefinition &&
- oldTileDefinition.hasFullHitBox(this._hitBoxTag);
- if (hadFullHitBox) {
- this._collisionTileMap.invalidateTile(
- this._layerIndex,
- columnIndex,
- rowIndex
- );
- }
- }
- this._isTileMapDirty = true;
- }
-
- setGridRowCount(targetRowCount: integer) {
- if (targetRowCount <= 0) return;
- if (!this._tileMap) return;
- this._tileMap.setDimensionY(targetRowCount);
- if (this._collisionTileMap) {
- this._collisionTileMap.updateDimensions();
- }
- this._isTileMapDirty = true;
- this.invalidateHitboxes();
- }
-
- setGridColumnCount(targetColumnCount: integer) {
- if (targetColumnCount <= 0) return;
- if (!this._tileMap) return;
- this._tileMap.setDimensionX(targetColumnCount);
- if (this._collisionTileMap) {
- this._collisionTileMap.updateDimensions();
- }
- this._isTileMapDirty = true;
- this.invalidateHitboxes();
- }
-
- getGridRowCount(): integer {
- if (!this._tileMap) return 0;
- return this._tileMap.getDimensionY();
- }
-
- getGridColumnCount(): integer {
- if (!this._tileMap) return 0;
- return this._tileMap.getDimensionX();
- }
-
getTilesetColumnCount(): integer {
return this._columnCount;
}
@@ -890,67 +478,32 @@ namespace gdjs {
return this._tileMap;
}
- getTileMapWidth() {
- const tileMap = this._tileMap;
- return tileMap ? tileMap.getWidth() : 20;
+ getTileMapForEdition(): TileMapHelper.EditableTileMap | null {
+ return this._tileMap;
}
- getTileMapHeight() {
- const tileMap = this._tileMap;
- return tileMap ? tileMap.getHeight() : 20;
+ getCollisionTileMap(): gdjs.TileMap.TransformedCollisionTileMap | null {
+ return this._collisionTileMap;
}
- /**
- * @param x The layer column.
- * @param y The layer row.
- * @param layerIndex The layer index.
- * @returns The tile's id.
- */
- getTileId(x: integer, y: integer, layerIndex: integer): integer {
- if (!this._tileMap) return -1;
- return this._tileMap.getTileId(x, y, layerIndex);
+ getDisplayMode(): string {
+ return 'all';
}
- /**
- * @param x The layer column.
- * @param y The layer row.
- * @param layerIndex The layer index.
- * @param flip true if the tile should be flipped.
- */
- flipTileOnY(x: integer, y: integer, layerIndex: integer, flip: boolean) {
- if (!this._tileMap) return;
- this._tileMap.flipTileOnY(x, y, layerIndex, flip);
+ getDisplayedLayerIndex(): integer {
+ return 0;
}
- /**
- * @param x The layer column.
- * @param y The layer row.
- * @param layerIndex The layer index.
- * @param flip true if the tile should be flipped.
- */
- flipTileOnX(x: integer, y: integer, layerIndex: integer, flip: boolean) {
- if (!this._tileMap) return;
- this._tileMap.flipTileOnX(x, y, layerIndex, flip);
+ getEditedLayerIndex(): integer {
+ return 0;
}
- /**
- * @param x The layer column.
- * @param y The layer row.
- * @param layerIndex The layer index.
- */
- isTileFlippedOnX(x: integer, y: integer, layerIndex: integer): boolean {
- if (!this._tileMap) return false;
- return this._tileMap.isTileFlippedOnX(x, y, layerIndex);
+ getCollisionMaskTag(): string {
+ return hitBoxTag;
}
- /**
- * @param x The layer column.
- * @param y The layer row.
- * @param layerIndex The layer index.
- */
- isTileFlippedOnY(x: integer, y: integer, layerIndex: integer): boolean {
- if (!this._tileMap) return false;
- return this._tileMap.isTileFlippedOnY(x, y, layerIndex);
+ invalidateTileMap(): void {
+ this._isTileMapDirty = true;
}
}
gdjs.registerObject(
diff --git a/Extensions/TileMap/tilemapcollisionmaskruntimeobject.ts b/Extensions/TileMap/tilemapcollisionmaskruntimeobject.ts
index e3cce2a79040..c35e76c58c37 100644
--- a/Extensions/TileMap/tilemapcollisionmaskruntimeobject.ts
+++ b/Extensions/TileMap/tilemapcollisionmaskruntimeobject.ts
@@ -319,28 +319,16 @@ namespace gdjs {
return;
}
const transformation = this._collisionTileMap.getTransformation();
-
- const absScaleX = Math.abs(this._scaleX);
- const absScaleY = Math.abs(this._scaleY);
-
transformation.setToIdentity();
-
- // Translation
transformation.translate(this.x, this.y);
-
- // Rotation
- const angleInRadians = (this.angle * Math.PI) / 180;
transformation.rotateAround(
- angleInRadians,
+ (this.angle * Math.PI) / 180,
this.getCenterX(),
this.getCenterY()
);
-
- // Scale
- transformation.scale(absScaleX, absScaleY);
+ transformation.scale(Math.abs(this._scaleX), Math.abs(this._scaleY));
this._collisionTileMap.setTransformation(transformation);
-
this._transformationIsUpToDate = true;
}
diff --git a/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.ts b/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.ts
index 725cad74f411..5e938cb5b269 100644
--- a/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.ts
+++ b/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.ts
@@ -55,8 +55,8 @@ namespace gdjs {
}
updatePosition(): void {
- this._pixiObject.pivot.x = this._object.getTileMapWidth() / 2;
- this._pixiObject.pivot.y = this._object.getTileMapHeight() / 2;
+ this._pixiObject.pivot.x = this._object.getOriginalWidth() / 2;
+ this._pixiObject.pivot.y = this._object.getOriginalHeight() / 2;
this._pixiObject.position.x = this._object.x + this.getWidth() / 2;
this._pixiObject.position.y = this._object.y + this.getHeight() / 2;
}
@@ -76,9 +76,9 @@ namespace gdjs {
if (!tileMap) return;
for (const layer of tileMap.getLayers()) {
const isLayerHidden =
- (this._object._displayMode === 'index' &&
- this._object._layerIndex !== layer.id) ||
- (this._object._displayMode === 'visible' && !layer.isVisible());
+ (this._object.getDisplayMode() === 'index' &&
+ this._object.getDisplayedLayerIndex() !== layer.id) ||
+ (this._object.getDisplayMode() === 'visible' && !layer.isVisible());
// Only set alpha on editable layers that are not hidden,
// as others are not rendered.
@@ -93,33 +93,33 @@ namespace gdjs {
}
setWidth(width: float): void {
- this._pixiObject.scale.x = width / this._object.getTileMapWidth();
+ this._pixiObject.scale.x = width / this._object.getOriginalWidth();
this._pixiObject.position.x = this._object.x + width / 2;
}
setHeight(height: float): void {
- this._pixiObject.scale.y = height / this._object.getTileMapHeight();
+ this._pixiObject.scale.y = height / this._object.getOriginalHeight();
this._pixiObject.position.y = this._object.y + height / 2;
}
setScaleX(scaleX: float): void {
this._pixiObject.scale.x = scaleX;
- const width = scaleX * this._object.getTileMapWidth();
+ const width = scaleX * this._object.getOriginalWidth();
this._pixiObject.position.x = this._object.x + width / 2;
}
setScaleY(scaleY: float): void {
this._pixiObject.scale.y = scaleY;
- const height = scaleY * this._object.getTileMapHeight();
+ const height = scaleY * this._object.getOriginalHeight();
this._pixiObject.position.y = this._object.y + height / 2;
}
getWidth(): float {
- return this._object.getTileMapWidth() * this._pixiObject.scale.x;
+ return this._object.getOriginalWidth() * this._pixiObject.scale.x;
}
getHeight(): float {
- return this._object.getTileMapHeight() * this._pixiObject.scale.y;
+ return this._object.getOriginalHeight() * this._pixiObject.scale.y;
}
getScaleX(): float {
@@ -201,8 +201,8 @@ namespace gdjs {
tileMap,
textureCache,
// @ts-ignore
- this._object._displayMode,
- this._object._layerIndex,
+ this._object.getDisplayMode(),
+ this._object.getDisplayedLayerIndex(),
leftBound,
rightBound,
topBound,
diff --git a/Extensions/TileMap/tilemapruntimeobject.ts b/Extensions/TileMap/tilemapruntimeobject.ts
index 7dbce4c4e5cb..c007a8adc0b8 100644
--- a/Extensions/TileMap/tilemapruntimeobject.ts
+++ b/Extensions/TileMap/tilemapruntimeobject.ts
@@ -8,11 +8,13 @@ namespace gdjs {
tilemapJsonFile: string;
tilesetJsonFile: string;
tilemapAtlasImage: string;
- displayMode: string;
+ displayMode: 'visible' | 'all' | 'index';
layerIndex: integer;
levelIndex: integer;
animationSpeedScale: number;
animationFps: number;
+ collisionMaskTag: string;
+ isCollisionMaskEnabled: boolean;
};
};
@@ -46,7 +48,7 @@ namespace gdjs {
* @category Objects > Tile Map
*/
export class TileMapRuntimeObject
- extends gdjs.RuntimeObject
+ extends gdjs.AbstractTileMapRuntimeObject
implements gdjs.Resizable, gdjs.Scalable, gdjs.OpacityHandler
{
_frameElapsedTime: float = 0;
@@ -56,12 +58,30 @@ namespace gdjs {
_tilemapAtlasImage: string;
_displayMode: string;
_layerIndex: integer;
+ editedLayerIndex: integer;
_levelIndex: integer;
_animationSpeedScale: number;
_animationFps: number;
_tileMapManager: gdjs.TileMap.TileMapRuntimeManager;
+ /** The unique tile map for a given resource. */
+ _originalTileMap: TileMapHelper.EditableTileMap | null = null;
+ /**
+ * Either the same as `_originalTileMap` when no edition happened
+ * or a cloned instance with some changes.
+ */
_tileMap: TileMapHelper.EditableTileMap | null = null;
_renderer: gdjs.TileMapRuntimeObjectPixiRenderer;
+ _isTileMapDirty: boolean = false;
+ _collisionTileMap: gdjs.TileMap.TransformedCollisionTileMap | null = null;
+ /**
+ * The tiles are filtered according to this tag.
+ *
+ * This allows have multiple objects with different usage
+ * for the same tile map.
+ * For instance, platforms, jumpthru, ladder, spike, water...
+ */
+ private _collisionMaskTag: string;
+ private isCollisionMaskEnabled = true;
constructor(
instanceContainer: gdjs.RuntimeInstanceContainer,
@@ -74,16 +94,19 @@ namespace gdjs {
this._tilemapAtlasImage = objectData.content.tilemapAtlasImage;
this._displayMode = objectData.content.displayMode;
this._layerIndex = objectData.content.layerIndex;
+ this.editedLayerIndex = objectData.content.layerIndex;
this._levelIndex = objectData.content.levelIndex;
this._animationSpeedScale = objectData.content.animationSpeedScale;
this._animationFps = objectData.content.animationFps;
+ this._collisionMaskTag = objectData.content.collisionMaskTag;
+ this.isCollisionMaskEnabled = objectData.content.isCollisionMaskEnabled;
this._tileMapManager =
gdjs.TileMap.TileMapRuntimeManager.getManager(instanceContainer);
this._renderer = new gdjs.TileMapRuntimeObjectRenderer(
this,
instanceContainer
);
- this.updateTileMap();
+ this.reloadTileMap();
// *ALWAYS* call `this.onCreated()` at the very end of your object constructor.
this.onCreated();
@@ -93,6 +116,13 @@ namespace gdjs {
return this._renderer.getRendererObject();
}
+ updatePreRender(instanceContainer: gdjs.RuntimeInstanceContainer): void {
+ if (!this.isHidden()) {
+ this.updateTileMap(this._isTileMapDirty);
+ this._isTileMapDirty = false;
+ }
+ }
+
update(instanceContainer: gdjs.RuntimeInstanceContainer): void {
if (this._animationSpeedScale <= 0 || this._animationFps === 0) {
return;
@@ -129,7 +159,7 @@ namespace gdjs {
if (
oldObjectData.content.layerIndex !== newObjectData.content.layerIndex
) {
- this.setLayerIndex(newObjectData.content.layerIndex);
+ this.setDisplayedLayerIndex(newObjectData.content.layerIndex);
}
if (
oldObjectData.content.levelIndex !== newObjectData.content.levelIndex
@@ -196,7 +226,7 @@ namespace gdjs {
this.setDisplayMode(networkSyncData.dm);
}
if (networkSyncData.lai !== undefined) {
- this.setLayerIndex(networkSyncData.lai);
+ this.setDisplayedLayerIndex(networkSyncData.lai);
}
if (networkSyncData.lei !== undefined) {
this.setLevelIndex(networkSyncData.lei);
@@ -210,6 +240,7 @@ namespace gdjs {
if (initialInstanceData.customSize) {
this.setWidth(initialInstanceData.width);
this.setHeight(initialInstanceData.height);
+ this.invalidateTransformation();
}
this.setOpacity(
initialInstanceData.opacity === undefined
@@ -218,7 +249,7 @@ namespace gdjs {
);
}
- updateTileMap(): void {
+ reloadTileMap(): void {
this._tileMapManager.getOrLoadTileMap(
this._tilemapJsonFile,
this._tilesetJsonFile,
@@ -250,15 +281,60 @@ namespace gdjs {
// getOrLoadTextureCache already log warns and errors.
return;
}
+ this._originalTileMap = tileMap;
this._tileMap = tileMap;
+ if (this.isCollisionMaskEnabled) {
+ this._collisionTileMap =
+ new gdjs.TileMap.TransformedCollisionTileMap(
+ tileMap,
+ this._collisionMaskTag,
+ this._layerIndex
+ );
+ }
this._renderer.refreshPixiTileMap(textureCache, true);
this.invalidateHitboxes();
+ if (!this._tileMap.getTileLayer(this.editedLayerIndex)) {
+ for (const layer of this._tileMap.getLayers()) {
+ if (this._tileMap.getTileLayer(layer.id)) {
+ this.editedLayerIndex = layer.id;
+ break;
+ }
+ }
+ }
}
);
}
);
}
+ updateTileMap(forceUpdate: boolean): void {
+ this._tileMapManager.getOrLoadTextureCache(
+ (textureName) => {
+ const game = this.getInstanceContainer().getGame();
+ const mappedName = game.resolveEmbeddedResource(
+ this._tilemapJsonFile,
+ textureName
+ );
+ return game
+ .getImageManager()
+ .getPIXITexture(
+ mappedName
+ ) as unknown as PIXI.BaseTexture;
+ },
+ this._tilemapAtlasImage,
+ this._tilemapJsonFile,
+ this._tilesetJsonFile,
+ this._levelIndex,
+ (textureCache: TileMapHelper.TileTextureCache | null) => {
+ if (!textureCache) {
+ // getOrLoadTextureCache already log warns and errors.
+ return;
+ }
+ this._renderer.refreshPixiTileMap(textureCache, true);
+ }
+ );
+ }
+
onDestroyed(): void {
super.onDestroyed();
this._renderer.destroy();
@@ -269,7 +345,7 @@ namespace gdjs {
*/
setTilemapJsonFile(tilemapJsonFile: string): void {
this._tilemapJsonFile = tilemapJsonFile;
- this.updateTileMap();
+ this.reloadTileMap();
}
getTilemapJsonFile(): string {
@@ -282,7 +358,7 @@ namespace gdjs {
setTilesetJsonFile(tilesetJsonFile: string): void {
this._tilesetJsonFile = tilesetJsonFile;
- this.updateTileMap();
+ this.reloadTileMap();
}
getTilesetJsonFile(): string {
@@ -307,32 +383,44 @@ namespace gdjs {
setDisplayMode(displayMode: string): void {
this._displayMode = displayMode;
- this.updateTileMap();
+ this.reloadTileMap();
}
getDisplayMode(): string {
return this._displayMode;
}
- setLayerIndex(layerIndex): void {
+ setDisplayedLayerIndex(layerIndex: integer): void {
this._layerIndex = layerIndex;
- this.updateTileMap();
+ this.reloadTileMap();
}
- getLayerIndex(): integer {
+ getDisplayedLayerIndex(): integer {
return this._layerIndex;
}
- setLevelIndex(levelIndex): void {
+ /**
+ * Change which layer is used to edit and read tiles.
+ * @param layerIndex The index of the layer to edit
+ */
+ setEditedLayerIndex(layerIndex: integer): void {
+ this.editedLayerIndex = layerIndex;
+ }
+
+ getEditedLayerIndex(): integer {
+ return this.editedLayerIndex;
+ }
+
+ setLevelIndex(levelIndex: integer): void {
this._levelIndex = levelIndex;
- this.updateTileMap();
+ this.reloadTileMap();
}
getLevelIndex() {
return this._levelIndex;
}
- setAnimationSpeedScale(animationSpeedScale): void {
+ setAnimationSpeedScale(animationSpeedScale: float): void {
this._animationSpeedScale = animationSpeedScale;
}
@@ -345,6 +433,7 @@ namespace gdjs {
this._renderer.setWidth(width);
this.invalidateHitboxes();
+ this.invalidateTransformation();
}
setHeight(height: float): void {
@@ -352,6 +441,7 @@ namespace gdjs {
this._renderer.setHeight(height);
this.invalidateHitboxes();
+ this.invalidateTransformation();
}
setSize(newWidth: float, newHeight: float): void {
@@ -360,11 +450,13 @@ namespace gdjs {
}
override getOriginalWidth(): float {
- return this.getTileMapWidth();
+ const tileMap = this._tileMap;
+ return tileMap ? tileMap.getWidth() : 20;
}
override getOriginalHeight(): float {
- return this.getTileMapHeight();
+ const tileMap = this._tileMap;
+ return tileMap ? tileMap.getHeight() : 20;
}
/**
@@ -401,6 +493,7 @@ namespace gdjs {
this._renderer.setScaleX(scaleX);
this.invalidateHitboxes();
+ this.invalidateTransformation();
}
/**
@@ -416,21 +509,25 @@ namespace gdjs {
this._renderer.setScaleY(scaleY);
this.invalidateHitboxes();
+ this.invalidateTransformation();
}
setX(x: float): void {
super.setX(x);
this._renderer.updatePosition();
+ this.invalidateTransformation();
}
setY(y: float): void {
super.setY(y);
this._renderer.updatePosition();
+ this.invalidateTransformation();
}
setAngle(angle: float): void {
super.setAngle(angle);
this._renderer.updateAngle();
+ this.invalidateTransformation();
}
setOpacity(opacity: float): void {
@@ -462,67 +559,35 @@ namespace gdjs {
return this._tileMap;
}
- getTileMapWidth() {
- const tileMap = this._tileMap;
- return tileMap ? tileMap.getWidth() : 20;
- }
-
- getTileMapHeight() {
- const tileMap = this._tileMap;
- return tileMap ? tileMap.getHeight() : 20;
- }
-
/**
- * @param x The layer column.
- * @param y The layer row.
- * @param layerIndex The layer index.
- * @returns The tile's id.
+ * Return a tile map that is safe to modify.
*/
- getTileId(x: integer, y: integer, layerIndex: integer): integer {
- if (!this._tileMap) return -1;
- return this._tileMap.getTileId(x, y, layerIndex);
+ getTileMapForEdition(): TileMapHelper.EditableTileMap | null {
+ if (!this._tileMap || !this._originalTileMap) {
+ return null;
+ }
+ if (this._tileMap === this._originalTileMap) {
+ this._tileMap = this._originalTileMap.clone();
+ this._collisionTileMap = new gdjs.TileMap.TransformedCollisionTileMap(
+ this._tileMap,
+ this._collisionMaskTag,
+ this._layerIndex
+ );
+ this.invalidateTransformation();
+ }
+ return this._tileMap;
}
- /**
- * @param x The layer column.
- * @param y The layer row.
- * @param layerIndex The layer index.
- * @param flip true if the tile should be flipped.
- */
- flipTileOnY(x: integer, y: integer, layerIndex: integer, flip: boolean) {
- if (!this._tileMap) return;
- this._tileMap.flipTileOnY(x, y, layerIndex, flip);
+ getCollisionTileMap(): gdjs.TileMap.TransformedCollisionTileMap | null {
+ return this._collisionTileMap;
}
- /**
- * @param x The layer column.
- * @param y The layer row.
- * @param layerIndex The layer index.
- * @param flip true if the tile should be flipped.
- */
- flipTileOnX(x: integer, y: integer, layerIndex: integer, flip: boolean) {
- if (!this._tileMap) return;
- this._tileMap.flipTileOnX(x, y, layerIndex, flip);
+ getCollisionMaskTag(): string {
+ return this._collisionMaskTag;
}
- /**
- * @param x The layer column.
- * @param y The layer row.
- * @param layerIndex The layer index.
- */
- isTileFlippedOnX(x: integer, y: integer, layerIndex: integer): boolean {
- if (!this._tileMap) return false;
- return this._tileMap.isTileFlippedOnX(x, y, layerIndex);
- }
-
- /**
- * @param x The layer column.
- * @param y The layer row.
- * @param layerIndex The layer index.
- */
- isTileFlippedOnY(x: integer, y: integer, layerIndex: integer): boolean {
- if (!this._tileMap) return false;
- return this._tileMap.isTileFlippedOnY(x, y, layerIndex);
+ invalidateTileMap(): void {
+ this._isTileMapDirty = true;
}
}
gdjs.registerObject('TileMap::TileMap', gdjs.TileMapRuntimeObject);
diff --git a/GDJS/tests/karma.conf.js b/GDJS/tests/karma.conf.js
index aa2067451776..ee2e189d549b 100644
--- a/GDJS/tests/karma.conf.js
+++ b/GDJS/tests/karma.conf.js
@@ -167,6 +167,8 @@ module.exports = function (config) {
'./newIDE/app/resources/GDJS/Runtime/Extensions/Effects/pixi-filters/filter-kawase-blur.js',
'./newIDE/app/resources/GDJS/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js',
'./newIDE/app/resources/GDJS/Runtime/Extensions/TileMap/TileMapRuntimeManager.js',
+ './newIDE/app/resources/GDJS/Runtime/Extensions/TileMap/TileMapBehavior.js',
+ './newIDE/app/resources/GDJS/Runtime/Extensions/TileMap/AbstractTileMapRuntimeObject.js',
'./newIDE/app/resources/GDJS/Runtime/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js',
'./newIDE/app/resources/GDJS/Runtime/Extensions/TileMap/tilemapruntimeobject.js',
'./newIDE/app/resources/GDJS/Runtime/Extensions/TileMap/collision/TileMapCollisionMaskRenderer.js',
diff --git a/SharedLibs/TileMapHelper/src/load/tiled/TiledTileMapLoader.ts b/SharedLibs/TileMapHelper/src/load/tiled/TiledTileMapLoader.ts
index ba77316dc404..f05e3909ae06 100644
--- a/SharedLibs/TileMapHelper/src/load/tiled/TiledTileMapLoader.ts
+++ b/SharedLibs/TileMapHelper/src/load/tiled/TiledTileMapLoader.ts
@@ -24,11 +24,11 @@ export namespace TiledTileMapLoader {
*/
export function load(
tiledTileMap: TiledTileMap,
- pako: any
+ pako: any,
): EditableTileMap | null {
if (!tiledTileMap.tiledversion) {
console.warn(
- "The loaded Tiled map does not contain a 'tiledversion' key. Are you sure this file has been exported from Tiled (mapeditor.org)?"
+ "The loaded Tiled map does not contain a 'tiledversion' key. Are you sure this file has been exported from Tiled (mapeditor.org)?",
);
return null;
@@ -41,15 +41,12 @@ export namespace TiledTileMapLoader {
if (tiledTileSet.tiles) {
for (const tile of tiledTileSet.tiles) {
const tileDefinition = new TileDefinition(
- tile.animation ? tile.animation.length : 0
+ tile.animation ? tile.animation.length : 0,
);
const tileClass = tile.type || tile.class;
- if (tile.objectgroup) {
+ if (tile.objectgroup && tile.objectgroup.objects) {
for (const object of tile.objectgroup.objects) {
- const tag = object.type || object.class || tileClass;
- if (!tag || tag.length === 0) {
- continue;
- }
+ const tag = object.type || object.class || tileClass || "";
let polygon: PolygonVertices | null = null;
let hasFullHitBox = false;
if (object.polygon) {
@@ -97,6 +94,7 @@ export namespace TiledTileMapLoader {
}
} else if (tileClass) {
// When there is no shape, default to the whole tile.
+ // Unless no class is set and this is likely a non-solid tile.
const polygon: PolygonVertices = [
[0, 0],
[0, tiledTileMap.tileheight],
@@ -107,13 +105,13 @@ export namespace TiledTileMapLoader {
}
definitions.set(
getTileIdFromTiledGUI(firstGid + tile.id),
- tileDefinition
+ tileDefinition,
);
}
}
for (let tileIndex = 0; tileIndex < tiledTileSet.tilecount; tileIndex++) {
const tileId = getTileIdFromTiledGUI(firstGid + tileIndex);
- if (!definitions.has(tileId)) {
+ if (tileId && !definitions.has(tileId)) {
definitions.set(tileId, new TileDefinition(0));
}
}
@@ -124,31 +122,33 @@ export namespace TiledTileMapLoader {
tiledTileMap.tileheight,
tiledTileMap.width,
tiledTileMap.height,
- definitions
+ definitions,
);
for (const tiledLayer of tiledTileMap.layers) {
if (tiledLayer.type === "objectgroup") {
const objectLayer = collisionTileMap.addObjectLayer(tiledLayer.id);
objectLayer.setVisible(tiledLayer.visible);
- for (const tiledObject of tiledLayer.objects) {
- if (!tiledObject.visible || !tiledObject.gid) {
- // Objects layer are nice to put decorations but dynamic objects
- // must be done with GDevelop objects.
- // So, there is no point to load it as there won't be any action to
- // make objects visible individually.
- continue;
+ if (tiledLayer.objects) {
+ for (const tiledObject of tiledLayer.objects) {
+ if (!tiledObject.visible || !tiledObject.gid) {
+ // Objects layer are nice to put decorations but dynamic objects
+ // must be done with GDevelop objects.
+ // So, there is no point to load it as there won't be any action to
+ // make objects visible individually.
+ continue;
+ }
+ const tileGid = extractTileUidFlippedStates(tiledObject.gid);
+ const object = new TileObject(
+ tiledObject.x,
+ tiledObject.y,
+ tileGid.id,
+ );
+ objectLayer.add(object);
+ object.setFlippedHorizontally(tileGid.flippedHorizontally);
+ object.setFlippedVertically(tileGid.flippedVertically);
+ object.setFlippedDiagonally(tileGid.flippedDiagonally);
}
- const tileGid = extractTileUidFlippedStates(tiledObject.gid);
- const object = new TileObject(
- tiledObject.x,
- tiledObject.y,
- tileGid.id
- );
- objectLayer.add(object);
- object.setFlippedHorizontally(tileGid.flippedHorizontally);
- object.setFlippedVertically(tileGid.flippedVertically);
- object.setFlippedDiagonally(tileGid.flippedDiagonally);
}
} else if (tiledLayer.type === "tilelayer") {
let tileSlotIndex = 0;
@@ -164,14 +164,14 @@ export namespace TiledTileMapLoader {
}
if (layerData) {
const collisionTileLayer = collisionTileMap.addNewTileLayer(
- tiledLayer.id
+ tiledLayer.id,
);
collisionTileLayer.setAlpha(tiledLayer.opacity);
collisionTileLayer.setVisible(tiledLayer.visible);
// TODO handle layer offset
- for (let y = 0; y < tiledLayer.height; y++) {
- for (let x = 0; x < tiledLayer.width; x++) {
+ for (let y = 0; y < (tiledLayer.height || 0); y++) {
+ for (let x = 0; x < (tiledLayer.width || 0); x++) {
// The "globalTileUid" is the tile UID with encoded
// bits about the flipping/rotation of the tile.
const globalTileUid = layerData[tileSlotIndex];
@@ -182,17 +182,17 @@ export namespace TiledTileMapLoader {
collisionTileLayer.setFlippedHorizontally(
x,
y,
- tileUid.flippedHorizontally
+ tileUid.flippedHorizontally,
);
collisionTileLayer.setFlippedVertically(
x,
y,
- tileUid.flippedVertically
+ tileUid.flippedVertically,
);
collisionTileLayer.setFlippedDiagonally(
x,
y,
- tileUid.flippedDiagonally
+ tileUid.flippedDiagonally,
);
}
tileSlotIndex += 1;
diff --git a/SharedLibs/TileMapHelper/src/load/tiled/TiledTileMapLoaderHelper.ts b/SharedLibs/TileMapHelper/src/load/tiled/TiledTileMapLoaderHelper.ts
index 0cc035ff7981..cb95567f8655 100644
--- a/SharedLibs/TileMapHelper/src/load/tiled/TiledTileMapLoaderHelper.ts
+++ b/SharedLibs/TileMapHelper/src/load/tiled/TiledTileMapLoaderHelper.ts
@@ -105,7 +105,7 @@ export const extractTileUidFlippedStates = (
* @return the tile identifier.
*/
export function getTileIdFromTiledGUI(
- tiledGUI: number | undefined
+ tiledGUI: number
): number | undefined {
return tiledGUI === 0 ? undefined : tiledGUI - 1;
}
diff --git a/SharedLibs/TileMapHelper/src/model/TileMapModel.ts b/SharedLibs/TileMapHelper/src/model/TileMapModel.ts
index 51cfce997262..7b455f4e2a56 100644
--- a/SharedLibs/TileMapHelper/src/model/TileMapModel.ts
+++ b/SharedLibs/TileMapHelper/src/model/TileMapModel.ts
@@ -16,7 +16,7 @@ import { FlippingHelper } from "./GID";
* This allows to support new file format with only a new parser.
*/
export class EditableTileMap {
- private _backgroundResourceName?: string;
+ private _backgroundResourceName: string | null = null;
private _tileSet: Map;
private _layers: Array;
/**
@@ -54,7 +54,7 @@ export class EditableTileMap {
dimY: integer,
// TODO should the tile set be built internally?
// It's not meant to change and it avoid to do a copy.
- tileSet: Map
+ tileSet: Map,
) {
this.tileWidth = tileWidth;
this.tileHeight = tileHeight;
@@ -64,6 +64,20 @@ export class EditableTileMap {
this._layers = [];
}
+ clone(): EditableTileMap {
+ const tileMap = new EditableTileMap(
+ this.tileWidth,
+ this.tileHeight,
+ this.dimX,
+ this.dimY,
+ this._tileSet,
+ );
+ for (const layer of this._layers) {
+ tileMap._layers.push(layer.clone(tileMap, layer.id));
+ }
+ return tileMap;
+ }
+
/**
* Loads EditableTileMap from serialized data.
* Uses object configuration as the source of truth as the serialized data
@@ -82,7 +96,7 @@ export class EditableTileMap {
tileSize: number;
tileSetColumnCount: number;
tileSetRowCount: number;
- }
+ },
): EditableTileMap {
const tileSet = new Map();
@@ -93,7 +107,7 @@ export class EditableTileMap {
tileSetRowCount <= 0
) {
throw new Error(
- `Tilemap object badly configured. Tile size ${tileSize} is not compatible with atlas image dimensions, resulting in having ${tileSetColumnCount} columns and ${tileSetRowCount} rows.`
+ `Tilemap object badly configured. Tile size ${tileSize} is not compatible with atlas image dimensions, resulting in having ${tileSetColumnCount} columns and ${tileSetRowCount} rows.`,
);
}
// TODO: Actually save and load tile set when useful.
@@ -108,7 +122,7 @@ export class EditableTileMap {
tileSize || editableTileMapAsJsObject.tileHeight,
editableTileMapAsJsObject.dimX || 1,
editableTileMapAsJsObject.dimY || 1,
- tileSet
+ tileSet,
);
if (editableTileMapAsJsObject.layers) {
@@ -117,8 +131,8 @@ export class EditableTileMap {
EditableTileMapLayer.from(
layerAsJsObject,
tileMap,
- (tileId) => tileId < tileSetColumnCount * tileSetRowCount
- )
+ (tileId) => tileId < tileSetColumnCount * tileSetRowCount,
+ ),
);
});
} else {
@@ -209,7 +223,7 @@ export class EditableTileMap {
columnsToAppend: number,
columnsToUnshift: number,
rowsToAppend: number,
- rowsToUnshift: number
+ rowsToUnshift: number,
): void {
if (
columnsToAppend < 0 ||
@@ -230,7 +244,7 @@ export class EditableTileMap {
columnsToAppend,
columnsToUnshift,
rowsToAppend,
- rowsToUnshift
+ rowsToUnshift,
);
}
}
@@ -310,7 +324,7 @@ export class EditableTileMap {
/**
* @returns The resource name of the background
*/
- getBackgroundResourceName(): string {
+ getBackgroundResourceName(): string | null {
return this._backgroundResourceName;
}
@@ -410,7 +424,7 @@ export class EditableTileMap {
}
trimEmptyColumnsAndRowToFitLayer(
- layerId: integer
+ layerId: integer,
):
| {
poppedRows: number;
@@ -427,7 +441,7 @@ export class EditableTileMap {
// The tile map is empty. Instead of having an object with null width and height,
// the tile map is resized to have a size of 1x1 with an empty tile. This is useful
// in the editor. It might need to have a different behavior in the runtime.
- layer.buildEmptyLayer(1, 1);
+ layer.increaseDimensions(1, 0, 1, 0);
this.dimX = 1;
this.dimY = 1;
return {
@@ -446,7 +460,7 @@ export class EditableTileMap {
trimmingData.columnsToPop,
trimmingData.columnsToShift,
trimmingData.rowsToPop,
- trimmingData.rowsToShift
+ trimmingData.rowsToShift,
);
}
}
@@ -489,6 +503,8 @@ abstract class AbstractEditableLayer {
this.id = id;
}
+ abstract clone(tileMap: EditableTileMap, id: integer): AbstractEditableLayer;
+
setVisible(visible: boolean): void {
this.visible = visible;
}
@@ -528,6 +544,12 @@ export class EditableObjectLayer extends AbstractEditableLayer {
this.objects = [];
}
+ clone(tileMap: EditableTileMap, id: integer): EditableObjectLayer {
+ const layer = new EditableObjectLayer(tileMap, id);
+ layer.objects.push.apply(this.objects);
+ return layer;
+ }
+
add(object: TileObject): void {
this.objects.push(object);
}
@@ -575,21 +597,21 @@ export class TileObject {
setFlippedHorizontally(flippedHorizontally: boolean): void {
this.tileId = FlippingHelper.setFlippedHorizontally(
this.tileId,
- flippedHorizontally
+ flippedHorizontally,
);
}
setFlippedVertically(flippedVertically: boolean): void {
this.tileId = FlippingHelper.setFlippedVertically(
this.tileId,
- flippedVertically
+ flippedVertically,
);
}
setFlippedDiagonally(flippedDiagonally: boolean): void {
this.tileId = FlippingHelper.setFlippedDiagonally(
this.tileId,
- flippedDiagonally
+ flippedDiagonally,
);
}
@@ -628,29 +650,33 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
*/
constructor(tileMap: EditableTileMap, id: integer) {
super(tileMap, id);
- this.buildEmptyLayer(
- this.tileMap.getDimensionX(),
- this.tileMap.getDimensionY()
- );
- this._alpha = 1;
- }
-
- buildEmptyLayer(dimensionX: number, dimensionY: number) {
+ const dimensionX = this.tileMap.getDimensionX();
+ const dimensionY = this.tileMap.getDimensionY();
this._tiles = [];
this._tiles.length = dimensionY;
for (let index = 0; index < this._tiles.length; index++) {
this._tiles[index] = new Int32Array(dimensionX);
}
+ this._alpha = 1;
+ }
+
+ clone(tileMap: EditableTileMap, id: integer): EditableTileMapLayer {
+ const layer = new EditableTileMapLayer(tileMap, id);
+ for (let index = 0; index < layer._tiles.length; index++) {
+ layer._tiles[index].set(this._tiles[index]);
+ }
+ layer._alpha = this._alpha;
+ return layer;
}
static from(
editableTileMapLayerAsJsObject: EditableTileMapLayerAsJsObject,
tileMap: EditableTileMap,
- isTileIdValid: (tileId: number) => boolean
+ isTileIdValid: (tileId: number) => boolean,
): EditableTileMapLayer {
const layer = new EditableTileMapLayer(
tileMap,
- editableTileMapLayerAsJsObject.id
+ editableTileMapLayerAsJsObject.id,
);
layer.setAlpha(editableTileMapLayerAsJsObject.alpha);
editableTileMapLayerAsJsObject.tiles.forEach((row: number[], y: number) =>
@@ -659,7 +685,7 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
if (isTileIdValid(tileId)) {
layer.setTileGID(x, y, tileGID);
}
- })
+ }),
);
return layer;
}
@@ -677,8 +703,8 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
// -1 corresponds to null value
if (tileGID === undefined) return -1;
return tileGID;
- })
- )
+ }),
+ ),
),
};
}
@@ -705,19 +731,19 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
columnsToPop: number,
columnsToShift: number,
rowsToPop: number,
- rowsToShift: number
+ rowsToShift: number,
) {
if (rowsToPop > 0 || rowsToShift > 0) {
this._tiles = this._tiles.slice(
rowsToShift,
- rowsToPop ? -rowsToPop : undefined
+ rowsToPop ? -rowsToPop : undefined,
);
}
if (columnsToPop > 0 || columnsToShift > 0) {
this._tiles.forEach((row, rowIndex) => {
this._tiles[rowIndex] = this._tiles[rowIndex].slice(
columnsToShift,
- columnsToPop ? -columnsToPop : undefined
+ columnsToPop ? -columnsToPop : undefined,
);
});
}
@@ -727,14 +753,14 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
columnsToAppend: number,
columnsToUnshift: number,
rowsToAppend: number,
- rowsToUnshift: number
+ rowsToUnshift: number,
) {
const initialRowCount = this._tiles.length;
const initialColumnCount = this._tiles[0].length;
if (columnsToAppend > 0 || columnsToUnshift > 0) {
this._tiles.forEach((row, rowIndex) => {
const newRow = new Int32Array(
- initialColumnCount + columnsToAppend + columnsToUnshift
+ initialColumnCount + columnsToAppend + columnsToUnshift,
).fill(0);
newRow.set(row, columnsToUnshift);
this._tiles[rowIndex] = newRow;
@@ -750,9 +776,9 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
.fill(0)
.map(() =>
new Int32Array(
- initialColumnCount + columnsToAppend + columnsToUnshift
- ).fill(0)
- )
+ initialColumnCount + columnsToAppend + columnsToUnshift,
+ ).fill(0),
+ ),
);
this._tiles.length = initialRowCount + rowsToAppend + rowsToUnshift;
@@ -763,7 +789,7 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
rowIndex++
) {
this._tiles[rowIndex] = new Int32Array(
- initialColumnCount + columnsToAppend + columnsToUnshift
+ initialColumnCount + columnsToAppend + columnsToUnshift,
).fill(0);
}
}
@@ -817,10 +843,10 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
const initialDimensionX = this.getDimensionX();
const initialDimensionY = this.getDimensionY();
const columnsToShiftByRow = new Array(this._tiles.length).fill(
- this._tiles[0].length
+ this._tiles[0].length,
);
const columnsToPopByRow = new Array(this._tiles.length).fill(
- this._tiles[0].length
+ this._tiles[0].length,
);
let isFirstNonEmptyRowFound = false;
for (let y = 0; y < this._tiles.length; y++) {
@@ -886,7 +912,7 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
setFlippedHorizontally(
x: integer,
y: integer,
- flippedHorizontally: boolean
+ flippedHorizontally: boolean,
): void {
const tilesRow = this._tiles[y];
if (!tilesRow || x >= tilesRow.length) {
@@ -900,7 +926,7 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
}
tilesRow[x] = FlippingHelper.setFlippedHorizontally(
tileId,
- flippedHorizontally
+ flippedHorizontally,
);
}
@@ -912,7 +938,7 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
setFlippedVertically(
x: integer,
y: integer,
- flippedVertically: boolean
+ flippedVertically: boolean,
): void {
const tilesRow = this._tiles[y];
if (!tilesRow || x >= tilesRow.length) {
@@ -926,7 +952,7 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
}
tilesRow[x] = FlippingHelper.setFlippedVertically(
tileId,
- flippedVertically
+ flippedVertically,
);
}
@@ -938,7 +964,7 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
setFlippedDiagonally(
x: integer,
y: integer,
- flippedDiagonally: boolean
+ flippedDiagonally: boolean,
): void {
const tilesRow = this._tiles[y];
if (!tilesRow || x >= tilesRow.length) {
@@ -952,7 +978,7 @@ export class EditableTileMapLayer extends AbstractEditableLayer {
}
tilesRow[x] = FlippingHelper.setFlippedDiagonally(
tileId,
- flippedDiagonally
+ flippedDiagonally,
);
}
@@ -1098,7 +1124,7 @@ export class TileDefinition {
addHitBox(
tag: string,
polygon: PolygonVertices,
- hasFullHitBox: boolean
+ hasFullHitBox: boolean,
): void {
let taggedHitBox = this.taggedHitBoxes.find((hitbox) => hitbox.tag === tag);
if (!taggedHitBox) {
@@ -1126,7 +1152,7 @@ export class TileDefinition {
*/
getHitBoxes(tag: string): PolygonVertices[] | undefined {
const taggedHitBox = this.taggedHitBoxes.find(
- (hitbox) => hitbox.tag === tag
+ (hitbox) => hitbox.tag === tag,
);
return taggedHitBox && taggedHitBox.polygons;
}
@@ -1138,9 +1164,9 @@ export class TileDefinition {
*/
hasFullHitBox(tag: string): boolean {
const taggedHitBox = this.taggedHitBoxes.find(
- (hitbox) => hitbox.tag === tag
+ (hitbox) => hitbox.tag === tag,
);
- return taggedHitBox && taggedHitBox.hasFullHitBox;
+ return !!taggedHitBox && taggedHitBox.hasFullHitBox;
}
/**
diff --git a/SharedLibs/TileMapHelper/src/render/TileMapPixiHelper.ts b/SharedLibs/TileMapHelper/src/render/TileMapPixiHelper.ts
index fb84ba362319..9ed7f50c3cbb 100644
--- a/SharedLibs/TileMapHelper/src/render/TileMapPixiHelper.ts
+++ b/SharedLibs/TileMapHelper/src/render/TileMapPixiHelper.ts
@@ -113,7 +113,7 @@ export namespace PixiTileMapHelper {
leftBound: number,
rightBound: number,
topBound: number,
- bottomBound: number,
+ bottomBound: number
): void {
// The extension doesn't handle the Pixi sub-namespace very well.
const pixiTileMap = untypedPixiTileMap as PIXI.tilemap.CompositeTilemap;