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;