@voltro/plugin-progression 0.0.0-stage → 0.87.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 +24329 -0
- package/LICENSE +61 -0
- package/README.md +478 -2
- package/SECURITY.md +56 -0
- package/THIRD-PARTY-NOTICES.md +9189 -0
- package/dist/achievementComponents.js +92 -0
- package/dist/achievementStore.js +603 -0
- package/dist/achievementTables.entity.js +98 -0
- package/dist/achievements.d.ts +188 -0
- package/dist/achievements.js +205 -0
- package/dist/capture.js +64 -0
- package/dist/cmsQuests.d.ts +91 -0
- package/dist/cmsQuests.js +83 -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 +38 -0
- package/dist/daily.d.ts +152 -0
- package/dist/daily.js +126 -0
- package/dist/dailyStore.js +421 -0
- package/dist/dailySystem.fixture.js +138 -0
- package/dist/dailyTables.entity.js +90 -0
- package/dist/declarationFixtures.js +143 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.js +20 -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 +122 -0
- package/dist/passRules.js +96 -0
- package/dist/passStore.js +485 -0
- package/dist/passTables.entity.js +96 -0
- package/dist/plugin.js +1086 -0
- package/dist/port.js +5 -0
- package/dist/progressionStore.js +706 -0
- package/dist/questComponents.js +163 -0
- package/dist/questPort.d.ts +126 -0
- package/dist/questPort.js +5 -0
- package/dist/questRefresh.js +56 -0
- package/dist/questRefresh.server.js +126 -0
- package/dist/questRerollJournal.js +77 -0
- package/dist/questStore.js +592 -0
- package/dist/questTables.entity.js +117 -0
- package/dist/quests.d.ts +142 -0
- package/dist/quests.js +153 -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 +35 -0
- package/dist/rankClosure.server.js +139 -0
- package/dist/rankClosureWorkflow.d.ts +34 -0
- package/dist/rankClosureWorkflow.js +16 -0
- package/dist/rankReader.server.js +57 -0
- package/dist/rankRewardParent.server.js +65 -0
- package/dist/rankSeasons.d.ts +144 -0
- package/dist/rankSeasons.js +91 -0
- package/dist/rankStore.js +521 -0
- package/dist/rankSystem.fixture.js +170 -0
- package/dist/rankTables.entity.js +101 -0
- package/dist/ranks.d.ts +167 -0
- package/dist/ranks.js +219 -0
- package/dist/resourceStore.js +464 -0
- package/dist/resourceTables.entity.js +89 -0
- package/dist/resources.d.ts +105 -0
- package/dist/resources.js +60 -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 +39 -0
- package/dist/rewardDelivery.d.ts +163 -0
- package/dist/rewardDelivery.js +38 -0
- package/dist/rewardDelivery.server.js +430 -0
- package/dist/rewardDeliveryRecord.js +48 -0
- package/dist/rewardDeliveryWorkflow.d.ts +36 -0
- package/dist/rewardDeliveryWorkflow.js +16 -0
- package/dist/rpc.d.ts +880 -0
- package/dist/rpc.js +498 -0
- package/dist/server.d.ts +2812 -0
- package/dist/server.js +21 -0
- package/dist/stats.js +45 -0
- package/dist/strategies.d.ts +131 -0
- package/dist/strategies.js +4 -0
- package/dist/systemFixtures.js +474 -0
- package/dist/tables.entity.js +155 -0
- package/dist/testing.d.ts +1566 -0
- package/dist/testing.js +11 -0
- package/dist/track.js +72 -0
- package/dist/tutorial.d.ts +157 -0
- package/dist/tutorial.js +110 -0
- package/dist/tutorialStore.js +496 -0
- package/dist/tutorialSystem.fixture.js +100 -0
- package/dist/tutorialTables.entity.js +91 -0
- package/dist/web.d.ts +363 -0
- package/dist/web.js +7 -0
- package/package.json +167 -4
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ProgressionError as e } from "./errors.js";
|
|
2
|
+
import { RankRatingSource as t, capturePlayerRank as n, captureRankRating as r, defaultRankDecay as i, defaultRankGrade as a, defaultRankScore as o, defaultRankSeasonReset as s, defineRankLadder as c, resolveRank as l, resolveRankSeasonReset as u, resolveRankStrategies as d } from "./ranks.js";
|
|
3
|
+
import { grant as f, grantItem as p, xp as m } from "./reward.js";
|
|
4
|
+
import { RankPort as h, acceptRankObservation as g, captureRankSeasonState as _, closeRankSeasonState as v, defineRankSeason as y, initialRankSeasonState as b } from "./rankSeasons.js";
|
|
5
|
+
import { TutorialPort as x, TutorialVerifier as S, defaultTutorialStepPolicy as C, defineTutorial as w, resolveTutorialSkip as T, resolveTutorialStep as E } from "./tutorial.js";
|
|
6
|
+
import { SeasonPassPort as D, defaultPassCatchUp as O, defineSeasonPass as k, resolvePassCatchUp as A } from "./pass.js";
|
|
7
|
+
import { QuestSource as j, defaultQuestProgressResolver as M, defaultQuestSelector as N, defineQuest as P, defineQuestPool as F, resolveQuestProgress as I, selectQuests as L, staticQuestSource as R } from "./quests.js";
|
|
8
|
+
import { DailyProfileSource as z, LoginCalendarPort as B, defaultDailyClaimPolicy as V, defaultDailyWindow as H, defineLoginCalendar as U, resolveDailyClaim as W } from "./daily.js";
|
|
9
|
+
import { RewardDeliveryPort as G } from "./rewardDelivery.js";
|
|
10
|
+
import { defaultXpCurve as K, explicitLevelCurve as q, levelCurve as J, resolveXpCurve as Y } from "./curve.js";
|
|
11
|
+
import { ProgressionPort as X } from "./port.js";
|
|
12
|
+
import { applyStatValue as Z, defineStat as Q } from "./stats.js";
|
|
13
|
+
import { defaultRewardResolver as $, defineProgression as ee, resolveRewards as te } from "./track.js";
|
|
14
|
+
import { QuestPort as ne } from "./questPort.js";
|
|
15
|
+
import { QuestPlayerSource as re, QuestRefreshPort as ie, defaultQuestWindow as ae, resolveQuestWindow as oe } from "./questRefresh.js";
|
|
16
|
+
import { RegenResourcePort as se, defaultResourceRegen as ce, defineRegenResource as le, resolveResourceRegen as ue } from "./resources.js";
|
|
17
|
+
import { AchievementPort as de, AchievementStatSource as fe, captureAchievementCondition as pe, captureAchievementPlatform as me, captureAchievementStats as he, composite as ge, defaultAchievementEvaluator as _e, defineAchievement as ve, resolveAchievementEvaluation as ye, statAtLeast as be } from "./achievements.js";
|
|
18
|
+
import { progressionAchievementsSystemContract as xe, progressionDailySystemContract as Se, progressionPassesSystemContract as Ce, progressionPlugin as we, progressionQuestsSystemContract as Te, progressionRanksSystemContract as Ee, progressionResourcesSystemContract as De, progressionSystemContract as Oe, progressionTutorialsSystemContract as ke } from "./plugin.js";
|
|
19
|
+
export { de as AchievementPort, fe as AchievementStatSource, z as DailyProfileSource, B as LoginCalendarPort, e as ProgressionError, X as ProgressionPort, re as QuestPlayerSource, ne as QuestPort, ie as QuestRefreshPort, j as QuestSource, h as RankPort, t as RankRatingSource, se as RegenResourcePort, G as RewardDeliveryPort, D as SeasonPassPort, x as TutorialPort, S as TutorialVerifier, g as acceptRankObservation, Z as applyStatValue, pe as captureAchievementCondition, me as captureAchievementPlatform, he as captureAchievementStats, n as capturePlayerRank, r as captureRankRating, _ as captureRankSeasonState, v as closeRankSeasonState, ge as composite, _e as defaultAchievementEvaluator, V as defaultDailyClaimPolicy, H as defaultDailyWindow, O as defaultPassCatchUp, M as defaultQuestProgressResolver, N as defaultQuestSelector, ae as defaultQuestWindow, i as defaultRankDecay, a as defaultRankGrade, o as defaultRankScore, s as defaultRankSeasonReset, ce as defaultResourceRegen, $ as defaultRewardResolver, C as defaultTutorialStepPolicy, K as defaultXpCurve, ve as defineAchievement, U as defineLoginCalendar, ee as defineProgression, P as defineQuest, F as defineQuestPool, c as defineRankLadder, y as defineRankSeason, le as defineRegenResource, k as defineSeasonPass, Q as defineStat, w as defineTutorial, q as explicitLevelCurve, f as grant, p as grantItem, b as initialRankSeasonState, J as levelCurve, xe as progressionAchievementsSystemContract, Se as progressionDailySystemContract, Ce as progressionPassesSystemContract, we as progressionPlugin, Te as progressionQuestsSystemContract, Ee as progressionRanksSystemContract, De as progressionResourcesSystemContract, Oe as progressionSystemContract, ke as progressionTutorialsSystemContract, ye as resolveAchievementEvaluation, W as resolveDailyClaim, A as resolvePassCatchUp, I as resolveQuestProgress, oe as resolveQuestWindow, l as resolveRank, u as resolveRankSeasonReset, d as resolveRankStrategies, ue as resolveResourceRegen, te as resolveRewards, T as resolveTutorialSkip, E as resolveTutorialStep, Y as resolveXpCurve, L as selectQuests, be as statAtLeast, R as staticQuestSource, m as xp };
|
package/dist/pass.d.ts
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { Context } from 'effect';
|
|
2
|
+
import { Effect } from 'effect';
|
|
3
|
+
import { PluginPrivacyTarget } from '@voltro/protocol';
|
|
4
|
+
import { Schema } from 'effect';
|
|
5
|
+
import { Subject } from '@voltro/protocol';
|
|
6
|
+
import { YieldableError } from 'effect/Cause';
|
|
7
|
+
|
|
8
|
+
export declare const capturePassState: (input: unknown, pass: SeasonPass) => PassState;
|
|
9
|
+
|
|
10
|
+
export declare const claimablePassTiers: (pass: SeasonPass, state: PassState) => readonly PassTierClaim[];
|
|
11
|
+
|
|
12
|
+
export declare const defaultPassCatchUp: PassCatchUp;
|
|
13
|
+
|
|
14
|
+
/** UTC elapsed days govern pass catch-up; player timezone does not change a season. */
|
|
15
|
+
export declare const defineSeasonPass: (input: SeasonPassDefinition | SeasonPass) => SeasonPass;
|
|
16
|
+
|
|
17
|
+
export declare type PassCatchUp = (input: PassCatchUpContext) => ProgressValue;
|
|
18
|
+
|
|
19
|
+
export declare interface PassCatchUpContext {
|
|
20
|
+
readonly pass: SeasonPass;
|
|
21
|
+
readonly amount: string;
|
|
22
|
+
readonly at: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export declare interface PassClaimInput {
|
|
26
|
+
readonly passId: string;
|
|
27
|
+
readonly tier: number;
|
|
28
|
+
readonly track: PassTrack;
|
|
29
|
+
readonly requestId: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export declare interface PassCloseInput {
|
|
33
|
+
readonly tenantId: string;
|
|
34
|
+
readonly ownerId: string;
|
|
35
|
+
readonly passId: string;
|
|
36
|
+
readonly requestId: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export declare const passInitialState: (pass: SeasonPass) => PassState;
|
|
40
|
+
|
|
41
|
+
export declare const passMask: (input: unknown, tiers: number) => bigint;
|
|
42
|
+
|
|
43
|
+
export declare interface PassPremiumInput {
|
|
44
|
+
readonly tenantId: string;
|
|
45
|
+
readonly ownerId: string;
|
|
46
|
+
readonly passId: string;
|
|
47
|
+
readonly offerId: string;
|
|
48
|
+
readonly fulfillmentId: string;
|
|
49
|
+
readonly requestId: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export declare interface PassReceipt {
|
|
53
|
+
readonly operationId: string;
|
|
54
|
+
readonly kind: 'xp' | 'premium' | 'claim' | 'close';
|
|
55
|
+
readonly after: PassState;
|
|
56
|
+
readonly claims: readonly PassTierClaim[];
|
|
57
|
+
readonly rewardsQueued: number;
|
|
58
|
+
readonly at: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export declare interface PassState {
|
|
62
|
+
readonly passId: string;
|
|
63
|
+
readonly version: number;
|
|
64
|
+
readonly xp: string;
|
|
65
|
+
readonly claimedFree: string;
|
|
66
|
+
readonly claimedPremium: string;
|
|
67
|
+
readonly premium: boolean;
|
|
68
|
+
readonly purchasedAt: number | null;
|
|
69
|
+
readonly fulfillmentId: string | null;
|
|
70
|
+
readonly closed: boolean;
|
|
71
|
+
readonly updatedAt: number;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export declare const passTier: (pass: SeasonPass, xp: string) => number;
|
|
75
|
+
|
|
76
|
+
export declare interface PassTierClaim {
|
|
77
|
+
readonly tier: number;
|
|
78
|
+
readonly track: PassTrack;
|
|
79
|
+
readonly rewards: readonly ProgressionReward[];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export declare type PassTrack = 'free' | 'premium';
|
|
83
|
+
|
|
84
|
+
export declare interface PassXpInput {
|
|
85
|
+
readonly tenantId: string;
|
|
86
|
+
readonly ownerId: string;
|
|
87
|
+
readonly passId: string;
|
|
88
|
+
readonly amount: ProgressValue;
|
|
89
|
+
readonly source: string;
|
|
90
|
+
readonly originId: string;
|
|
91
|
+
readonly requestId: string;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export declare interface PlayerPass extends PassState {
|
|
95
|
+
readonly tier: number;
|
|
96
|
+
readonly from: number;
|
|
97
|
+
readonly until: number;
|
|
98
|
+
readonly observedAt: number;
|
|
99
|
+
readonly active: boolean;
|
|
100
|
+
readonly premiumOffer: string | null;
|
|
101
|
+
readonly claimable: readonly PassTierClaim[];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
declare class ProgressionError extends ProgressionError_base {
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
declare const ProgressionError_base: Schema.Class<ProgressionError, Schema.TaggedStruct<"ProgressionError", {
|
|
108
|
+
readonly code: Schema.Literals<readonly ["invalid_input", "invalid_record", "invalid_curve", "invalid_reward", "invalid_track", "invalid_stat", "overflow", "insufficient_resource", "forbidden", "conflict", "erased", "not_found", "limit_exceeded", "unavailable"]>;
|
|
109
|
+
}>, YieldableError>;
|
|
110
|
+
|
|
111
|
+
declare type ProgressionReward = {
|
|
112
|
+
readonly kind: 'currency';
|
|
113
|
+
readonly currency: string;
|
|
114
|
+
readonly amount: string;
|
|
115
|
+
} | {
|
|
116
|
+
readonly kind: 'item';
|
|
117
|
+
readonly itemId: string;
|
|
118
|
+
readonly qty: number;
|
|
119
|
+
} | {
|
|
120
|
+
readonly kind: 'xp';
|
|
121
|
+
readonly trackId: string;
|
|
122
|
+
readonly amount: string;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
declare type ProgressValue = string | number | bigint;
|
|
126
|
+
|
|
127
|
+
export declare const resolvePassCatchUp: (input: PassCatchUpContext, slot?: PassCatchUp) => string;
|
|
128
|
+
|
|
129
|
+
export declare interface SeasonPass {
|
|
130
|
+
readonly id: string;
|
|
131
|
+
readonly version: number;
|
|
132
|
+
readonly from: number;
|
|
133
|
+
readonly until: number;
|
|
134
|
+
readonly tiers: number;
|
|
135
|
+
readonly xpPerTier: string;
|
|
136
|
+
readonly tracks: {
|
|
137
|
+
readonly free: readonly (readonly ProgressionReward[])[];
|
|
138
|
+
readonly premium: readonly (readonly ProgressionReward[])[];
|
|
139
|
+
};
|
|
140
|
+
readonly premiumOffer: string | null;
|
|
141
|
+
readonly sources: readonly string[];
|
|
142
|
+
readonly catchUp: {
|
|
143
|
+
readonly xpBoostAfterDay: number;
|
|
144
|
+
readonly multiplier: number;
|
|
145
|
+
} | null;
|
|
146
|
+
readonly autoClaim: boolean;
|
|
147
|
+
readonly expireUnclaimed: 'mail' | 'forfeit';
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export declare interface SeasonPassDefinition {
|
|
151
|
+
readonly id: string;
|
|
152
|
+
readonly version?: number;
|
|
153
|
+
readonly from: number;
|
|
154
|
+
readonly until: number;
|
|
155
|
+
readonly tiers: number;
|
|
156
|
+
readonly xpPerTier: ProgressValue;
|
|
157
|
+
readonly tracks: {
|
|
158
|
+
readonly free: readonly (readonly ProgressionReward[])[];
|
|
159
|
+
readonly premium: readonly (readonly ProgressionReward[])[];
|
|
160
|
+
};
|
|
161
|
+
readonly premiumOffer?: string;
|
|
162
|
+
readonly sources: readonly string[];
|
|
163
|
+
readonly catchUp?: {
|
|
164
|
+
readonly xpBoostAfterDay: number;
|
|
165
|
+
readonly multiplier?: number;
|
|
166
|
+
};
|
|
167
|
+
readonly autoClaim?: boolean;
|
|
168
|
+
readonly expireUnclaimed?: 'mail' | 'forfeit';
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export declare class SeasonPassPort extends SeasonPassPort_base {
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
declare const SeasonPassPort_base: Context.ServiceClass<SeasonPassPort, "@voltro/SeasonPassPort", SeasonPassService>;
|
|
175
|
+
|
|
176
|
+
export declare interface SeasonPassService {
|
|
177
|
+
readonly applyXp: (subject: Subject, input: PassXpInput) => Effect.Effect<PassReceipt, ProgressionError>;
|
|
178
|
+
readonly grantPremium: (subject: Subject, input: PassPremiumInput) => Effect.Effect<PassReceipt, ProgressionError>;
|
|
179
|
+
readonly claim: (subject: Subject, input: PassClaimInput) => Effect.Effect<PassReceipt, ProgressionError>;
|
|
180
|
+
readonly close: (subject: Subject, input: PassCloseInput) => Effect.Effect<PassReceipt, ProgressionError>;
|
|
181
|
+
readonly mine: (subject: Subject) => Effect.Effect<readonly PlayerPass[], ProgressionError>;
|
|
182
|
+
readonly exportSubject: (target: PluginPrivacyTarget) => Effect.Effect<unknown, ProgressionError>;
|
|
183
|
+
readonly eraseSubject: (target: PluginPrivacyTarget) => Effect.Effect<void, ProgressionError>;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export { }
|
package/dist/pass.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { progressionError as e } from "./errors.js";
|
|
2
|
+
import { identifier as t, integer as n, list as r, object as i, progressValue as a } from "./capture.js";
|
|
3
|
+
import { captureRewards as o } from "./reward.js";
|
|
4
|
+
import { Context as s } from "effect";
|
|
5
|
+
//#region src/pass.ts
|
|
6
|
+
var c = (s) => {
|
|
7
|
+
let c = i(s, [
|
|
8
|
+
"id",
|
|
9
|
+
"version",
|
|
10
|
+
"from",
|
|
11
|
+
"until",
|
|
12
|
+
"tiers",
|
|
13
|
+
"xpPerTier",
|
|
14
|
+
"tracks",
|
|
15
|
+
"premiumOffer",
|
|
16
|
+
"sources",
|
|
17
|
+
"catchUp",
|
|
18
|
+
"autoClaim",
|
|
19
|
+
"expireUnclaimed"
|
|
20
|
+
]), l = n(c.from, 0, 864e13), u = n(c.until, l + 1, 864e13), d = n(c.tiers, 1, 256), f = a(c.xpPerTier);
|
|
21
|
+
if (!f || f * BigInt(d) > 9223372036854775807n) throw e("overflow");
|
|
22
|
+
let p = i(c.tracks, ["free", "premium"]), m = r(p.free, d).map((e) => o(e, 64)), h = r(p.premium, d).map((e) => o(e, 64));
|
|
23
|
+
if (m.length !== d || h.length !== d) throw e("invalid_input");
|
|
24
|
+
let g = r(c.sources, 64).map(t);
|
|
25
|
+
if (!g.length || new Set(g).size !== g.length) throw e("invalid_input");
|
|
26
|
+
let _ = c.catchUp == null ? null : i(c.catchUp, ["xpBoostAfterDay", "multiplier"]);
|
|
27
|
+
if (c.autoClaim !== void 0 && typeof c.autoClaim != "boolean" || c.expireUnclaimed !== void 0 && c.expireUnclaimed !== "mail" && c.expireUnclaimed !== "forfeit") throw e("invalid_input");
|
|
28
|
+
return Object.freeze({
|
|
29
|
+
id: t(c.id),
|
|
30
|
+
version: n(c.version ?? 1, 1, 1e6),
|
|
31
|
+
from: l,
|
|
32
|
+
until: u,
|
|
33
|
+
tiers: d,
|
|
34
|
+
xpPerTier: String(f),
|
|
35
|
+
tracks: Object.freeze({
|
|
36
|
+
free: Object.freeze(m),
|
|
37
|
+
premium: Object.freeze(h)
|
|
38
|
+
}),
|
|
39
|
+
premiumOffer: c.premiumOffer == null ? null : t(c.premiumOffer),
|
|
40
|
+
sources: Object.freeze(g),
|
|
41
|
+
catchUp: _ ? Object.freeze({
|
|
42
|
+
xpBoostAfterDay: n(_.xpBoostAfterDay, 0, 1e5),
|
|
43
|
+
multiplier: n(_.multiplier ?? 2, 1, 1e3)
|
|
44
|
+
}) : null,
|
|
45
|
+
autoClaim: c.autoClaim ?? !1,
|
|
46
|
+
expireUnclaimed: c.expireUnclaimed ?? "forfeit"
|
|
47
|
+
});
|
|
48
|
+
}, l = ({ pass: e, amount: t, at: n }) => {
|
|
49
|
+
let r = e.catchUp && Math.floor((n - e.from) / 864e5) >= e.catchUp.xpBoostAfterDay ? e.catchUp.multiplier : 1;
|
|
50
|
+
return String(a(t) * BigInt(r));
|
|
51
|
+
}, u = (t, r = l) => {
|
|
52
|
+
let i = c(t.pass), o = String(a(t.amount)), s = n(t.at, i.from, i.until - 1);
|
|
53
|
+
if (o === "0") throw e("invalid_input");
|
|
54
|
+
let u = a(r(Object.freeze({
|
|
55
|
+
pass: i,
|
|
56
|
+
amount: o,
|
|
57
|
+
at: s
|
|
58
|
+
})));
|
|
59
|
+
if (!u) throw e("invalid_input");
|
|
60
|
+
return String(u);
|
|
61
|
+
}, d = (t, n) => {
|
|
62
|
+
if (typeof t != "string" || !/^(0|[1-9][0-9]{0,77})$/.test(t)) throw e("invalid_record");
|
|
63
|
+
let r = BigInt(t);
|
|
64
|
+
if (r >= 1n << BigInt(n)) throw e("invalid_record");
|
|
65
|
+
return r;
|
|
66
|
+
}, f = (e, t) => Number(a(t) / BigInt(e.xpPerTier) > BigInt(e.tiers) ? BigInt(e.tiers) : a(t) / BigInt(e.xpPerTier)), p = (e) => Object.freeze({
|
|
67
|
+
passId: e.id,
|
|
68
|
+
version: e.version,
|
|
69
|
+
xp: "0",
|
|
70
|
+
claimedFree: "0",
|
|
71
|
+
claimedPremium: "0",
|
|
72
|
+
premium: !1,
|
|
73
|
+
purchasedAt: null,
|
|
74
|
+
fulfillmentId: null,
|
|
75
|
+
closed: !1,
|
|
76
|
+
updatedAt: e.from
|
|
77
|
+
}), m = (r, o) => {
|
|
78
|
+
let s = i(r, [
|
|
79
|
+
"passId",
|
|
80
|
+
"version",
|
|
81
|
+
"xp",
|
|
82
|
+
"claimedFree",
|
|
83
|
+
"claimedPremium",
|
|
84
|
+
"premium",
|
|
85
|
+
"purchasedAt",
|
|
86
|
+
"fulfillmentId",
|
|
87
|
+
"closed",
|
|
88
|
+
"updatedAt"
|
|
89
|
+
]);
|
|
90
|
+
if (s.passId !== o.id || s.version !== o.version || typeof s.premium != "boolean" || typeof s.closed != "boolean") throw e("invalid_record");
|
|
91
|
+
let c = String(a(s.xp));
|
|
92
|
+
if (BigInt(c) > BigInt(o.xpPerTier) * BigInt(o.tiers)) throw e("invalid_record");
|
|
93
|
+
let l = (1n << BigInt(f(o, c))) - 1n, u = d(s.claimedFree, o.tiers), p = d(s.claimedPremium, o.tiers);
|
|
94
|
+
if ((u & l) !== u || (p & l) !== p || !s.premium && (p !== 0n || s.purchasedAt !== null || s.fulfillmentId !== null) || s.premium && (!o.premiumOffer || s.purchasedAt === null || s.fulfillmentId === null)) throw e("invalid_record");
|
|
95
|
+
let m = s.premium ? n(s.purchasedAt, o.from, o.until - 1) : null, h = s.premium ? t(s.fulfillmentId) : null, g = n(s.updatedAt, o.from, 864e13);
|
|
96
|
+
if (m !== null && m > g || !s.closed && g >= o.until || s.closed && g < o.until) throw e("invalid_record");
|
|
97
|
+
return Object.freeze({
|
|
98
|
+
passId: o.id,
|
|
99
|
+
version: o.version,
|
|
100
|
+
xp: c,
|
|
101
|
+
claimedFree: String(u),
|
|
102
|
+
claimedPremium: String(p),
|
|
103
|
+
premium: s.premium,
|
|
104
|
+
purchasedAt: m,
|
|
105
|
+
fulfillmentId: h,
|
|
106
|
+
closed: s.closed,
|
|
107
|
+
updatedAt: g
|
|
108
|
+
});
|
|
109
|
+
}, h = (e, t) => {
|
|
110
|
+
let n = m(t, e), r = f(e, n.xp), i = [];
|
|
111
|
+
for (let t of ["free", "premium"]) if (t === "free" || n.premium) {
|
|
112
|
+
let a = d(t === "free" ? n.claimedFree : n.claimedPremium, e.tiers);
|
|
113
|
+
for (let n = 1; n <= r; n++) a & 1n << BigInt(n - 1) || i.push(Object.freeze({
|
|
114
|
+
tier: n,
|
|
115
|
+
track: t,
|
|
116
|
+
rewards: e.tracks[t][n - 1]
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
return Object.freeze(i);
|
|
120
|
+
}, g = class extends s.Service()("@voltro/SeasonPassPort") {};
|
|
121
|
+
//#endregion
|
|
122
|
+
export { g as SeasonPassPort, m as capturePassState, h as claimablePassTiers, l as defaultPassCatchUp, c as defineSeasonPass, p as passInitialState, d as passMask, f as passTier, u as resolvePassCatchUp };
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { progressionError as e } from "./errors.js";
|
|
2
|
+
import { identifier as t, integer as n, object as r, progressValue as i } from "./capture.js";
|
|
3
|
+
import { capturePassState as a, claimablePassTiers as o, passMask as s } from "./pass.js";
|
|
4
|
+
//#region src/passRules.ts
|
|
5
|
+
var c = (a, o) => {
|
|
6
|
+
let s = r(a);
|
|
7
|
+
if (s.kind === "xp" && Object.keys(s).length === 5) {
|
|
8
|
+
r(a, [
|
|
9
|
+
"kind",
|
|
10
|
+
"amount",
|
|
11
|
+
"effectiveAmount",
|
|
12
|
+
"source",
|
|
13
|
+
"originId"
|
|
14
|
+
]);
|
|
15
|
+
let n = String(i(s.amount)), c = String(i(s.effectiveAmount)), l = t(s.source);
|
|
16
|
+
if (n === "0" || c === "0" || !o.sources.includes(l)) throw e("invalid_input");
|
|
17
|
+
return Object.freeze({
|
|
18
|
+
kind: "xp",
|
|
19
|
+
amount: n,
|
|
20
|
+
effectiveAmount: c,
|
|
21
|
+
source: l,
|
|
22
|
+
originId: t(s.originId)
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
if (s.kind === "premium" && Object.keys(s).length === 3) {
|
|
26
|
+
r(a, [
|
|
27
|
+
"kind",
|
|
28
|
+
"offerId",
|
|
29
|
+
"fulfillmentId"
|
|
30
|
+
]);
|
|
31
|
+
let n = t(s.offerId);
|
|
32
|
+
if (n !== o.premiumOffer) throw e("forbidden");
|
|
33
|
+
return Object.freeze({
|
|
34
|
+
kind: "premium",
|
|
35
|
+
offerId: n,
|
|
36
|
+
fulfillmentId: t(s.fulfillmentId)
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (s.kind === "claim" && Object.keys(s).length === 3) {
|
|
40
|
+
if (r(a, [
|
|
41
|
+
"kind",
|
|
42
|
+
"tier",
|
|
43
|
+
"track"
|
|
44
|
+
]), s.track !== "free" && s.track !== "premium") throw e("invalid_input");
|
|
45
|
+
return Object.freeze({
|
|
46
|
+
kind: "claim",
|
|
47
|
+
tier: n(s.tier, 1, o.tiers),
|
|
48
|
+
track: s.track
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (s.kind === "close" && Object.keys(s).length === 1) return Object.freeze({ kind: "close" });
|
|
52
|
+
throw e("invalid_input");
|
|
53
|
+
}, l = (t, r, l, u) => {
|
|
54
|
+
let d = a(r, t), f = c(l, t), p = n(u, d.updatedAt, 864e13);
|
|
55
|
+
if (d.closed || f.kind === "close" && p < t.until || f.kind !== "close" && (p < t.from || p >= t.until)) throw e("conflict");
|
|
56
|
+
if (f.kind === "close" && t.expireUnclaimed === "mail") throw e("unavailable");
|
|
57
|
+
let m = {
|
|
58
|
+
...d,
|
|
59
|
+
updatedAt: p
|
|
60
|
+
};
|
|
61
|
+
if (f.kind === "xp") {
|
|
62
|
+
let e = i(d.xp) + i(f.effectiveAmount), n = BigInt(t.xpPerTier) * BigInt(t.tiers);
|
|
63
|
+
m = {
|
|
64
|
+
...m,
|
|
65
|
+
xp: String(e > n ? n : e)
|
|
66
|
+
};
|
|
67
|
+
} else if (f.kind === "premium") {
|
|
68
|
+
if (d.premium) throw e("conflict");
|
|
69
|
+
m = {
|
|
70
|
+
...m,
|
|
71
|
+
premium: !0,
|
|
72
|
+
purchasedAt: p,
|
|
73
|
+
fulfillmentId: f.fulfillmentId
|
|
74
|
+
};
|
|
75
|
+
} else f.kind === "close" && (m = {
|
|
76
|
+
...m,
|
|
77
|
+
closed: !0
|
|
78
|
+
});
|
|
79
|
+
let h = o(t, m), g = f.kind === "claim" ? h.filter((e) => e.tier === f.tier && e.track === f.track) : t.autoClaim && (f.kind === "xp" || f.kind === "premium") ? h : [];
|
|
80
|
+
if (f.kind === "claim" && g.length !== 1) throw e("conflict");
|
|
81
|
+
let _ = s(m.claimedFree, t.tiers), v = s(m.claimedPremium, t.tiers);
|
|
82
|
+
for (let e of g) {
|
|
83
|
+
let t = 1n << BigInt(e.tier - 1);
|
|
84
|
+
e.track === "free" ? _ |= t : v |= t;
|
|
85
|
+
}
|
|
86
|
+
return Object.freeze({
|
|
87
|
+
after: a({
|
|
88
|
+
...m,
|
|
89
|
+
claimedFree: String(_),
|
|
90
|
+
claimedPremium: String(v)
|
|
91
|
+
}, t),
|
|
92
|
+
claims: Object.freeze(g)
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
//#endregion
|
|
96
|
+
export { l as applyPassIntent, c as capturePassIntent };
|