diff --git a/src/engine/util/pause-system.ts b/src/engine/util/pause-system.ts index 026e6a29..dc4a2e6e 100644 --- a/src/engine/util/pause-system.ts +++ b/src/engine/util/pause-system.ts @@ -1,9 +1,11 @@ import type { EventEmitter, Scene, SceneEvents } from '..'; import type { Query } from '../entity-component-system'; -import { System, SystemType } from '../entity-component-system'; +import { System, SystemPriority, SystemType } from '../entity-component-system'; import { PauseComponent, PauseComponentTag } from '../entity-component-system/components/pause-component'; export class PauseSystem extends System { + static priority = SystemPriority.Highest; + systemType: SystemType = SystemType.Update; query: Query; sceneEventEmitter: EventEmitter; @@ -25,16 +27,14 @@ export class PauseSystem extends System { update(elapsed: number): void { for (const pauseEntity of this.query.entities) { const pauseComponent = pauseEntity.get(PauseComponent); - if (pauseComponent.canPause === false) { - pauseComponent.paused = false; - } else { - pauseComponent.paused = this.isPaused; + const paused = this.isPaused && pauseComponent.canPause !== false; - if (this.isPaused) { - pauseEntity.addTag(PauseComponentTag); - } else { - pauseEntity.removeTag(PauseComponentTag); - } + pauseComponent.paused = paused; + + if (paused) { + pauseEntity.addTag(PauseComponentTag); + } else { + pauseEntity.removeTag(PauseComponentTag); } } } diff --git a/src/spec/vitest/pause-spec.ts b/src/spec/vitest/pause-spec.ts index 73b02851..b18e7cb4 100644 --- a/src/spec/vitest/pause-spec.ts +++ b/src/spec/vitest/pause-spec.ts @@ -1,9 +1,10 @@ import { describe, it, expect, beforeEach } from 'vitest'; import { PauseSystem } from '../../engine/util/pause-system'; -import { PauseComponent } from '../../engine/entity-component-system/components/pause-component'; +import { PauseComponent, PauseComponentTag } from '../../engine/entity-component-system/components/pause-component'; import type { Scene } from '../../engine/scene'; import { Entity } from '../../engine/entity-component-system/entity'; import { Engine } from '../../engine/engine'; +import { SystemPriority } from '../../engine/entity-component-system'; describe('PauseSystem', () => { let pauseSystem: PauseSystem; @@ -24,6 +25,10 @@ describe('PauseSystem', () => { expect(pauseSystem.isPaused).toBe(false); }); + it('should run before pause-sensitive systems', () => { + expect(PauseSystem.priority).toBe(SystemPriority.Highest); + }); + it('should set isPaused to true when scene emits pause event', () => { scene.pause(); expect(pauseSystem.isPaused).toBe(true); @@ -165,4 +170,23 @@ describe('PauseSystem', () => { pauseSystem.update(16); expect(pauseComponent.paused).toBe(false); }); + + it('should remove paused tag when canPause becomes false while paused', () => { + const entity = new Entity(); + const pauseComponent = new PauseComponent({ canPause: true }); + entity.addComponent(pauseComponent); + scene.add(entity); + + scene.pause(); + pauseSystem.update(16); + + expect(pauseComponent.paused).toBe(true); + expect(entity.hasTag(PauseComponentTag)).toBe(true); + + pauseComponent.canPause = false; + pauseSystem.update(16); + + expect(pauseComponent.paused).toBe(false); + expect(entity.hasTag(PauseComponentTag)).toBe(false); + }); });