From dba0f054dbef35801963fda961cb08774eb3a1d2 Mon Sep 17 00:00:00 2001 From: Peter Stockings Date: Mon, 5 Jan 2026 14:17:12 +1100 Subject: [PATCH] Fix for bug where when switching levels the player would jump between entrance to exit locations --- src/rendering/DungeonRenderer.ts | 17 ++++++++++++++++- src/rendering/__tests__/DungeonRenderer.test.ts | 9 +++++---- src/scenes/GameScene.ts | 2 +- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/rendering/DungeonRenderer.ts b/src/rendering/DungeonRenderer.ts index 1c1d146..cfe9e95 100644 --- a/src/rendering/DungeonRenderer.ts +++ b/src/rendering/DungeonRenderer.ts @@ -29,7 +29,7 @@ export class DungeonRenderer { this.fxRenderer = new FxRenderer(scene); } - initializeFloor(world: World) { + initializeFloor(world: World, playerId: EntityId) { this.world = world; this.fovManager.initialize(world); @@ -55,6 +55,21 @@ export class DungeonRenderer { this.fxRenderer.clearCorpses(); this.setupAnimations(); this.minimapRenderer.positionMinimap(); + + // Reset player sprite position to prevent tween animation from old floor + if (this.playerSprite) { + // Kill any active tweens on the player sprite + this.scene.tweens.killTweensOf(this.playerSprite); + + // Get player position in new world using provided playerId + const player = world.actors.get(playerId); + if (player && player.category === "combatant") { + this.playerSprite.setPosition( + player.pos.x * TILE_SIZE + TILE_SIZE / 2, + player.pos.y * TILE_SIZE + TILE_SIZE / 2 + ); + } + } } private setupAnimations() { diff --git a/src/rendering/__tests__/DungeonRenderer.test.ts b/src/rendering/__tests__/DungeonRenderer.test.ts index e76ab33..fdd19c2 100644 --- a/src/rendering/__tests__/DungeonRenderer.test.ts +++ b/src/rendering/__tests__/DungeonRenderer.test.ts @@ -108,6 +108,7 @@ describe('DungeonRenderer', () => { }, tweens: { add: vi.fn(), + killTweensOf: vi.fn(), }, }; @@ -124,7 +125,7 @@ describe('DungeonRenderer', () => { }); it('should track and clear corpse sprites on floor initialization', () => { - renderer.initializeFloor(mockWorld); + renderer.initializeFloor(mockWorld, 1); // Spawn a couple of corpses @@ -138,7 +139,7 @@ describe('DungeonRenderer', () => { expect(mockScene.add.sprite).toHaveBeenCalledTimes(3); // Initialize floor again (changing level) - renderer.initializeFloor(mockWorld); + renderer.initializeFloor(mockWorld, 1); // Verify destroy was called on both corpse sprites @@ -147,7 +148,7 @@ describe('DungeonRenderer', () => { }); it('should render exp_orb as a circle and not as an enemy sprite', () => { - renderer.initializeFloor(mockWorld); + renderer.initializeFloor(mockWorld, 1); // Add an exp_orb to the world mockWorld.actors.set(2, { @@ -185,7 +186,7 @@ describe('DungeonRenderer', () => { }); it('should render any enemy type defined in config as a sprite', () => { - renderer.initializeFloor(mockWorld); + renderer.initializeFloor(mockWorld, 1); // Add a rat (defined in config) mockWorld.actors.set(3, { diff --git a/src/scenes/GameScene.ts b/src/scenes/GameScene.ts index b7bc457..521ec98 100644 --- a/src/scenes/GameScene.ts +++ b/src/scenes/GameScene.ts @@ -333,7 +333,7 @@ export class GameScene extends Phaser.Scene { this.cameras.main.setBounds(0, 0, this.world.width * TILE_SIZE, this.world.height * TILE_SIZE); // Initialize Renderer for new floor - this.dungeonRenderer.initializeFloor(this.world); + this.dungeonRenderer.initializeFloor(this.world, this.playerId); // Step until player turn const enemyStep = stepUntilPlayerTurn(this.world, this.playerId, this.entityManager);