diff --git a/packages/game/src/Quest.ts b/packages/game/src/Quest.ts index 1e3cdf7..b677e26 100644 --- a/packages/game/src/Quest.ts +++ b/packages/game/src/Quest.ts @@ -1,7 +1,13 @@ /* eslint-disable no-await-in-loop */ import { Event } from './Event' import { GlobalException } from './Exception' -import { IQuest, IFileExistenceChecker, ICommand, IResponse } from './schema' +import { + IQuest, + IFileExistenceChecker, + ICommand, + IResponse, + ITask, +} from './schema' import { Stage } from './Stage' export class Quest { @@ -67,4 +73,21 @@ export class Quest { getResponses(completed: string[]): IResponse[] { return completed.map((id) => this.events.get(id)!.getResponse()) } + + getTasks(completed: string[]): ITask[] { + const completedSet = new Set(completed) + const completedStages = this.stages + .filter((stage) => completedSet.has(stage.id)) + .map((stage) => ({ + id: stage.id, + name: stage.name, + completed: true, + })) + const activeStages = this.getActiveStages(completed).map((stage) => ({ + id: stage.id, + name: stage.name, + completed: false, + })) + return [...completedStages, ...activeStages] + } } diff --git a/packages/game/src/Session.ts b/packages/game/src/Session.ts index 484d8c5..0ad6b6b 100644 --- a/packages/game/src/Session.ts +++ b/packages/game/src/Session.ts @@ -5,6 +5,7 @@ import { ISession, IFileExistenceChecker, IResponse, + ITask, } from './schema' export class Session implements ISession { @@ -43,4 +44,8 @@ export class Session implements ISession { getResponses(): IResponse[] { return this.quest.getResponses(this.completed) } + + getTasks(): ITask[] { + return this.quest.getTasks(this.completed) + } } diff --git a/packages/game/src/schema/index.ts b/packages/game/src/schema/index.ts index bba3834..282f071 100644 --- a/packages/game/src/schema/index.ts +++ b/packages/game/src/schema/index.ts @@ -15,3 +15,9 @@ export interface ICommand { export interface ISession { completedEvents: string[] } + +export interface ITask { + id: string + name: string + completed: boolean +} diff --git a/packages/game/test/session.test.ts b/packages/game/test/session.test.ts index 43749f8..ccc5d79 100644 --- a/packages/game/test/session.test.ts +++ b/packages/game/test/session.test.ts @@ -12,6 +12,7 @@ const quest: IQuest = { stages: [ { id: 'stage1', + name: 'Stage 1', requirements: [], condition: { command: 'echo start', @@ -20,6 +21,7 @@ const quest: IQuest = { }, { id: 'stage2', + name: 'Stage 2', requirements: ['stage1'], condition: { command: 'ls', @@ -28,6 +30,7 @@ const quest: IQuest = { }, { id: 'stage3', + name: 'Stage 3', requirements: ['stage1'], condition: { command: 'mkdir hello', @@ -36,6 +39,7 @@ const quest: IQuest = { }, { id: 'stage4', + name: 'Stage 4', requirements: ['stage2', 'stage3'], condition: { command: 'echo finish', @@ -129,4 +133,39 @@ describe('Session', () => { { type: 'narrative', content: 'Narrative 2' }, ]) }) + + it('should return tasks', () => { + const session = new Session( + { + completedEvents: [], + }, + quest, + new MockFileChecker() + ) + expect(session.getTasks()).toEqual([ + { id: 'stage1', name: 'Stage 1', completed: false }, + ]) + + session.complete('stage1') + expect(session.getTasks()).toEqual([ + { id: 'stage1', name: 'Stage 1', completed: true }, + { id: 'stage2', name: 'Stage 2', completed: false }, + { id: 'stage3', name: 'Stage 3', completed: false }, + ]) + + session.complete('stage2') + expect(session.getTasks()).toEqual([ + { id: 'stage1', name: 'Stage 1', completed: true }, + { id: 'stage2', name: 'Stage 2', completed: true }, + { id: 'stage3', name: 'Stage 3', completed: false }, + ]) + + session.complete('stage3') + expect(session.getTasks()).toEqual([ + { id: 'stage1', name: 'Stage 1', completed: true }, + { id: 'stage2', name: 'Stage 2', completed: true }, + { id: 'stage3', name: 'Stage 3', completed: true }, + { id: 'stage4', name: 'Stage 4', completed: false }, + ]) + }) })