From c39121eaca99d6afa6ac41ca5f03fe2d4d362322 Mon Sep 17 00:00:00 2001 From: jakubiszon Date: Mon, 3 Mar 2025 17:05:53 +0100 Subject: [PATCH 1/4] refactor(start-flag): move player start position logic --- handlers/TileMapHandler.js | 60 ++++++++++++++++++++++++++++---------- objects/StartFlag.js | 31 +++++--------------- 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/handlers/TileMapHandler.js b/handlers/TileMapHandler.js index b83948a..ce5979e 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,56 @@ 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); + /** + * Sets the initial player and camera position based on this.currentLevel and the specified flagIndex. + * @param {string | undefined} flagIndex specifying the + */ + #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 } + /** Returns an object containing the x,y of the tile the player should start on. */ + #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); + + // default start flag used when flagIndex was not matched + const levelStartFlag = (!customEntryFlag) && startFlagsInLevel.find(startFlag => startFlag?.extraAttributes?.levelStartFlag); + + // any start flag used when no other flag was found + const lastFlag = (!levelStartFlag && !customEntryFlag) && startFlagsInLevel[startFlagsInLevel.length - 1]; + + return customEntryFlag || + levelStartFlag || + lastFlag || + { x: 0, y: 0 }; + } + + /** + * @param {{x:number, y:number}} position - object specifying the initial tile of the player. + */ + #setPlayerInitialTile(position) { + if (this?.player) { + this.player.initialX = position.x * this.tileSize; + this.player.initialY = position.y * this.tileSize; + } + } + updateLevelDimensions() { this.levelWidth = this.getLevelWidth(); this.levelHeight = this.getLevelHeight(); diff --git a/objects/StartFlag.js b/objects/StartFlag.js index 45d4dd8..eb450e5 100644 --- a/objects/StartFlag.js +++ b/objects/StartFlag.js @@ -15,35 +15,17 @@ 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 + /** + * Updates the levelStartFlag property for this flag and adjusts the other flags to keep just one such flag in the level + * @param {*} levelStartValue + */ updateLevelStartValue(levelStartValue) { const startFlagsInTileMapHandler = this.tilemapHandler.filterObjectsByTypes(ObjectTypes.START_FLAG); + // TODO move this logic to tilemapHandler if (levelStartValue) { //reset all other start flags, because there can only be 1 level starting flag startFlagsInTileMapHandler.forEach(startFlagInTileMapHandler => { @@ -55,6 +37,7 @@ class StartFlag extends InteractiveLevelObject { this.addChangeableAttribute("levelStartFlag", false); } } + //endRemoval collisionEvent() { } From de588ecb52106d7a1800d0c7c7f2a7bde93b1927 Mon Sep 17 00:00:00 2001 From: jakubiszon Date: Mon, 3 Mar 2025 17:14:11 +0100 Subject: [PATCH 2/4] doc(TileMapHandler): add codedoc --- handlers/TileMapHandler.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/handlers/TileMapHandler.js b/handlers/TileMapHandler.js index ce5979e..e9d44cc 100644 --- a/handlers/TileMapHandler.js +++ b/handlers/TileMapHandler.js @@ -55,7 +55,8 @@ class TileMapHandler { /** * Sets the initial player and camera position based on this.currentLevel and the specified flagIndex. - * @param {string | undefined} flagIndex specifying the + * @param {number} levelIndex specifies the level to load. + * @param {string | undefined} flagIndex specifies the custom starting flag. */ #setInitialPlayerAndCameraPos(levelIndex, flagIndex) { const initialPlayerTile = this.#getInitialPlayerTile(levelIndex, flagIndex); @@ -94,12 +95,12 @@ class TileMapHandler { } /** - * @param {{x:number, y:number}} position - object specifying the initial tile of the player. + * @param {{x:number, y:number}} tile - object specifying the initial tile of the player. */ - #setPlayerInitialTile(position) { + #setPlayerInitialTile(tile) { if (this?.player) { - this.player.initialX = position.x * this.tileSize; - this.player.initialY = position.y * this.tileSize; + this.player.initialX = tile.x * this.tileSize; + this.player.initialY = tile.y * this.tileSize; } } From c5495e7a52bbf3a6713fcbf5da091f868c4e9e57 Mon Sep 17 00:00:00 2001 From: jakubiszon Date: Mon, 3 Mar 2025 17:44:59 +0100 Subject: [PATCH 3/4] fix: pass flag index to resetLevel --- handlers/TileMapHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handlers/TileMapHandler.js b/handlers/TileMapHandler.js index e9d44cc..42ea388 100644 --- a/handlers/TileMapHandler.js +++ b/handlers/TileMapHandler.js @@ -266,7 +266,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(); From a9320f36c2d8103f24a8c0f6f828cad9cde54029 Mon Sep 17 00:00:00 2001 From: jakubiszon Date: Sat, 8 Mar 2025 18:11:02 +0100 Subject: [PATCH 4/4] remove comments --- handlers/TileMapHandler.js | 11 ----------- objects/StartFlag.js | 5 ----- 2 files changed, 16 deletions(-) diff --git a/handlers/TileMapHandler.js b/handlers/TileMapHandler.js index 42ea388..466b737 100644 --- a/handlers/TileMapHandler.js +++ b/handlers/TileMapHandler.js @@ -53,11 +53,6 @@ class TileMapHandler { } } - /** - * Sets the initial player and camera position based on this.currentLevel and the specified flagIndex. - * @param {number} levelIndex specifies the level to load. - * @param {string | undefined} flagIndex specifies the custom starting flag. - */ #setInitialPlayerAndCameraPos(levelIndex, flagIndex) { const initialPlayerTile = this.#getInitialPlayerTile(levelIndex, flagIndex); this.#setPlayerInitialTile(initialPlayerTile); @@ -76,16 +71,13 @@ class TileMapHandler { //endRemoval } - /** Returns an object containing the x,y of the tile the player should start on. */ #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); - // default start flag used when flagIndex was not matched const levelStartFlag = (!customEntryFlag) && startFlagsInLevel.find(startFlag => startFlag?.extraAttributes?.levelStartFlag); - // any start flag used when no other flag was found const lastFlag = (!levelStartFlag && !customEntryFlag) && startFlagsInLevel[startFlagsInLevel.length - 1]; return customEntryFlag || @@ -94,9 +86,6 @@ class TileMapHandler { { x: 0, y: 0 }; } - /** - * @param {{x:number, y:number}} tile - object specifying the initial tile of the player. - */ #setPlayerInitialTile(tile) { if (this?.player) { this.player.initialX = tile.x * this.tileSize; diff --git a/objects/StartFlag.js b/objects/StartFlag.js index eb450e5..3d1381c 100644 --- a/objects/StartFlag.js +++ b/objects/StartFlag.js @@ -18,14 +18,9 @@ class StartFlag extends InteractiveLevelObject { } //startRemoval - /** - * Updates the levelStartFlag property for this flag and adjusts the other flags to keep just one such flag in the level - * @param {*} levelStartValue - */ updateLevelStartValue(levelStartValue) { const startFlagsInTileMapHandler = this.tilemapHandler.filterObjectsByTypes(ObjectTypes.START_FLAG); - // TODO move this logic to tilemapHandler if (levelStartValue) { //reset all other start flags, because there can only be 1 level starting flag startFlagsInTileMapHandler.forEach(startFlagInTileMapHandler => {