diff --git a/handlers/TileMapHandler.js b/handlers/TileMapHandler.js index b83948a..466b737 100644 --- a/handlers/TileMapHandler.js +++ b/handlers/TileMapHandler.js @@ -24,12 +24,12 @@ class TileMapHandler { }); } - resetLevel(levelIndex) { + resetLevel(levelIndex, flagIndex) { SFXHandler.resetSfx(); this.tileMap = WorldDataHandler.levels[levelIndex].tileData; Camera.updateViewportRelatedToScale(WorldDataHandler.levels[levelIndex].zoomFactor || 1) this.updateLevelDimensions(); - this.setInitialPlayerAndCameraPos(levelIndex); + this.#setInitialPlayerAndCameraPos(levelIndex, flagIndex); this.levelObjects = []; this.levelObjects = this.createInitialObjects(WorldDataHandler.levels[levelIndex].levelObjects); this.deko = this.createInitialDeko(WorldDataHandler.levels[levelIndex].deko); @@ -53,26 +53,46 @@ class TileMapHandler { } } - setInitialPlayerAndCameraPos(levelIndex) { - //This is a fallback, in case no flag was set in a level (start, ending, or if user forgot to set it) - let initialPlayerValue = { x: 0, y: 0 }; - WorldDataHandler.levels[levelIndex].levelObjects.forEach(levelObject => { - if (levelObject.type === ObjectTypes.START_FLAG) { - initialPlayerValue.x = levelObject.x * this.tileSize; - initialPlayerValue.y = levelObject.y * this.tileSize; - } - }) - this.player.initialY = initialPlayerValue.x; - this.player.initialX = initialPlayerValue.y; - Camera.moveTo(initialPlayerValue.x, initialPlayerValue.y); + #setInitialPlayerAndCameraPos(levelIndex, flagIndex) { + const initialPlayerTile = this.#getInitialPlayerTile(levelIndex, flagIndex); + this.#setPlayerInitialTile(initialPlayerTile); + + const initialPlayerPosition = { + x: initialPlayerTile.x * this.tileSize, + y: initialPlayerTile.y * this.tileSize + }; + + Camera.moveTo(initialPlayerPosition.x, initialPlayerPosition.y); //startRemoval if (typeof LevelSizeHandler === 'function') { - LevelSizeHandler.updateCameraSliders(this.levelWidth * this.tileSize, this.levelHeight * this.tileSize, initialPlayerValue); + LevelSizeHandler.updateCameraSliders(this.levelWidth * this.tileSize, this.levelHeight * this.tileSize, initialPlayerPosition); } //endRemoval } + #getInitialPlayerTile(levelIndex, flagIndex) { + const startFlagsInLevel = WorldDataHandler.levels[levelIndex].levelObjects.filter(levelObject => levelObject.type === ObjectTypes.START_FLAG); + + const customEntryFlag = flagIndex && startFlagsInLevel.find(startFlag => startFlag?.extraAttributes?.flagIndex === flagIndex); + + const levelStartFlag = (!customEntryFlag) && startFlagsInLevel.find(startFlag => startFlag?.extraAttributes?.levelStartFlag); + + const lastFlag = (!levelStartFlag && !customEntryFlag) && startFlagsInLevel[startFlagsInLevel.length - 1]; + + return customEntryFlag || + levelStartFlag || + lastFlag || + { x: 0, y: 0 }; + } + + #setPlayerInitialTile(tile) { + if (this?.player) { + this.player.initialX = tile.x * this.tileSize; + this.player.initialY = tile.y * this.tileSize; + } + } + updateLevelDimensions() { this.levelWidth = this.getLevelWidth(); this.levelHeight = this.getLevelHeight(); @@ -235,7 +255,7 @@ class TileMapHandler { if (this.currentLevel === levelAmounth - 1) { GameStatistics.stopTimer(); } - this.resetLevel(this.currentLevel); + this.resetLevel(this.currentLevel, PlayMode.customExit?.flagIndex); if (typeof LevelNavigationHandler === 'function') { LevelNavigationHandler.updateLevel(); LevelNavigationHandler.adaptLevelList(); diff --git a/objects/StartFlag.js b/objects/StartFlag.js index 45d4dd8..3d1381c 100644 --- a/objects/StartFlag.js +++ b/objects/StartFlag.js @@ -15,32 +15,9 @@ class StartFlag extends InteractiveLevelObject { this.flagIndex = this.makeid(3); this.addChangeableAttribute("flagIndex", this.flagIndex, this.tilemapHandler.currentLevel); } - - const customEntryFlag = startFlagsInLevel.find(startFlag => - PlayMode?.customExit?.flagIndex && startFlag?.extraAttributes?.flagIndex === PlayMode.customExit.flagIndex - ); - const levelStartFlag = startFlagsInLevel.find(startFlag => - startFlag?.extraAttributes?.levelStartFlag - ); - - if (customEntryFlag?.extraAttributes?.flagIndex === this.flagIndex || levelStartFlag?.extraAttributes?.flagIndex === this.flagIndex) { - this.setPlayerInitialPosition(); - } - else if (!levelStartFlag && !customEntryFlag) { - const lastFlag = startFlagsInLevel[startFlagsInLevel.length - 1]; - if (lastFlag.x === this.initialX && lastFlag.y === this.initialY) { - this.setPlayerInitialPosition(); - } - } - } - - setPlayerInitialPosition() { - if (this.tilemapHandler?.player) { - this.tilemapHandler.player.initialX = this.x; - this.tilemapHandler.player.initialY = this.y; - } } + //startRemoval updateLevelStartValue(levelStartValue) { const startFlagsInTileMapHandler = this.tilemapHandler.filterObjectsByTypes(ObjectTypes.START_FLAG); @@ -55,6 +32,7 @@ class StartFlag extends InteractiveLevelObject { this.addChangeableAttribute("levelStartFlag", false); } } + //endRemoval collisionEvent() { }