|
1 | 1 | import type { StoryState } from './store'; |
2 | 2 | import { useStoryStore } from './store'; |
| 3 | +import type { Passage } from './parser'; |
3 | 4 | import { random, randomInt } from './prng'; |
4 | 5 |
|
5 | 6 | interface ExpressionFns { |
| 7 | + currentPassage: () => Passage | undefined; |
| 8 | + previousPassage: () => Passage | undefined; |
6 | 9 | visited: (name: string) => number; |
7 | 10 | hasVisited: (name: string) => boolean; |
8 | 11 | hasVisitedAny: (...names: string[]) => boolean; |
@@ -39,7 +42,7 @@ function transform(expr: string): string { |
39 | 42 | } |
40 | 43 |
|
41 | 44 | const preamble = |
42 | | - 'const {visited,hasVisited,hasVisitedAny,hasVisitedAll,rendered,hasRendered,hasRenderedAny,hasRenderedAll,random,randomInt}=__fns;'; |
| 45 | + 'const {currentPassage,previousPassage,visited,hasVisited,hasVisitedAny,hasVisitedAll,rendered,hasRendered,hasRenderedAny,hasRenderedAll,random,randomInt}=__fns;'; |
43 | 46 |
|
44 | 47 | function getOrCompile(key: string, body: string): CompiledExpression { |
45 | 48 | const cached = fnCache.get(key); |
@@ -94,7 +97,20 @@ export function buildExpressionFns() { |
94 | 97 | const hasRenderedAll = (...names: string[]): boolean => |
95 | 98 | names.every((n) => rendered(n) > 0); |
96 | 99 |
|
| 100 | + const currentPassage = (): Passage | undefined => { |
| 101 | + const s = useStoryStore.getState(); |
| 102 | + return s.storyData?.passages.get(s.currentPassage); |
| 103 | + }; |
| 104 | + const previousPassage = (): Passage | undefined => { |
| 105 | + const s = useStoryStore.getState(); |
| 106 | + if (s.historyIndex <= 0) return undefined; |
| 107 | + const prevName = s.history[s.historyIndex - 1]?.passage; |
| 108 | + return prevName ? s.storyData?.passages.get(prevName) : undefined; |
| 109 | + }; |
| 110 | + |
97 | 111 | cachedFns = { |
| 112 | + currentPassage, |
| 113 | + previousPassage, |
98 | 114 | visited, |
99 | 115 | hasVisited, |
100 | 116 | hasVisitedAny, |
|
0 commit comments