Skip to content

Function: createStoryletPlugin()

createStoryletPlugin<TConditionEngine, TPassageId>(): ChoicekitPlugin<{ api: { getEligibleStorylets: () => Readonly<{ completionRatio: number; conditionPriorityScore: number; failingConditions: number; isEligible: boolean; name: string; passageId: TPassageId; passingConditions: number; priority: number; }>[]; getStoryletStats: (storyletName) => Readonly<{ loaded: number; selected: number; }>; getTopEligibleStorylet: () => Readonly<{ completionRatio: number; conditionPriorityScore: number; failingConditions: number; isEligible: boolean; name: string; passageId: TPassageId; passingConditions: number; priority: number; }> | null; loadTopEligibleStorylet: () => Readonly<{ completionRatio: number; conditionPriorityScore: number; failingConditions: number; isEligible: boolean; name: string; passageId: TPassageId; passingConditions: number; priority: number; }> | null; markStoryletSelected: (storyletName) => void; }; config: { storylets: readonly Readonly<{ conditions: readonly StoryletCondition<TConditionEngine>[]; name: string; passageId: TPassageId; priority?: number; }>[]; }; dependencies: []; engine: TConditionEngine; id: "storylet"; serializedState: { loadedCounts: Record<string, number>; selectedCounts: Record<string, number>; }; state: StoryletPluginState; }>

Defined in: plugins/examples/storylet.ts:142

Create the official storylet plugin.

The resulting API is mounted at engine.$.storylet and provides:

  • query APIs for eligible/top storylets
  • explicit selection/loading helpers
  • per-storylet selection/load statistics

Persistence uses serialize.withSave = true, so counters rewind with story saves.

TConditionEngine extends ChoicekitEngine<ChoicekitEngineGenerics> = ChoicekitEngine<ChoicekitEngineGenerics>

TPassageId extends string = TConditionEngine["passageId"]

ChoicekitPlugin<{ api: { getEligibleStorylets: () => Readonly<{ completionRatio: number; conditionPriorityScore: number; failingConditions: number; isEligible: boolean; name: string; passageId: TPassageId; passingConditions: number; priority: number; }>[]; getStoryletStats: (storyletName) => Readonly<{ loaded: number; selected: number; }>; getTopEligibleStorylet: () => Readonly<{ completionRatio: number; conditionPriorityScore: number; failingConditions: number; isEligible: boolean; name: string; passageId: TPassageId; passingConditions: number; priority: number; }> | null; loadTopEligibleStorylet: () => Readonly<{ completionRatio: number; conditionPriorityScore: number; failingConditions: number; isEligible: boolean; name: string; passageId: TPassageId; passingConditions: number; priority: number; }> | null; markStoryletSelected: (storyletName) => void; }; config: { storylets: readonly Readonly<{ conditions: readonly StoryletCondition<TConditionEngine>[]; name: string; passageId: TPassageId; priority?: number; }>[]; }; dependencies: []; engine: TConditionEngine; id: "storylet"; serializedState: { loadedCounts: Record<string, number>; selectedCounts: Record<string, number>; }; state: StoryletPluginState; }>