@voltro/plugin-progression 0.0.0-stage → 0.88.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24492 -0
- package/LICENSE +61 -0
- package/README.md +478 -2
- package/SECURITY.md +56 -0
- package/THIRD-PARTY-NOTICES.md +9841 -0
- package/dist/achievementComponents.js +91 -0
- package/dist/achievementStore.js +602 -0
- package/dist/achievementTables.entity.js +97 -0
- package/dist/achievements.d.ts +188 -0
- package/dist/achievements.js +204 -0
- package/dist/capture.js +63 -0
- package/dist/cmsQuests.d.ts +91 -0
- package/dist/cmsQuests.js +82 -0
- package/dist/components.d.ts +172 -0
- package/dist/components.js +4 -0
- package/dist/curve.d.ts +27 -0
- package/dist/curve.js +37 -0
- package/dist/daily.d.ts +152 -0
- package/dist/daily.js +125 -0
- package/dist/dailyStore.js +420 -0
- package/dist/dailySystem.fixture.js +137 -0
- package/dist/dailyTables.entity.js +89 -0
- package/dist/declarationFixtures.js +142 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.js +19 -0
- package/dist/index.d.ts +1833 -0
- package/dist/index.js +19 -0
- package/dist/pass.d.ts +186 -0
- package/dist/pass.js +121 -0
- package/dist/passRules.js +95 -0
- package/dist/passStore.js +484 -0
- package/dist/passTables.entity.js +95 -0
- package/dist/plugin.js +1085 -0
- package/dist/port.js +4 -0
- package/dist/progressionStore.js +705 -0
- package/dist/questComponents.js +162 -0
- package/dist/questPort.d.ts +126 -0
- package/dist/questPort.js +4 -0
- package/dist/questRefresh.js +55 -0
- package/dist/questRefresh.server.js +125 -0
- package/dist/questRerollJournal.js +76 -0
- package/dist/questStore.js +591 -0
- package/dist/questTables.entity.js +116 -0
- package/dist/quests.d.ts +142 -0
- package/dist/quests.js +152 -0
- package/dist/rank-app/schedules/progression.dispatchRankClosures.cron.tsx +19 -0
- package/dist/rank-app/workflows/progression.closeRankSeason.workflow.server.tsx +10 -0
- package/dist/rank-app/workflows/progression.closeRankSeason.workflow.tsx +1 -0
- package/dist/rankClosure.d.ts +69 -0
- package/dist/rankClosure.js +34 -0
- package/dist/rankClosure.server.js +138 -0
- package/dist/rankClosureWorkflow.d.ts +34 -0
- package/dist/rankClosureWorkflow.js +15 -0
- package/dist/rankReader.server.js +56 -0
- package/dist/rankRewardParent.server.js +64 -0
- package/dist/rankSeasons.d.ts +144 -0
- package/dist/rankSeasons.js +90 -0
- package/dist/rankStore.js +520 -0
- package/dist/rankSystem.fixture.js +169 -0
- package/dist/rankTables.entity.js +100 -0
- package/dist/ranks.d.ts +167 -0
- package/dist/ranks.js +218 -0
- package/dist/resourceStore.js +463 -0
- package/dist/resourceTables.entity.js +88 -0
- package/dist/resources.d.ts +105 -0
- package/dist/resources.js +59 -0
- package/dist/reward-app/schedules/progression.dispatchRewards.cron.tsx +19 -0
- package/dist/reward-app/workflows/progression.deliverReward.workflow.server.tsx +10 -0
- package/dist/reward-app/workflows/progression.deliverReward.workflow.tsx +1 -0
- package/dist/reward.d.ts +27 -0
- package/dist/reward.js +38 -0
- package/dist/rewardDelivery.d.ts +163 -0
- package/dist/rewardDelivery.js +37 -0
- package/dist/rewardDelivery.server.js +429 -0
- package/dist/rewardDeliveryRecord.js +47 -0
- package/dist/rewardDeliveryWorkflow.d.ts +36 -0
- package/dist/rewardDeliveryWorkflow.js +15 -0
- package/dist/rpc.d.ts +880 -0
- package/dist/rpc.js +497 -0
- package/dist/server.d.ts +2812 -0
- package/dist/server.js +21 -0
- package/dist/stats.js +44 -0
- package/dist/strategies.d.ts +131 -0
- package/dist/strategies.js +4 -0
- package/dist/systemFixtures.js +473 -0
- package/dist/tables.entity.js +154 -0
- package/dist/testing.d.ts +1566 -0
- package/dist/testing.js +11 -0
- package/dist/track.js +71 -0
- package/dist/tutorial.d.ts +157 -0
- package/dist/tutorial.js +109 -0
- package/dist/tutorialStore.js +495 -0
- package/dist/tutorialSystem.fixture.js +99 -0
- package/dist/tutorialTables.entity.js +90 -0
- package/dist/web.d.ts +363 -0
- package/dist/web.js +6 -0
- package/package.json +167 -4
package/dist/server.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { progressionDefinitionsTable as e, progressionOperationsTable as t, progressionOriginsTable as n, progressionRewardsTable as r, progressionStatLedgerTable as i, progressionStatsTable as a, progressionSubjectsTable as o, progressionTables as s, progressionTracksTable as c, progressionXpLedgerTable as l } from "./tables.entity.js";
|
|
2
|
+
import { dataStoreProgression as u, resolveProgressionOptions as d } from "./progressionStore.js";
|
|
3
|
+
import { questDefinitionsTable as f, questOperationsTable as p, questOriginsTable as m, questRewardsTable as h, questSubjectsTable as g, questTables as _, questWindowsTable as v, questsTable as y } from "./questTables.entity.js";
|
|
4
|
+
import { dataStoreQuests as b, resolveQuestOptions as x } from "./questStore.js";
|
|
5
|
+
import { defaultQuestSeed as S, makeQuestRefreshService as C, resolveQuestRefreshOptions as w } from "./questRefresh.server.js";
|
|
6
|
+
import { resourceDefinitionsTable as T, resourceMovementsTable as E, resourceOperationsTable as D, resourceOriginsTable as O, resourceSubjectsTable as k, resourceTables as A, resourcesTable as j } from "./resourceTables.entity.js";
|
|
7
|
+
import { dataStoreResources as M, resolveResourceOptions as N } from "./resourceStore.js";
|
|
8
|
+
import { achievementDefinitionsTable as P, achievementOperationsTable as F, achievementRewardsTable as I, achievementSubjectsTable as L, achievementTables as R, achievementUnlockLedgerTable as z, achievementsTable as B } from "./achievementTables.entity.js";
|
|
9
|
+
import { captureAchievementHistory as V, dataStoreAchievements as H, resolveAchievementOptions as U } from "./achievementStore.js";
|
|
10
|
+
import { dailyClaimsTable as W, dailyDefinitionsTable as G, dailyOperationsTable as K, dailyRewardsTable as q, dailyStatesTable as J, dailySubjectsTable as Y, dailyTables as X } from "./dailyTables.entity.js";
|
|
11
|
+
import { passDefinitionsTable as Z, passLedgerTable as Q, passOperationsTable as $, passRewardsTable as ee, passStatesTable as te, passSubjectsTable as ne, passTables as re } from "./passTables.entity.js";
|
|
12
|
+
import { tutorialDefinitionsTable as ie, tutorialLedgerTable as ae, tutorialOperationsTable as oe, tutorialRewardsTable as se, tutorialStatesTable as ce, tutorialSubjectsTable as le, tutorialTables as ue } from "./tutorialTables.entity.js";
|
|
13
|
+
import { rankClosureUnitsTable as de, rankDefinitionsTable as fe, rankLedgerTable as pe, rankOperationsTable as me, rankRewardsTable as he, rankStatesTable as ge, rankSubjectsTable as _e, rankTables as ve } from "./rankTables.entity.js";
|
|
14
|
+
import { dataStoreRewardDelivery as ye, resolveRewardDeliveryOptions as be } from "./rewardDelivery.server.js";
|
|
15
|
+
import { dataStoreLoginCalendars as xe, resolveDailyOptions as Se } from "./dailyStore.js";
|
|
16
|
+
import { dataStoreSeasonPasses as Ce, resolvePassOptions as we } from "./passStore.js";
|
|
17
|
+
import { dataStoreTutorials as Te, resolveTutorialOptions as Ee } from "./tutorialStore.js";
|
|
18
|
+
import { dataStoreRankSeasons as De, resolveRankStoreOptions as Oe } from "./rankStore.js";
|
|
19
|
+
import { dataStoreRankClosure as ke, resolveRankClosureOptions as Ae } from "./rankClosure.server.js";
|
|
20
|
+
import { makeRankReader as je, ratingSourceFromLeaderboards as Me } from "./rankReader.server.js";
|
|
21
|
+
export { P as achievementDefinitionsTable, F as achievementOperationsTable, I as achievementRewardsTable, L as achievementSubjectsTable, R as achievementTables, z as achievementUnlockLedgerTable, B as achievementsTable, V as captureAchievementHistory, W as dailyClaimsTable, G as dailyDefinitionsTable, K as dailyOperationsTable, q as dailyRewardsTable, J as dailyStatesTable, Y as dailySubjectsTable, X as dailyTables, H as dataStoreAchievements, xe as dataStoreLoginCalendars, u as dataStoreProgression, b as dataStoreQuests, ke as dataStoreRankClosure, De as dataStoreRankSeasons, M as dataStoreResources, ye as dataStoreRewardDelivery, Ce as dataStoreSeasonPasses, Te as dataStoreTutorials, S as defaultQuestSeed, C as makeQuestRefreshService, je as makeRankReader, Z as passDefinitionsTable, Q as passLedgerTable, $ as passOperationsTable, ee as passRewardsTable, te as passStatesTable, ne as passSubjectsTable, re as passTables, e as progressionDefinitionsTable, t as progressionOperationsTable, n as progressionOriginsTable, r as progressionRewardsTable, i as progressionStatLedgerTable, a as progressionStatsTable, o as progressionSubjectsTable, s as progressionTables, c as progressionTracksTable, l as progressionXpLedgerTable, f as questDefinitionsTable, p as questOperationsTable, m as questOriginsTable, h as questRewardsTable, g as questSubjectsTable, _ as questTables, v as questWindowsTable, y as questsTable, de as rankClosureUnitsTable, fe as rankDefinitionsTable, pe as rankLedgerTable, me as rankOperationsTable, he as rankRewardsTable, ge as rankStatesTable, _e as rankSubjectsTable, ve as rankTables, Me as ratingSourceFromLeaderboards, U as resolveAchievementOptions, Se as resolveDailyOptions, we as resolvePassOptions, d as resolveProgressionOptions, x as resolveQuestOptions, w as resolveQuestRefreshOptions, Ae as resolveRankClosureOptions, Oe as resolveRankStoreOptions, N as resolveResourceOptions, be as resolveRewardDeliveryOptions, Ee as resolveTutorialOptions, T as resourceDefinitionsTable, E as resourceMovementsTable, D as resourceOperationsTable, O as resourceOriginsTable, k as resourceSubjectsTable, A as resourceTables, j as resourcesTable, ie as tutorialDefinitionsTable, ae as tutorialLedgerTable, oe as tutorialOperationsTable, se as tutorialRewardsTable, ce as tutorialStatesTable, le as tutorialSubjectsTable, ue as tutorialTables };
|
package/dist/stats.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { progressionError as e } from "./errors.js";
|
|
2
|
+
import { identifier as t, list as n, object as r, progressValue as i } from "./capture.js";
|
|
3
|
+
// src/stats.ts
|
|
4
|
+
var a = [
|
|
5
|
+
"increment",
|
|
6
|
+
"max",
|
|
7
|
+
"min",
|
|
8
|
+
"set"
|
|
9
|
+
], o = (o) => {
|
|
10
|
+
let s = r(o, [
|
|
11
|
+
"id",
|
|
12
|
+
"initial",
|
|
13
|
+
"cap",
|
|
14
|
+
"operators"
|
|
15
|
+
]), c = i(s.initial ?? "0"), l = i(s.cap ?? "9223372036854775807"), u = n(s.operators ?? a, 4);
|
|
16
|
+
if (c > l || u.length === 0 || new Set(u).size !== u.length || u.some((e) => !a.some((t) => t === e))) throw e("invalid_stat");
|
|
17
|
+
return Object.freeze({
|
|
18
|
+
id: t(s.id),
|
|
19
|
+
initial: String(c),
|
|
20
|
+
cap: String(l),
|
|
21
|
+
operators: Object.freeze(u)
|
|
22
|
+
});
|
|
23
|
+
}, s = (t, n, r, a) => {
|
|
24
|
+
let s = o(a);
|
|
25
|
+
if (!s.operators.includes(r)) throw e("forbidden");
|
|
26
|
+
let c = i(t ?? s.initial), l = i(n);
|
|
27
|
+
if (c > BigInt(s.cap)) throw e("invalid_record");
|
|
28
|
+
let u;
|
|
29
|
+
switch (r) {
|
|
30
|
+
case "increment":
|
|
31
|
+
u = c + l;
|
|
32
|
+
break;
|
|
33
|
+
case "max":
|
|
34
|
+
u = l > c ? l : c;
|
|
35
|
+
break;
|
|
36
|
+
case "min":
|
|
37
|
+
u = t === null || l < c ? l : c;
|
|
38
|
+
break;
|
|
39
|
+
case "set": u = l;
|
|
40
|
+
}
|
|
41
|
+
if (u > BigInt(s.cap)) throw e("overflow");
|
|
42
|
+
return String(i(u));
|
|
43
|
+
};
|
|
44
|
+
export { a as STAT_OPERATORS, s as applyStatValue, o as defineStat };
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
export declare const defaultQuestProgressResolver: QuestProgressResolver;
|
|
2
|
+
|
|
3
|
+
/** Deterministic weighted selection without replacement; a trusted seed is not a security RNG. */
|
|
4
|
+
export declare const defaultQuestSelector: QuestSelector;
|
|
5
|
+
|
|
6
|
+
export declare const defaultRewardResolver: RewardResolver;
|
|
7
|
+
|
|
8
|
+
export declare const defaultXpCurve: XpCurve;
|
|
9
|
+
|
|
10
|
+
declare interface LevelCurve {
|
|
11
|
+
readonly thresholds: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
declare interface LevelReward {
|
|
15
|
+
readonly level: number;
|
|
16
|
+
readonly reward: ProgressionReward;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
declare type ProgressionReward = {
|
|
20
|
+
readonly kind: 'currency';
|
|
21
|
+
readonly currency: string;
|
|
22
|
+
readonly amount: string;
|
|
23
|
+
} | {
|
|
24
|
+
readonly kind: 'item';
|
|
25
|
+
readonly itemId: string;
|
|
26
|
+
readonly qty: number;
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: 'xp';
|
|
29
|
+
readonly trackId: string;
|
|
30
|
+
readonly amount: string;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
declare interface ProgressionTrack {
|
|
34
|
+
readonly id: string;
|
|
35
|
+
readonly version: number;
|
|
36
|
+
readonly xpCurve: LevelCurve;
|
|
37
|
+
readonly sources: readonly string[];
|
|
38
|
+
readonly rewards: Readonly<Record<string, readonly ProgressionReward[]>>;
|
|
39
|
+
readonly every: Readonly<Record<string, readonly ProgressionReward[]>>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
declare type ProgressValue = string | number | bigint;
|
|
43
|
+
|
|
44
|
+
declare interface QuestDefinition {
|
|
45
|
+
readonly id: string;
|
|
46
|
+
readonly titleKey?: string;
|
|
47
|
+
readonly objectives: readonly QuestObjective[];
|
|
48
|
+
readonly reward: readonly ProgressionReward[];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
declare type QuestObjective = {
|
|
52
|
+
readonly stat: string;
|
|
53
|
+
readonly target: number;
|
|
54
|
+
} | {
|
|
55
|
+
readonly event: string;
|
|
56
|
+
readonly target: number;
|
|
57
|
+
readonly where?: Readonly<Record<string, QuestScalar>>;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
declare interface QuestPool extends QuestPoolDefinition {
|
|
61
|
+
readonly version: number;
|
|
62
|
+
readonly rerolls: number;
|
|
63
|
+
readonly weights: Readonly<Record<string, number>>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
declare interface QuestPoolDefinition {
|
|
67
|
+
readonly id: string;
|
|
68
|
+
readonly version?: number;
|
|
69
|
+
readonly slots: number;
|
|
70
|
+
readonly rerolls?: number;
|
|
71
|
+
readonly refresh: {
|
|
72
|
+
readonly cron: string;
|
|
73
|
+
readonly timezone: string;
|
|
74
|
+
};
|
|
75
|
+
readonly quests: readonly QuestDefinition[];
|
|
76
|
+
readonly weights?: Readonly<Record<string, number>>;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export declare interface QuestProgressContext {
|
|
80
|
+
readonly quest: QuestDefinition;
|
|
81
|
+
readonly progress: readonly number[];
|
|
82
|
+
readonly signal: QuestSignal;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export declare type QuestProgressResolver = (context: QuestProgressContext) => readonly number[];
|
|
86
|
+
|
|
87
|
+
declare type QuestScalar = string | number | boolean | null;
|
|
88
|
+
|
|
89
|
+
export declare type QuestSelector = (context: QuestSelectorContext) => readonly string[];
|
|
90
|
+
|
|
91
|
+
export declare interface QuestSelectorContext {
|
|
92
|
+
readonly pool: QuestPool;
|
|
93
|
+
readonly count: number;
|
|
94
|
+
readonly seed: number;
|
|
95
|
+
readonly excluded: readonly string[];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
declare type QuestSignal = {
|
|
99
|
+
readonly kind: 'stat';
|
|
100
|
+
readonly stat: string;
|
|
101
|
+
readonly delta: string;
|
|
102
|
+
} | {
|
|
103
|
+
readonly kind: 'event';
|
|
104
|
+
readonly event: string;
|
|
105
|
+
readonly data: Readonly<Record<string, QuestScalar>>;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
export declare const resolveQuestProgress: (input: QuestProgressContext, slot?: QuestProgressResolver) => readonly number[];
|
|
109
|
+
|
|
110
|
+
export declare const resolveRewards: (context: RewardResolverContext, slot?: RewardResolver) => readonly LevelReward[];
|
|
111
|
+
|
|
112
|
+
export declare const resolveXpCurve: (xp: ProgressValue, curve: LevelCurve, slot?: XpCurve) => number;
|
|
113
|
+
|
|
114
|
+
export declare type RewardResolver = (context: RewardResolverContext) => readonly LevelReward[];
|
|
115
|
+
|
|
116
|
+
export declare interface RewardResolverContext {
|
|
117
|
+
readonly track: ProgressionTrack;
|
|
118
|
+
readonly fromLevel: number;
|
|
119
|
+
readonly toLevel: number;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export declare const selectQuests: (input: QuestSelectorContext, slot?: QuestSelector) => readonly string[];
|
|
123
|
+
|
|
124
|
+
export declare type XpCurve = (context: XpCurveContext) => number;
|
|
125
|
+
|
|
126
|
+
export declare interface XpCurveContext {
|
|
127
|
+
readonly xp: string;
|
|
128
|
+
readonly curve: LevelCurve;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export { }
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { defaultQuestProgressResolver as e, defaultQuestSelector as t, resolveQuestProgress as n, selectQuests as r } from "./quests.js";
|
|
2
|
+
import { defaultXpCurve as i, resolveXpCurve as a } from "./curve.js";
|
|
3
|
+
import { defaultRewardResolver as o, resolveRewards as s } from "./track.js";
|
|
4
|
+
export { e as defaultQuestProgressResolver, t as defaultQuestSelector, o as defaultRewardResolver, i as defaultXpCurve, n as resolveQuestProgress, s as resolveRewards, a as resolveXpCurve, r as selectQuests };
|
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
import { SeasonPassPort as e, defaultPassCatchUp as t, defineSeasonPass as n, resolvePassCatchUp as r } from "./pass.js";
|
|
2
|
+
import { QuestSource as i, defaultQuestProgressResolver as a, defaultQuestSelector as o, defineQuestPool as s, resolveQuestProgress as c, selectQuests as l, staticQuestSource as ee } from "./quests.js";
|
|
3
|
+
import { defaultXpCurve as u, resolveXpCurve as d } from "./curve.js";
|
|
4
|
+
import { ProgressionPort as f } from "./port.js";
|
|
5
|
+
import { defaultRewardResolver as te, resolveRewards as p, trackDeclaration as m } from "./track.js";
|
|
6
|
+
import { QuestPort as h } from "./questPort.js";
|
|
7
|
+
import { RegenResourcePort as g, defaultResourceRegen as _, resolveResourceRegen as v } from "./resources.js";
|
|
8
|
+
import { AchievementPort as y, AchievementStatSource as b, defaultAchievementEvaluator as x, resolveAchievementEvaluation as S, statAtLeast as C } from "./achievements.js";
|
|
9
|
+
import { progressionPlugin as ne } from "./plugin.js";
|
|
10
|
+
import { passFixture as re, progressionFixture as ie, resourceFixture as w } from "./declarationFixtures.js";
|
|
11
|
+
import { Effect as T, Layer as E } from "effect";
|
|
12
|
+
import { systemSubject as D } from "@voltro/protocol";
|
|
13
|
+
import { ensureTableRegistered as O } from "@voltro/database";
|
|
14
|
+
import { InMemoryDataStore as k } from "@voltro/runtime";
|
|
15
|
+
// src/systemFixtures.ts
|
|
16
|
+
var A = Date.UTC(2026, 9, 10), j = ie(), M = w(), N = s({
|
|
17
|
+
id: "fixture.daily",
|
|
18
|
+
version: 1,
|
|
19
|
+
slots: 1,
|
|
20
|
+
rerolls: 1,
|
|
21
|
+
refresh: {
|
|
22
|
+
cron: "0 4 * * *",
|
|
23
|
+
timezone: "UTC"
|
|
24
|
+
},
|
|
25
|
+
quests: [{
|
|
26
|
+
id: "fixture.first",
|
|
27
|
+
objectives: [{
|
|
28
|
+
event: "match.finished",
|
|
29
|
+
target: 2
|
|
30
|
+
}],
|
|
31
|
+
reward: []
|
|
32
|
+
}, {
|
|
33
|
+
id: "fixture.second",
|
|
34
|
+
objectives: [{
|
|
35
|
+
event: "match.finished",
|
|
36
|
+
target: 2
|
|
37
|
+
}],
|
|
38
|
+
reward: []
|
|
39
|
+
}]
|
|
40
|
+
}), ae = ee([N], "fixture.r1"), P = re(), F = n({
|
|
41
|
+
...P.pass,
|
|
42
|
+
from: A,
|
|
43
|
+
until: A + 2592e6,
|
|
44
|
+
sources: ["match.finished"]
|
|
45
|
+
}), I = {
|
|
46
|
+
app: {
|
|
47
|
+
name: "progression-port-fixture",
|
|
48
|
+
type: "api",
|
|
49
|
+
voltroVersion: "0.83.1"
|
|
50
|
+
},
|
|
51
|
+
config: {},
|
|
52
|
+
env: {},
|
|
53
|
+
logger: {
|
|
54
|
+
info() {},
|
|
55
|
+
warn() {},
|
|
56
|
+
error() {},
|
|
57
|
+
debug() {}
|
|
58
|
+
}
|
|
59
|
+
}, L = E.effectContext(T.acquireRelease(T.sync(() => ne({
|
|
60
|
+
tracks: [m(j.track)],
|
|
61
|
+
stats: [{ id: "wins" }],
|
|
62
|
+
statSources: ["match.finished"],
|
|
63
|
+
now: () => A,
|
|
64
|
+
quests: {
|
|
65
|
+
source: ae,
|
|
66
|
+
channel: "live",
|
|
67
|
+
locale: "en",
|
|
68
|
+
eventSources: ["match.finished"],
|
|
69
|
+
now: () => A
|
|
70
|
+
},
|
|
71
|
+
resources: {
|
|
72
|
+
definitions: [M.resource],
|
|
73
|
+
sources: ["match.started", "players.created"],
|
|
74
|
+
now: () => A
|
|
75
|
+
},
|
|
76
|
+
achievements: {
|
|
77
|
+
definitions: [{
|
|
78
|
+
id: "fixture.wins",
|
|
79
|
+
hidden: !0,
|
|
80
|
+
condition: C("wins", "2"),
|
|
81
|
+
reward: []
|
|
82
|
+
}],
|
|
83
|
+
now: () => A
|
|
84
|
+
},
|
|
85
|
+
passes: {
|
|
86
|
+
definitions: [F],
|
|
87
|
+
now: () => A
|
|
88
|
+
}
|
|
89
|
+
})), (e) => T.suspend(() => e.onDeactivate(I))).pipe(T.tap((e) => T.gen(function* () {
|
|
90
|
+
e.extendSchema.tables.forEach((e) => O(e)), yield* T.promise(() => Promise.resolve(e.bindDataStore(new k())));
|
|
91
|
+
}).pipe(T.orDie)), T.flatMap((e) => E.build(e.services)))), R = L, z = L, B = L, V = L, H = L, U = L, W = L, G = D("progression.system.fixture"), K = {
|
|
92
|
+
type: "user",
|
|
93
|
+
id: "a",
|
|
94
|
+
tenantId: "fixture",
|
|
95
|
+
kind: "guest"
|
|
96
|
+
}, q = {
|
|
97
|
+
tenantId: "fixture",
|
|
98
|
+
ownerId: "a"
|
|
99
|
+
}, oe = Object.freeze({
|
|
100
|
+
kind: "port",
|
|
101
|
+
tag: f,
|
|
102
|
+
fakeLayer: R,
|
|
103
|
+
probe: {
|
|
104
|
+
run: () => T.scoped(T.gen(function* () {
|
|
105
|
+
let e = yield* f, t = {
|
|
106
|
+
...q,
|
|
107
|
+
trackId: j.track.id,
|
|
108
|
+
amount: "100",
|
|
109
|
+
requestId: "fixture.xp",
|
|
110
|
+
source: "match.finished",
|
|
111
|
+
origin: "fixture.match"
|
|
112
|
+
}, n = yield* e.applyXp(G, t), r = yield* e.applyXp(G, t);
|
|
113
|
+
return yield* e.applyStat(G, {
|
|
114
|
+
...q,
|
|
115
|
+
stat: "wins",
|
|
116
|
+
period: "lifetime",
|
|
117
|
+
operator: "increment",
|
|
118
|
+
operand: "1",
|
|
119
|
+
requestId: "fixture.stat",
|
|
120
|
+
source: "match.finished",
|
|
121
|
+
origin: "fixture.match"
|
|
122
|
+
}), {
|
|
123
|
+
original: n.operationId === r.operationId,
|
|
124
|
+
tracks: (yield* e.mine(K)).map((e) => ({
|
|
125
|
+
xp: e.xp,
|
|
126
|
+
level: e.level
|
|
127
|
+
})),
|
|
128
|
+
stats: (yield* e.stats(K)).map((e) => e.value),
|
|
129
|
+
rewardsQueued: n.rewardsQueued
|
|
130
|
+
};
|
|
131
|
+
}).pipe(T.provide(R))),
|
|
132
|
+
expected: {
|
|
133
|
+
original: !0,
|
|
134
|
+
tracks: [{
|
|
135
|
+
xp: "100",
|
|
136
|
+
level: 2
|
|
137
|
+
}],
|
|
138
|
+
stats: ["1"],
|
|
139
|
+
rewardsQueued: 1
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}), se = Object.freeze({
|
|
143
|
+
kind: "port",
|
|
144
|
+
tag: h,
|
|
145
|
+
fakeLayer: z,
|
|
146
|
+
probe: {
|
|
147
|
+
run: () => T.scoped(T.gen(function* () {
|
|
148
|
+
let e = yield* h;
|
|
149
|
+
yield* e.assign(G, {
|
|
150
|
+
...q,
|
|
151
|
+
poolId: N.id,
|
|
152
|
+
requestId: "fixture.assign",
|
|
153
|
+
windowId: "fixture.day",
|
|
154
|
+
from: A,
|
|
155
|
+
until: A + 864e5,
|
|
156
|
+
timezone: "UTC",
|
|
157
|
+
seed: 1
|
|
158
|
+
});
|
|
159
|
+
let t = {
|
|
160
|
+
...q,
|
|
161
|
+
poolId: N.id,
|
|
162
|
+
windowId: "fixture.day",
|
|
163
|
+
requestId: "fixture.record",
|
|
164
|
+
source: "match.finished",
|
|
165
|
+
origin: "fixture.match",
|
|
166
|
+
signal: {
|
|
167
|
+
kind: "event",
|
|
168
|
+
event: "match.finished",
|
|
169
|
+
data: {}
|
|
170
|
+
}
|
|
171
|
+
}, n = yield* e.record(G, t), r = yield* e.record(G, t);
|
|
172
|
+
return {
|
|
173
|
+
original: n.operationId === r.operationId,
|
|
174
|
+
quests: (yield* e.mine(K)).map((e) => ({
|
|
175
|
+
progress: e.progress,
|
|
176
|
+
state: e.state
|
|
177
|
+
}))
|
|
178
|
+
};
|
|
179
|
+
}).pipe(T.provide(z))),
|
|
180
|
+
expected: {
|
|
181
|
+
original: !0,
|
|
182
|
+
quests: [{
|
|
183
|
+
progress: [1],
|
|
184
|
+
state: "active"
|
|
185
|
+
}]
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}), ce = Object.freeze({
|
|
189
|
+
kind: "port",
|
|
190
|
+
tag: i,
|
|
191
|
+
fakeLayer: B,
|
|
192
|
+
probe: {
|
|
193
|
+
run: () => T.scoped(T.gen(function* () {
|
|
194
|
+
let e = yield* (yield* i).read({
|
|
195
|
+
tenantId: "fixture",
|
|
196
|
+
channel: "live",
|
|
197
|
+
locale: "en"
|
|
198
|
+
});
|
|
199
|
+
return {
|
|
200
|
+
revision: e.revision,
|
|
201
|
+
pools: e.pools.map((e) => e.id)
|
|
202
|
+
};
|
|
203
|
+
}).pipe(T.provide(B))),
|
|
204
|
+
expected: {
|
|
205
|
+
revision: "fixture.r1",
|
|
206
|
+
pools: ["fixture.daily"]
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}), le = Object.freeze({
|
|
210
|
+
kind: "port",
|
|
211
|
+
tag: g,
|
|
212
|
+
fakeLayer: V,
|
|
213
|
+
probe: {
|
|
214
|
+
run: () => T.scoped(T.gen(function* () {
|
|
215
|
+
let e = yield* g;
|
|
216
|
+
yield* e.initialize(G, {
|
|
217
|
+
...q,
|
|
218
|
+
resourceId: M.resource.id,
|
|
219
|
+
requestId: "fixture.initialize",
|
|
220
|
+
source: "players.created",
|
|
221
|
+
origin: "fixture.player"
|
|
222
|
+
});
|
|
223
|
+
let t = {
|
|
224
|
+
...q,
|
|
225
|
+
resourceId: M.resource.id,
|
|
226
|
+
amount: "3",
|
|
227
|
+
requestId: "fixture.consume",
|
|
228
|
+
source: "match.started",
|
|
229
|
+
origin: "fixture.match"
|
|
230
|
+
}, n = yield* e.consume(G, t), r = yield* e.consume(G, t);
|
|
231
|
+
return {
|
|
232
|
+
original: n.operationId === r.operationId,
|
|
233
|
+
values: (yield* e.mine(K)).map((e) => e.value)
|
|
234
|
+
};
|
|
235
|
+
}).pipe(T.provide(V))),
|
|
236
|
+
expected: {
|
|
237
|
+
original: !0,
|
|
238
|
+
values: ["7"]
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}), J = {
|
|
242
|
+
...q,
|
|
243
|
+
stat: "wins",
|
|
244
|
+
period: "lifetime",
|
|
245
|
+
operator: "increment",
|
|
246
|
+
operand: "2",
|
|
247
|
+
requestId: "fixture.achievement.stat",
|
|
248
|
+
source: "match.finished",
|
|
249
|
+
origin: "fixture.achievement.match"
|
|
250
|
+
}, ue = Object.freeze({
|
|
251
|
+
kind: "port",
|
|
252
|
+
tag: y,
|
|
253
|
+
fakeLayer: H,
|
|
254
|
+
probe: {
|
|
255
|
+
run: () => T.scoped(T.gen(function* () {
|
|
256
|
+
let e = yield* f, t = yield* y;
|
|
257
|
+
yield* e.applyStat(G, J);
|
|
258
|
+
let n = {
|
|
259
|
+
...q,
|
|
260
|
+
requestId: "fixture.evaluate"
|
|
261
|
+
}, r = yield* t.evaluate(G, n), i = yield* t.evaluate(G, n);
|
|
262
|
+
return {
|
|
263
|
+
original: r.operationId === i.operationId,
|
|
264
|
+
achievements: (yield* t.mine(K)).map((e) => ({
|
|
265
|
+
id: e.achievementId,
|
|
266
|
+
tier: e.tierId,
|
|
267
|
+
unlocked: e.unlocked,
|
|
268
|
+
value: e.progress[0]?.value
|
|
269
|
+
}))
|
|
270
|
+
};
|
|
271
|
+
}).pipe(T.provide(H))),
|
|
272
|
+
expected: {
|
|
273
|
+
original: !0,
|
|
274
|
+
achievements: [{
|
|
275
|
+
id: "fixture.wins",
|
|
276
|
+
tier: "base",
|
|
277
|
+
unlocked: !0,
|
|
278
|
+
value: "2"
|
|
279
|
+
}]
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}), de = Object.freeze({
|
|
283
|
+
kind: "port",
|
|
284
|
+
tag: b,
|
|
285
|
+
fakeLayer: U,
|
|
286
|
+
probe: {
|
|
287
|
+
run: () => T.scoped(T.gen(function* () {
|
|
288
|
+
let e = yield* f, t = yield* b;
|
|
289
|
+
return yield* e.applyStat(G, J), (yield* t.history(G, {
|
|
290
|
+
...q,
|
|
291
|
+
limit: 100
|
|
292
|
+
})).events.map((e) => ({
|
|
293
|
+
stat: e.stat,
|
|
294
|
+
value: e.value
|
|
295
|
+
}));
|
|
296
|
+
}).pipe(T.provide(U))),
|
|
297
|
+
expected: [{
|
|
298
|
+
stat: "wins",
|
|
299
|
+
value: "2"
|
|
300
|
+
}]
|
|
301
|
+
}
|
|
302
|
+
}), fe = Object.freeze({
|
|
303
|
+
kind: "port",
|
|
304
|
+
tag: e,
|
|
305
|
+
fakeLayer: W,
|
|
306
|
+
probe: {
|
|
307
|
+
run: () => T.scoped(T.gen(function* () {
|
|
308
|
+
let t = yield* e;
|
|
309
|
+
yield* t.applyXp(G, {
|
|
310
|
+
...q,
|
|
311
|
+
passId: F.id,
|
|
312
|
+
amount: "100",
|
|
313
|
+
requestId: "fixture.pass.xp",
|
|
314
|
+
source: "match.finished",
|
|
315
|
+
originId: "fixture.match"
|
|
316
|
+
});
|
|
317
|
+
let n = {
|
|
318
|
+
passId: F.id,
|
|
319
|
+
tier: 1,
|
|
320
|
+
track: "free",
|
|
321
|
+
requestId: "fixture.pass.claim"
|
|
322
|
+
}, r = yield* t.claim(K, n), i = yield* t.claim(K, n);
|
|
323
|
+
return {
|
|
324
|
+
original: r.operationId === i.operationId,
|
|
325
|
+
claimedFree: r.after.claimedFree,
|
|
326
|
+
rewardsQueued: r.rewardsQueued,
|
|
327
|
+
passes: (yield* t.mine(K)).map((e) => ({
|
|
328
|
+
xp: e.xp,
|
|
329
|
+
tier: e.tier,
|
|
330
|
+
claimedFree: e.claimedFree
|
|
331
|
+
}))
|
|
332
|
+
};
|
|
333
|
+
}).pipe(T.provide(W))),
|
|
334
|
+
expected: {
|
|
335
|
+
original: !0,
|
|
336
|
+
claimedFree: "1",
|
|
337
|
+
rewardsQueued: 1,
|
|
338
|
+
passes: [{
|
|
339
|
+
xp: "100",
|
|
340
|
+
tier: 1,
|
|
341
|
+
claimedFree: "1"
|
|
342
|
+
}]
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}), pe = Object.freeze({
|
|
346
|
+
kind: "slot",
|
|
347
|
+
defaultImplementation: u,
|
|
348
|
+
defaultProbe: {
|
|
349
|
+
run: () => T.sync(() => d(j.xpCurve.xp, j.curve)),
|
|
350
|
+
expected: 2
|
|
351
|
+
},
|
|
352
|
+
overrideProbe: {
|
|
353
|
+
run: () => T.sync(() => d(j.xpCurve.xp, j.curve, () => 3)),
|
|
354
|
+
expected: 3
|
|
355
|
+
}
|
|
356
|
+
}), me = Object.freeze({
|
|
357
|
+
kind: "slot",
|
|
358
|
+
defaultImplementation: te,
|
|
359
|
+
defaultProbe: {
|
|
360
|
+
run: () => T.sync(() => p(j.rewardResolver)),
|
|
361
|
+
expected: [{
|
|
362
|
+
level: 2,
|
|
363
|
+
reward: {
|
|
364
|
+
kind: "currency",
|
|
365
|
+
currency: "test.gold",
|
|
366
|
+
amount: "5"
|
|
367
|
+
}
|
|
368
|
+
}]
|
|
369
|
+
},
|
|
370
|
+
overrideProbe: {
|
|
371
|
+
run: () => T.sync(() => p(j.rewardResolver, () => [])),
|
|
372
|
+
expected: []
|
|
373
|
+
}
|
|
374
|
+
}), Y = {
|
|
375
|
+
pool: N,
|
|
376
|
+
count: 1,
|
|
377
|
+
seed: 1,
|
|
378
|
+
excluded: []
|
|
379
|
+
}, he = Object.freeze({
|
|
380
|
+
kind: "slot",
|
|
381
|
+
defaultImplementation: o,
|
|
382
|
+
defaultProbe: {
|
|
383
|
+
run: () => T.sync(() => l(Y)),
|
|
384
|
+
expected: ["fixture.first"]
|
|
385
|
+
},
|
|
386
|
+
overrideProbe: {
|
|
387
|
+
run: () => T.sync(() => l(Y, () => ["fixture.second"])),
|
|
388
|
+
expected: ["fixture.second"]
|
|
389
|
+
}
|
|
390
|
+
}), X = {
|
|
391
|
+
quest: N.quests[0],
|
|
392
|
+
progress: [0],
|
|
393
|
+
signal: {
|
|
394
|
+
kind: "event",
|
|
395
|
+
event: "match.finished",
|
|
396
|
+
data: {}
|
|
397
|
+
}
|
|
398
|
+
}, ge = Object.freeze({
|
|
399
|
+
kind: "slot",
|
|
400
|
+
defaultImplementation: a,
|
|
401
|
+
defaultProbe: {
|
|
402
|
+
run: () => T.sync(() => c(X)),
|
|
403
|
+
expected: [1]
|
|
404
|
+
},
|
|
405
|
+
overrideProbe: {
|
|
406
|
+
run: () => T.sync(() => c(X, () => [2])),
|
|
407
|
+
expected: [2]
|
|
408
|
+
}
|
|
409
|
+
}), _e = Object.freeze({
|
|
410
|
+
kind: "slot",
|
|
411
|
+
defaultImplementation: _,
|
|
412
|
+
defaultProbe: {
|
|
413
|
+
run: () => T.sync(() => v(M)),
|
|
414
|
+
expected: {
|
|
415
|
+
value: "7",
|
|
416
|
+
anchorAt: 3e3
|
|
417
|
+
}
|
|
418
|
+
},
|
|
419
|
+
overrideProbe: {
|
|
420
|
+
run: () => T.sync(() => v(M, () => ({
|
|
421
|
+
value: "6",
|
|
422
|
+
anchorAt: 2e3
|
|
423
|
+
}))),
|
|
424
|
+
expected: {
|
|
425
|
+
value: "6",
|
|
426
|
+
anchorAt: 2e3
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}), Z = C("wins", "2"), Q = [{
|
|
430
|
+
stat: "wins",
|
|
431
|
+
period: "lifetime",
|
|
432
|
+
seasonId: null,
|
|
433
|
+
value: "2"
|
|
434
|
+
}], $ = [{
|
|
435
|
+
stat: "wins",
|
|
436
|
+
period: "lifetime",
|
|
437
|
+
seasonId: null,
|
|
438
|
+
value: "2",
|
|
439
|
+
target: "2",
|
|
440
|
+
met: !0
|
|
441
|
+
}], ve = Object.freeze({
|
|
442
|
+
kind: "slot",
|
|
443
|
+
defaultImplementation: x,
|
|
444
|
+
defaultProbe: {
|
|
445
|
+
run: () => T.sync(() => S(Z, Q)),
|
|
446
|
+
expected: {
|
|
447
|
+
met: !0,
|
|
448
|
+
progress: $
|
|
449
|
+
}
|
|
450
|
+
},
|
|
451
|
+
overrideProbe: {
|
|
452
|
+
run: () => T.sync(() => S(Z, Q, (e) => ({
|
|
453
|
+
...x(e),
|
|
454
|
+
met: !1
|
|
455
|
+
}))),
|
|
456
|
+
expected: {
|
|
457
|
+
met: !1,
|
|
458
|
+
progress: $
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}), ye = Object.freeze({
|
|
462
|
+
kind: "slot",
|
|
463
|
+
defaultImplementation: t,
|
|
464
|
+
defaultProbe: {
|
|
465
|
+
run: () => T.sync(() => r(P.passCatchUp)),
|
|
466
|
+
expected: "200"
|
|
467
|
+
},
|
|
468
|
+
overrideProbe: {
|
|
469
|
+
run: () => T.sync(() => r(P.passCatchUp, (e) => e.amount)),
|
|
470
|
+
expected: "100"
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
export { ve as achievementEvaluatorSystemFixture, H as achievementFakeLayer, ue as achievementPortSystemFixture, U as achievementStatSourceFakeLayer, de as achievementStatSourceSystemFixture, ye as passCatchUpSystemFixture, W as passFakeLayer, fe as passPortSystemFixture, R as progressionFakeLayer, oe as progressionPortSystemFixture, z as questFakeLayer, se as questPortSystemFixture, ge as questProgressResolverSystemFixture, he as questSelectorSystemFixture, B as questSourceFakeLayer, ce as questSourceSystemFixture, V as resourceFakeLayer, le as resourcePortSystemFixture, _e as resourceRegenSystemFixture, me as rewardResolverSystemFixture, pe as xpCurveSystemFixture };
|