@idosgames/core 0.5.1 → 0.7.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/dist/index.d.cts CHANGED
@@ -45,9 +45,39 @@ declare const ResourceEntryType: {
45
45
  readonly Item: "Item";
46
46
  readonly VirtualCurrency: "VirtualCurrency";
47
47
  readonly CryptoCurrency: "CryptoCurrency";
48
- readonly UsdCent: "UsdCent";
48
+ /** Rewarded-video credit: one verified ad view, spendable in ad-gated actions. */
49
+ readonly RewardedVideoCredit: "RewardedVideoCredit";
50
+ /**
51
+ * Real-money payment in a store. Only `ProductID` is populated — the amount and currency come
52
+ * from the SKU price tier, not from us. Never a stored resource: the money is paid outside,
53
+ * and the server settles the receipt before the resource operation runs.
54
+ */
55
+ readonly Purchase: "Purchase";
49
56
  };
50
57
  type ResourceEntryType = (typeof ResourceEntryType)[keyof typeof ResourceEntryType];
58
+ /**
59
+ * Platform the client runs on. Sent with every request (header `X-IG-Platform`) because the set
60
+ * of available payment options depends on it: an App Store build must not offer payment outside
61
+ * IAP. `Unknown` is a value of its own, not a synonym for `Web` — a client that does not report
62
+ * its platform only gets options that are safe everywhere.
63
+ */
64
+ declare const ClientPlatform: {
65
+ readonly Unknown: "Unknown";
66
+ readonly Web: "Web";
67
+ readonly Android: "Android";
68
+ readonly Ios: "Ios";
69
+ };
70
+ type ClientPlatform = (typeof ClientPlatform)[keyof typeof ClientPlatform];
71
+ /** Store that issued a receipt. Must match a key in the title's `Purchase.Stores`. */
72
+ declare const IapStore$1: {
73
+ readonly GooglePlay: "GooglePlay";
74
+ readonly AppleAppStore: "AppleAppStore";
75
+ };
76
+ type IapStore$1 = (typeof IapStore$1)[keyof typeof IapStore$1];
77
+ declare const zIapStore: z.ZodEnum<{
78
+ GooglePlay: "GooglePlay";
79
+ AppleAppStore: "AppleAppStore";
80
+ }>;
51
81
  declare const EventTokenType: {
52
82
  readonly TimedEvent: "TimedEvent";
53
83
  readonly Quest: "Quest";
@@ -208,6 +238,9 @@ interface UserEventTokensState {
208
238
  CoopEvent?: Record<string, UserEventTokenProgress>;
209
239
  Season?: Record<string, UserEventTokenProgress>;
210
240
  }
241
+ type PriceOption = { OptionID?: null | string; Name?: null | string; Cost?: null | ResourceConsume; AllowedPlatforms?: null | Array<'Unknown' | 'Web' | 'Android' | 'Ios'>; AssetPaths?: null | Record<string, string>; [key: string]: unknown; };
242
+ type PriceOptions = Record<string, PriceOption>;
243
+ type PaymentProof = { Store: 'GooglePlay' | 'AppleAppStore'; Receipt: string; Signature?: null | string; [key: string]: unknown; };
211
244
 
212
245
  interface StorePurchaseState {
213
246
  OfferID: string;
@@ -222,7 +255,7 @@ interface UserStoreState {
222
255
  type StorePurchaseResponse = { ServerTimeUtc: string; OfferID: string; Count: number; Resources?: null | ResourceOperation; };
223
256
  type PurchaseBatchResponse = Array<{ Id: string; Success: boolean; Error?: null | string; Data?: null | StorePurchaseResponse; }>;
224
257
  type StoreDefinition = { StoreID: string; Type?: null | string; Name?: null | string; Description?: null | string; Rules?: null | { StartUtc?: null | string; EndUtc?: null | string; RequiredFlags?: null | Array<string>; [key: string]: unknown; }; AssetPaths?: null | Record<string, string>; [key: string]: unknown; };
225
- type StoreOfferDefinition = { OfferID: string; StoreIDs?: null | Array<string>; Name?: null | string; Cost?: null | ResourceConsume; Rewards?: null | ResourceGrant; Rules?: null | { StartUtc?: null | string; EndUtc?: null | string; Gate?: null | SegmentGate; Limits?: null | LimitSpec; [key: string]: unknown; }; AssetPaths?: null | Record<string, string>; [key: string]: unknown; };
258
+ type StoreOfferDefinition = { OfferID: string; StoreIDs?: null | Array<string>; Name?: null | string; PriceOptions?: null | PriceOptions; Rewards?: null | ResourceGrant; Rules?: null | { StartUtc?: null | string; EndUtc?: null | string; Gate?: null | SegmentGate; Limits?: null | LimitSpec; [key: string]: unknown; }; AssetPaths?: null | Record<string, string>; [key: string]: unknown; };
226
259
  /** The title's shop system (config), returned by getStoreDefinitions(). */
227
260
  interface StoreDefinitions {
228
261
  Stores?: Record<string, StoreDefinition> | null;
@@ -232,10 +265,19 @@ interface StoreDefinitions {
232
265
  interface StorePurchaseRef {
233
266
  OfferID?: string;
234
267
  Count?: number;
268
+ /** Chosen payment option. Empty = first one available on this platform. */
269
+ SelectedOptionID?: string;
235
270
  }
236
271
  interface StoreRequest extends BaseRequest {
237
272
  OfferID?: string;
238
273
  Count?: number;
274
+ /** Chosen payment option (`PriceOption.OptionID`). Empty = first one available here. */
275
+ SelectedOptionID?: string;
276
+ /**
277
+ * Store receipt. Required exactly when the chosen option is paid with real money
278
+ * (a `Purchase` entry in its cost); ignored for resource prices.
279
+ */
280
+ Payment?: PaymentProof;
239
281
  /** PurchaseBatch: per-offer purchase counts (deduped by OfferID). */
240
282
  Purchases?: StorePurchaseRef[];
241
283
  }
@@ -292,7 +334,8 @@ interface UserLootboxState {
292
334
  Pity?: Record<string, UserLootboxPityCounter>;
293
335
  }
294
336
  type LootboxPityTriggerResponse = { RuleID: string; BoxIndex?: null | number; };
295
- type LootboxOpenResponse = { ServerTimeUtc: string; LootboxID: string; OpenedCount?: null | number; SelectedOptionID?: null | number; Resources?: null | ResourceOperation; Inventory?: null | InventoryDelta; Results?: null | Array<ResourceOperation>; TriggeredPity?: null | Array<LootboxPityTriggerResponse>; };
337
+ type LootboxOpenResponse = { ServerTimeUtc: string; LootboxID: string; OpenedCount?: null | number; SelectedOptionID?: null | string; Resources?: null | ResourceOperation; Inventory?: null | InventoryDelta; Results?: null | Array<ResourceOperation>; TriggeredPity?: null | Array<LootboxPityTriggerResponse>; };
338
+ /** One opening price option: an idempotent option ID and its consume-only cost. */
296
339
  /**
297
340
  * Container of preset wiring for a lootbox — one PresetBinding per block. Inline data
298
341
  * (RewardSlots/PityRules) lives on LootboxDefinition. null = presets unused.
@@ -302,17 +345,30 @@ interface LootboxPresetBindings {
302
345
  PityRules?: PresetBinding | null;
303
346
  }
304
347
  type LootboxSupplyRule = { CatalogID?: null | string; ItemID?: null | string; MaxDrops?: null | number; [key: string]: unknown; };
305
- type LootboxDefinition = { LootboxID: string; AssetPaths?: null | Record<string, string>; PriceOptions?: null | Record<string, { PriceOptionID?: null | number; RequiredResources?: null | ResourceConsume; [key: string]: unknown; }>; RewardSlots?: null | Array<LootboxRewardSlot>; PityRules?: null | Array<LootboxPityRule>; Presets?: null | LootboxPresetBindings; RewardMultiplier?: null | RewardProgressionMultiplierSpec; SupplyLimits?: null | Array<LootboxSupplyRule>; [key: string]: unknown; };
348
+ type LootboxDefinition = { LootboxID: string; AssetPaths?: null | Record<string, string>; PriceOptions?: null | PriceOptions; RewardSlots?: null | Array<LootboxRewardSlot>; PityRules?: null | Array<LootboxPityRule>; Presets?: null | LootboxPresetBindings; RewardMultiplier?: null | RewardProgressionMultiplierSpec; SupplyLimits?: null | Array<LootboxSupplyRule>; MaxOpenCount?: null | number; [key: string]: unknown; };
306
349
  /** The title's lootbox catalog (config), returned by getDefinitions(). */
350
+ /** Module-wide Lootbox settings shared by every lootbox of the title. */
351
+ interface LootboxGlobalSettings {
352
+ /**
353
+ * Max boxes per single open() call for every lootbox of the title. Overridden per lootbox via
354
+ * LootboxDefinition.MaxOpenCount. null = platform default (100). <= 0 = opening disabled.
355
+ */
356
+ MaxOpenCount?: number | null;
357
+ }
307
358
  interface LootboxDefinitions {
308
359
  Definitions?: Record<string, LootboxDefinition> | null;
360
+ /** Module-wide settings (e.g. the max-open ceiling). null = platform defaults apply. */
361
+ Settings?: LootboxGlobalSettings | null;
309
362
  RewardPools?: RewardPoolLibrary | null;
310
363
  }
311
364
  type LootboxDefinitionsResponse = { LootboxDefinitions?: null | LootboxDefinitions; };
312
365
  interface LootboxRequest extends BaseRequest {
313
366
  LootboxID?: string;
314
367
  Count?: number;
315
- SelectedOptionID?: number;
368
+ /** Chosen payment option. Empty = first one available on this platform. */
369
+ SelectedOptionID?: string;
370
+ /** Store receipt — required when the chosen option is paid with real money. */
371
+ Payment?: PaymentProof;
316
372
  }
317
373
  declare const LootboxAction: {
318
374
  readonly GetDefinitions: "GetDefinitions";
@@ -394,7 +450,15 @@ declare const RewardAction: {
394
450
  };
395
451
  type RewardAction = (typeof RewardAction)[keyof typeof RewardAction];
396
452
  type ExperimentVariantCondition = { ExperimentID?: null | string; Variants?: null | Array<string>; [key: string]: unknown; };
397
- type SegmentGate = { Segments?: null | Array<string>; MinPremiumTier?: null | number; RequiredPremiumIDs?: null | Array<string>; MinLevel?: null | number; MaxLevel?: null | number; Countries?: null | Array<string>; RegisteredWithinDays?: null | number; ActiveWithinDays?: null | number; Experiment?: null | ExperimentVariantCondition; [key: string]: unknown; };
453
+ /** What a TutorialGateCondition checks about the player's onboarding progress. */
454
+ declare const TutorialGateMode: {
455
+ readonly Completed: "Completed";
456
+ readonly Started: "Started";
457
+ readonly StepReached: "StepReached";
458
+ };
459
+ type TutorialGateMode = (typeof TutorialGateMode)[keyof typeof TutorialGateMode];
460
+ type TutorialGateCondition = { FlowIDs?: null | Array<string>; Mode?: null | 'Completed' | 'Started' | 'StepReached'; StepID?: null | string; Negate?: null | boolean; SkippedCountsAsCompleted?: null | boolean; [key: string]: unknown; };
461
+ type SegmentGate = { Segments?: null | Array<string>; MinPremiumTier?: null | number; RequiredPremiumIDs?: null | Array<string>; MinLevel?: null | number; MaxLevel?: null | number; Countries?: null | Array<string>; RegisteredWithinDays?: null | number; ActiveWithinDays?: null | number; Experiment?: null | ExperimentVariantCondition; Tutorial?: null | TutorialGateCondition; Platforms?: null | Array<'Unknown' | 'Web' | 'Android' | 'Ios'>; [key: string]: unknown; };
398
462
  type RelativeWindow = { OffsetSecondsFromParentStart?: null | number; DurationSeconds?: null | number; AllowEarningAfterEnd?: null | boolean; ClaimGraceHours?: null | number; [key: string]: unknown; };
399
463
  type ScheduledWindow = { StartUtc?: null | string; EndUtc?: null | string; AllowEarningAfterEnd?: null | boolean; ClaimGraceHours?: null | number; [key: string]: unknown; };
400
464
  type ScheduleChain = { AnchorUtc?: null | string; MaxCycles?: null | number; PauseBetweenPhasesSec?: null | number; PauseBetweenCyclesSec?: null | number; [key: string]: unknown; };
@@ -530,7 +594,117 @@ declare const QuestAction: {
530
594
  readonly ClaimGroupCompletionReward: "ClaimGroupCompletionReward";
531
595
  };
532
596
  type QuestAction = (typeof QuestAction)[keyof typeof QuestAction];
533
- type ResourceEntry = { Type?: null | 'Item' | 'VirtualCurrency' | 'CryptoCurrency' | 'UsdCent'; CurrencyID?: null | string; Amount?: null | number; CatalogID?: null | string; ItemID?: null | string; };
597
+
598
+ declare const TutorialStepCompletionMode: {
599
+ /** The client calls completeStep itself ("the player tapped Next"). Default. */
600
+ readonly ClientAck: "ClientAck";
601
+ /** An engine game event closes it — the client only reports it was shown. */
602
+ readonly SystemEvent: "SystemEvent";
603
+ /** Closes on being shown (reportStepShown) — an informational aside. */
604
+ readonly Auto: "Auto";
605
+ /** Several triggers with an explicit all/any rule. */
606
+ readonly Composite: "Composite";
607
+ };
608
+ type TutorialStepCompletionMode = (typeof TutorialStepCompletionMode)[keyof typeof TutorialStepCompletionMode];
609
+ declare const TutorialRestartPolicy: {
610
+ readonly Never: "Never";
611
+ readonly OnRequest: "OnRequest";
612
+ readonly Always: "Always";
613
+ };
614
+ type TutorialRestartPolicy = (typeof TutorialRestartPolicy)[keyof typeof TutorialRestartPolicy];
615
+ declare const TutorialFlowStatus: {
616
+ readonly NotStarted: "NotStarted";
617
+ readonly InProgress: "InProgress";
618
+ readonly Completed: "Completed";
619
+ readonly Skipped: "Skipped";
620
+ /** Expired per Policy.ExpireAfterSeconds without being completed. */
621
+ readonly Expired: "Expired";
622
+ };
623
+ type TutorialFlowStatus = (typeof TutorialFlowStatus)[keyof typeof TutorialFlowStatus];
624
+ declare const TutorialScriptModule: {
625
+ readonly GameLoop: "GameLoop";
626
+ };
627
+ type TutorialScriptModule = (typeof TutorialScriptModule)[keyof typeof TutorialScriptModule];
628
+ declare const TutorialBoardAction: {
629
+ readonly Raid: "Raid";
630
+ readonly Attack: "Attack";
631
+ };
632
+ type TutorialBoardAction = (typeof TutorialBoardAction)[keyof typeof TutorialBoardAction];
633
+ type TutorialStepIdentity = { Title?: null | string; TitleKey?: null | string; Body?: null | string; BodyKey?: null | string; AnchorID?: null | string; HighlightTarget?: null | string; AssetPaths?: null | Record<string, string>; UiHint?: null | Record<string, string>; [key: string]: unknown; };
634
+ type TutorialStepCompletion = { Mode?: null | 'SystemEvent' | 'ClientAck' | 'Auto' | 'Composite'; Triggers?: null | Array<TriggerSource>; TargetValue?: null | number; RequireAllTriggers?: null | boolean; [key: string]: unknown; };
635
+ type TutorialStepEffects = { Grant?: null | ResourceGrant; UnlockFeatures?: null | Array<string>; [key: string]: unknown; };
636
+ type TutorialBoardScript = { TileType?: null | string; TileIndex?: null | number; ChanceOutcomeID?: null | string; RandomActionType?: null | 'Raid' | 'Attack'; [key: string]: unknown; };
637
+ type TutorialScriptedOutcome = { Module?: null | 'GameLoop'; Board?: null | TutorialBoardScript; MaxUses?: null | number; [key: string]: unknown; };
638
+ type TutorialStepPolicy = { Skippable?: null | boolean; TimeoutSeconds?: null | number; [key: string]: unknown; };
639
+ type TutorialStepDefinition = { StepID?: null | string; Order?: null | number; Identity?: null | TutorialStepIdentity; Completion?: null | TutorialStepCompletion; Effects?: null | TutorialStepEffects; Script?: null | TutorialScriptedOutcome; Policy?: null | TutorialStepPolicy; [key: string]: unknown; };
640
+ type TutorialIdentity = { DisplayName?: null | string; DisplayNameKey?: null | string; Description?: null | string; DescriptionKey?: null | string; SortOrder?: null | number; AssetPaths?: null | Record<string, string>; CustomParams?: null | Record<string, string>; [key: string]: unknown; };
641
+ type TutorialAvailability = { Schedule?: null | ScheduleSpec; Gate?: null | SegmentGate; RequiredFlowIDs?: null | Array<string>; AutoStart?: null | boolean; StartTrigger?: null | TriggerSource; [key: string]: unknown; };
642
+ type TutorialFlowPolicy = { Skippable?: null | boolean; SkippableFromOrder?: null | number; RestartPolicy?: null | 'Never' | 'OnRequest' | 'Always'; ExpireAfterSeconds?: null | number; IsBlocking?: null | boolean; UnlockFeatures?: null | Array<string>; [key: string]: unknown; };
643
+ type TutorialReward = { Grant?: null | ResourceGrant; AutoClaim?: null | boolean; [key: string]: unknown; };
644
+ type TutorialPresetBindings = { Availability?: null | PresetBinding; Policy?: null | PresetBinding; Reward?: null | PresetBinding; Steps?: null | PresetBinding; [key: string]: unknown; };
645
+ type TutorialFlowDefinition = { FlowID?: null | string; Identity?: null | TutorialIdentity; Availability?: null | TutorialAvailability; Policy?: null | TutorialFlowPolicy; Steps?: null | Record<string, TutorialStepDefinition>; Reward?: null | TutorialReward; Presets?: null | TutorialPresetBindings; [key: string]: unknown; };
646
+ type TutorialBlockingPolicy = { BlockingFlowIDs?: null | Array<string>; BlockedModules?: null | Array<string>; BlockedActions?: null | Record<string, Array<string>>; BlockBeforeStart?: null | boolean; SkipLiftsBlock?: null | boolean; [key: string]: unknown; };
647
+ type TutorialGlobalSettings = { IsEnabled?: null | boolean; MaxActiveFlows?: null | number; Blocking?: null | TutorialBlockingPolicy; [key: string]: unknown; };
648
+ type TutorialPresetRegistry = { Availability?: null | Record<string, TutorialAvailability>; Policy?: null | Record<string, TutorialFlowPolicy>; Reward?: null | Record<string, TutorialReward>; Steps?: null | Record<string, Record<string, TutorialStepDefinition>>; [key: string]: unknown; };
649
+ type TutorialDefinitions = { Flows?: null | Record<string, TutorialFlowDefinition>; Settings?: null | TutorialGlobalSettings; Presets?: null | TutorialPresetRegistry; [key: string]: unknown; };
650
+ interface UserTutorialStepState {
651
+ StepID?: string;
652
+ Progress?: number;
653
+ FiredTriggers?: number[];
654
+ ShownAtUtc?: string;
655
+ CompletedAtUtc?: string;
656
+ Skipped?: boolean;
657
+ ScriptUses?: number;
658
+ }
659
+ interface UserTutorialFlowState {
660
+ FlowID?: string;
661
+ Status?: TutorialFlowStatus;
662
+ CurrentStepID?: string | null;
663
+ StartedAtUtc?: string;
664
+ FinishedAtUtc?: string;
665
+ Steps?: Record<string, UserTutorialStepState>;
666
+ RestartCount?: number;
667
+ RewardClaimed?: boolean;
668
+ /**
669
+ * Experiment and variant captured when the flow STARTED. Not a duplicate of the live
670
+ * assignment: changing the experiment salt reassigns the player, and without the snapshot the
671
+ * funnel would attribute the run to a variant they never saw.
672
+ */
673
+ ExperimentID?: string | null;
674
+ VariantID?: string | null;
675
+ }
676
+ interface UserTutorialState {
677
+ Flows?: Record<string, UserTutorialFlowState>;
678
+ LastUpdatedUtc?: string;
679
+ }
680
+ type TutorialFlowView = { FlowID: string; Status: 'Completed' | 'Expired' | 'NotStarted' | 'InProgress' | 'Skipped'; TotalSteps: number; CompletedSteps: number; CanSkip: boolean; RewardClaimed: boolean; RewardPending: boolean; CurrentStepID?: null | string; CurrentStep?: null | TutorialStepDefinition; VariantID?: null | string; [key: string]: unknown; };
681
+ type GetUserTutorialStateResponse = { State?: null | UserTutorialState; Flows?: null | Array<TutorialFlowView>; UnlockedFeatures?: null | Array<string>; [key: string]: unknown; };
682
+ type TutorialFlowResponse = { Flow?: null | TutorialFlowView; [key: string]: unknown; };
683
+ type TutorialClaimResponse = { FlowID?: null | string; Granted?: null | ResourceOperation; [key: string]: unknown; };
684
+ type TutorialFlowBatchResponse = Array<{ Id: string; Success: boolean; Error?: null | string; Data?: null | TutorialFlowResponse; }>;
685
+ type TutorialStepProgress = { FlowID: string; StepID: string; Progress: number; Target: number; Completed: boolean; [key: string]: unknown; };
686
+ interface TutorialRequest extends BaseRequest {
687
+ FlowID?: string;
688
+ StepID?: string;
689
+ /** CompleteStepsBatch: steps to close, in order. Deduped by StepID. */
690
+ StepIDs?: string[];
691
+ /** Allow auto-start while reading state. Default true. */
692
+ AutoStart?: boolean;
693
+ }
694
+ declare const TutorialAction: {
695
+ readonly GetTutorialDefinitions: "GetTutorialDefinitions";
696
+ readonly GetUserTutorialState: "GetUserTutorialState";
697
+ readonly StartFlow: "StartFlow";
698
+ readonly ReportStepShown: "ReportStepShown";
699
+ readonly CompleteStep: "CompleteStep";
700
+ readonly CompleteStepsBatch: "CompleteStepsBatch";
701
+ readonly SkipStep: "SkipStep";
702
+ readonly SkipFlow: "SkipFlow";
703
+ readonly ClaimFlowReward: "ClaimFlowReward";
704
+ readonly ResetFlow: "ResetFlow";
705
+ };
706
+ type TutorialAction = (typeof TutorialAction)[keyof typeof TutorialAction];
707
+ type ResourceEntry = { Type?: null | 'Item' | 'VirtualCurrency' | 'CryptoCurrency' | 'RewardedVideoCredit' | 'Purchase'; CurrencyID?: null | string; Amount?: null | number; CatalogID?: null | string; ItemID?: null | string; ProductID?: null | string; };
534
708
  type EventTokenAddress = { EntityID: string; Type?: null | 'TimedEvent' | 'Quest' | 'Leaderboard' | 'CoopEvent' | 'Season'; };
535
709
  type EventTokenOperation = { Address?: null | EventTokenAddress; Amount?: null | number; Source?: null | string; };
536
710
  type ResourceBundle = { Entries?: null | Array<ResourceEntry>; EventTokens?: null | Array<EventTokenOperation>; };
@@ -704,6 +878,7 @@ type UserSeasonStateResponse = UserSeasonState;
704
878
  type ActiveSeasonInfo = { SeasonChainID: string; CycleIndex?: null | number; Season?: null | { SeasonID?: null | string; Order?: null | number; DurationSec?: null | number; DisplayName?: null | string; Description?: null | string; AssetPaths?: null | Record<string, string>; Tiers?: null | Array<{ Tier?: null | number; DisplayName?: null | string; AssetPaths?: null | Record<string, string>; RequiredTokens?: null | number; TierReachedReward?: null | ResourceGrant; [key: string]: unknown; }>; LinkedCollectionID?: null | string; CustomParams?: null | Record<string, string>; [key: string]: unknown; }; ComputedStartUtc?: null | string; ComputedEndUtc?: null | string; SecondsRemaining?: null | number; UserState?: null | UserSeasonState; NextTier?: null | { Tier?: null | number; DisplayName?: null | string; AssetPaths?: null | Record<string, string>; RequiredTokens?: null | number; TierReachedReward?: null | ResourceGrant; [key: string]: unknown; }; [key: string]: unknown; };
705
879
  type GrantStatusTokensResponse = { SeasonChainID: string; NewTier: number; CurrentSeasonID?: null | string; AmountGranted?: null | number; NewStatusTokens?: null | number; OldTier?: null | number; TierUp?: null | boolean; };
706
880
  type ClaimTierRewardResponse = { SeasonChainID: string; TierNumber: number; CurrentSeasonID?: null | string; Resources?: null | ResourceOperation; };
881
+ type ClaimTierRewardsBatchResponse = { ServerTimeUtc: string; Items: Array<{ Id: string; Success: boolean; Error?: null | string; Data?: null | ClaimTierRewardResponse; }>; Resources?: null | ResourceOperation; };
707
882
  type SeasonChainDefinition = { SeasonChainID?: null | string; DisplayName?: null | string; Schedule?: null | ScheduleSpec; Seasons?: null | Array<{ SeasonID?: null | string; Order?: null | number; DurationSec?: null | number; DisplayName?: null | string; Description?: null | string; AssetPaths?: null | Record<string, string>; Tiers?: null | Array<{ Tier?: null | number; DisplayName?: null | string; AssetPaths?: null | Record<string, string>; RequiredTokens?: null | number; TierReachedReward?: null | ResourceGrant; [key: string]: unknown; }>; LinkedCollectionID?: null | string; CustomParams?: null | Record<string, string>; [key: string]: unknown; }>; GrantTokensAccessMode?: null | string; Gate?: null | SegmentGate; [key: string]: unknown; };
708
883
  /** Root configuration of the title's season system, returned by getDefinitions(). */
709
884
  interface SeasonDefinitions {
@@ -713,6 +888,12 @@ interface SeasonRequest extends BaseRequest {
713
888
  SeasonChainID?: string;
714
889
  Amount?: number;
715
890
  TierNumber?: number;
891
+ /**
892
+ * ClaimTierRewardsBatch: tier numbers to claim. Non-positive entries are dropped, the rest is
893
+ * deduped keeping order and clamped to the platform batch size. Needed because tiers are
894
+ * reached in batches — one token grant can raise the player through several at once.
895
+ */
896
+ TierNumbers?: number[];
716
897
  }
717
898
  declare const SeasonAction: {
718
899
  readonly GetDefinitions: "GetDefinitions";
@@ -720,6 +901,7 @@ declare const SeasonAction: {
720
901
  readonly GetUserState: "GetUserState";
721
902
  readonly GrantStatusTokens: "GrantStatusTokens";
722
903
  readonly ClaimTierReward: "ClaimTierReward";
904
+ readonly ClaimTierRewardsBatch: "ClaimTierRewardsBatch";
723
905
  };
724
906
  type SeasonAction = (typeof SeasonAction)[keyof typeof SeasonAction];
725
907
 
@@ -740,7 +922,7 @@ interface UserPremiumState {
740
922
  ActivatedTrialIDs?: string[];
741
923
  MaxActiveTier?: number;
742
924
  }
743
- type PremiumDefinition = { PremiumID?: null | string; DisplayName?: null | string; Tier?: null | number; DurationDays?: null | number; TrialDurationDays?: null | number; PriceOptions?: null | Record<string, { OptionID?: null | string; Name?: null | string; RequiredResources?: null | ResourceConsume; [key: string]: unknown; }>; AppleProductID?: null | string; GoogleProductID?: null | string; Benefits?: null | Record<string, string>; [key: string]: unknown; };
925
+ type PremiumDefinition = { PremiumID?: null | string; DisplayName?: null | string; Tier?: null | number; DurationDays?: null | number; TrialDurationDays?: null | number; PriceOptions?: null | PriceOptions; AppleProductID?: null | string; GoogleProductID?: null | string; Benefits?: null | Record<string, string>; [key: string]: unknown; };
744
926
  interface PremiumDefinitions {
745
927
  Definitions?: Record<string, PremiumDefinition> | null;
746
928
  }
@@ -790,13 +972,13 @@ type UnlockCharactersBatchResponse = { ServerTimeUtc: string; Items: Array<{ Id:
790
972
  type UpgradeCharacterLevelsBatchResponse = { ServerTimeUtc: string; Items: Array<{ Id: string; Success: boolean; Error?: null | string; Data?: null | UpgradeCharacterLevelResponse; }>; Resources?: null | ResourceOperation; };
791
973
  type UpgradeStatLevelsBatchResponse = { ServerTimeUtc: string; Items: Array<{ Id: string; Success: boolean; Error?: null | string; Data?: null | UpgradeStatLevelResponse; }>; Resources?: null | ResourceOperation; };
792
974
  type StatRequirement = { RequiredStatID: string; RequiredLevel: number; [key: string]: unknown; };
793
- type StatDefinition = { StatID: string; TypeID?: null | string; DisplayName?: null | string; Description?: null | string; MaxLevel?: null | number; Weight?: null | number; BaseCostResource?: null | ResourceConsume; CostScalingFactor?: null | number; BaseStatValue?: null | number; StatScalingFactor?: null | number; CharacterLevelScalingFactor?: null | number; Requirements?: null | Array<StatRequirement>; AssetPaths?: null | Record<string, string>; [key: string]: unknown; };
794
- type CharacterLevelDefinition = { Level?: null | number; UpgradeCost?: null | ResourceConsume; GlobalStatMultiplier?: null | number; StatMaxLevelMultiplier?: null | number; AssetPaths?: null | Record<string, string>; [key: string]: unknown; };
975
+ type StatDefinition = { StatID: string; TypeID?: null | string; DisplayName?: null | string; Description?: null | string; MaxLevel?: null | number; Weight?: null | number; PriceOptions?: null | PriceOptions; CostScalingFactor?: null | number; BaseStatValue?: null | number; StatScalingFactor?: null | number; CharacterLevelScalingFactor?: null | number; Requirements?: null | Array<StatRequirement>; AssetPaths?: null | Record<string, string>; [key: string]: unknown; };
976
+ type CharacterLevelDefinition = { Level?: null | number; PriceOptions?: null | PriceOptions; GlobalStatMultiplier?: null | number; StatMaxLevelMultiplier?: null | number; AssetPaths?: null | Record<string, string>; [key: string]: unknown; };
795
977
  type CharacterEquipmentSlot = { SlotID: string; MinCharacterLevel?: null | number; StatRequirements?: null | Array<StatRequirement>; AllowedRarityIDs?: null | Array<string>; AllowedItemTags?: null | Array<string>; MinItemLevel?: null | number; MaxItemLevel?: null | number; [key: string]: unknown; };
796
978
  type CharacterEquipment = { Slots?: null | Record<string, CharacterEquipmentSlot>; [key: string]: unknown; };
797
979
  type CharacterIdentity = { DisplayName?: null | string; Description?: null | string; Lore?: null | string; SortOrder?: null | number; AssetPaths?: null | Record<string, string>; [key: string]: unknown; };
798
980
  type CharacterClassification = { ClassID?: null | string; RarityID?: null | string; Tags?: null | Array<string>; [key: string]: unknown; };
799
- type CharacterUnlock = { UnlockedByDefault?: null | boolean; Cost?: null | ResourceConsume; [key: string]: unknown; };
981
+ type CharacterUnlock = { UnlockedByDefault?: null | boolean; PriceOptions?: null | PriceOptions; [key: string]: unknown; };
800
982
  type CharacterDefinition = { CharacterID: string; Identity?: null | CharacterIdentity; Classification?: null | CharacterClassification; Unlock?: null | CharacterUnlock; Presets?: null | { Stats?: null | PresetBinding; Levels?: null | PresetBinding; Equipment?: null | PresetBinding; [key: string]: unknown; }; Equipment?: null | CharacterEquipment; Stats?: null | Record<string, StatDefinition>; Levels?: null | Record<string, CharacterLevelDefinition>; [key: string]: unknown; };
801
983
  type StatsPreset = { Stats?: null | Record<string, StatDefinition>; [key: string]: unknown; };
802
984
  type LevelsPreset = { Levels?: null | Record<string, CharacterLevelDefinition>; [key: string]: unknown; };
@@ -839,6 +1021,13 @@ interface CharacterStatRef {
839
1021
  }
840
1022
  interface CharacterRequest extends BaseRequest {
841
1023
  CharacterID?: string;
1024
+ /**
1025
+ * Chosen way to pay (`PriceOption.OptionID`). Empty = the first option available on this
1026
+ * player's platform, which is what keeps single-price entities working unchanged.
1027
+ */
1028
+ SelectedOptionID?: string;
1029
+ /** Store receipt. Required exactly when the chosen option is paid in a store. */
1030
+ Payment?: PaymentProof;
842
1031
  StatID?: string;
843
1032
  ItemsToEquip?: EquipSlotPair[];
844
1033
  UnequipSlotIDs?: string[];
@@ -891,14 +1080,19 @@ interface UserMatchState {
891
1080
  CreationLimits?: UserMatchCreationLimitState | null;
892
1081
  }
893
1082
  type BattleResult = { WinnerUserID?: null | string; LoserUserID?: null | string; Entry?: null | ResourceBundle; NetReward?: null | ResourceBundle; BattleLog?: null | Array<{ RoundIndex?: null | number; AttackerID?: null | string; DefenderID?: null | string; AttackZone?: null | 'Head' | 'Torso' | 'Legs'; DefenseZone?: null | 'Head' | 'Torso' | 'Legs'; HitType?: null | 'Hit' | 'Critical' | 'Block' | 'Dodge'; DamageDealt?: null | number; DefenderHpRemaining?: null | number; [key: string]: unknown; }>; IsDraw?: null | boolean; P1BattleProfile?: null | { UserID?: null | string; SelectedCharacterID?: null | string; SelectedCharacter?: null | CharacterModel; BattleStrategy?: null | Array<BattleStepConfig>; UnstackableItems?: null | Record<string, UnstackableItemInstanceState>; Stats?: null | { MaxHp?: null | number; CurrentHp?: null | number; Damage?: null | number; AttackSpeed?: null | number; CritChance?: null | number; CritMultiplier?: null | number; Armor?: null | number; DodgeChance?: null | number; [key: string]: unknown; }; [key: string]: unknown; }; P2BattleProfile?: null | { UserID?: null | string; SelectedCharacterID?: null | string; SelectedCharacter?: null | CharacterModel; BattleStrategy?: null | Array<BattleStepConfig>; UnstackableItems?: null | Record<string, UnstackableItemInstanceState>; Stats?: null | { MaxHp?: null | number; CurrentHp?: null | number; Damage?: null | number; AttackSpeed?: null | number; CritChance?: null | number; CritMultiplier?: null | number; Armor?: null | number; DodgeChance?: null | number; [key: string]: unknown; }; [key: string]: unknown; }; [key: string]: unknown; };
894
- type PvPMatch = { MatchID: string; TitleID?: null | string; RuleID?: null | string; CreatedAt?: null | string; CreatorID?: null | string; CreatorCharacterID?: null | string; CreatorStrategy?: null | Array<BattleStepConfig>; TargetUserID?: null | string; Entry?: null | ResourceBundle; CreationCostPaid?: null | ResourceBundle; RefundCreationCostOnCancel?: null | boolean; JoinedByUserID?: null | string; JoinedByCharacterID?: null | string; JoinedAt?: null | string; Status?: null | 'Completed' | 'Open' | 'InProgress' | 'Cancelled'; WinnerUserID?: null | string; CompletedAt?: null | string; IsRewardDistributed?: null | boolean; RewardDistributedAt?: null | string; [key: string]: unknown; };
895
- type CreateMatchResponse = { Status: 'Completed' | 'Open' | 'InProgress' | 'Cancelled'; MatchID: string; Entry?: null | ResourceBundle; Resources?: null | ResourceOperation; };
1083
+ type PvPMatch = { MatchID: string; TitleID?: null | string; RuleID?: null | string; CreatedAt?: null | string; CreatorID?: null | string; CreatorCharacterID?: null | string; CreatorStrategy?: null | Array<BattleStepConfig>; TargetUserID?: null | string; Entry?: null | ResourceBundle; CreationCostPaid?: null | ResourceBundle; RefundCreationCostOnCancel?: null | boolean; JoinedByUserID?: null | string; JoinedByCharacterID?: null | string; JoinedAt?: null | string; Status?: null | 'Completed' | 'InProgress' | 'Open' | 'Cancelled'; WinnerUserID?: null | string; CompletedAt?: null | string; IsRewardDistributed?: null | boolean; RewardDistributedAt?: null | string; [key: string]: unknown; };
1084
+ type CreateMatchResponse = { Status: 'Completed' | 'InProgress' | 'Open' | 'Cancelled'; MatchID: string; Entry?: null | ResourceBundle; Resources?: null | ResourceOperation; };
896
1085
  type UpdateMatchResponse = { Match?: null | PvPMatch; };
897
- type CancelMatchResponse = { MatchID: string; Status: 'Completed' | 'Open' | 'InProgress' | 'Cancelled'; Resources?: null | ResourceOperation; };
1086
+ type CancelMatchResponse = { MatchID: string; Status: 'Completed' | 'InProgress' | 'Open' | 'Cancelled'; Resources?: null | ResourceOperation; };
898
1087
  type InstantBattleResponse = { Battle?: null | BattleResult; Resources?: null | ResourceOperation; ResourcesDual?: null | ResourceDualPartyResult; };
899
1088
  type MatchesPageResponse = { Matches?: null | Array<PvPMatch>; Page?: null | number; PageSize?: null | number; HasMore?: null | boolean; };
900
1089
  interface MatchRequest extends BaseRequest {
901
1090
  MatchID?: string;
1091
+ /**
1092
+ * Chosen way to pay (`PriceOption.OptionID`). Empty = the first option available on this
1093
+ * player's platform, which keeps single-price entities working unchanged.
1094
+ */
1095
+ SelectedOptionID?: string;
902
1096
  TargetUserID?: string;
903
1097
  /** Entry stake for one side (currencies / stackable items / event tokens). */
904
1098
  Entry?: ResourceBundle;
@@ -926,7 +1120,7 @@ type MatchAction = (typeof MatchAction)[keyof typeof MatchAction];
926
1120
  type InstantBattleSettings = { StatMapping?: null | { HealthStatID?: null | string; DamageStatID?: null | string; ArmorStatID?: null | string; AttackSpeedStatID?: null | string; CritChanceStatID?: null | string; CritDamageStatID?: null | string; DodgeStatID?: null | string; AllMightStatID?: null | string; [key: string]: unknown; }; Combat?: null | { MaxRounds?: null | number; BlockDamageMultiplier?: null | number; MinHitDamage?: null | number; DefaultCritMultiplier?: null | number; MaxCritChance?: null | number; MaxDodgeChance?: null | number; [key: string]: unknown; }; Formula?: null | { Health?: null | { Terms?: null | Array<{ Coefficient?: null | number; Factors?: null | Array<{ Source?: null | 'Constant' | 'Stat' | 'RankMultiplier' | 'AllMight' | 'GearFlat' | 'GearPercent'; StatID?: null | string; Value?: null | number; OnePlus?: null | boolean; [key: string]: unknown; }>; [key: string]: unknown; }>; [key: string]: unknown; }; Damage?: null | { Terms?: null | Array<{ Coefficient?: null | number; Factors?: null | Array<{ Source?: null | 'Constant' | 'Stat' | 'RankMultiplier' | 'AllMight' | 'GearFlat' | 'GearPercent'; StatID?: null | string; Value?: null | number; OnePlus?: null | boolean; [key: string]: unknown; }>; [key: string]: unknown; }>; [key: string]: unknown; }; Armor?: null | { Terms?: null | Array<{ Coefficient?: null | number; Factors?: null | Array<{ Source?: null | 'Constant' | 'Stat' | 'RankMultiplier' | 'AllMight' | 'GearFlat' | 'GearPercent'; StatID?: null | string; Value?: null | number; OnePlus?: null | boolean; [key: string]: unknown; }>; [key: string]: unknown; }>; [key: string]: unknown; }; AttackSpeed?: null | { Terms?: null | Array<{ Coefficient?: null | number; Factors?: null | Array<{ Source?: null | 'Constant' | 'Stat' | 'RankMultiplier' | 'AllMight' | 'GearFlat' | 'GearPercent'; StatID?: null | string; Value?: null | number; OnePlus?: null | boolean; [key: string]: unknown; }>; [key: string]: unknown; }>; [key: string]: unknown; }; CritChance?: null | { Terms?: null | Array<{ Coefficient?: null | number; Factors?: null | Array<{ Source?: null | 'Constant' | 'Stat' | 'RankMultiplier' | 'AllMight' | 'GearFlat' | 'GearPercent'; StatID?: null | string; Value?: null | number; OnePlus?: null | boolean; [key: string]: unknown; }>; [key: string]: unknown; }>; [key: string]: unknown; }; CritDamage?: null | { Terms?: null | Array<{ Coefficient?: null | number; Factors?: null | Array<{ Source?: null | 'Constant' | 'Stat' | 'RankMultiplier' | 'AllMight' | 'GearFlat' | 'GearPercent'; StatID?: null | string; Value?: null | number; OnePlus?: null | boolean; [key: string]: unknown; }>; [key: string]: unknown; }>; [key: string]: unknown; }; Dodge?: null | { Terms?: null | Array<{ Coefficient?: null | number; Factors?: null | Array<{ Source?: null | 'Constant' | 'Stat' | 'RankMultiplier' | 'AllMight' | 'GearFlat' | 'GearPercent'; StatID?: null | string; Value?: null | number; OnePlus?: null | boolean; [key: string]: unknown; }>; [key: string]: unknown; }>; [key: string]: unknown; }; [key: string]: unknown; }; [key: string]: unknown; };
927
1121
  type MatchEconomySettings = { BurnRate?: null | number; [key: string]: unknown; };
928
1122
  type MatchEntrySettings = { AllowVirtualCurrency?: null | boolean; AllowItems?: null | boolean; AllowEventTokens?: null | boolean; Allowed?: null | Array<{ Kind?: null | 'Item' | 'VirtualCurrency' | 'EventToken'; CurrencyID?: null | string; CatalogID?: null | string; ItemID?: null | string; TokenType?: null | 'TimedEvent' | 'Quest' | 'Leaderboard' | 'CoopEvent' | 'Season'; EntityID?: null | string; MinAmount?: null | number; MaxAmount?: null | number; [key: string]: unknown; }>; MaxPositions?: null | number; [key: string]: unknown; };
929
- type MatchCreationSettings = { Cost?: null | ResourceConsume; RefundCostOnCancel?: null | boolean; MaxOpenMatches?: null | number; Limits?: null | LimitSpec; AllowPrivateMatches?: null | boolean; MaxMatchesPerOpponentPerDay?: null | number; [key: string]: unknown; };
1123
+ type MatchCreationSettings = { PriceOptions?: null | PriceOptions; RefundCostOnCancel?: null | boolean; MaxOpenMatches?: null | number; Limits?: null | LimitSpec; AllowPrivateMatches?: null | boolean; MaxMatchesPerOpponentPerDay?: null | number; [key: string]: unknown; };
930
1124
  /** One instant-battle rule, keyed by RuleID in InstantBattleDefinitions.Rules. */
931
1125
  interface InstantBattleRule {
932
1126
  RuleID?: string | null;
@@ -981,8 +1175,9 @@ interface UserCollectionState {
981
1175
  [key: string]: unknown;
982
1176
  }
983
1177
  type GrantedCollectible = { CollectibleID: string; Rarity?: null | number; IsSpecial?: null | boolean; IsDuplicate?: null | boolean; CollectionCurrencyConverted?: null | number; };
984
- type OpenPackResponse = { GrantedCollectibles?: null | Array<GrantedCollectible>; DuplicateCollectibles?: null | Array<GrantedCollectible>; CollectionCurrencyEarned?: null | number; NewCollectionCurrencyBalance?: null | number; NewlyCompletedSetIDs?: null | Array<string>; CollectionJustCompleted?: null | boolean; Resources?: null | ResourceOperation; TriggeredPity?: null | Array<unknown>; };
985
- type OpenCollectionChestResponse = { GrantedCollectibles?: null | Array<GrantedCollectible>; DuplicateCollectibles?: null | Array<GrantedCollectible>; CollectionCurrencyEarned?: null | number; NewCollectionCurrencyBalance?: null | number; Resources?: null | ResourceOperation; TriggeredPity?: null | Array<unknown>; };
1178
+ type PackOpenResult = { GrantedCollectibles?: null | Array<GrantedCollectible>; DuplicateCollectibles?: null | Array<GrantedCollectible>; CollectionCurrencyEarned?: null | number; };
1179
+ type OpenPackResponse = { OpenedCount?: null | number; Packs?: null | Array<PackOpenResult>; GrantedCollectibles?: null | Array<GrantedCollectible>; DuplicateCollectibles?: null | Array<GrantedCollectible>; CollectionCurrencyEarned?: null | number; NewCollectionCurrencyBalance?: null | number; NewlyCompletedSetIDs?: null | Array<string>; CollectionJustCompleted?: null | boolean; Resources?: null | ResourceOperation; TriggeredPity?: null | Array<unknown>; };
1180
+ type OpenCollectionChestResponse = { OpenedCount?: null | number; Chests?: null | Array<PackOpenResult>; GrantedCollectibles?: null | Array<GrantedCollectible>; DuplicateCollectibles?: null | Array<GrantedCollectible>; CollectionCurrencyEarned?: null | number; NewCollectionCurrencyBalance?: null | number; Resources?: null | ResourceOperation; TriggeredPity?: null | Array<unknown>; };
986
1181
  type UseCollectibleJokerResponse = { GrantedCollectibleID?: null | string; NewlyCompletedSetID?: null | string; CollectionJustCompleted?: null | boolean; Resources?: null | ResourceOperation; };
987
1182
  type ClaimSetRewardResponse = { SetID: string; Resources?: null | ResourceOperation; };
988
1183
  type ClaimSetRewardsBatchResponse = Array<{ Id: string; Success: boolean; Error?: null | string; Data?: null | ClaimSetRewardResponse; }>;
@@ -994,13 +1189,22 @@ type AcceptTradeOfferResponse = { OfferID: string; ReceivedCollectibleID?: null
994
1189
  type DeclineTradeOfferResponse = { OfferID: string; Resources?: null | ResourceOperation; };
995
1190
  type GetTradeOffersResponse = { Offers?: null | Array<CollectionTradeOfferDocument>; };
996
1191
  type CollectionDefinition = { CollectionID?: null | string; DisplayName?: null | string; Description?: null | string; AssetPaths?: null | Record<string, string>; SeasonChainID?: null | string; Sets?: null | Array<{ SetID?: null | string; DisplayName?: null | string; AssetPaths?: null | Record<string, string>; SortOrder?: null | number; Collectibles?: null | Array<{ CollectibleID?: null | string; DisplayName?: null | string; AssetPaths?: null | Record<string, string>; Rarity?: null | number; HasSpecialVersion?: null | boolean; SortOrder?: null | number; [key: string]: unknown; }>; SetCompletionReward?: null | ResourceGrant; [key: string]: unknown; }>; GrandPrize?: null | ResourceGrant; [key: string]: unknown; };
997
- type CollectionPackTypeDefinition = { PackTypeID?: null | string; Cost?: null | ResourceConsume; BonusRewardSlots?: null | Array<LootboxRewardSlot>; PityRules?: null | Array<LootboxPityRule>; Presets?: null | { BonusRewardSlots?: null | PresetBinding; PityRules?: null | PresetBinding; [key: string]: unknown; }; DisplayName?: null | string; AssetPaths?: null | Record<string, string>; CollectibleCount?: null | number; GuaranteedMinRarity?: null | number; GuaranteeMaxRarity?: null | boolean; RarityWeights?: null | Record<string, number>; ColorTier?: null | number; [key: string]: unknown; };
1192
+ type CollectionPackTypeDefinition = { PackTypeID?: null | string; PriceOptions?: null | PriceOptions; BonusRewardSlots?: null | Array<LootboxRewardSlot>; PityRules?: null | Array<LootboxPityRule>; Presets?: null | { BonusRewardSlots?: null | PresetBinding; PityRules?: null | PresetBinding; [key: string]: unknown; }; DisplayName?: null | string; AssetPaths?: null | Record<string, string>; CollectibleCount?: null | number; MaxOpenCount?: null | number; GuaranteedMinRarity?: null | number; GuaranteeMaxRarity?: null | boolean; RarityWeights?: null | Record<string, number>; ColorTier?: null | number; [key: string]: unknown; };
998
1193
  type DuplicateCollectionCurrencyConversion = { Rarity?: null | number; CollectionCurrencyGranted?: null | number; [key: string]: unknown; };
999
- type CollectionChestDefinition = { CollectionChestID?: null | string; DisplayName?: null | string; AssetPaths?: null | Record<string, string>; CollectionCurrencyCost?: null | number; MinCollectibleCount?: null | number; MaxCollectibleCount?: null | number; GuaranteedMinRarity?: null | number; BonusRewardSlots?: null | Array<LootboxRewardSlot>; PityRules?: null | Array<LootboxPityRule>; Presets?: null | { BonusRewardSlots?: null | PresetBinding; PityRules?: null | PresetBinding; [key: string]: unknown; }; Tier?: null | number; [key: string]: unknown; };
1194
+ type CollectionChestDefinition = { CollectionChestID?: null | string; DisplayName?: null | string; AssetPaths?: null | Record<string, string>; CollectionCurrencyCost?: null | number; MaxOpenCount?: null | number; MinCollectibleCount?: null | number; MaxCollectibleCount?: null | number; GuaranteedMinRarity?: null | number; BonusRewardSlots?: null | Array<LootboxRewardSlot>; PityRules?: null | Array<LootboxPityRule>; Presets?: null | { BonusRewardSlots?: null | PresetBinding; PityRules?: null | PresetBinding; [key: string]: unknown; }; Tier?: null | number; [key: string]: unknown; };
1000
1195
  type SpecialTradeEventDefinition = { SpecialTradeEventID?: null | string; StartUtc?: null | string; EndUtc?: null | string; AllowedSpecialCollectibleIDs?: null | Array<string>; SpecialTradeEventDailyTradeLimit?: null | number; [key: string]: unknown; };
1001
1196
  /** The title's collection-system config (config), returned by getCollectionDefinitions(). */
1197
+ /** Module-wide Collection settings shared by every collection and pack type of the title. */
1198
+ interface CollectionGlobalSettings {
1199
+ /** Max packs per single OpenPack call. null = platform default (100). <= 0 = disabled. */
1200
+ MaxPackOpenCount?: number | null;
1201
+ /** Same for collection chests (OpenCollectionChest) — a separate knob. */
1202
+ MaxChestOpenCount?: number | null;
1203
+ }
1002
1204
  interface CollectionDefinitions {
1003
1205
  Collections?: Record<string, CollectionDefinition> | null;
1206
+ /** Module-wide settings (multi-open ceilings). null = platform defaults apply. */
1207
+ Settings?: CollectionGlobalSettings | null;
1004
1208
  PackTypes?: Record<string, CollectionPackTypeDefinition> | null;
1005
1209
  CollectionChests?: CollectionChestDefinition[] | null;
1006
1210
  DuplicateConversions?: DuplicateCollectionCurrencyConversion[] | null;
@@ -1017,6 +1221,13 @@ interface CollectionSetRef {
1017
1221
  }
1018
1222
  interface CollectionRequest extends BaseRequest {
1019
1223
  CollectionID?: string;
1224
+ /**
1225
+ * Chosen way to pay (`PriceOption.OptionID`). Empty = the first option available on this
1226
+ * player's platform, which is what keeps single-price entities working unchanged.
1227
+ */
1228
+ SelectedOptionID?: string;
1229
+ /** Store receipt. Required exactly when the chosen option is paid in a store. */
1230
+ Payment?: PaymentProof;
1020
1231
  CollectibleID?: string;
1021
1232
  PackTypeID?: string;
1022
1233
  CollectionChestID?: string;
@@ -1028,6 +1239,11 @@ interface CollectionRequest extends BaseRequest {
1028
1239
  RequestedCollectibleID?: string;
1029
1240
  RequestedCollectibleIsSpecial?: boolean;
1030
1241
  OfferID?: string;
1242
+ /**
1243
+ * How many packs/chests to open in a single OpenPack / OpenCollectionChest call. Default 1.
1244
+ * Clamped to [1, MaxOpenCount].
1245
+ */
1246
+ Count?: number;
1031
1247
  }
1032
1248
  declare const CollectionAction: {
1033
1249
  readonly GetDefinitions: "GetDefinitions";
@@ -1084,7 +1300,7 @@ type CoopPartnerObjectState = { Index?: null | number; OwnerUserID?: null | stri
1084
1300
  type CoopBuildObjectsState = { Objects?: null | Array<CoopPartnerObjectState>; [key: string]: unknown; };
1085
1301
  type CoopGroupDocument = { GroupID?: null | string; TitleID?: null | string; CoopChainID?: null | string; CoopEventID?: null | string; CycleIndex?: null | number; Members?: null | Array<CoopGroupMember>; BuildObjectsState?: null | CoopBuildObjectsState; Status?: null | string; CreatedAtUtc?: null | string; ExpiresAtUtc?: null | string; Version?: null | number; [key: string]: unknown; };
1086
1302
  type ActiveCoopEventInfo = { CoopChainID: string; [key: string]: unknown; };
1087
- type CoopEventDefinition = { CoopEventID?: null | string; Order?: null | number; DurationSec?: null | number; DisplayName?: null | string; Description?: null | string; AssetPaths?: null | Record<string, string>; EventType?: null | string; PartnerCount?: null | number; MatchmakingTimeoutMinutes?: null | number; MemberGracePeriodMinutes?: null | number; BuildObjects?: null | { Objects?: null | Array<{ Index?: null | number; DisplayName?: null | string; AssetPaths?: null | Record<string, string>; MaxProgress?: null | number; CompletionReward?: null | ResourceGrant; [key: string]: unknown; }>; SpinCost?: null | ResourceConsume; SpinnerTable?: null | Array<{ DisplayName?: null | string; AssetPaths?: null | Record<string, string>; Weight?: null | number; MinProgress?: null | number; MaxProgress?: null | number; [key: string]: unknown; }>; [key: string]: unknown; }; GrandPrize?: null | ResourceGrant; [key: string]: unknown; };
1303
+ type CoopEventDefinition = { CoopEventID?: null | string; Order?: null | number; DurationSec?: null | number; DisplayName?: null | string; Description?: null | string; AssetPaths?: null | Record<string, string>; EventType?: null | string; PartnerCount?: null | number; MatchmakingTimeoutMinutes?: null | number; MemberGracePeriodMinutes?: null | number; BuildObjects?: null | { Objects?: null | Array<{ Index?: null | number; DisplayName?: null | string; AssetPaths?: null | Record<string, string>; MaxProgress?: null | number; CompletionReward?: null | ResourceGrant; [key: string]: unknown; }>; PriceOptions?: null | PriceOptions; SpinnerTable?: null | Array<{ DisplayName?: null | string; AssetPaths?: null | Record<string, string>; Weight?: null | number; MinProgress?: null | number; MaxProgress?: null | number; [key: string]: unknown; }>; MaxSpinsPerCall?: null | number; [key: string]: unknown; }; GrandPrize?: null | ResourceGrant; [key: string]: unknown; };
1088
1304
  /** A coop event chain: cyclic schedule + ordered events + audience gate. */
1089
1305
  interface CoopEventChainDefinition {
1090
1306
  CoopChainID?: string | null;
@@ -1096,7 +1312,7 @@ interface CoopEventChainDefinition {
1096
1312
  }
1097
1313
  type CoopUserStateResponse = { ServerTimeUtc?: null | string; UserState?: null | UserCoopEventState; ActiveGroup?: null | CoopGroupDocument; };
1098
1314
  type CoopGroupStateResponse = { ServerTimeUtc?: null | string; Group?: null | CoopGroupDocument; SecondsRemaining?: null | number; };
1099
- type CoopSpinResponse = { ServerTimeUtc?: null | string; GroupID?: null | string; Resources?: null | ResourceOperation; ObjectIndex?: null | number; Sector?: null | { DisplayName?: null | string; AssetPaths?: null | Record<string, string>; Weight?: null | number; MinProgress?: null | number; MaxProgress?: null | number; [key: string]: unknown; }; ProgressDelta?: null | number; NewProgress?: null | number; MaxProgress?: null | number; ObjectCompleted?: null | boolean; AllObjectsCompleted?: null | boolean; };
1315
+ type CoopSpinResponse = { ServerTimeUtc?: null | string; GroupID?: null | string; Resources?: null | ResourceOperation; ObjectIndex?: null | number; Sector?: null | { DisplayName?: null | string; AssetPaths?: null | Record<string, string>; Weight?: null | number; MinProgress?: null | number; MaxProgress?: null | number; [key: string]: unknown; }; RequestedSpins?: null | number; SpinsUsed?: null | number; Sectors?: null | Array<{ DisplayName?: null | string; AssetPaths?: null | Record<string, string>; Weight?: null | number; MinProgress?: null | number; MaxProgress?: null | number; [key: string]: unknown; }>; ProgressDelta?: null | number; NewProgress?: null | number; MaxProgress?: null | number; ObjectCompleted?: null | boolean; AllObjectsCompleted?: null | boolean; };
1100
1316
  type CoopClaimRewardResponse = { ServerTimeUtc?: null | string; GroupID?: null | string; RewardType?: null | string; Resources?: null | ResourceOperation; };
1101
1317
  type CoopLeaveGroupResponse = { ServerTimeUtc?: null | string; GroupID?: null | string; Success?: null | boolean; };
1102
1318
  /** Root config of the title's cooperative events system. Plugs into TitlePublicConfig as CoopEvent. */
@@ -1107,7 +1323,17 @@ interface CoopEventDefinitions {
1107
1323
  }
1108
1324
  interface CoopEventRequest extends BaseRequest {
1109
1325
  CoopChainID?: string;
1326
+ /**
1327
+ * Chosen way to pay (`PriceOption.OptionID`). Empty = the first option available on this
1328
+ * player's platform, which keeps single-price entities working unchanged.
1329
+ */
1330
+ SelectedOptionID?: string;
1110
1331
  GroupID?: string;
1332
+ /**
1333
+ * How many spins to perform in a single Spin call. Default 1. Clamped to
1334
+ * [1, MaxSpinsPerCall]. Only spins that actually happen are charged — see SpinsUsed.
1335
+ */
1336
+ Count?: number;
1111
1337
  }
1112
1338
  declare const CoopEventAction: {
1113
1339
  readonly GetDefinitions: "GetDefinitions";
@@ -1153,7 +1379,7 @@ interface UserDealOffersState {
1153
1379
  LastUpdatedUtc?: string | null;
1154
1380
  }
1155
1381
  type DealSlotDefinition = { SlotID?: null | string; Enabled?: null | boolean; SortOrder?: null | number; Queue?: null | Array<{ Order?: null | number; OfferID?: null | string; DurationSec?: null | number; DelayBeforeActivationSec?: null | number; [key: string]: unknown; }>; Schedule?: null | ScheduleSpec; Gate?: null | SegmentGate; AllowDismissSkip?: null | boolean; DismissSkipDelaySec?: null | number; [key: string]: unknown; };
1156
- type DealNodeActionDefinition = { Purchase?: null | { StoreOfferID?: null | string; BillingProductID?: null | string; DirectCost?: null | ResourceConsume; UseExternalRewards?: null | boolean; [key: string]: unknown; }; RewardedVideo?: null | { AdPlacementID?: null | string; ViewsRequiredToComplete?: null | number; MaxViewsPerActivation?: null | number; CooldownSecondsBetweenViews?: null | number; RequireServerVerification?: null | boolean; GrantRewardsPerView?: null | boolean; [key: string]: unknown; }; [key: string]: unknown; };
1382
+ type DealNodeActionDefinition = { Purchase?: null | { StoreOfferID?: null | string; BillingProductID?: null | string; PriceOptions?: null | PriceOptions; UseExternalRewards?: null | boolean; [key: string]: unknown; }; RewardedVideo?: null | { AdPlacementID?: null | string; ViewsRequiredToComplete?: null | number; MaxViewsPerActivation?: null | number; CooldownSecondsBetweenViews?: null | number; RequireServerVerification?: null | boolean; GrantRewardsPerView?: null | boolean; [key: string]: unknown; }; [key: string]: unknown; };
1157
1383
  /**
1158
1384
  * Container of preset wiring for an offer — one PresetBinding per block. Inline data (Milestones)
1159
1385
  * lives on DealOfferDefinition. null = presets unused.
@@ -1251,6 +1477,13 @@ type ClaimDealMilestoneResponse = { ServerTimeUtc?: null | string; SlotID?: null
1251
1477
  type ClaimDealMilestonesBatchResponse = { ServerTimeUtc?: null | string; SlotID?: null | string; ClaimedIDs?: null | Array<string>; Rejected?: null | Record<string, string>; Resources?: null | ResourceOperation; };
1252
1478
  interface DealOfferRequest extends BaseRequest {
1253
1479
  SlotID?: string;
1480
+ /**
1481
+ * Chosen way to pay (`PriceOption.OptionID`). Empty = the first option available on this
1482
+ * player's platform, which keeps single-price entities working unchanged.
1483
+ */
1484
+ SelectedOptionID?: string;
1485
+ /** Store receipt. Required exactly when the chosen option is paid in a store. */
1486
+ Payment?: PaymentProof;
1254
1487
  NodeID?: string;
1255
1488
  MilestoneID?: string;
1256
1489
  MilestoneIDs?: string[];
@@ -1296,15 +1529,23 @@ interface ReferralDefinitionsResponse {
1296
1529
  type UserReferralStateResponse = { Referral?: null | UserReferralState; };
1297
1530
  type ActivateReferralCodeResponse = { ReferralCode?: null | string; IsFirstActivation?: null | boolean; Resources?: null | ResourceOperation; };
1298
1531
  type ClaimInviteRewardResponse = { RewardID?: null | string; Resources?: null | ResourceOperation; };
1532
+ type ClaimInviteRewardsBatchResponse = { ServerTimeUtc: string; Items: Array<{ Id: string; Success: boolean; Error?: null | string; Data?: null | ClaimInviteRewardResponse; }>; Resources?: null | ResourceOperation; };
1299
1533
  interface ReferralRequest extends BaseRequest {
1300
1534
  ReferralCode?: string;
1301
1535
  InviteRewardID?: string;
1536
+ /**
1537
+ * ClaimInviteRewardsBatch: invite-milestone IDs to claim. Deduped keeping order, clamped to
1538
+ * the platform batch size. Invalid entries (unknown / not reached / already claimed) fail as
1539
+ * their own item without dropping the batch.
1540
+ */
1541
+ InviteRewardIDs?: string[];
1302
1542
  }
1303
1543
  declare const ReferralAction: {
1304
1544
  readonly GetDefinitions: "GetDefinitions";
1305
1545
  readonly GetUserState: "GetUserState";
1306
1546
  readonly ActivateReferralCode: "ActivateReferralCode";
1307
1547
  readonly ClaimInviteReward: "ClaimInviteReward";
1548
+ readonly ClaimInviteRewardsBatch: "ClaimInviteRewardsBatch";
1308
1549
  };
1309
1550
  type ReferralAction = (typeof ReferralAction)[keyof typeof ReferralAction];
1310
1551
 
@@ -1330,7 +1571,8 @@ interface UserSocialState {
1330
1571
  Timeline?: SocialTimelineEvent[];
1331
1572
  }
1332
1573
  type FriendsListResponse = { Friends?: null | Array<FriendPublicProfile>; };
1333
- type FriendActionResponse = { TargetUserID?: null | string; Status?: null | string; };
1574
+ type SocialCounters = { FriendsCount?: null | number; IncomingRequestsCount?: null | number; OutgoingRequestsCount?: null | number; };
1575
+ type FriendActionResponse = { TargetUserID?: null | string; Status?: null | string; Target?: null | FriendPublicProfile; Counters?: null | SocialCounters; };
1334
1576
  type TimelineResponse = { Events?: null | Array<SocialTimelineEvent>; };
1335
1577
  interface SocialRequest extends BaseRequest {
1336
1578
  TargetUserID?: string;
@@ -1355,7 +1597,7 @@ declare const TimedBoostStackingPolicy: {
1355
1597
  readonly Stack: "Stack";
1356
1598
  };
1357
1599
  type TimedBoostStackingPolicy = (typeof TimedBoostStackingPolicy)[keyof typeof TimedBoostStackingPolicy];
1358
- type TimedBoostDefinition = { BoostID?: null | string; DisplayName?: null | string; Description?: null | string; AssetPaths?: null | Record<string, string>; ActivationCost?: null | ResourceConsume; Effect?: null | { Target?: null | string; Operation?: null | string; Value?: null | number; [key: string]: unknown; }; DurationSeconds?: null | number; Charges?: null | number; StackingPolicy?: null | string; MaxActiveInstances?: null | number; Tags?: null | Array<string>; [key: string]: unknown; };
1600
+ type TimedBoostDefinition = { BoostID?: null | string; DisplayName?: null | string; Description?: null | string; AssetPaths?: null | Record<string, string>; PriceOptions?: null | PriceOptions; Effect?: null | { Target?: null | string; Operation?: null | string; Value?: null | number; [key: string]: unknown; }; DurationSeconds?: null | number; Charges?: null | number; StackingPolicy?: null | string; MaxActiveInstances?: null | number; Tags?: null | Array<string>; [key: string]: unknown; };
1359
1601
  type ScheduledBoostDefinition = { ScheduledBoostID?: null | string; DisplayName?: null | string; Description?: null | string; AssetPaths?: null | Record<string, string>; Tags?: null | Array<string>; Schedule?: null | ScheduleSpec; Effects?: null | Array<{ Target?: null | string; Operation?: null | string; Value?: null | number; [key: string]: unknown; }>; Gate?: null | SegmentGate; CustomParams?: null | Record<string, string>; [key: string]: unknown; };
1360
1602
  type BoostChainDefinition = { ChainID?: null | string; DisplayName?: null | string; Description?: null | string; AssetPaths?: null | Record<string, string>; Schedule?: null | ScheduleSpec; Phases?: null | Array<{ ChainedBoostID?: null | string; Order?: null | number; DurationSec?: null | number; Effects?: null | Array<{ Target?: null | string; Operation?: null | string; Value?: null | number; [key: string]: unknown; }>; CustomParams?: null | Record<string, string>; [key: string]: unknown; }>; Gate?: null | SegmentGate; CustomParams?: null | Record<string, string>; [key: string]: unknown; };
1361
1603
  type TriggeredBoostDefinition = { TriggeredBoostID?: null | string; DisplayName?: null | string; AssetPaths?: null | Record<string, string>; Tags?: null | Array<string>; Sources?: null | Array<TriggerSource>; Effects?: null | Array<{ Target?: null | string; Operation?: null | string; Value?: null | number; [key: string]: unknown; }>; DurationSeconds?: null | number; Charges?: null | number; StackingPolicy?: null | string; MaxActiveInstances?: null | number; Gate?: null | SegmentGate; [key: string]: unknown; };
@@ -1386,6 +1628,13 @@ type ActiveBoostWindowInfo = { Kind?: null | string; SourceID?: null | string; P
1386
1628
  type GetActiveBoostWindowsResponse = { ServerTimeUtc?: null | string; Windows?: null | Array<ActiveBoostWindowInfo>; };
1387
1629
  interface TimedBoostRequest extends BaseRequest {
1388
1630
  BoostID?: string;
1631
+ /**
1632
+ * Chosen way to pay (`PriceOption.OptionID`). Empty = the first option available on this
1633
+ * player's platform, which keeps single-price entities working unchanged.
1634
+ */
1635
+ SelectedOptionID?: string;
1636
+ /** Store receipt. Required exactly when the chosen option is paid in a store. */
1637
+ Payment?: PaymentProof;
1389
1638
  }
1390
1639
  declare const TimedBoostAction: {
1391
1640
  readonly GetDefinitions: "GetDefinitions";
@@ -1652,7 +1901,7 @@ interface GameLoopDefinitions {
1652
1901
  [key: string]: unknown;
1653
1902
  }
1654
1903
  type RollActionData = { TargetUserID?: null | string; IsBot?: null | boolean; PublicData?: null | UserPublicDataModel; TargetBuildingStates?: null | Array<BuildingState>; TargetHasShield?: null | boolean; [key: string]: unknown; };
1655
- type SpecialModeOfferData = { ModeID?: null | string; Choices?: null | Array<{ ChoiceID?: null | string; Mode?: null | string; Reward?: null | ScaledResourceOperation; DurationSeconds?: null | number; EntryCost?: null | ResourceConsume; Multipliers?: null | SpecialClaimMultipliers; [key: string]: unknown; }>; [key: string]: unknown; };
1904
+ type SpecialModeOfferData = { ModeID?: null | string; Choices?: null | Array<{ ChoiceID?: null | string; Mode?: null | string; Reward?: null | ScaledResourceOperation; DurationSeconds?: null | number; PriceOptions?: null | PriceOptions; Multipliers?: null | SpecialClaimMultipliers; [key: string]: unknown; }>; [key: string]: unknown; };
1656
1905
  type CommunityChestContributionResult = { GroupID?: null | string; Delta?: null | number; NewProgress?: null | number; MaxProgress?: null | number; UnlockedMilestoneIDs?: null | Array<string>; Completed?: null | boolean; [key: string]: unknown; };
1657
1906
  interface BoardRollResponse {
1658
1907
  UsedMultiplier?: number | null;
@@ -1700,6 +1949,11 @@ type CommunityChestClaimResponse = { ServerTimeUtc?: null | string; GroupID?: nu
1700
1949
  type CommunityChestLeaveResponse = { ServerTimeUtc?: null | string; GroupID?: null | string; Success?: null | boolean; };
1701
1950
  interface GameLoopRequest extends BaseRequest {
1702
1951
  RollMultiplier?: number;
1952
+ /**
1953
+ * Chosen way to pay (`PriceOption.OptionID`). Empty = the first option available on this
1954
+ * player's platform, which keeps single-price entities working unchanged.
1955
+ */
1956
+ SelectedOptionID?: string;
1703
1957
  BuildingIndex?: number;
1704
1958
  DigIndex?: number;
1705
1959
  StageLevel?: number;
@@ -1762,14 +2016,14 @@ type MarketplaceCommissionOverride = { Percent?: null | number; MinPerPosition?:
1762
2016
  type MarketplacePricePolicy = { AllowVirtualCurrency?: null | boolean; AllowItems?: null | boolean; AllowEventTokens?: null | boolean; Allowed?: null | Array<{ Kind?: null | 'Item' | 'VirtualCurrency' | 'EventToken'; CurrencyID?: null | string; CatalogID?: null | string; ItemID?: null | string; TokenType?: null | 'TimedEvent' | 'Quest' | 'Leaderboard' | 'CoopEvent' | 'Season'; EntityID?: null | string; MinAmount?: null | number; MaxAmount?: null | number; [key: string]: unknown; }>; MaxPositions?: null | number; [key: string]: unknown; };
1763
2017
  type MarketplaceCommissionPolicy = { Percent?: null | number; MinPerPosition?: null | number; Sink?: null | 'Burn' | 'Ledger'; LedgerAccountID?: null | string; PerCatalogOverrides?: null | Record<string, MarketplaceCommissionOverride>; ApplyToDirectTrades?: null | boolean; [key: string]: unknown; };
1764
2018
  type MarketplaceTradabilityPolicy = { AllowedCatalogIDs?: null | Array<string>; DeniedCatalogIDs?: null | Array<string>; DeniedItemIDs?: null | Array<string>; AllowUnstackableWithState?: null | boolean; [key: string]: unknown; };
1765
- type MarketplaceListingSettings = { Enabled?: null | boolean; AllowedDurationsHours?: null | Array<number>; MaxActiveListings?: null | number; CreateLimits?: null | LimitSpec; BuyLimits?: null | LimitSpec; ListingFee?: null | ResourceConsume; RefundListingFeeOnCancel?: null | boolean; [key: string]: unknown; };
2019
+ type MarketplaceListingSettings = { Enabled?: null | boolean; AllowedDurationsHours?: null | Array<number>; MaxActiveListings?: null | number; CreateLimits?: null | LimitSpec; BuyLimits?: null | LimitSpec; ListingFeeOptions?: null | PriceOptions; RefundListingFeeOnCancel?: null | boolean; [key: string]: unknown; };
1766
2020
  type MarketplaceAuctionSettings = { Enabled?: null | boolean; MinDurationHours?: null | number; MaxDurationHours?: null | number; AntiSnipeWindowSeconds?: null | number; AntiSnipeExtensionSeconds?: null | number; MaxAntiSnipeExtensions?: null | number; MinBidStepPercent?: null | number; MinBidStepAbsolute?: null | number; BidLimits?: null | LimitSpec; [key: string]: unknown; };
1767
2021
  type MarketplaceBuyOrderSettings = { Enabled?: null | boolean; MaxActiveOrders?: null | number; AllowedDurationsHours?: null | Array<number>; CreateLimits?: null | LimitSpec; FillLimits?: null | LimitSpec; [key: string]: unknown; };
1768
2022
  type MarketplaceDirectTradeSettings = { Enabled?: null | boolean; OfferExpirationHours?: null | number; MaxPendingOutgoing?: null | number; AllowGifts?: null | boolean; CreateLimits?: null | LimitSpec; [key: string]: unknown; };
1769
2023
  type MarketplaceMatchingSettings = { Enabled?: null | boolean; [key: string]: unknown; };
1770
2024
  type MarketplaceDefinitions = { Enabled?: null | boolean; Gate?: null | SegmentGate; Schedule?: null | ScheduleSpec; PricePolicy?: null | MarketplacePricePolicy; Commission?: null | MarketplaceCommissionPolicy; Tradability?: null | MarketplaceTradabilityPolicy; Listings?: null | MarketplaceListingSettings; Auctions?: null | MarketplaceAuctionSettings; BuyOrders?: null | MarketplaceBuyOrderSettings; DirectTrades?: null | MarketplaceDirectTradeSettings; Matching?: null | MarketplaceMatchingSettings; [key: string]: unknown; };
1771
2025
  type MarketplaceBidRefund = { BidIndex?: null | number; UserID?: null | string; Amount?: null | number; Settled?: null | boolean; SettledAt?: null | string; [key: string]: unknown; };
1772
- type MarketplaceAuctionState = { BidAxisType?: null | 'Item' | 'VirtualCurrency' | 'CryptoCurrency' | 'UsdCent'; BidCurrencyID?: null | string; BidCatalogID?: null | string; BidItemID?: null | string; StartingBid?: null | number; CurrentBid?: null | number; CurrentBidderID?: null | string; BidCount?: null | number; ExtensionCount?: null | number; PendingRefunds?: null | Array<MarketplaceBidRefund>; [key: string]: unknown; };
2026
+ type MarketplaceAuctionState = { BidAxisType?: null | 'Item' | 'VirtualCurrency' | 'CryptoCurrency' | 'RewardedVideoCredit' | 'Purchase'; BidCurrencyID?: null | string; BidCatalogID?: null | string; BidItemID?: null | string; StartingBid?: null | number; CurrentBid?: null | number; CurrentBidderID?: null | string; BidCount?: null | number; ExtensionCount?: null | number; PendingRefunds?: null | Array<MarketplaceBidRefund>; [key: string]: unknown; };
1773
2027
  type MarketplaceActionCounter = { LastAt?: null | string; DailyCount?: null | number; DailyResetUtc?: null | string; [key: string]: unknown; };
1774
2028
  type UserMarketplaceState = { Create?: null | MarketplaceActionCounter; Buy?: null | MarketplaceActionCounter; Sell?: null | MarketplaceActionCounter; Bid?: null | MarketplaceActionCounter; [key: string]: unknown; };
1775
2029
  type MarketplaceOfferView = { OfferID?: null | string; OfferType?: null | 'Listing' | 'Auction' | 'BuyOrder' | 'DirectTrade'; Status?: null | 'Active' | 'Completed' | 'Expired' | 'Cancelled' | 'Declined'; CreatorUserID?: null | string; CreatorPublicData?: null | UserPublicDataModel; TargetUserID?: null | string; GoodsType?: null | 'Item' | 'VirtualCurrency'; GoodsCatalogID?: null | string; GoodsItemID?: null | string; GoodsCurrencyID?: null | string; GoodsAmount?: null | number; GoodsInstances?: null | Array<UnstackableItemInstanceState>; Price?: null | ResourceBundle; Auction?: null | MarketplaceAuctionState; CreatedAt?: null | string; ExpiresAt?: null | string; [key: string]: unknown; };
@@ -1790,6 +2044,11 @@ type MarketplaceHistoryEntryView = { OfferID?: null | string; OfferType?: null |
1790
2044
  type MarketplaceHistoryResponse = { Entries?: null | Array<MarketplaceHistoryEntryView>; ContinuationToken?: null | string; [key: string]: unknown; };
1791
2045
  interface MarketplaceRequest extends BaseRequest {
1792
2046
  OfferID?: string;
2047
+ /**
2048
+ * Chosen way to pay (`PriceOption.OptionID`). Empty = the first option available on this
2049
+ * player's platform, which keeps single-price entities working unchanged.
2050
+ */
2051
+ SelectedOptionID?: string;
1793
2052
  /**
1794
2053
  * Item (default) or VirtualCurrency. For Create actions / MarketBuy / MarketSell: what's
1795
2054
  * traded. For browsing (GetOffersByItem/GetBuyOrders): a storefront filter.
@@ -1844,6 +2103,111 @@ declare const MarketplaceAction: {
1844
2103
  };
1845
2104
  type MarketplaceAction = (typeof MarketplaceAction)[keyof typeof MarketplaceAction];
1846
2105
 
2106
+ declare const LocalizationMissingKeyMode: {
2107
+ /** Render the key itself. Default — this is what keeps literal-name titles working. */
2108
+ readonly ReturnKey: "ReturnKey";
2109
+ /** Render the key wrapped in markers (⟦quest.daily.title⟧) — proofreading mode. */
2110
+ readonly ReturnMarkedKey: "ReturnMarkedKey";
2111
+ /** Render an empty string. */
2112
+ readonly ReturnEmpty: "ReturnEmpty";
2113
+ };
2114
+ type LocalizationMissingKeyMode = (typeof LocalizationMissingKeyMode)[keyof typeof LocalizationMissingKeyMode];
2115
+ /** One language offered to the player. */
2116
+ interface LocalizationLocaleDefinition {
2117
+ /** Readability mirror of the dictionary key; the KEY is the identifier. */
2118
+ Locale?: string | null;
2119
+ /**
2120
+ * Language name written IN THAT LANGUAGE ("Русский", "Deutsch") — an endonym, not a
2121
+ * translation: the picker is read by someone who may not know the current language.
2122
+ */
2123
+ DisplayName?: string | null;
2124
+ IsEnabled?: boolean | null;
2125
+ Order?: number | null;
2126
+ [k: string]: unknown;
2127
+ }
2128
+ /**
2129
+ * `TitlePublicConfigurationModel.Localization` — settings only. No translations here.
2130
+ */
2131
+ interface LocalizationDefinitions {
2132
+ IsEnabled?: boolean | null;
2133
+ /** Default locale, which is also the FALLBACK. Canonical form (lower-case, "-"). */
2134
+ DefaultLocale?: string | null;
2135
+ /** Keyed by canonical locale code ("en", "pt-br"). */
2136
+ Locales?: Record<string, LocalizationLocaleDefinition> | null;
2137
+ MissingKeyMode?: LocalizationMissingKeyMode | null;
2138
+ MaxEntriesPerLocale?: number | null;
2139
+ MaxValueLengthBytes?: number | null;
2140
+ [k: string]: unknown;
2141
+ }
2142
+ /** One table: which locale, which version, and where the artifact is. */
2143
+ interface LocalizationTableRef {
2144
+ Locale?: string | null;
2145
+ Version?: number | null;
2146
+ /** `null` — nothing to download, or the artifact could not be published. */
2147
+ Url?: string | null;
2148
+ [k: string]: unknown;
2149
+ }
2150
+ /**
2151
+ * `ClientState.Localization` — what to download and from where.
2152
+ *
2153
+ * `Fallback` is present only when the player's own locale is NOT fully translated. A fully
2154
+ * translated language carries ONE file, and edits to the default language then cost that player
2155
+ * nothing — this is the whole reason coverage is computed server-side.
2156
+ */
2157
+ interface LocalizationState {
2158
+ /** The locale the request was resolved to. Cache the table UNDER THIS, not under what you sent. */
2159
+ Locale?: string | null;
2160
+ /** `0` — no table exists for this locale (declared but untranslated). */
2161
+ Version?: number | null;
2162
+ Url?: string | null;
2163
+ Fallback?: LocalizationTableRef | null;
2164
+ [k: string]: unknown;
2165
+ }
2166
+ interface LocalizationRequest extends BaseRequest {
2167
+ /** Any form: "ru", "pt-BR", "pt_br". The server canonicalizes and resolves it. */
2168
+ Locale?: string;
2169
+ /** Version already held by the client. `0`/absent — nothing cached. */
2170
+ KnownVersion?: number;
2171
+ }
2172
+ declare const LocalizationAction: {
2173
+ readonly GetLocalizationManifest: "GetLocalizationManifest";
2174
+ readonly GetLocalizationTable: "GetLocalizationTable";
2175
+ };
2176
+ type LocalizationAction = (typeof LocalizationAction)[keyof typeof LocalizationAction];
2177
+ interface LocalizationLocaleInfo {
2178
+ Locale?: string | null;
2179
+ DisplayName?: string | null;
2180
+ Order?: number | null;
2181
+ /** `0` — the language is declared but has no table yet. */
2182
+ Version?: number | null;
2183
+ [k: string]: unknown;
2184
+ }
2185
+ /** Discovery: what exists, without downloading any table. */
2186
+ interface LocalizationManifestResponse {
2187
+ IsEnabled?: boolean | null;
2188
+ DefaultLocale?: string | null;
2189
+ MissingKeyMode?: LocalizationMissingKeyMode | null;
2190
+ ResolvedLocale?: string | null;
2191
+ Locales?: LocalizationLocaleInfo[] | null;
2192
+ [k: string]: unknown;
2193
+ }
2194
+ /**
2195
+ * A translation table delivered in the response BODY — the fallback for when the CDN artifact
2196
+ * is unavailable. `Entries` is exactly what the artifact file contains: a flat `{key: value}`
2197
+ * object.
2198
+ */
2199
+ interface LocalizationTableResponse {
2200
+ RequestedLocale?: string | null;
2201
+ Locale?: string | null;
2202
+ Version?: number | null;
2203
+ /** `true` — the client's version matched; `Entries` is absent. */
2204
+ NotModified?: boolean | null;
2205
+ Entries?: Record<string, string> | null;
2206
+ FallbackLocale?: string | null;
2207
+ FallbackVersion?: number | null;
2208
+ [k: string]: unknown;
2209
+ }
2210
+
1847
2211
  interface UserDailyCounters {
1848
2212
  PeriodStartUtc: string;
1849
2213
  Earned: number;
@@ -1955,6 +2319,7 @@ interface UserState {
1955
2319
  Lootbox?: UserLootboxState | null;
1956
2320
  Reward?: UserRewardState | null;
1957
2321
  Quest?: UserQuestState | null;
2322
+ Tutorial?: UserTutorialState | null;
1958
2323
  Leaderboard?: UserLeaderboardsState | null;
1959
2324
  Season?: UserSeasonsState | null;
1960
2325
  Premium?: UserPremiumState | null;
@@ -2014,6 +2379,15 @@ interface ClientState {
2014
2379
  * недействительна, состояние приходит целиком.
2015
2380
  */
2016
2381
  StateEpoch?: string | null;
2382
+ /**
2383
+ * Локализация: какую таблицу переводов качать и откуда. Устроено как конфиг тайтла — уезжает
2384
+ * ССЫЛКОЙ на immutable-артефакт, — но таблиц может понадобиться ДВЕ: своя и запасная, если
2385
+ * своя переведена не полностью.
2386
+ *
2387
+ * `null` — локализация у тайтла выключена. `UserService` разбирается с этим сам: качает,
2388
+ * кладёт в локальное хранилище и отдаёт `client.localization`.
2389
+ */
2390
+ Localization?: LocalizationState | null;
2017
2391
  [k: string]: unknown;
2018
2392
  }
2019
2393
  /**
@@ -2064,6 +2438,21 @@ interface UserRequest extends BaseRequest {
2064
2438
  * запроса, когда скачать артефакт не удалось; вручную задавать не нужно.
2065
2439
  */
2066
2440
  ForceInlineConfig?: boolean;
2441
+ /**
2442
+ * Локаль игрока в любой форме («ru», «pt-BR», «pt_br»). Сервер сводит её к объявленной
2443
+ * тайтлом и отвечает про результат в `ClientState.Localization.Locale`.
2444
+ *
2445
+ * Ставится SDK автоматически из `settings.locale` (по умолчанию — язык устройства);
2446
+ * задавать вручную нужно только при явной смене языка игроком.
2447
+ */
2448
+ Locale?: string;
2449
+ /**
2450
+ * Версии таблиц переводов, которые уже есть у клиента: «локаль → версия». Ставится SDK.
2451
+ *
2452
+ * Карта, а не одно число, потому что таблиц у клиента бывает две — своя и запасная, — и
2453
+ * устареть они могут независимо: правка английского не трогает версию русского.
2454
+ */
2455
+ KnownLocalizationVersions?: Record<string, number>;
2067
2456
  }
2068
2457
  declare const UserAction: {
2069
2458
  readonly GetClientState: "GetClientState";
@@ -2357,6 +2746,11 @@ interface ItemUpgradeRef {
2357
2746
  }
2358
2747
  interface ItemRequest extends BaseRequest {
2359
2748
  ItemInstanceID?: string;
2749
+ /**
2750
+ * Chosen way to pay (`PriceOption.OptionID`). Empty = the first option available on this
2751
+ * player's platform, which keeps single-price entities working unchanged.
2752
+ */
2753
+ SelectedOptionID?: string;
2360
2754
  Levels?: number;
2361
2755
  TargetLevel?: number;
2362
2756
  FodderInstanceIDs?: string[];
@@ -2385,7 +2779,7 @@ type NFTModel = { Networks?: null | Record<string, NFTNetworkBinding>; MetadataU
2385
2779
  type ItemStats = { FlatBonuses?: null | Record<string, number>; PercentBonuses?: null | Record<string, number>; Power?: null | number; [key: string]: unknown; };
2386
2780
  type ItemEquipment = { MinCharacterLevel?: null | number; UseRequirements?: null | Record<string, number>; AllowedCharacterIDs?: null | Array<string>; AllowedSlotIDs?: null | Array<string>; [key: string]: unknown; };
2387
2781
  type ItemUpgradeFodder = { ValuationMode?: null | 'FlatCount' | 'Merge' | 'InvestmentRefund'; MergeRatio?: null | number; Selection?: null | 'ProtectLeveled' | 'CheapestFirst' | 'ClientSelected'; [key: string]: unknown; };
2388
- type ItemUpgrade = { MaxLevel?: null | number; BaseCostResource?: null | ResourceConsume; CostScalingFactor?: null | number; FlatScalingFactor?: null | number; PercentScalingFactor?: null | number; PowerScalingFactor?: null | number; Fodder?: null | ItemUpgradeFodder; [key: string]: unknown; };
2782
+ type ItemUpgrade = { MaxLevel?: null | number; PriceOptions?: null | PriceOptions; CostScalingFactor?: null | number; FlatScalingFactor?: null | number; PercentScalingFactor?: null | number; PowerScalingFactor?: null | number; Fodder?: null | ItemUpgradeFodder; [key: string]: unknown; };
2389
2783
  type ItemMetadata = { RarityID?: null | string; CollectionID?: null | string; AuthorID?: null | string; [key: string]: unknown; };
2390
2784
  type ItemDefinition = { ItemID: string; CatalogID: string; ItemClass?: null | string; DisplayName?: null | string; Description?: null | string; Tags?: null | Array<string>; CustomData?: null | string; IsStackable?: null | boolean; IsTradable?: null | boolean; Weight?: null | number; AssetPaths?: null | Record<string, string>; NFT?: null | NFTModel; Stats?: null | ItemStats; Equipment?: null | ItemEquipment; Upgrade?: null | ItemUpgrade; Metadata?: null | ItemMetadata; ExpirationDurationSeconds?: null | number; [key: string]: unknown; };
2391
2785
  /** Catalog: a set of items of one thematic group. Key of `Items` is ItemID. */
@@ -2547,7 +2941,7 @@ declare const CraftType: {
2547
2941
  type CraftType = (typeof CraftType)[keyof typeof CraftType];
2548
2942
  type CraftSingleResult = { Index?: null | number; BurnedItemIDs?: null | Array<string>; RolledCollectionID?: null | string; UsedCollections?: null | Record<string, number>; Output?: null | ResourceEntry; };
2549
2943
  type CraftResponse = { ServerTimeUtc: string; CraftID: string; Type?: null | 'TradeUpRarity' | 'TradeUpCollection'; CraftedCount?: null | number; SelectedOptionID?: null | string; InputRarity?: null | string; OutputRarity?: null | string; Resources?: null | ResourceOperation; Results?: null | Array<CraftSingleResult>; };
2550
- type CraftDefinition = { CraftID?: null | string; Type?: null | 'TradeUpRarity' | 'TradeUpCollection'; CatalogID?: null | string; CollectionID?: null | string; InputRarityID?: null | string; OutputRarityID?: null | string; RequiredItemCount?: null | number; PriceOptions?: null | Record<string, { OptionID?: null | string; RequiredResources?: null | ResourceConsume; [key: string]: unknown; }>; [key: string]: unknown; };
2944
+ type CraftDefinition = { CraftID?: null | string; Type?: null | 'TradeUpRarity' | 'TradeUpCollection'; CatalogID?: null | string; CollectionID?: null | string; InputRarityID?: null | string; OutputRarityID?: null | string; RequiredItemCount?: null | number; PriceOptions?: null | PriceOptions; [key: string]: unknown; };
2551
2945
  /** The title's craft catalog (config), returned by getDefinitions(). */
2552
2946
  interface CraftDefinitions {
2553
2947
  Definitions?: Record<string, CraftDefinition> | null;
@@ -2634,6 +3028,12 @@ interface TitlePublicConfigurationModel {
2634
3028
  Multiplayer?: MultiplayerDefinitions | null;
2635
3029
  UserCustomData?: UserCustomDataDefinitions | null;
2636
3030
  Referral?: ReferralDefinitions | null;
3031
+ /**
3032
+ * Localization SETTINGS only — which locales exist, which is the fallback, the limits. The
3033
+ * translation TABLES are delivered separately, one file per locale; use `client.localization`
3034
+ * rather than reading anything out of here.
3035
+ */
3036
+ Localization?: LocalizationDefinitions | null;
2637
3037
  [key: string]: unknown;
2638
3038
  }
2639
3039
  interface TitleRequest extends BaseRequest {
@@ -2666,6 +3066,7 @@ interface SdkEvents {
2666
3066
  "user:lootboxUpdated": void;
2667
3067
  "user:rewardUpdated": void;
2668
3068
  "user:questUpdated": void;
3069
+ "user:tutorialUpdated": void;
2669
3070
  "user:timedEventUpdated": void;
2670
3071
  "user:leaderboardUpdated": void;
2671
3072
  "user:seasonUpdated": void;
@@ -2722,6 +3123,32 @@ interface SdkEvents {
2722
3123
  * quest UI. Nothing to call to trigger it.
2723
3124
  */
2724
3125
  "quest:systemProgress": QuestProgressUpdate[];
3126
+ "tutorial:definitionsLoaded": TutorialDefinitions;
3127
+ "tutorial:userStateLoaded": GetUserTutorialStateResponse;
3128
+ "tutorial:flowStarted": TutorialFlowResponse;
3129
+ "tutorial:flowSkipped": TutorialFlowResponse;
3130
+ "tutorial:flowReset": TutorialFlowResponse;
3131
+ "tutorial:stepChanged": TutorialFlowResponse;
3132
+ "tutorial:stepsCompletedBatch": TutorialFlowBatchResponse;
3133
+ "tutorial:rewardClaimed": TutorialClaimResponse;
3134
+ /**
3135
+ * Steps the BACKEND advanced while handling some other call (Mode = SystemEvent). Arrives on
3136
+ * the response of the action that caused it — subscribe instead of polling the state.
3137
+ */
3138
+ "tutorial:systemProgress": TutorialStepProgress[];
3139
+ /**
3140
+ * Таблица переводов сменилась: игрок вошёл, переключил язык или издатель поправил тексты.
3141
+ * Подписка — штатный способ перерисовать уже нарисованные подписи: `t()` синхронна, поэтому
3142
+ * без сигнала интерфейс останется со старыми строками до следующей перерисовки.
3143
+ *
3144
+ * `fallbackLocale` не `null` — своя локаль переведена не полностью, часть надписей приедет
3145
+ * на языке по умолчанию.
3146
+ */
3147
+ "localization:changed": {
3148
+ locale: string | null;
3149
+ fallbackLocale: string | null;
3150
+ entryCount: number;
3151
+ };
2725
3152
  /**
2726
3153
  * New revisions of the state containers the backend changed while handling some other call
2727
3154
  * (a purchase, a claim, a roll). Rides on that call's response so the client can keep its
@@ -2761,6 +3188,8 @@ interface SdkEvents {
2761
3188
  "season:userStateLoaded": UserSeasonStateResponse;
2762
3189
  "season:statusTokensGranted": GrantStatusTokensResponse;
2763
3190
  "season:tierRewardClaimed": ClaimTierRewardResponse;
3191
+ /** Batch claim of several tier rewards applied in one atomic operation. */
3192
+ "season:tierRewardsBatchClaimed": ClaimTierRewardsBatchResponse;
2764
3193
  "premium:definitionsLoaded": PremiumDefinitionsResponse;
2765
3194
  "premium:stateLoaded": PremiumStateResponse;
2766
3195
  "premium:trialActivated": PremiumPurchaseResponse;
@@ -2826,6 +3255,8 @@ interface SdkEvents {
2826
3255
  "referral:userStateLoaded": UserReferralStateResponse;
2827
3256
  "referral:codeActivated": ActivateReferralCodeResponse;
2828
3257
  "referral:inviteRewardClaimed": ClaimInviteRewardResponse;
3258
+ /** Batch claim of several invite milestones applied in one atomic operation. */
3259
+ "referral:inviteRewardsBatchClaimed": ClaimInviteRewardsBatchResponse;
2829
3260
  "social:friendsListLoaded": FriendsListResponse;
2830
3261
  "social:incomingRequestsLoaded": FriendsListResponse;
2831
3262
  "social:recommendedFriendsLoaded": FriendsListResponse;
@@ -2945,6 +3376,15 @@ interface IDosGamesSettings {
2945
3376
  * перезапуск (React Native, встраивание в нативную оболочку).
2946
3377
  */
2947
3378
  readonly configStorage: ConfigStorage;
3379
+ /**
3380
+ * Локаль игрока, с которой стартует игра. По умолчанию — язык устройства; не определился —
3381
+ * пусто, и тогда сервер отдаст язык тайтла по умолчанию.
3382
+ *
3383
+ * Это ПОЖЕЛАНИЕ, а не факт: сервер сводит код к тому, на что тайтл реально переведён
3384
+ * («pt-BR» → «pt-br» → «en»), и отвечает результатом. Смотреть надо
3385
+ * `client.localization.locale`, а не это поле.
3386
+ */
3387
+ readonly locale: string;
2948
3388
  }
2949
3389
  interface SettingsInput {
2950
3390
  titleID: string;
@@ -2954,6 +3394,7 @@ interface SettingsInput {
2954
3394
  devBuild?: boolean;
2955
3395
  debugLogging?: boolean;
2956
3396
  configStorage?: ConfigStorage;
3397
+ locale?: string;
2957
3398
  }
2958
3399
 
2959
3400
  /**
@@ -2998,6 +3439,21 @@ declare class UserData {
2998
3439
  /** Stores the authoritative points-track snapshot in the Quest event-token bucket. */
2999
3440
  patchQuestPointsTracks(tracks: Record<string, QuestPointsTrackView> | null | undefined): void;
3000
3441
  patchGroupCompletionClaimed(cycleID: string, groupCompletionID: string): void;
3442
+ applyTutorial(data: UserTutorialState | null): void;
3443
+ /**
3444
+ * Fold a flow view returned by a mutating call into the cached state, so the game can read
3445
+ * `state.Tutorial` right after the call without waiting for a refresh.
3446
+ *
3447
+ * Only the fields the view actually carries are written. `CurrentStep` is deliberately NOT
3448
+ * stored: it is a copy of the CONFIG, and duplicating it into player state would give two
3449
+ * sources of truth for the same step the moment the config changes.
3450
+ */
3451
+ patchTutorialFlow(view: TutorialFlowView | null | undefined): void;
3452
+ /**
3453
+ * Apply step progress the backend advanced by itself (Mode = SystemEvent), delivered on the
3454
+ * response of whatever action caused it.
3455
+ */
3456
+ patchTutorialProgress(updates: readonly TutorialStepProgress[] | null | undefined): void;
3001
3457
  patchQuestProgressUpdates(updates: readonly QuestProgressUpdate[] | null | undefined): void;
3002
3458
  getQuestPointsProgress(cycleID: string): UserEventTokenProgress | null;
3003
3459
  applyActiveEvents(data: GetActiveEventsResponse | null): void;
@@ -3243,6 +3699,8 @@ declare class UserService {
3243
3699
  private baseRequest;
3244
3700
  private get configCache();
3245
3701
  private cache?;
3702
+ private get localizationCache();
3703
+ private locCache?;
3246
3704
  private get stateStore();
3247
3705
  private versionStore?;
3248
3706
  /**
@@ -3298,6 +3756,26 @@ declare class UserService {
3298
3756
  * refresh doesn't wipe the active board.
3299
3757
  */
3300
3758
  getClientStateExcept(excludeFields?: string[], excludeTitleFields?: string[]): Promise<OperationResult<ClientState>>;
3759
+ /**
3760
+ * Прикладывает к запросу локаль и версии уже сохранённых таблиц. Сервер по ним не станет
3761
+ * присылать ссылки на то, что у клиента и так свежее.
3762
+ *
3763
+ * Локаль берётся из уже применённой (игрок мог переключить язык руками), иначе из настроек
3764
+ * (по умолчанию — язык устройства). Пусто — сервер отдаст язык тайтла по умолчанию.
3765
+ */
3766
+ private prepareLocalization;
3767
+ /**
3768
+ * Достраивает таблицы переводов и отдаёт их `client.localization`.
3769
+ *
3770
+ * Порядок источников ТОТ ЖЕ, что у конфига тайтла, и по той же причине: хранилище (версия
3771
+ * совпала) → CDN → эндпоинт телом → устаревшая локальная копия. Отличие одно, и оно
3772
+ * принципиальное: **провал здесь игру НЕ роняет.** Конфига нет — играть не во что; переводов
3773
+ * нет — интерфейс покажет ключи. Поэтому `applyState` зовётся при любом исходе.
3774
+ */
3775
+ private applyLocalization;
3776
+ private resolveLocalizationTable;
3777
+ private fetchLocalizationFromCdn;
3778
+ private fetchLocalizationFromApi;
3301
3779
  /**
3302
3780
  * Только версии контейнеров — без единого байта данных.
3303
3781
  *
@@ -3350,7 +3828,7 @@ declare class ItemService {
3350
3828
  * Upgrade an item instance's level, optionally consuming fodder instances. On success the
3351
3829
  * server-authoritative inventory is re-fetched (mirrors the C# GetUserInventory call).
3352
3830
  */
3353
- upgradeLevel(itemInstanceID: string, fodderInstanceIDs?: readonly string[]): Promise<OperationResult<UpgradeItemLevelResponse>>;
3831
+ upgradeLevel(itemInstanceID: string, fodderInstanceIDs?: readonly string[], selectedOptionID?: string): Promise<OperationResult<UpgradeItemLevelResponse>>;
3354
3832
  /**
3355
3833
  * Upgrade several item instances (+1 level each, or a multi-level/target-level upgrade per
3356
3834
  * ref) in one atomic operation. On success the server-authoritative inventory is re-fetched.
@@ -3362,7 +3840,17 @@ declare class ItemService {
3362
3840
  declare class StoreService {
3363
3841
  private readonly ctx;
3364
3842
  constructor(ctx: ClientContext);
3365
- purchase(offerID: string, count?: number): Promise<OperationResult<StorePurchaseResponse>>;
3843
+ /**
3844
+ * Buys an offer.
3845
+ *
3846
+ * `selectedOptionID` picks the way to pay; omitting it takes the first option available on this
3847
+ * platform, which is what keeps single-price offers working without any client change.
3848
+ * `payment` is required exactly when the chosen option is paid in a store — see CheckoutService.
3849
+ */
3850
+ purchase(offerID: string, count?: number, options?: {
3851
+ selectedOptionID?: string;
3852
+ payment?: PaymentProof;
3853
+ }): Promise<OperationResult<StorePurchaseResponse>>;
3366
3854
  /** Buy several offers in one atomic operation. Each ref is `{ OfferID, Count }`. */
3367
3855
  purchaseBatch(purchases: StorePurchaseRef[]): Promise<OperationResult<PurchaseBatchResponse>>;
3368
3856
  getDefinitions(): Promise<OperationResult<StoreDefinitions>>;
@@ -3370,12 +3858,165 @@ declare class StoreService {
3370
3858
  private baseRequest;
3371
3859
  }
3372
3860
 
3861
+ /** What happens after a receipt is verified. */
3862
+ declare const IapProductType: {
3863
+ readonly Consumable: "Consumable";
3864
+ readonly NonConsumable: "NonConsumable";
3865
+ readonly Subscription: "Subscription";
3866
+ };
3867
+ type IapProductType = (typeof IapProductType)[keyof typeof IapProductType];
3868
+ type IapProductRules = { StartUtc?: null | string; EndUtc?: null | string; Gate?: null | SegmentGate; Limits?: null | LimitSpec; [key: string]: unknown; };
3869
+ type IapProductDefinition = { ProductID?: null | string; Name?: null | string; Type?: null | 'Subscription' | 'Consumable' | 'NonConsumable'; Enabled?: null | boolean; StoreProductIDs?: null | Record<string, string>; Rewards?: null | ResourceGrant; PriceUsdCents?: null | number; Rules?: null | IapProductRules; AssetPaths?: null | Record<string, string>; CustomParams?: null | Record<string, string>; [key: string]: unknown; };
3870
+ type PurchaseDefinitions = { Enabled?: null | boolean; Products?: null | Record<string, IapProductDefinition>; [key: string]: unknown; };
3871
+ type IapProductPurchaseState = { ProductID?: null | string; TotalPurchases?: null | number; DailyPurchases?: null | number; DailyResetUtc?: null | string; LastPurchasedAt?: null | string; Owned?: null | boolean; [key: string]: unknown; };
3872
+ type UserPurchaseState = { Products?: null | Record<string, IapProductPurchaseState>; LifetimeSpendUsdCents?: null | number; [key: string]: unknown; };
3873
+ /** How the server treated the receipt. */
3874
+ declare const IapPurchaseStatus: {
3875
+ readonly Granted: "Granted";
3876
+ readonly Restored: "Restored";
3877
+ readonly AlreadyProcessed: "AlreadyProcessed";
3878
+ };
3879
+ type IapPurchaseStatus = (typeof IapPurchaseStatus)[keyof typeof IapPurchaseStatus];
3880
+ type PurchaseValidationResponse = { ServerTimeUtc: string; Store?: null | 'GooglePlay' | 'AppleAppStore'; ProductID?: null | string; TransactionID?: null | string; Status?: null | 'Granted' | 'Restored' | 'AlreadyProcessed'; Granted?: null | boolean; Quantity?: null | number; Resources?: null | ResourceOperation; ProductState?: null | IapProductPurchaseState; [key: string]: unknown; };
3881
+ type PurchaseValidationBatchResponse = { ServerTimeUtc: string; Items: Array<{ Id: string; Success: boolean; Error?: null | string; Data?: null | PurchaseValidationResponse; }>; Resources?: null | ResourceOperation; };
3882
+ interface PurchaseReceiptRef {
3883
+ Store?: IapStore;
3884
+ Receipt?: string;
3885
+ Signature?: string;
3886
+ /** Only used when the receipt itself is opaque (legacy Apple app receipt). */
3887
+ ProductID?: string;
3888
+ }
3889
+ interface PurchaseRequest extends BaseRequest {
3890
+ Store?: IapStore;
3891
+ Receipt?: string;
3892
+ Signature?: string;
3893
+ ProductID?: string;
3894
+ /** ValidatePurchasesBatch: receipts to restore after a reinstall. */
3895
+ Receipts?: PurchaseReceiptRef[];
3896
+ }
3897
+ type IapStore = 'GooglePlay' | 'AppleAppStore';
3898
+ declare const PurchaseAction: {
3899
+ readonly GetDefinitions: "GetDefinitions";
3900
+ readonly GetUserState: "GetUserState";
3901
+ readonly ValidatePurchase: "ValidatePurchase";
3902
+ readonly ValidatePurchasesBatch: "ValidatePurchasesBatch";
3903
+ };
3904
+ type PurchaseAction = (typeof PurchaseAction)[keyof typeof PurchaseAction];
3905
+
3906
+ /**
3907
+ * Real-money purchases (IAP) — the catalog of store products and receipt validation.
3908
+ *
3909
+ * The money is paid in the store BEFORE the server hears about it, so a refusal here is an
3910
+ * incident, not "not enough funds": every refusal is recorded in the title's transaction ledger.
3911
+ * That is also why the client must hand every receipt it receives to `validatePurchase`, including
3912
+ * the ones the store re-delivers on startup — an order confirmed to the store but never delivered
3913
+ * to us is a purchase the player paid for and will never get.
3914
+ *
3915
+ * This service covers products that ARE the goods. When a store product is used as the *price* of
3916
+ * something else (an offer, a lootbox, a deal), the purchase goes through that module instead —
3917
+ * see `CheckoutService`.
3918
+ */
3919
+ declare class PurchaseService {
3920
+ private readonly ctx;
3921
+ constructor(ctx: ClientContext);
3922
+ /** Product catalog with per-player availability. */
3923
+ getDefinitions(): Promise<OperationResult<PurchaseDefinitions>>;
3924
+ /** Player's IAP state: per-product counters, ownership, lifetime spend. */
3925
+ getUserState(): Promise<OperationResult<UserPurchaseState>>;
3926
+ /**
3927
+ * Verifies a receipt and grants the product.
3928
+ *
3929
+ * `productID` is only a hint for stores whose receipt is opaque (legacy Apple app receipt): in
3930
+ * every other case the SKU is read from the receipt itself, because the client's claim about
3931
+ * what was bought cannot be trusted.
3932
+ */
3933
+ validatePurchase(store: IapStore, receipt: string, options?: {
3934
+ signature?: string;
3935
+ productID?: string;
3936
+ }): Promise<OperationResult<PurchaseValidationResponse>>;
3937
+ /**
3938
+ * Restores purchases after a reinstall: several receipts in one call.
3939
+ *
3940
+ * Non-consumables come back as `Restored` (ownership confirmed, nothing granted twice), while a
3941
+ * consumable that never reached us is granted now.
3942
+ */
3943
+ validatePurchasesBatch(receipts: PurchaseReceiptRef[]): Promise<OperationResult<PurchaseValidationBatchResponse>>;
3944
+ }
3945
+
3946
+ /** What a price option needs before it can be paid. */
3947
+ interface PaymentRequirement {
3948
+ /** The option itself — pass its `OptionID` to the module that sells the entity. */
3949
+ option: PriceOption;
3950
+ /** `store` = a receipt is required; `resources` = the server charges the player's balances. */
3951
+ kind: "store" | "resources";
3952
+ /** IAP product to buy in the store. Set only when `kind` is `"store"`. */
3953
+ productID?: string;
3954
+ /** Crypto shortfall, if this option is paid with an on-chain currency the player is short on. */
3955
+ shortfall?: CryptoShortfall;
3956
+ }
3957
+ /** How much of a crypto currency is missing to pay for an option. */
3958
+ interface CryptoShortfall {
3959
+ currencyID: string;
3960
+ /** Price of the option in that currency. */
3961
+ required: number;
3962
+ /** What the player currently holds in-game. */
3963
+ available: number;
3964
+ /** `required - available` — what a deposit has to cover. */
3965
+ missing: number;
3966
+ }
3967
+ /**
3968
+ * Helper layer over prices: which options this client may show, what each of them needs, and how
3969
+ * much crypto is missing to pay one.
3970
+ *
3971
+ * It deliberately does NOT buy anything. Buying belongs to the module that owns the entity
3972
+ * (`client.store.purchase`, `client.lootbox.open`, …), because only that module knows the rest of
3973
+ * the request — count, target ids, idempotency key. This service answers the question that comes
3974
+ * *before* the call: which option, and what does it need.
3975
+ *
3976
+ * Depositing crypto lives in `@idosgames/wallet`: `core` never imports a wallet stack, so a game
3977
+ * that pays only with in-game currencies does not ship one.
3978
+ */
3979
+ declare class CheckoutService {
3980
+ private readonly ctx;
3981
+ constructor(ctx: ClientContext);
3982
+ /** Platform this client reports to the server. */
3983
+ get platform(): ClientPlatform;
3984
+ /**
3985
+ * Options this client may show, in the order the server would pick them (by `OptionID`).
3986
+ *
3987
+ * ⚠ Filtering here is what the player SEES. The server re-checks the platform when charging, so
3988
+ * a hidden option cannot be paid anyway — but showing one that a store forbids is itself a
3989
+ * policy violation, which is why the filter exists on the client at all.
3990
+ */
3991
+ availableOptions(options: PriceOptions | null | undefined): PriceOption[];
3992
+ /** Is this option offered on the current platform? Empty `AllowedPlatforms` = everywhere. */
3993
+ isAvailable(option: PriceOption | null | undefined): boolean;
3994
+ /**
3995
+ * What the option needs before it can be paid: a store receipt, or just the player's balances.
3996
+ *
3997
+ * For a crypto price it also reports the shortfall — the number a deposit has to cover. The
3998
+ * balance comes from the cached player state, so it is as fresh as the last server response.
3999
+ */
4000
+ requirementOf(option: PriceOption): PaymentRequirement;
4001
+ /** IAP product this option is paid with, or `null` when it is a resource price. */
4002
+ storeProductOf(cost: ResourceConsume | null | undefined): string | null;
4003
+ /**
4004
+ * Crypto shortfall of a price, or `null` when the player can already afford it.
4005
+ *
4006
+ * Only the first crypto entry is reported: a price mixing two on-chain currencies would need two
4007
+ * deposits, and no wallet flow does that in one go — such a price is a config mistake, not a
4008
+ * case to paper over here.
4009
+ */
4010
+ cryptoShortfallOf(cost: ResourceConsume | null | undefined): CryptoShortfall | null;
4011
+ private cryptoBalance;
4012
+ }
4013
+
3373
4014
  /** Port of LootboxService.cs. */
3374
4015
  declare class LootboxService {
3375
4016
  private readonly ctx;
3376
4017
  constructor(ctx: ClientContext);
3377
4018
  getDefinitions(): Promise<OperationResult<LootboxDefinitionsResponse>>;
3378
- open(lootboxID: string, count: number, selectedOptionID: number): Promise<OperationResult<LootboxOpenResponse>>;
4019
+ open(lootboxID: string, count: number, selectedOptionID?: string, payment?: PaymentProof): Promise<OperationResult<LootboxOpenResponse>>;
3379
4020
  private baseRequest;
3380
4021
  }
3381
4022
 
@@ -3397,6 +4038,194 @@ declare class RewardService {
3397
4038
  private baseRequest;
3398
4039
  }
3399
4040
 
4041
+ /**
4042
+ * Onboarding: flows of ordered steps that the server hands out, gates and closes.
4043
+ *
4044
+ * Two things the game must know before using this:
4045
+ *
4046
+ * 1. **Not every step is yours to close.** `completeStep` works only for steps whose
4047
+ * `Completion.Mode` is `ClientAck` (or `Auto`, which closes on being shown). A `SystemEvent`
4048
+ * step is closed by the backend off a real game event — a board roll, a purchase, a chest
4049
+ * open — and calling `completeStep` on it is refused. Read `CurrentStep.Completion.Mode` from
4050
+ * the flow view and only offer a "Next" button when it is `ClientAck`.
4051
+ * 2. **Progress can arrive on OTHER calls.** When a system-event step advances, the backend
4052
+ * attaches it to the response of the action that caused it, and the SDK applies it to the
4053
+ * cached state and emits `tutorial:systemProgress`. Subscribe to that instead of polling.
4054
+ */
4055
+ declare class TutorialService {
4056
+ private readonly ctx;
4057
+ constructor(ctx: ClientContext);
4058
+ /** Flow and step definitions of the title (presets already resolved server-side). */
4059
+ getTutorialDefinitions(): Promise<OperationResult<TutorialDefinitions>>;
4060
+ /**
4061
+ * Player state plus everything needed to draw the current step without a second call.
4062
+ *
4063
+ * @param autoStart Let the server start flows marked for auto-start. Pass `false` from a
4064
+ * settings screen that merely lists tutorials — otherwise opening it would begin one.
4065
+ */
4066
+ getUserTutorialState(autoStart?: boolean): Promise<OperationResult<GetUserTutorialStateResponse>>;
4067
+ /** Start a flow explicitly. Returns the flow with its first step. */
4068
+ startFlow(flowID: string): Promise<OperationResult<TutorialFlowResponse>>;
4069
+ /**
4070
+ * Report that the step was shown to the player. Worth calling for every step: it is what the
4071
+ * funnel measures time-on-step from, and a step with `Mode = Auto` closes on it.
4072
+ */
4073
+ reportStepShown(flowID: string, stepID: string): Promise<OperationResult<TutorialFlowResponse>>;
4074
+ /**
4075
+ * Close the current step by the player's acknowledgement.
4076
+ * Refused for `SystemEvent`/`Composite` steps — those are closed by the game event itself.
4077
+ */
4078
+ completeStep(flowID: string, stepID: string): Promise<OperationResult<TutorialFlowResponse>>;
4079
+ /**
4080
+ * Close several steps of one flow, in order — for a client catching up after being offline.
4081
+ * Steps are closed one by one: closing the third without the second stays impossible.
4082
+ */
4083
+ completeStepsBatch(flowID: string, stepIDs: string[]): Promise<OperationResult<TutorialFlowBatchResponse>>;
4084
+ /** Skip one step (only if the step declares itself skippable). */
4085
+ skipStep(flowID: string, stepID: string): Promise<OperationResult<TutorialFlowResponse>>;
4086
+ /**
4087
+ * Skip the whole flow. Allowed only when the flow is skippable AND the current step is at or
4088
+ * past `Policy.SkippableFromOrder` — the flow view's `CanSkip` tells you whether to show the
4089
+ * button at all.
4090
+ */
4091
+ skipFlow(flowID: string): Promise<OperationResult<TutorialFlowResponse>>;
4092
+ /**
4093
+ * Take the completion reward. Show this when the flow view reports `RewardPending`.
4094
+ * A flow with `Reward.AutoClaim` pays out on its last step and never reports it pending.
4095
+ */
4096
+ claimFlowReward(flowID: string): Promise<OperationResult<TutorialClaimResponse>>;
4097
+ /**
4098
+ * Replay a flow. Only for flows whose `RestartPolicy` allows it; the reward is NOT granted
4099
+ * again — the server keeps the claimed flag through the reset.
4100
+ */
4101
+ resetFlow(flowID: string): Promise<OperationResult<TutorialFlowResponse>>;
4102
+ private flowCall;
4103
+ private stepCall;
4104
+ /**
4105
+ * Fold the returned flow view into the cached player state. The view is authoritative for the
4106
+ * fields it carries, so the game can read `client.data.user.state.Tutorial` right after the
4107
+ * call without waiting for a state refresh.
4108
+ */
4109
+ private applyFlowView;
4110
+ /**
4111
+ * Batch and claim responses do not carry a flow view, so the cached state is re-read once.
4112
+ * Silent: a failed refresh must not turn a successful claim into an error for the player.
4113
+ */
4114
+ private refreshAfterMutation;
4115
+ private baseRequest;
4116
+ }
4117
+
4118
+ /** Значения для подстановки в перевод: `{count}`, `{name}` и т.п. */
4119
+ type LocalizationParams = Record<string, string | number>;
4120
+ /**
4121
+ * Локализация: перевод по ключу и загрузка таблиц.
4122
+ *
4123
+ * **Контракт резолва — `t(x) = своя таблица → запасная таблица → сам x`.** Последнее звено не
4124
+ * запасной вариант на случай ошибки, а часть замысла: у существующих тайтлов в конфиге лежат
4125
+ * готовые названия («Iron Sword» в `DisplayName`), и такой литерал — это просто ключ, для
4126
+ * которого перевода не нашлось. Поэтому оборачивать в `t()` можно ВСЁ, включая строки из
4127
+ * конфига, и ни один тайтл от этого не ломается.
4128
+ *
4129
+ * **Таблиц бывает две.** Свою локаль клиент качает всегда, запасную — только если своя
4130
+ * переведена не полностью; решает это сервер и сообщает в `ClientState.Localization.Fallback`.
4131
+ * У полностью переведённого языка файл один, и правки языка по умолчанию такому игроку ничего
4132
+ * не стоят.
4133
+ *
4134
+ * Загрузкой занимается `UserService` на входе в игру — здесь только применение и чтение.
4135
+ * Отдельно грузить ничего не надо; `setLocale` нужен, только когда язык меняет сам игрок.
4136
+ */
4137
+ declare class LocalizationService {
4138
+ private readonly ctx;
4139
+ constructor(ctx: ClientContext);
4140
+ private table;
4141
+ private fallbackTable;
4142
+ private currentLocale;
4143
+ private currentFallbackLocale;
4144
+ private pluralRules;
4145
+ private get cache();
4146
+ private tableCache?;
4147
+ /**
4148
+ * Локаль, на которой игра идёт СЕЙЧАС, — та, к которой сервер свёл запрошенную. `null`,
4149
+ * пока состояние не загружено или если локализация у тайтла выключена.
4150
+ *
4151
+ * Смотреть надо сюда, а не в `settings.locale`: там пожелание, здесь факт.
4152
+ */
4153
+ get locale(): string | null;
4154
+ /** Запасная локаль, если своя переведена не полностью. `null` — вторая таблица не нужна. */
4155
+ get fallbackLocale(): string | null;
4156
+ /**
4157
+ * Языки, объявленные тайтлом, — для меню выбора. Берутся из конфига (там же лежат эндонимы),
4158
+ * поэтому обращение к сети не нужно.
4159
+ */
4160
+ get locales(): LocalizationLocaleInfo[];
4161
+ /** Есть ли перевод для ключа (в своей таблице или в запасной). */
4162
+ has(key: string): boolean;
4163
+ /**
4164
+ * Перевод по ключу.
4165
+ *
4166
+ * Порядок: своя таблица → запасная → сам ключ (или то, что задано
4167
+ * `MissingKeyMode` в конфиге тайтла).
4168
+ *
4169
+ * Множественное число: передайте `{ count }` — сервер хранит формы суффиксами
4170
+ * (`items.count.one`, `.few`, `.many`, `.other`), а категорию выбирает `Intl.PluralRules`
4171
+ * ПО ТЕКУЩЕЙ ЛОКАЛИ. Своей таблицы правил здесь нет намеренно: у русского их три, у
4172
+ * польского четыре, у арабского шесть, и переписывать CLDR руками — верный способ разойтись
4173
+ * с ним на редкой локали.
4174
+ *
4175
+ * Подстановка: `{name}` в переводе заменяется на `params.name`. Отсутствующий параметр
4176
+ * оставляется как есть — видимый `{name}` на экране находится сразу, а молча пропавший
4177
+ * кусок текста не находится никогда.
4178
+ */
4179
+ t(key: string, params?: LocalizationParams): string;
4180
+ /**
4181
+ * Применяет блок, приехавший в `GetClientState`. Зовётся `UserService`; вызывать вручную не
4182
+ * нужно.
4183
+ *
4184
+ * Таблицы уже разрешены вызывающим (хранилище → CDN → эндпоинт), потому что порядок
4185
+ * источников общий с конфигом тайтла и живёт там же.
4186
+ */
4187
+ applyState(state: LocalizationState | null | undefined, tables: {
4188
+ table: Record<string, string> | null;
4189
+ fallbackTable: Record<string, string> | null;
4190
+ }): void;
4191
+ /**
4192
+ * Смена языка игроком.
4193
+ *
4194
+ * Идёт ЧЕРЕЗ ЭНДПОИНТ, а не через CDN, и это осознанно: ссылку на артефакт выдаёт только
4195
+ * `GetClientState`, а тянуть ради смены языка полное состояние игрока дороже, чем один раз
4196
+ * взять таблицу телом. Дальше она лежит в локальном хранилище и повторных загрузок не
4197
+ * стоит.
4198
+ *
4199
+ * Запасная таблица догружается тем же способом, если сервер сообщил, что она нужна.
4200
+ */
4201
+ setLocale(locale: string): Promise<OperationResult<string>>;
4202
+ /** Какие языки доступны и какие у их таблиц версии. Таблицы не качает. */
4203
+ getManifest(): Promise<OperationResult<LocalizationManifestResponse>>;
4204
+ private reset;
4205
+ private setLocaleInternal;
4206
+ private baseRequest;
4207
+ /**
4208
+ * Таблица телом + запись в локальное хранилище. Кэш проверяется ПЕРЕД запросом и
4209
+ * приезжает в `KnownVersion`: совпала версия — сервер записи не шлёт, и таблица берётся с
4210
+ * диска.
4211
+ */
4212
+ private loadTableFromApi;
4213
+ /** Значение из своей таблицы, иначе из запасной. */
4214
+ private lookup;
4215
+ /**
4216
+ * Ключ с учётом множественного числа. Без `count` — сам ключ; с ним — сначала форма для
4217
+ * категории CLDR, потом `other`.
4218
+ */
4219
+ private resolveKey;
4220
+ /**
4221
+ * Категория множественного числа по текущей локали. `Intl.PluralRules` может бросить на
4222
+ * некорректном языковом теге — тогда откатываемся к `other`: показать не ту форму хуже, чем
4223
+ * не показать ничего, но уронить кадр из-за перевода нельзя.
4224
+ */
4225
+ private pluralCategory;
4226
+ private onMissing;
4227
+ }
4228
+
3400
4229
  /** Port of QuestService.cs. */
3401
4230
  declare class QuestService {
3402
4231
  private readonly ctx;
@@ -3478,6 +4307,14 @@ declare class SeasonService {
3478
4307
  getUserState(seasonChainID: string): Promise<OperationResult<UserSeasonStateResponse>>;
3479
4308
  grantStatusTokens(seasonChainID: string, amount: number): Promise<OperationResult<GrantStatusTokensResponse>>;
3480
4309
  claimTierReward(seasonChainID: string, tierNumber: number): Promise<OperationResult<ClaimTierRewardResponse>>;
4310
+ /**
4311
+ * Claims the rewards of several tiers in ONE atomic backend operation.
4312
+ *
4313
+ * Exists because tiers are reached in BATCHES — a single token grant can raise the player
4314
+ * through several at once, leaving more than one reward unclaimed. The merged `Resources` is
4315
+ * applied ONCE from the top level; per-item `Data.Resources` is null by contract.
4316
+ */
4317
+ claimTierRewardsBatch(seasonChainID: string, tierNumbers: number[]): Promise<OperationResult<ClaimTierRewardsBatchResponse>>;
3481
4318
  private baseRequest;
3482
4319
  }
3483
4320
 
@@ -3510,7 +4347,16 @@ declare class CharacterService {
3510
4347
  constructor(ctx: ClientContext);
3511
4348
  getCharacterDefinitions(): Promise<OperationResult<CharacterDefinitions>>;
3512
4349
  getUserCharacters(): Promise<OperationResult<GetCharactersResponse>>;
3513
- unlockCharacter(characterID: string): Promise<OperationResult<UnlockCharacterResponse>>;
4350
+ /**
4351
+ * Unlocks a character.
4352
+ *
4353
+ * `options.selectedOptionID` picks the way to pay; omitting it takes the first option available
4354
+ * on this platform. `options.payment` is required exactly when that option is paid in a store.
4355
+ */
4356
+ unlockCharacter(characterID: string, options?: {
4357
+ selectedOptionID?: string;
4358
+ payment?: PaymentProof;
4359
+ }): Promise<OperationResult<UnlockCharacterResponse>>;
3514
4360
  upgradeStatLevel(characterID: string, statID: string, opts?: UpgradeLevelsOptions): Promise<OperationResult<UpgradeStatLevelResponse>>;
3515
4361
  upgradeCharacterLevel(characterID: string, opts?: UpgradeLevelsOptions): Promise<OperationResult<UpgradeCharacterLevelResponse>>;
3516
4362
  equipItems(characterID: string, itemsToEquip: EquipSlotPair[]): Promise<OperationResult<EquipItemsResponse>>;
@@ -3552,7 +4398,7 @@ declare class CharacterService {
3552
4398
  declare class MatchService {
3553
4399
  private readonly ctx;
3554
4400
  constructor(ctx: ClientContext);
3555
- createMatch(entry: ResourceBundle, ruleID: string, characterID?: string, battleStrategy?: BattleStepConfig[], targetUserID?: string): Promise<OperationResult<CreateMatchResponse>>;
4401
+ createMatch(entry: ResourceBundle, ruleID: string, characterID?: string, battleStrategy?: BattleStepConfig[], targetUserID?: string, selectedOptionID?: string): Promise<OperationResult<CreateMatchResponse>>;
3556
4402
  /** Edit an open match's own fields (e.g. privacy) before anyone joins. */
3557
4403
  updateMatch(matchID: string, fields?: {
3558
4404
  targetUserID?: string;
@@ -3587,8 +4433,19 @@ declare class CollectionService {
3587
4433
  constructor(ctx: ClientContext);
3588
4434
  getDefinitions(): Promise<OperationResult<CollectionDefinitions>>;
3589
4435
  getUserState(): Promise<OperationResult<UserCollectionState>>;
3590
- openPack(collectionID: string, packTypeID: string): Promise<OperationResult<OpenPackResponse>>;
3591
- openCollectionChest(collectionID: string, collectionChestID: string): Promise<OperationResult<OpenCollectionChestResponse>>;
4436
+ /**
4437
+ * Opens `count` packs in ONE atomic operation. The cost scales with the count and each pack
4438
+ * is rolled against the state left by the previous one, so a collectible dropping twice in a
4439
+ * row is correctly counted as a duplicate. `count` is clamped server-side to the configured
4440
+ * ceiling (pack type → module setting → platform default); the response reports what actually
4441
+ * happened in `OpenedCount` and breaks it down per pack in `Packs`.
4442
+ */
4443
+ openPack(collectionID: string, packTypeID: string, count?: number, options?: {
4444
+ selectedOptionID?: string;
4445
+ payment?: PaymentProof;
4446
+ }): Promise<OperationResult<OpenPackResponse>>;
4447
+ /** Opens `count` chests in ONE atomic operation. See openPack() for the multi-open contract. */
4448
+ openCollectionChest(collectionID: string, collectionChestID: string, count?: number): Promise<OperationResult<OpenCollectionChestResponse>>;
3592
4449
  useCollectibleJoker(collectionID: string, collectibleID: string): Promise<OperationResult<UseCollectibleJokerResponse>>;
3593
4450
  claimSetReward(collectionID: string, setID: string): Promise<OperationResult<ClaimSetRewardResponse>>;
3594
4451
  /** Claim rewards for several completed sets in one atomic operation (deduped by SetID). */
@@ -3612,7 +4469,14 @@ declare class CoopEventService {
3612
4469
  getUserState(): Promise<OperationResult<CoopUserStateResponse>>;
3613
4470
  getGroupState(groupID: string): Promise<OperationResult<CoopGroupStateResponse>>;
3614
4471
  joinOrCreateGroup(coopChainID: string): Promise<OperationResult<CoopGroupStateResponse>>;
3615
- spin(coopChainID: string, groupID: string): Promise<OperationResult<CoopSpinResponse>>;
4472
+ /**
4473
+ * Spins the wheel `count` times in ONE atomic operation.
4474
+ *
4475
+ * Only spins that actually happen are charged: the run stops at the spin that completes the
4476
+ * object, and the remainder is neither rolled nor billed — check `SpinsUsed` against
4477
+ * `RequestedSpins`. `count` is clamped server-side to `MaxSpinsPerCall`.
4478
+ */
4479
+ spin(coopChainID: string, groupID: string, count?: number, selectedOptionID?: string): Promise<OperationResult<CoopSpinResponse>>;
3616
4480
  claimObjectReward(groupID: string): Promise<OperationResult<CoopClaimRewardResponse>>;
3617
4481
  claimGrandPrize(groupID: string): Promise<OperationResult<CoopClaimRewardResponse>>;
3618
4482
  leaveGroup(groupID?: string): Promise<OperationResult<CoopLeaveGroupResponse>>;
@@ -3627,7 +4491,17 @@ declare class DealOfferService {
3627
4491
  getUserState(): Promise<OperationResult<UserDealOffersStateResponse>>;
3628
4492
  getActiveDeals(): Promise<OperationResult<GetActiveDealsResponse>>;
3629
4493
  dismissDeal(slotID: string): Promise<OperationResult<DismissDealResponse>>;
3630
- executeNode(slotID: string, nodeID: string, externalRefID?: string): Promise<OperationResult<ExecuteNodeResponse>>;
4494
+ /**
4495
+ * Executes a node of an active deal.
4496
+ *
4497
+ * `options.selectedOptionID` picks the way to pay the node; `options.payment` carries the store
4498
+ * receipt and is required exactly when that option is paid in a store — the main monetization
4499
+ * path of deal offers.
4500
+ */
4501
+ executeNode(slotID: string, nodeID: string, externalRefID?: string, options?: {
4502
+ selectedOptionID?: string;
4503
+ payment?: PaymentProof;
4504
+ }): Promise<OperationResult<ExecuteNodeResponse>>;
3631
4505
  recordShow(slotID: string): Promise<OperationResult<RecordShowResponse>>;
3632
4506
  claimMilestone(slotID: string, milestoneID: string): Promise<OperationResult<ClaimDealMilestoneResponse>>;
3633
4507
  claimMilestonesBatch(slotID: string, milestoneIDs: string[]): Promise<OperationResult<ClaimDealMilestonesBatchResponse>>;
@@ -3642,6 +4516,15 @@ declare class ReferralService {
3642
4516
  getUserState(): Promise<OperationResult<UserReferralStateResponse>>;
3643
4517
  activateReferralCode(referralCode: string): Promise<OperationResult<ActivateReferralCodeResponse>>;
3644
4518
  claimInviteReward(inviteRewardID: string): Promise<OperationResult<ClaimInviteRewardResponse>>;
4519
+ /**
4520
+ * Claims several invite milestones in ONE atomic backend operation.
4521
+ *
4522
+ * The merged `Resources` of the batch is applied ONCE from the top level — per-item
4523
+ * `Data.Resources` is null by contract, so applying both would double count the grant.
4524
+ * Invalid items (unknown / not reached / already claimed) come back as failed elements
4525
+ * without dropping the rest of the batch.
4526
+ */
4527
+ claimInviteRewardsBatch(inviteRewardIDs: string[]): Promise<OperationResult<ClaimInviteRewardsBatchResponse>>;
3645
4528
  private baseRequest;
3646
4529
  }
3647
4530
 
@@ -3667,7 +4550,10 @@ declare class TimedBoostService {
3667
4550
  getDefinitions(): Promise<OperationResult<TimedBoostDefinitions>>;
3668
4551
  getActive(): Promise<OperationResult<GetActiveTimedBoostsResponse>>;
3669
4552
  getActiveWindows(): Promise<OperationResult<GetActiveBoostWindowsResponse>>;
3670
- activate(boostID: string): Promise<OperationResult<ActivateTimedBoostResponse>>;
4553
+ activate(boostID: string, options?: {
4554
+ selectedOptionID?: string;
4555
+ payment?: PaymentProof;
4556
+ }): Promise<OperationResult<ActivateTimedBoostResponse>>;
3671
4557
  cleanupExpired(): Promise<OperationResult<SuccessResponse>>;
3672
4558
  private baseRequest;
3673
4559
  }
@@ -3758,7 +4644,7 @@ declare class GameLoopService {
3758
4644
  boardLoopRaid(digIndex: number, existingRelatedEntityID?: string): Promise<OperationResult<RaidResponse>>;
3759
4645
  boardLoopRaidFast(digIndices: number[]): Promise<OperationResult<RaidResponse>>;
3760
4646
  boardLoopBuild(buildingIndex: number): Promise<OperationResult<BuildResponse>>;
3761
- boardSpecialChoose(choiceID: string): Promise<OperationResult<SpecialChooseResponse>>;
4647
+ boardSpecialChoose(choiceID: string, selectedOptionID?: string): Promise<OperationResult<SpecialChooseResponse>>;
3762
4648
  boardSpecialApplyMultiplier(existingRelatedEntityID?: string): Promise<OperationResult<SpecialApplyMultiplierResponse>>;
3763
4649
  boardSpecialClaim(): Promise<OperationResult<SpecialClaimResponse>>;
3764
4650
  /** Fetch this player's Community Chest state (active group, if any) + seconds remaining. */
@@ -3818,7 +4704,7 @@ declare class MarketplaceService {
3818
4704
  getBuyOrders(itemID?: string, continuationToken?: string, pageSize?: number): Promise<OperationResult<MarketplaceBrowseResponse>>;
3819
4705
  getMyState(): Promise<OperationResult<MarketplaceMyStateResponse>>;
3820
4706
  getHistory(continuationToken?: string, pageSize?: number): Promise<OperationResult<MarketplaceHistoryResponse>>;
3821
- createListing(itemID: string, catalogID: string, goodsAmount: number, priceBundle: ResourceBundle, durationHours: number, itemInstanceIDs?: string[]): Promise<OperationResult<MarketplaceCreateOfferResponse>>;
4707
+ createListing(itemID: string, catalogID: string, goodsAmount: number, priceBundle: ResourceBundle, durationHours: number, itemInstanceIDs?: string[], selectedOptionID?: string): Promise<OperationResult<MarketplaceCreateOfferResponse>>;
3822
4708
  cancelListing(offerID: string): Promise<OperationResult<MarketplaceSettlementResponse>>;
3823
4709
  buy(offerID: string): Promise<OperationResult<MarketplaceSettlementResponse>>;
3824
4710
  /** Immediate-or-cancel market buy against the best matching active Listing (no resting order left behind on miss). */
@@ -3840,6 +4726,8 @@ declare class MarketplaceService {
3840
4726
  bidCatalogID?: string;
3841
4727
  bidItemID?: string;
3842
4728
  itemInstanceIDs?: string[];
4729
+ /** Way to pay the listing fee (`PriceOption.OptionID`). */
4730
+ selectedOptionID?: string;
3843
4731
  }): Promise<OperationResult<MarketplaceCreateOfferResponse>>;
3844
4732
  placeBid(offerID: string, bidAmount: number): Promise<OperationResult<MarketplacePlaceBidResponse>>;
3845
4733
  /** Role-dependent lazy finalization: winner claims goods, seller claims proceeds (net). */
@@ -3971,6 +4859,17 @@ declare class StoreApi {
3971
4859
  getUserState(request: StoreRequest): Promise<OperationResult<UserStoreState>>;
3972
4860
  }
3973
4861
 
4862
+ /** Thin transport wrapper for the Purchase feature (port of PurchaseAPI.cs). */
4863
+ declare class PurchaseApi {
4864
+ private readonly ctx;
4865
+ constructor(ctx: ClientContext);
4866
+ private send;
4867
+ getDefinitions(request: PurchaseRequest): Promise<OperationResult<PurchaseDefinitions>>;
4868
+ getUserState(request: PurchaseRequest): Promise<OperationResult<UserPurchaseState>>;
4869
+ validatePurchase(request: PurchaseRequest): Promise<OperationResult<PurchaseValidationResponse>>;
4870
+ validatePurchasesBatch(request: PurchaseRequest): Promise<OperationResult<PurchaseValidationBatchResponse>>;
4871
+ }
4872
+
3974
4873
  /** Thin transport wrapper for the Lootbox feature (port of LootboxAPI.cs). */
3975
4874
  declare class LootboxApi {
3976
4875
  private readonly ctx;
@@ -3994,6 +4893,40 @@ declare class RewardApi {
3994
4893
  claimReward(request: RewardRequest): Promise<OperationResult<ClaimRewardResponse>>;
3995
4894
  }
3996
4895
 
4896
+ /** Thin transport wrapper for the Tutorial feature (port of TutorialV2). */
4897
+ declare class TutorialApi {
4898
+ private readonly ctx;
4899
+ constructor(ctx: ClientContext);
4900
+ private send;
4901
+ getTutorialDefinitions(request: TutorialRequest): Promise<OperationResult<TutorialDefinitions>>;
4902
+ getUserTutorialState(request: TutorialRequest): Promise<OperationResult<GetUserTutorialStateResponse>>;
4903
+ startFlow(request: TutorialRequest): Promise<OperationResult<TutorialFlowResponse>>;
4904
+ reportStepShown(request: TutorialRequest): Promise<OperationResult<TutorialFlowResponse>>;
4905
+ completeStep(request: TutorialRequest): Promise<OperationResult<TutorialFlowResponse>>;
4906
+ completeStepsBatch(request: TutorialRequest): Promise<OperationResult<TutorialFlowBatchResponse>>;
4907
+ skipStep(request: TutorialRequest): Promise<OperationResult<TutorialFlowResponse>>;
4908
+ skipFlow(request: TutorialRequest): Promise<OperationResult<TutorialFlowResponse>>;
4909
+ claimFlowReward(request: TutorialRequest): Promise<OperationResult<TutorialClaimResponse>>;
4910
+ resetFlow(request: TutorialRequest): Promise<OperationResult<TutorialFlowResponse>>;
4911
+ }
4912
+
4913
+ /** Thin transport wrapper for the Localization feature (port of LocalizationV2). */
4914
+ declare class LocalizationApi {
4915
+ private readonly ctx;
4916
+ constructor(ctx: ClientContext);
4917
+ private send;
4918
+ /** Which languages exist and what their table versions are. Downloads no table. */
4919
+ getLocalizationManifest(request: LocalizationRequest): Promise<OperationResult<LocalizationManifestResponse>>;
4920
+ /**
4921
+ * A translation table in the response body.
4922
+ *
4923
+ * This is the FALLBACK path: the main one is the immutable CDN artifact referenced by
4924
+ * `ClientState.Localization.Url`. Coming here is normal (first player after a translation
4925
+ * edit, blocked CDN, a manual language switch) — it just costs one more round trip.
4926
+ */
4927
+ getLocalizationTable(request: LocalizationRequest): Promise<OperationResult<LocalizationTableResponse>>;
4928
+ }
4929
+
3997
4930
  /** Thin transport wrapper for the Quest feature (port of QuestAPI.cs). */
3998
4931
  declare class QuestApi {
3999
4932
  private readonly ctx;
@@ -4059,6 +4992,7 @@ declare class SeasonApi {
4059
4992
  getUserState(request: SeasonRequest): Promise<OperationResult<UserSeasonStateResponse>>;
4060
4993
  grantStatusTokens(request: SeasonRequest): Promise<OperationResult<GrantStatusTokensResponse>>;
4061
4994
  claimTierReward(request: SeasonRequest): Promise<OperationResult<ClaimTierRewardResponse>>;
4995
+ claimTierRewardsBatch(request: SeasonRequest): Promise<OperationResult<ClaimTierRewardsBatchResponse>>;
4062
4996
  }
4063
4997
 
4064
4998
  /** Thin transport wrapper for the Premium feature (port of PremiumAPI.cs). */
@@ -4176,6 +5110,7 @@ declare class ReferralApi {
4176
5110
  getUserState(request: ReferralRequest): Promise<OperationResult<UserReferralStateResponse>>;
4177
5111
  activateReferralCode(request: ReferralRequest): Promise<OperationResult<ActivateReferralCodeResponse>>;
4178
5112
  claimInviteReward(request: ReferralRequest): Promise<OperationResult<ClaimInviteRewardResponse>>;
5113
+ claimInviteRewardsBatch(request: ReferralRequest): Promise<OperationResult<ClaimInviteRewardsBatchResponse>>;
4179
5114
  }
4180
5115
 
4181
5116
  /** Thin transport wrapper for the Social feature (port of SocialAPI.cs). */
@@ -4347,6 +5282,11 @@ declare class MultiplayerApi {
4347
5282
  interface IDosGamesClientConfig extends SettingsInput {
4348
5283
  /** Platform adapter (defaults to BrowserPlatformAdapter). Inject NoopPlatformAdapter in tests. */
4349
5284
  platform?: PlatformAdapter;
5285
+ /**
5286
+ * Platform reported to the server (`X-IG-Platform`). Auto-detected when omitted; set it
5287
+ * explicitly in a native wrapper — the wrapper knows for certain, sniffing does not.
5288
+ */
5289
+ clientPlatform?: ClientPlatform;
4350
5290
  /** Custom fetch (defaults to global fetch). Inject a mock in tests. */
4351
5291
  fetch?: typeof fetch;
4352
5292
  /** Override the per-endpoint throttle window (ms). Default 600. */
@@ -4361,6 +5301,8 @@ declare class ClientContext {
4361
5301
  readonly settings: IDosGamesSettings;
4362
5302
  readonly emitter: TypedEmitter<SdkEvents>;
4363
5303
  readonly platform: PlatformAdapter;
5304
+ /** Platform reported to the server; services read it to filter payment options. */
5305
+ readonly clientPlatform: ClientPlatform;
4364
5306
  readonly data: IDosGamesData;
4365
5307
  readonly authStore: AuthStore;
4366
5308
  readonly api: {
@@ -4369,9 +5311,12 @@ declare class ClientContext {
4369
5311
  currency: CurrencyApi;
4370
5312
  item: ItemApi;
4371
5313
  store: StoreApi;
5314
+ purchase: PurchaseApi;
4372
5315
  lootbox: LootboxApi;
4373
5316
  reward: RewardApi;
4374
5317
  quest: QuestApi;
5318
+ tutorial: TutorialApi;
5319
+ localization: LocalizationApi;
4375
5320
  timedEvent: TimedEventApi;
4376
5321
  leaderboard: LeaderboardApi;
4377
5322
  season: SeasonApi;
@@ -4399,9 +5344,13 @@ declare class ClientContext {
4399
5344
  readonly currency: CurrencyService;
4400
5345
  readonly item: ItemService;
4401
5346
  readonly store: StoreService;
5347
+ readonly purchase: PurchaseService;
5348
+ readonly checkout: CheckoutService;
4402
5349
  readonly lootbox: LootboxService;
4403
5350
  readonly reward: RewardService;
4404
5351
  readonly quest: QuestService;
5352
+ readonly tutorial: TutorialService;
5353
+ readonly localization: LocalizationService;
4405
5354
  readonly timedEvent: TimedEventService;
4406
5355
  readonly leaderboard: LeaderboardService;
4407
5356
  readonly season: SeasonService;
@@ -4443,9 +5392,23 @@ declare class IDosGamesClient {
4443
5392
  get currency(): CurrencyService;
4444
5393
  get item(): ItemService;
4445
5394
  get store(): StoreService;
5395
+ /** Real-money purchases: the store product catalog and receipt validation. */
5396
+ get purchase(): PurchaseService;
5397
+ /**
5398
+ * Price options: what this client may show, what each option needs, how much crypto is missing.
5399
+ * Buying itself stays in the module that owns the entity — see the service docs.
5400
+ */
5401
+ get checkout(): CheckoutService;
4446
5402
  get lootbox(): LootboxService;
4447
5403
  get reward(): RewardService;
4448
5404
  get quest(): QuestService;
5405
+ /** Onboarding flows: start, advance, skip and claim tutorial steps. */
5406
+ get tutorial(): TutorialService;
5407
+ /**
5408
+ * Переводы: `t(key)` и смена языка. Загружать ничего не нужно — таблицы приезжают вместе с
5409
+ * состоянием на входе в игру.
5410
+ */
5411
+ get localization(): LocalizationService;
4449
5412
  get timedEvent(): TimedEventService;
4450
5413
  get leaderboard(): LeaderboardService;
4451
5414
  get season(): SeasonService;
@@ -4583,4 +5546,46 @@ type MailboxMessageDocument = { MessageID?: null | string; TitleID?: null | stri
4583
5546
  type MailboxBroadcastDocument = { BroadcastID?: null | string; TitleID?: null | string; MessageTypeID?: null | string; Subject?: null | string; Body?: null | string; TemplateParams?: null | Record<string, string>; AssetPaths?: null | Record<string, string>; Rewards?: null | ResourceGrant; TargetSegmentID?: null | string; TargetUserIDs?: null | Array<string>; StartsAtUtc?: null | string; ExpiresAtUtc?: null | string; CreatedAtUtc?: null | string; CreatedByAdminID?: null | string; AdminComment?: null | string; Status?: null | 'Active' | 'Completed' | 'Cancelled' | 'Paused'; DeliveredCount?: null | number; ClaimedCount?: null | number; [key: string]: unknown; };
4584
5547
  type UserMailboxState = { UnreadCount?: null | number; UnclaimedRewardCount?: null | number; LastFetchCursor?: null | string; ReceivedBroadcastIDs?: null | Array<string>; ClaimedBroadcastIDs?: null | Array<string>; DailyP2PGiftsSent?: null | number; DailyGiftsResetDate?: null | string; LastOpenedAtUtc?: null | string; TotalMessagesReceived?: null | number; TotalRewardsClaimed?: null | number; [key: string]: unknown; };
4585
5548
 
4586
- export { type AcceptTradeOfferResponse, type ActivateReferralCodeResponse, type ActivateTimedBoostResponse, type ActiveBoostWindowInfo, type ActiveCoopEventInfo, type ActiveDealSlotInfo, type ActiveEventInfo, type ActiveSeasonInfo, type ActiveTimedBoost, type AdConsentSettings, type AdConsentState, type AdCreditsData, type AdDailyData, type AdFraudFlags, type AdFrequencyCappingSettings, type AdPendingRequest, type AdPlacementDefinition, type AdPlacementUserState, type AdProviderDefinition, type AdSessionData, AdType, type AdUnitConfig, type AdVerificationSettings, type AddQuestProgressResponse, type AdvertisingDefinitions, type AppOpenSettings, AttackOutcome, type AttackResponse, type AttributionInput, type AuthContext, AuthType, AuthenticationAction, type AuthenticationRequest, AuthenticationService, BannerPosition, type BannerSettings, type BaseRequest, type BatchDeleteUserCustomDataResponse, type BatchGetPublicUserCustomDataResponse, type BatchItemResult, type BatchResponse, type BatchSetUserCustomDataResponse, type BattleResult, type BattleStepConfig, type BlockchainAccountSafetyPolicy, BlockchainAction, type BlockchainConfigResponse, type BlockchainDefinitions, type BlockchainNetworkDefinition, BlockchainNetworkType, type BlockchainNftCollectionBinding, BlockchainOperationCategory, type BlockchainRequest, BlockchainService, type BlockchainStats, type BlockchainSystemState, BlockchainTransactionStatus, BlockchainTransactionType, type BoardLoopDefinition, type BoardLoopState, type BoardPendingInteraction, type BoardRollResponse, BodyPart, type BoostTriggerCounter, BoostWindowKind, BroadcastStatus, type BuildResponse, type BuildingState, type CancelMatchResponse, type CancelTradeOfferResponse, type ChangeUsernameResponse, CharacterAction, type CharacterClassification, type CharacterDefinition, type CharacterDefinitions, type CharacterEquipment, type CharacterEquipmentSlot, type CharacterIdentity, type CharacterLevelDefinition, type CharacterLevelRef, type CharacterModel, type CharacterRequest, CharacterService, type CharacterStatRef, type CharacterUnequipResult, type CharacterUnlock, type ClaimAllRewardsBatchResponse, type ClaimAllRewardsResult, type ClaimComebackRewardResponse, type ClaimCycleRewardResponse, type ClaimCycleRewardsBatchResponse, type ClaimDailyRewardResponse, type ClaimDealMilestoneResponse, type ClaimDealMilestonesBatchResponse, type ClaimGrandPrizeResponse, type ClaimGroupCompletionRewardResponse, type ClaimInviteRewardResponse, type ClaimLeaderboardMilestoneResponse, type ClaimLeaderboardMilestonesBatchResponse, type ClaimMilestoneRewardResponse, type ClaimMilestoneRewardsBatchResponse, type ClaimMilestonesBatchResponse, type ClaimQuestRewardResponse, type ClaimQuestRewardsBatchResponse, type ClaimRewardResponse, type ClaimSetRewardResponse, type ClaimSetRewardsBatchResponse, type ClaimTierRewardResponse, type ClientState, CloudCodeAction, CloudCodeErrorCode, type CloudCodeLogEntry, CloudCodeLogLevel, type CloudCodeRequest, CloudCodeRevisionSelection, CloudCodeService, type CodeExecutionError, type CollectIdleAccrualResponse, CollectionAction, type CollectionDefinitions, type CollectionRequest, CollectionService, type CollectionSetRef, type CollectionTradeOfferDocument, CommissionSink, type CommunityChestClaimResponse, type CommunityChestGroupDocument, type CommunityChestGroupStateResponse, type CommunityChestHistoryEntry, type CommunityChestLeaveResponse, type CommunityChestMember, CommunityChestMemberStatus, type CommunityChestSharedState, CommunityChestStatus, type CommunityChestUserStateResponse, type ConfirmWithdrawalResponse, type ConversionDailyCounter, ConversionRateMode, type ConversionTarget, type ConvertResponse, type CoopBuildObjectsMemberState, type CoopBuildObjectsState, type CoopClaimRewardResponse, CoopEventAction, type CoopEventDefinitions, type CoopEventRequest, CoopEventService, type CoopGroupDocument, type CoopGroupMember, type CoopGroupStateResponse, CoopGroupStatus, type CoopLeaveGroupResponse, CoopMemberStatus, type CoopPartnerObjectState, type CoopSpinResponse, type CoopUserStateResponse, CraftAction, type CraftDefinitions, type CraftDefinitionsResponse, type CraftRequest, type CraftResponse, CraftService, type CraftSingleResult, CraftType, type CreateMatchResponse, type CryptoConvertResponse, type CryptoCurrencyDefinition, type CryptoCurrencyPermissions, type CryptoLimits, type CryptoNetworkBinding, CurrencyAction, type CurrencyAudit, type CurrencyConversion, type CurrencyDefinitions, type CurrencyRequest, CurrencyService, CurrencyStatus, CurrencyType, CustomDataBucket, CustomDataValueType, CustomDataWriter, type CyclicSchedule, DEFAULT_BASE_URL, type DailyUsageRecord, type DealMilestoneProgressInfo, DealNodeRuntimeStatus, DealOfferAction, DealOfferActivationStatus, type DealOfferDefinitions, type DealOfferRequest, DealOfferService, type DealOffersDefinitionResponse, type DeclineTradeOfferResponse, type DepositNFTResponse, type DepositTokenResponse, type DismissDealResponse, type DonationResponse, EnvelopeType, type EquipItemsResponse, type EquipSlotPair, type EquipmentPreset, type EquipmentSlot, type EquippedItem, type EventMap, type EventMilestoneClaimResponse, type EventTokenAddress, type EventTokenConversion, type EventTokenDefinition, type EventTokenGrantResponse, type EventTokenOperation, type EventTokenSpendResponse, EventTokenType, type ExecuteCloudCodeResponse, type ExecuteNodeResponse, type ExperimentDefinition, type ExperimentDefinitions, type ExperimentVariant, type ExperimentVariantCondition, type FodderConsumedEntry, FodderSelectionMode, FodderValuationMode, type FriendActionResponse, FriendActionStatus, type FriendPublicProfile, type FriendsListResponse, GameLoopAction, type GameLoopDefinitions, type GameLoopRequest, GameLoopService, type GetActiveBoostWindowsResponse, type GetActiveDealsResponse, type GetActiveEventsResponse, type GetActiveTimedBoostsResponse, type GetCharactersResponse, type GetLeaderboardResponse, type GetLeaderboardsBatchResponse, type GetMatchDefinitionsResponse, type GetMilestoneRewardMultiplierResponse, type GetMyProgressResponse, type GetMyUserCustomDataResponse, type GetOverviewBatchResponse, type GetProgressBatchResponse, type GetPublicTitleDataResponse, type GetPublicUserCustomDataResponse, type GetTradeOffersResponse, type GetUserQuestStateResponse, type GrantStatusTokensResponse, type GrantTokensBatchResponse, type GrantedCollectible, type HeistCell, IDosGamesClient, type IDosGamesClientConfig, IDosGamesData, type IDosGamesSettings, type IceServer, type InstantBattleDefinitions, type InstantBattleResponse, type InstantBattleRule, type InterstitialSettings, type InventoryDelta, ItemAction, type ItemCatalog, type ItemDefinition, type ItemDefinitions, type ItemEquipment, type ItemMetadata, type ItemRequest, ItemService, type ItemStats, type ItemTotals, type ItemUpgrade, type ItemUpgradeFodder, type ItemUpgradeRef, type JsonValue, KeyValueStorage, KycStatus, KycTier, LeaderboardAction, type LeaderboardDefinitions, type LeaderboardMilestoneRef, type LeaderboardOverview, type LeaderboardRequest, type LeaderboardScoreRef, LeaderboardService, type LeaderboardUserEntry, type LeaveRoomResponse, type LevelsPreset, type LimitSpec, type LinkedWalletInfo, type Listener, LootboxAction, type LootboxAmountRange, type LootboxDefinitions, type LootboxDefinitionsResponse, type LootboxOpenResponse, type LootboxPityRule, type LootboxPityTriggerResponse, type LootboxRequest, type LootboxRewardRoll, type LootboxRewardSlot, LootboxService, type LootboxSupplyRule, type MailboxBroadcastDocument, type MailboxDefinition, type MailboxMessageDocument, MailboxMessageSource, MailboxMessageStatus, type MailboxMessageTypeDefinition, type MailboxSegmentDefinition, MarketGoodsType, MarketOfferStatus, MarketOfferType, MarketplaceAction, type MarketplaceActionCounter, type MarketplaceAuctionSettings, type MarketplaceAuctionState, type MarketplaceBidRefund, type MarketplaceBrowseResponse, type MarketplaceBuyOrderSettings, type MarketplaceCommissionOverride, type MarketplaceCommissionPolicy, type MarketplaceCreateOfferResponse, type MarketplaceDefinitions, type MarketplaceDirectTradeSettings, type MarketplaceGetDefinitionsResponse, type MarketplaceGroupedOfferView, type MarketplaceGroupedOffersResponse, type MarketplaceHistoryEntryView, type MarketplaceHistoryResponse, type MarketplaceListingSettings, type MarketplaceMatchingSettings, type MarketplaceMyStateResponse, type MarketplaceOfferResponse, type MarketplaceOfferView, type MarketplacePlaceBidResponse, type MarketplacePricePolicy, type MarketplaceRequest, MarketplaceService, type MarketplaceSettlementResponse, type MarketplaceTradabilityPolicy, MatchAction, type MatchDefinitions, type MatchRequest, MatchService, MatchStatus, type MatchesPageResponse, type MilestoneClaimRef, type MilestoneDefinition, MultiplayerAction, MultiplayerChatMode, type MultiplayerDefinitions, type MultiplayerRequest, MultiplayerService, type MultiplayerSystemState, MultiplayerTopology, type NFTModel, type NFTNetworkBinding, type NFTTransactionDocument, type NFTWithdrawalResponse, type NftCollectionStats, type NftStatsContainer, type OpenCollectionChestResponse, type OpenPackResponse, type OperationFailure, type OperationFailureReason, type OperationResult, type OperationSuccess, type PendingWithdrawalRef, PlatformAdapter, type PlatformBlockchainState, type PlatformLoginResponse, type PlayerEconomyTuningState, type PollResponse, PremiumAction, type PremiumAdReduction, type PremiumDefinitions, type PremiumDefinitionsResponse, type PremiumPurchaseResponse, type PremiumRequest, PremiumService, type PremiumStateResponse, type PremiumSubscription, type PublishResponse, type PurchaseBatchResponse, type PvPMatch, QuestAction, type QuestAvailability, type QuestClaimRef, type QuestCycleDefinition, type QuestDefinition, type QuestDefinitions, type QuestGroupCompletionDefinition, type QuestIdentity, type QuestLinking, type QuestObjectiveDefinition, QuestObjectiveSource, type QuestPhaseDefinition, type QuestPointsTrackView, QuestPrerequisiteMode, type QuestPresetBindings, type QuestPresetRegistry, type QuestProgressUpdate, type QuestRequest, type QuestReward, QuestService, QuestStatus, RaidMode, type RaidResponse, type RealtimeEnvelope, type RechargeConfig, type RecordShowResponse, ReferralAction, type ReferralDefinitions, type ReferralDefinitionsResponse, type ReferralInviteRewardState, type ReferralRequest, ReferralService, type RelativeWindow, type ResourceBundle, type ResourceConsume, type ResourceDualPartyResult, type ResourceEntry, ResourceEntryType, type ResourceGrant, type ResourceOperation, type ResourceTransferResult, type RetryWithdrawalResponse, RewardAction, type RewardDefinitions, type RewardDefinitionsResponse, type RewardRequest, RewardService, type RewardedVideoSettings, type RollActionData, type RoomListItem, type RoomMemberView, type RoomSnapshotResponse, RoomVisibility, type RoomsPageResponse, type ScheduleChain, type ScheduleChainPhase, ScheduleMode, type ScheduleSpec, type ScheduledWindow, type SdkEvents, SeasonAction, type SeasonDefinitions, type SeasonRequest, SeasonService, type SeasonTierRewardBundle, type SeasonTierRewardMultiplier, type SeasonTierRewardSet, type SegmentGate, type SendTradeOfferResponse, type SetUserCustomDataResponse, type SettingsInput, SocialAction, type SocialRequest, SocialService, type SocialTimelineEvent, type SolanaWithdrawalSignature, type SpecialApplyMultiplierResponse, SpecialChoiceMode, type SpecialChooseResponse, type SpecialClaimResponse, type SpecialModeOfferData, type SpecialPendingState, type SpendRewardDefinition, type SpendTokensBatchResponse, type SsoCodeFromUrl, type StatDefinition, type StatRequirement, type StatsPreset, StoreAction, type StoreDefinitions, type StorePurchaseRef, type StorePurchaseResponse, type StorePurchaseState, type StoreRequest, StoreService, StoreType, type SubmitScoreResponse, type SubmitScoresBatchResponse, type SuccessResponse, TimedBoostAction, type TimedBoostDefinitions, type TimedBoostRequest, TimedBoostService, TimedBoostStackingPolicy, TimedEventAction, type TimedEventDefinitions, type TimedEventGrantRef, type TimedEventInstanceRef, type TimedEventMilestoneRef, type TimedEventRequest, TimedEventService, type TimedEventSpendRef, TimelineEventType, type TimelineResponse, TitleAction, TitleConfig, TitleCustomDataAction, type TitleCustomDataDefinitions, type TitleCustomDataKeyDefinition, type TitleCustomDataRecord, type TitleCustomDataRequest, TitleCustomDataService, TitleDataBucket, TitleDataScope, type TitlePublicConfigurationModel, type TitleRequest, TitleService, type TokenCurrencyStats, type TokenStatsContainer, type TokenTransactionDocument, type TokenWithdrawalResponse, TradeOfferStatus, TransactionDirection, type TransactionHistoryResponse, type TriggerContext, type TriggerSource, TypedEmitter, type UnequipAllCharactersResponse, type UnequipItemsResponse, type UnlockCharacterResponse, type UnlockCharactersBatchResponse, type UnstackableItemInstanceState, type Unsubscribe, type UpdateMatchResponse, type UpgradeCharacterLevelResponse, type UpgradeCharacterLevelsBatchResponse, type UpgradeItemLevelResponse, type UpgradeLevelsBatchResponse, type UpgradeLevelsOptions, type UpgradeStatLevelResponse, type UpgradeStatLevelsBatchResponse, type UsageReactivationEvent, type UsageTimeStats, type UseCollectibleJokerResponse, UserAction, type UserAdvertisingState, type UserBlockchainState, type UserBlockchainStateResponse, type UserCharactersState, type UserClaimRewardState, type UserCollectionState, type UserComebackState, type UserCommunityChestState, type UserCoopEventState, type UserCryptoComplianceCounters, type UserCryptoCurrencyState, UserCustomDataAction, type UserCustomDataBatchDeleteItem, type UserCustomDataBatchSetItem, type UserCustomDataDefinitions, type UserCustomDataKeyDefinition, type UserCustomDataRecord, type UserCustomDataRequest, UserCustomDataService, type UserCustomDataState, type UserDailyCalendarState, type UserDailyCounters, UserData, type UserDealNodeLifetimeCounts, type UserDealNodeState, type UserDealOfferActivationState, type UserDealOfferHistory, type UserDealOffersState, type UserDealOffersStateResponse, type UserDealSlotState, type UserDealTrackState, type UserDepositAddress, type UserEventTokenProgress, type UserEventTokensState, type UserGameLoopsState, type UserIdleAccrualState, type UserInventoryState, type UserKycState, type UserLeaderboardProgress, type UserLeaderboardsState, type UserLootboxPityCounter, type UserLootboxState, type UserMailboxState, type UserMarketplaceState, type UserMatchCreationLimitState, type UserMatchState, type UserPremiumState, type UserPublicDataModel, type UserQuestCycleState, type UserQuestObjectiveProgress, type UserQuestProgress, type UserQuestState, type UserReferralState, type UserReferralStateResponse, type UserRequest, type UserRewardState, type UserRewardsStateResponse, type UserSeasonState, type UserSeasonStateResponse, type UserSeasonsState, UserService, type UserSocialState, type UserState, type UserStateSlice, type UserStateVersions, type UserStoreState, type UserTimedBoostsState, type UserTimedEventStateResponse, type UserUsageState, type UserVirtualCurrencyState, type VirtualCurrencyDefinition, type VirtualCurrencyEconomy, type VirtualCurrencyPermissions, type WalletChallengeResponse, WalletLinkType, type WithdrawalSignatureResponse, type WithdrawalSplit, beginSsoRedirect, createIDosGamesClient, isFail, isOk, normalizeBlockchainCategory, readSsoCodeFromUrl };
5549
+ /** Что лежит в хранилище: версия таблицы и сама плоская таблица. */
5550
+ interface StoredLocalizationTable {
5551
+ v: number;
5552
+ t: Record<string, string>;
5553
+ }
5554
+ /**
5555
+ * Таблицы переводов, переживающие перезапуск игры.
5556
+ *
5557
+ * Механика та же, что у `TitleConfigCache`, с одним отличием: запись на ЛОКАЛЬ, а не на набор
5558
+ * полей. Иначе смена языка стирала бы предыдущий, и игрок, переключающийся туда-обратно,
5559
+ * перекачивал бы таблицы каждый раз.
5560
+ *
5561
+ * Переводы — публичные данные тайтла, одни и те же для всех игроков, поэтому при логауте они
5562
+ * намеренно НЕ удаляются: чистка только заставила бы качать заново.
5563
+ *
5564
+ * Любая ошибка хранилища трактуется как «кэша нет»: механизм обязан деградировать до полной
5565
+ * загрузки таблицы, а не ломать запуск игры.
5566
+ */
5567
+ declare class LocalizationCache {
5568
+ private readonly storage;
5569
+ private readonly titleId;
5570
+ constructor(storage: ConfigStorage, titleId: string);
5571
+ read(locale: string): Promise<StoredLocalizationTable | null>;
5572
+ write(locale: string, version: number, table: Record<string, string>): Promise<void>;
5573
+ /**
5574
+ * Версии ВСЕХ сохранённых таблиц одной картой — то, что уезжает в
5575
+ * `KnownLocalizationVersions`.
5576
+ *
5577
+ * Отдельная запись, а не обход ключей: интерфейс `ConfigStorage` намеренно узкий (get/set/
5578
+ * remove) и перечислять ключи не умеет — иначе его нельзя было бы реализовать поверх
5579
+ * PlayerPrefs или нативной обёртки.
5580
+ *
5581
+ * Карта нужна ДО того, как сервер ответит, какая локаль игроку досталась: прислать версию
5582
+ * только своего языка мало — на смене языка и у неполного перевода в дело идёт вторая
5583
+ * таблица, и её версию сервер тоже обязан сверить.
5584
+ */
5585
+ readVersions(): Promise<Record<string, number>>;
5586
+ private noteVersion;
5587
+ private keyOf;
5588
+ private versionsKey;
5589
+ }
5590
+
5591
+ export { type AcceptTradeOfferResponse, type ActivateReferralCodeResponse, type ActivateTimedBoostResponse, type ActiveBoostWindowInfo, type ActiveCoopEventInfo, type ActiveDealSlotInfo, type ActiveEventInfo, type ActiveSeasonInfo, type ActiveTimedBoost, type AdConsentSettings, type AdConsentState, type AdCreditsData, type AdDailyData, type AdFraudFlags, type AdFrequencyCappingSettings, type AdPendingRequest, type AdPlacementDefinition, type AdPlacementUserState, type AdProviderDefinition, type AdSessionData, AdType, type AdUnitConfig, type AdVerificationSettings, type AddQuestProgressResponse, type AdvertisingDefinitions, type AppOpenSettings, AttackOutcome, type AttackResponse, type AttributionInput, type AuthContext, AuthType, AuthenticationAction, type AuthenticationRequest, AuthenticationService, BannerPosition, type BannerSettings, type BaseRequest, type BatchDeleteUserCustomDataResponse, type BatchGetPublicUserCustomDataResponse, type BatchItemResult, type BatchResponse, type BatchSetUserCustomDataResponse, type BattleResult, type BattleStepConfig, type BlockchainAccountSafetyPolicy, BlockchainAction, type BlockchainConfigResponse, type BlockchainDefinitions, type BlockchainNetworkDefinition, BlockchainNetworkType, type BlockchainNftCollectionBinding, BlockchainOperationCategory, type BlockchainRequest, BlockchainService, type BlockchainStats, type BlockchainSystemState, BlockchainTransactionStatus, BlockchainTransactionType, type BoardLoopDefinition, type BoardLoopState, type BoardPendingInteraction, type BoardRollResponse, BodyPart, type BoostTriggerCounter, BoostWindowKind, BroadcastStatus, type BuildResponse, type BuildingState, type CancelMatchResponse, type CancelTradeOfferResponse, type ChangeUsernameResponse, CharacterAction, type CharacterClassification, type CharacterDefinition, type CharacterDefinitions, type CharacterEquipment, type CharacterEquipmentSlot, type CharacterIdentity, type CharacterLevelDefinition, type CharacterLevelRef, type CharacterModel, type CharacterRequest, CharacterService, type CharacterStatRef, type CharacterUnequipResult, type CharacterUnlock, CheckoutService, type ClaimAllRewardsBatchResponse, type ClaimAllRewardsResult, type ClaimComebackRewardResponse, type ClaimCycleRewardResponse, type ClaimCycleRewardsBatchResponse, type ClaimDailyRewardResponse, type ClaimDealMilestoneResponse, type ClaimDealMilestonesBatchResponse, type ClaimGrandPrizeResponse, type ClaimGroupCompletionRewardResponse, type ClaimInviteRewardResponse, type ClaimInviteRewardsBatchResponse, type ClaimLeaderboardMilestoneResponse, type ClaimLeaderboardMilestonesBatchResponse, type ClaimMilestoneRewardResponse, type ClaimMilestoneRewardsBatchResponse, type ClaimMilestonesBatchResponse, type ClaimQuestRewardResponse, type ClaimQuestRewardsBatchResponse, type ClaimRewardResponse, type ClaimSetRewardResponse, type ClaimSetRewardsBatchResponse, type ClaimTierRewardResponse, type ClaimTierRewardsBatchResponse, ClientPlatform, type ClientState, CloudCodeAction, CloudCodeErrorCode, type CloudCodeLogEntry, CloudCodeLogLevel, type CloudCodeRequest, CloudCodeRevisionSelection, CloudCodeService, type CodeExecutionError, type CollectIdleAccrualResponse, CollectionAction, type CollectionDefinitions, type CollectionGlobalSettings, type CollectionRequest, CollectionService, type CollectionSetRef, type CollectionTradeOfferDocument, CommissionSink, type CommunityChestClaimResponse, type CommunityChestGroupDocument, type CommunityChestGroupStateResponse, type CommunityChestHistoryEntry, type CommunityChestLeaveResponse, type CommunityChestMember, CommunityChestMemberStatus, type CommunityChestSharedState, CommunityChestStatus, type CommunityChestUserStateResponse, type ConfirmWithdrawalResponse, type ConversionDailyCounter, ConversionRateMode, type ConversionTarget, type ConvertResponse, type CoopBuildObjectsMemberState, type CoopBuildObjectsState, type CoopClaimRewardResponse, CoopEventAction, type CoopEventDefinitions, type CoopEventRequest, CoopEventService, type CoopGroupDocument, type CoopGroupMember, type CoopGroupStateResponse, CoopGroupStatus, type CoopLeaveGroupResponse, CoopMemberStatus, type CoopPartnerObjectState, type CoopSpinResponse, type CoopUserStateResponse, CraftAction, type CraftDefinitions, type CraftDefinitionsResponse, type CraftRequest, type CraftResponse, CraftService, type CraftSingleResult, CraftType, type CreateMatchResponse, type CryptoConvertResponse, type CryptoCurrencyDefinition, type CryptoCurrencyPermissions, type CryptoLimits, type CryptoNetworkBinding, type CryptoShortfall, CurrencyAction, type CurrencyAudit, type CurrencyConversion, type CurrencyDefinitions, type CurrencyRequest, CurrencyService, CurrencyStatus, CurrencyType, CustomDataBucket, CustomDataValueType, CustomDataWriter, type CyclicSchedule, DEFAULT_BASE_URL, type DailyUsageRecord, type DealMilestoneProgressInfo, DealNodeRuntimeStatus, DealOfferAction, DealOfferActivationStatus, type DealOfferDefinitions, type DealOfferRequest, DealOfferService, type DealOffersDefinitionResponse, type DeclineTradeOfferResponse, type DepositNFTResponse, type DepositTokenResponse, type DismissDealResponse, type DonationResponse, EnvelopeType, type EquipItemsResponse, type EquipSlotPair, type EquipmentPreset, type EquipmentSlot, type EquippedItem, type EventMap, type EventMilestoneClaimResponse, type EventTokenAddress, type EventTokenConversion, type EventTokenDefinition, type EventTokenGrantResponse, type EventTokenOperation, type EventTokenSpendResponse, EventTokenType, type ExecuteCloudCodeResponse, type ExecuteNodeResponse, type ExperimentDefinition, type ExperimentDefinitions, type ExperimentVariant, type ExperimentVariantCondition, type FodderConsumedEntry, FodderSelectionMode, FodderValuationMode, type FriendActionResponse, FriendActionStatus, type FriendPublicProfile, type FriendsListResponse, GameLoopAction, type GameLoopDefinitions, type GameLoopRequest, GameLoopService, type GetActiveBoostWindowsResponse, type GetActiveDealsResponse, type GetActiveEventsResponse, type GetActiveTimedBoostsResponse, type GetCharactersResponse, type GetLeaderboardResponse, type GetLeaderboardsBatchResponse, type GetMatchDefinitionsResponse, type GetMilestoneRewardMultiplierResponse, type GetMyProgressResponse, type GetMyUserCustomDataResponse, type GetOverviewBatchResponse, type GetProgressBatchResponse, type GetPublicTitleDataResponse, type GetPublicUserCustomDataResponse, type GetTradeOffersResponse, type GetUserQuestStateResponse, type GetUserTutorialStateResponse, type GrantStatusTokensResponse, type GrantTokensBatchResponse, type GrantedCollectible, type HeistCell, IDosGamesClient, type IDosGamesClientConfig, IDosGamesData, type IDosGamesSettings, type IapProductDefinition, type IapProductPurchaseState, type IapProductRules, IapProductType, IapPurchaseStatus, type IapStore, IapStore$1 as IapStoreValues, type IceServer, type InstantBattleDefinitions, type InstantBattleResponse, type InstantBattleRule, type InterstitialSettings, type InventoryDelta, ItemAction, type ItemCatalog, type ItemDefinition, type ItemDefinitions, type ItemEquipment, type ItemMetadata, type ItemRequest, ItemService, type ItemStats, type ItemTotals, type ItemUpgrade, type ItemUpgradeFodder, type ItemUpgradeRef, type JsonValue, KeyValueStorage, KycStatus, KycTier, LeaderboardAction, type LeaderboardDefinitions, type LeaderboardMilestoneRef, type LeaderboardOverview, type LeaderboardRequest, type LeaderboardScoreRef, LeaderboardService, type LeaderboardUserEntry, type LeaveRoomResponse, type LevelsPreset, type LimitSpec, type LinkedWalletInfo, type Listener, LocalizationAction, LocalizationCache, type LocalizationDefinitions, type LocalizationLocaleDefinition, type LocalizationLocaleInfo, type LocalizationManifestResponse, LocalizationMissingKeyMode, type LocalizationParams, type LocalizationRequest, LocalizationService, type LocalizationState, type LocalizationTableRef, type LocalizationTableResponse, LootboxAction, type LootboxAmountRange, type LootboxDefinitions, type LootboxDefinitionsResponse, type LootboxGlobalSettings, type LootboxOpenResponse, type LootboxPityRule, type LootboxPityTriggerResponse, type LootboxRequest, type LootboxRewardRoll, type LootboxRewardSlot, LootboxService, type LootboxSupplyRule, type MailboxBroadcastDocument, type MailboxDefinition, type MailboxMessageDocument, MailboxMessageSource, MailboxMessageStatus, type MailboxMessageTypeDefinition, type MailboxSegmentDefinition, MarketGoodsType, MarketOfferStatus, MarketOfferType, MarketplaceAction, type MarketplaceActionCounter, type MarketplaceAuctionSettings, type MarketplaceAuctionState, type MarketplaceBidRefund, type MarketplaceBrowseResponse, type MarketplaceBuyOrderSettings, type MarketplaceCommissionOverride, type MarketplaceCommissionPolicy, type MarketplaceCreateOfferResponse, type MarketplaceDefinitions, type MarketplaceDirectTradeSettings, type MarketplaceGetDefinitionsResponse, type MarketplaceGroupedOfferView, type MarketplaceGroupedOffersResponse, type MarketplaceHistoryEntryView, type MarketplaceHistoryResponse, type MarketplaceListingSettings, type MarketplaceMatchingSettings, type MarketplaceMyStateResponse, type MarketplaceOfferResponse, type MarketplaceOfferView, type MarketplacePlaceBidResponse, type MarketplacePricePolicy, type MarketplaceRequest, MarketplaceService, type MarketplaceSettlementResponse, type MarketplaceTradabilityPolicy, MatchAction, type MatchDefinitions, type MatchRequest, MatchService, MatchStatus, type MatchesPageResponse, type MilestoneClaimRef, type MilestoneDefinition, MultiplayerAction, MultiplayerChatMode, type MultiplayerDefinitions, type MultiplayerRequest, MultiplayerService, type MultiplayerSystemState, MultiplayerTopology, type NFTModel, type NFTNetworkBinding, type NFTTransactionDocument, type NFTWithdrawalResponse, type NftCollectionStats, type NftStatsContainer, type OpenCollectionChestResponse, type OpenPackResponse, type OperationFailure, type OperationFailureReason, type OperationResult, type OperationSuccess, type PackOpenResult, type PaymentProof, type PaymentRequirement, type PendingWithdrawalRef, PlatformAdapter, type PlatformBlockchainState, type PlatformLoginResponse, type PlayerEconomyTuningState, type PollResponse, PremiumAction, type PremiumAdReduction, type PremiumDefinitions, type PremiumDefinitionsResponse, type PremiumPurchaseResponse, type PremiumRequest, PremiumService, type PremiumStateResponse, type PremiumSubscription, type PriceOption, type PriceOptions, type PublishResponse, PurchaseAction, type PurchaseBatchResponse, type PurchaseDefinitions, type PurchaseReceiptRef, type PurchaseRequest, PurchaseService, type PurchaseValidationBatchResponse, type PurchaseValidationResponse, type PvPMatch, QuestAction, type QuestAvailability, type QuestClaimRef, type QuestCycleDefinition, type QuestDefinition, type QuestDefinitions, type QuestGroupCompletionDefinition, type QuestIdentity, type QuestLinking, type QuestObjectiveDefinition, QuestObjectiveSource, type QuestPhaseDefinition, type QuestPointsTrackView, QuestPrerequisiteMode, type QuestPresetBindings, type QuestPresetRegistry, type QuestProgressUpdate, type QuestRequest, type QuestReward, QuestService, QuestStatus, RaidMode, type RaidResponse, type RealtimeEnvelope, type RechargeConfig, type RecordShowResponse, ReferralAction, type ReferralDefinitions, type ReferralDefinitionsResponse, type ReferralInviteRewardState, type ReferralRequest, ReferralService, type RelativeWindow, type ResourceBundle, type ResourceConsume, type ResourceDualPartyResult, type ResourceEntry, ResourceEntryType, type ResourceGrant, type ResourceOperation, type ResourceTransferResult, type RetryWithdrawalResponse, RewardAction, type RewardDefinitions, type RewardDefinitionsResponse, type RewardRequest, RewardService, type RewardedVideoSettings, type RollActionData, type RoomListItem, type RoomMemberView, type RoomSnapshotResponse, RoomVisibility, type RoomsPageResponse, type ScheduleChain, type ScheduleChainPhase, ScheduleMode, type ScheduleSpec, type ScheduledWindow, type SdkEvents, SeasonAction, type SeasonDefinitions, type SeasonRequest, SeasonService, type SeasonTierRewardBundle, type SeasonTierRewardMultiplier, type SeasonTierRewardSet, type SegmentGate, type SendTradeOfferResponse, type SetUserCustomDataResponse, type SettingsInput, SocialAction, type SocialCounters, type SocialRequest, SocialService, type SocialTimelineEvent, type SolanaWithdrawalSignature, type SpecialApplyMultiplierResponse, SpecialChoiceMode, type SpecialChooseResponse, type SpecialClaimResponse, type SpecialModeOfferData, type SpecialPendingState, type SpendRewardDefinition, type SpendTokensBatchResponse, type SsoCodeFromUrl, type StatDefinition, type StatRequirement, type StatsPreset, StoreAction, type StoreDefinitions, type StorePurchaseRef, type StorePurchaseResponse, type StorePurchaseState, type StoreRequest, StoreService, StoreType, type StoredLocalizationTable, type SubmitScoreResponse, type SubmitScoresBatchResponse, type SuccessResponse, TimedBoostAction, type TimedBoostDefinitions, type TimedBoostRequest, TimedBoostService, TimedBoostStackingPolicy, TimedEventAction, type TimedEventDefinitions, type TimedEventGrantRef, type TimedEventInstanceRef, type TimedEventMilestoneRef, type TimedEventRequest, TimedEventService, type TimedEventSpendRef, TimelineEventType, type TimelineResponse, TitleAction, TitleConfig, TitleCustomDataAction, type TitleCustomDataDefinitions, type TitleCustomDataKeyDefinition, type TitleCustomDataRecord, type TitleCustomDataRequest, TitleCustomDataService, TitleDataBucket, TitleDataScope, type TitlePublicConfigurationModel, type TitleRequest, TitleService, type TokenCurrencyStats, type TokenStatsContainer, type TokenTransactionDocument, type TokenWithdrawalResponse, TradeOfferStatus, TransactionDirection, type TransactionHistoryResponse, type TriggerContext, type TriggerSource, TutorialAction, type TutorialAvailability, type TutorialBlockingPolicy, TutorialBoardAction, type TutorialBoardScript, type TutorialClaimResponse, type TutorialDefinitions, type TutorialFlowBatchResponse, type TutorialFlowDefinition, type TutorialFlowPolicy, type TutorialFlowResponse, TutorialFlowStatus, type TutorialFlowView, type TutorialGateCondition, TutorialGateMode, type TutorialGlobalSettings, type TutorialIdentity, type TutorialPresetBindings, type TutorialPresetRegistry, type TutorialRequest, TutorialRestartPolicy, type TutorialReward, TutorialScriptModule, type TutorialScriptedOutcome, type TutorialStepCompletion, TutorialStepCompletionMode, type TutorialStepDefinition, type TutorialStepEffects, type TutorialStepIdentity, type TutorialStepPolicy, type TutorialStepProgress, TypedEmitter, type UnequipAllCharactersResponse, type UnequipItemsResponse, type UnlockCharacterResponse, type UnlockCharactersBatchResponse, type UnstackableItemInstanceState, type Unsubscribe, type UpdateMatchResponse, type UpgradeCharacterLevelResponse, type UpgradeCharacterLevelsBatchResponse, type UpgradeItemLevelResponse, type UpgradeLevelsBatchResponse, type UpgradeLevelsOptions, type UpgradeStatLevelResponse, type UpgradeStatLevelsBatchResponse, type UsageReactivationEvent, type UsageTimeStats, type UseCollectibleJokerResponse, UserAction, type UserAdvertisingState, type UserBlockchainState, type UserBlockchainStateResponse, type UserCharactersState, type UserClaimRewardState, type UserCollectionState, type UserComebackState, type UserCommunityChestState, type UserCoopEventState, type UserCryptoComplianceCounters, type UserCryptoCurrencyState, UserCustomDataAction, type UserCustomDataBatchDeleteItem, type UserCustomDataBatchSetItem, type UserCustomDataDefinitions, type UserCustomDataKeyDefinition, type UserCustomDataRecord, type UserCustomDataRequest, UserCustomDataService, type UserCustomDataState, type UserDailyCalendarState, type UserDailyCounters, UserData, type UserDealNodeLifetimeCounts, type UserDealNodeState, type UserDealOfferActivationState, type UserDealOfferHistory, type UserDealOffersState, type UserDealOffersStateResponse, type UserDealSlotState, type UserDealTrackState, type UserDepositAddress, type UserEventTokenProgress, type UserEventTokensState, type UserGameLoopsState, type UserIdleAccrualState, type UserInventoryState, type UserKycState, type UserLeaderboardProgress, type UserLeaderboardsState, type UserLootboxPityCounter, type UserLootboxState, type UserMailboxState, type UserMarketplaceState, type UserMatchCreationLimitState, type UserMatchState, type UserPremiumState, type UserPublicDataModel, type UserPurchaseState, type UserQuestCycleState, type UserQuestObjectiveProgress, type UserQuestProgress, type UserQuestState, type UserReferralState, type UserReferralStateResponse, type UserRequest, type UserRewardState, type UserRewardsStateResponse, type UserSeasonState, type UserSeasonStateResponse, type UserSeasonsState, UserService, type UserSocialState, type UserState, type UserStateSlice, type UserStateVersions, type UserStoreState, type UserTimedBoostsState, type UserTimedEventStateResponse, type UserTutorialFlowState, type UserTutorialState, type UserTutorialStepState, type UserUsageState, type UserVirtualCurrencyState, type VirtualCurrencyDefinition, type VirtualCurrencyEconomy, type VirtualCurrencyPermissions, type WalletChallengeResponse, WalletLinkType, type WithdrawalSignatureResponse, type WithdrawalSplit, beginSsoRedirect, createIDosGamesClient, isFail, isOk, normalizeBlockchainCategory, readSsoCodeFromUrl, zPaymentProof, zPriceOption, zPriceOptions };