@my-swu/simulator-client 0.1.5 → 0.1.7

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.
Files changed (116) hide show
  1. package/README.md +29 -0
  2. package/dist/client.js +6 -1
  3. package/dist/connection/url.d.ts +2 -0
  4. package/dist/connection/url.js +4 -0
  5. package/dist/generated/index.d.ts +4 -0
  6. package/dist/generated/schemas.d.ts +1 -1
  7. package/dist/generated/schemas.js +2412 -1434
  8. package/dist/generated/types/admin-match-debug-bundle.d.ts +1 -1
  9. package/dist/generated/types/admin-match-list-response.d.ts +1 -1
  10. package/dist/generated/types/admin-match-replay-response.d.ts +1 -1
  11. package/dist/generated/types/client-message.d.ts +1 -1
  12. package/dist/generated/types/common.d.ts +524 -260
  13. package/dist/generated/types/create-limited-event-request.d.ts +1 -1
  14. package/dist/generated/types/format-event-response.d.ts +1 -1
  15. package/dist/generated/types/game-command.d.ts +1 -1
  16. package/dist/generated/types/game-event.d.ts +1 -1
  17. package/dist/generated/types/game-state.d.ts +1 -1
  18. package/dist/generated/types/get-match-response.d.ts +1 -1
  19. package/dist/generated/types/leave-limited-event-request.d.ts +1 -0
  20. package/dist/generated/types/leave-limited-event-request.js +2 -0
  21. package/dist/generated/types/limited-event-server-message.d.ts +1 -0
  22. package/dist/generated/types/limited-event-server-message.js +2 -0
  23. package/dist/generated/types/list-active-ai-matches-response.d.ts +1 -1
  24. package/dist/generated/types/lobby-access-response.d.ts +1 -1
  25. package/dist/generated/types/lobby-chat-response.d.ts +1 -1
  26. package/dist/generated/types/lobby-response.d.ts +1 -1
  27. package/dist/generated/types/lobby-server-message.d.ts +1 -1
  28. package/dist/generated/types/match-access-recovery-response.d.ts +1 -1
  29. package/dist/generated/types/match-access-response.d.ts +1 -1
  30. package/dist/generated/types/match-history-replay-response.d.ts +1 -1
  31. package/dist/generated/types/match-recovery-response.d.ts +1 -1
  32. package/dist/generated/types/match-spectator-access-response.d.ts +1 -1
  33. package/dist/generated/types/rematch-match-response.d.ts +1 -1
  34. package/dist/generated/types/restore-history-response.d.ts +1 -1
  35. package/dist/generated/types/restore-match-save-response.d.ts +1 -1
  36. package/dist/generated/types/server-message.d.ts +1 -1
  37. package/dist/generated/types/shared-match-history-replay-response.d.ts +1 -1
  38. package/dist/generated/types/submit-ai-game-feedback-request.d.ts +1 -0
  39. package/dist/generated/types/submit-ai-game-feedback-request.js +2 -0
  40. package/dist/generated/types/submit-ai-game-feedback-response.d.ts +1 -0
  41. package/dist/generated/types/submit-ai-game-feedback-response.js +2 -0
  42. package/dist/generated/types/submit-match-deck-response.d.ts +1 -1
  43. package/dist/generated/types/tournament-room-access-response.d.ts +1 -1
  44. package/dist/generated/types/tournament-room-server-message.d.ts +1 -1
  45. package/dist/generated/types/undo-match-response.d.ts +1 -1
  46. package/dist/generated/types/update-lobby-settings-request.d.ts +1 -1
  47. package/dist/generated/version.d.ts +1 -1
  48. package/dist/generated/version.js +1 -1
  49. package/dist/http/request.d.ts +2 -0
  50. package/dist/http/request.js +9 -1
  51. package/dist/i18n/card-print-catalog.d.ts +9 -0
  52. package/dist/i18n/card-print-catalog.js +260 -0
  53. package/dist/i18n/catalog.d.ts +8 -0
  54. package/dist/i18n/catalog.js +195 -0
  55. package/dist/i18n/diagnostics.d.ts +6 -0
  56. package/dist/i18n/diagnostics.js +19 -0
  57. package/dist/i18n/fallback.d.ts +3 -0
  58. package/dist/i18n/fallback.js +40 -0
  59. package/dist/i18n/format.d.ts +8 -0
  60. package/dist/i18n/format.js +29 -0
  61. package/dist/i18n/generated/message-types.d.ts +91 -0
  62. package/dist/i18n/generated/message-types.js +3 -0
  63. package/dist/i18n/icu.d.ts +12 -0
  64. package/dist/i18n/icu.js +75 -0
  65. package/dist/i18n/index.d.ts +9 -0
  66. package/dist/i18n/index.js +5 -0
  67. package/dist/i18n/locale.d.ts +9 -0
  68. package/dist/i18n/locale.js +19 -0
  69. package/dist/i18n/types.d.ts +151 -0
  70. package/dist/i18n/types.js +1 -0
  71. package/dist/index.d.ts +5 -4
  72. package/dist/internal/authenticated-socket-session.d.ts +2 -0
  73. package/dist/internal/authenticated-socket-session.js +3 -1
  74. package/dist/local/client.js +7 -2
  75. package/dist/local/server/http-router.js +18 -0
  76. package/dist/resources/admin.d.ts +8 -0
  77. package/dist/resources/admin.js +2 -0
  78. package/dist/resources/limited-event-session.d.ts +10 -0
  79. package/dist/resources/limited-event-session.js +35 -0
  80. package/dist/resources/limited-event-types.d.ts +34 -1
  81. package/dist/resources/limited-events.d.ts +8 -1
  82. package/dist/resources/limited-events.js +18 -1
  83. package/dist/resources/lobbies.d.ts +1 -1
  84. package/dist/resources/lobbies.js +1 -1
  85. package/dist/resources/lobby-types.d.ts +15 -2
  86. package/dist/resources/match-history.d.ts +8 -1
  87. package/dist/resources/match-history.js +10 -0
  88. package/dist/resources/tournament-rooms.d.ts +1 -1
  89. package/dist/resources/tournament-rooms.js +1 -1
  90. package/dist/types.d.ts +1 -1
  91. package/dist/validators.d.ts +5 -1
  92. package/i18n/cards/de.json +121 -0
  93. package/i18n/cards/en.json +121 -0
  94. package/i18n/cards/es.json +121 -0
  95. package/i18n/cards/fr.json +121 -0
  96. package/i18n/cards/it.json +121 -0
  97. package/i18n/cards/manifest.json +2715 -0
  98. package/i18n/de.json +11 -0
  99. package/i18n/en.json +11 -0
  100. package/i18n/es.json +11 -0
  101. package/i18n/fr.json +11 -0
  102. package/i18n/it.json +11 -0
  103. package/i18n/messages.schema.json +28 -0
  104. package/package.json +12 -2
  105. package/schema/common.schema.json +1684 -1005
  106. package/schema/create-limited-event-request.schema.json +11 -0
  107. package/schema/game-event.schema.json +76 -0
  108. package/schema/game-state.schema.json +8 -0
  109. package/schema/leave-limited-event-request.schema.json +15 -0
  110. package/schema/limited-event-server-message.schema.json +63 -0
  111. package/schema/manifest.json +5 -1
  112. package/schema/match-save-payload.schema.json +1 -1
  113. package/schema/route-manifest.json +54 -0
  114. package/schema/submit-ai-game-feedback-request.schema.json +36 -0
  115. package/schema/submit-ai-game-feedback-response.schema.json +19 -0
  116. package/schema/update-lobby-settings-request.schema.json +67 -0
@@ -29,6 +29,16 @@ export type AbilityTarget = ({
29
29
  } | {
30
30
  seat: Seat;
31
31
  type: "leader";
32
+ } | {
33
+ /**
34
+ * Zero-based position in that player's leader list.
35
+ */
36
+ leaderIndex: number;
37
+ /**
38
+ * Player who owns the leader slot.
39
+ */
40
+ seat: Seat;
41
+ type: "leaderByIndex";
32
42
  } | {
33
43
  seat: Seat;
34
44
  type: "base";
@@ -39,9 +49,18 @@ export type AbilityTarget = ({
39
49
  /**
40
50
  * Trigger window for a parsed ability. Identifies WHEN the ability
41
51
  * fires; the WHAT is carried by `TriggeredEffect`.
52
+ *
53
+ * This type is on the public SDK schema — it reaches `GameState` through
54
+ * `PendingAbilityView.window` and `GameEvent` — but only ever server to
55
+ * client: no `GameCommand` carries one, so a consumer reads it and never
56
+ * constructs it. The two variants that carry a [`crate::effect::UnitFilter`]
57
+ * are therefore exported opaquely, the way `MatchSavePayload::state` is: the
58
+ * variant discriminant stays on the wire so a UI can still switch on the
59
+ * window, while the engine filter behind it does not pin ~60 internal fields
60
+ * and their whole reference closure into the SDK type surface.
42
61
  */
43
62
  export type AbilityWindow = (("AfterPlayOrDeploy" | "WhenActionPhaseStarts" | "WhenFirstActionPhaseStarts" | "WhenYouDrawCardsDuringActionPhase" | "WhenAnOpponentDrawsCardsDuringActionPhase" | "WhenAPlayerDrawsCardsDuringActionPhase" | "WhenYouTakeInitiative" | "WhenYouDeployLeader" | "WhenEntersPlay" | "OnAttack" | "OnDefense" | "WhenFriendlyUnitAttacks" | "WhenThisUnitIsAttacked" | "WhenThisUnitReadies" | "WhenDamageIsDealtToThisUnit" | "WhenCombatDamageIsDealtToThisUnit" | "WhenThisUnitIsHealed" | "WhenDamageIsDealtToYourBase" | "WhenFriendlyUnitDealsDamageToEnemyUnit" | "WhenEnemyUnitAttacks" | "WhenEnemyUnitAttacksYourBase" | "WhenPilotAttachesToThisUnit" | "WhenFriendlyUnitIsDefeated" | "WhenThisUnitDealsCombatDamageToBase" | "WhenThisUnitDealsCombatDamageToUnit" | "WhenFriendlyUnitDealsCombatDamageToBase" | "WhenEnemyUnitDealsCombatDamageToYourBase" | "WhenAttackEnds" | "WhenFriendlyUnitAttackEnds" | "WhenCaptured" | "WhenDefeated" | "WhenEnemyUnitDefeated" | "WhenIndirectDamageDealtToUnit" | "WhenYouDealNonCombatDamage" | "WhenRevealOrDiscardFromHand" | "WhenAPlayerDiscardsFromHand" | "WhenOpponentPlaysCard" | "WhenOpponentPlaysEvent" | "WhenOpponentPlaysSecondCardEachPhase" | "WhenYouUseTheForce" | "WhenRegroupPhaseStarts" | "WhenFriendlyForceUnitAttacks" | "AtStartOfTurn" | "AtEndOfTurn") | "WhenYouDrawCards" | "WhenEnemyUnitReadiesDuringActionPhase" | "WhenFriendlyUnitDealtDamageAndSurvives" | {
44
- WhenFriendlyUnitDealtCombatDamageAndSurvives: UnitFilter;
63
+ WhenFriendlyUnitDealtCombatDamageAndSurvives: unknown;
45
64
  } | "WhenEnemyGroundUnitAttacksYourBase" | {
46
65
  WhenAnotherFriendlyTraitUnitAttacks: string;
47
66
  } | "WhenUpgradeAttachesToThisUnit" | "WhenAnotherFriendlyUnitIsDefeated" | "WhenFriendlyUpgradeIsDefeated" | {
@@ -49,12 +68,18 @@ export type AbilityWindow = (("AfterPlayOrDeploy" | "WhenActionPhaseStarts" | "W
49
68
  } | "WhenYouDealDamageToEnemyBase" | {
50
69
  WhenFriendlyTraitUnitAttackEnds: string;
51
70
  } | "WhenThisUnitWouldBeCaptured" | {
52
- WhenUnitDefeated: UnitFilter;
71
+ WhenUnitDefeated: unknown;
53
72
  } | {
54
73
  WhenUnitLeavesPlay: RelationFilter;
55
74
  } | "WhenYouReadyCardsDuringRegroup" | "WhenFriendlyUnitAttacksAndDefeats" | "WhenFriendlyUnitDefeatedWhileAttacking" | "WhenYouPlayEvent" | "WhenYouPlayAUnit" | "WhenYouPlayOrCreateAUnit" | "WhenFriendlyUnitEntersPlay" | "WhenYouPlayAnotherUnit" | "WhenYouPlayAnUpgrade" | "WhenYouCollectABounty" | "WhenYouDiscardFromDeck");
56
75
  export type ActionAbilitySource = ({
57
76
  type: "leader";
77
+ } | {
78
+ /**
79
+ * Non-primary leader slots start at one; slot zero uses legacy `Leader`.
80
+ */
81
+ leaderIndex: number;
82
+ type: "leaderByIndex";
58
83
  } | {
59
84
  actionIndex: number;
60
85
  type: "leaderUnit";
@@ -73,8 +98,13 @@ export type ActionAbilitySource = ({
73
98
  export interface ActionAbilityView {
74
99
  creditTokenCounts: number[];
75
100
  label: string;
101
+ modeChoice?: (ModeChoiceView | null);
76
102
  source: ActionAbilitySource;
77
103
  targetGroups: TargetSelectionGroup[];
104
+ /**
105
+ * Exact public Action or Epic Action declaration when migrated.
106
+ */
107
+ text?: (EffectTextRefsView | null);
78
108
  }
79
109
  /**
80
110
  * Admission scope that blocked creation of an AI-backed match.
@@ -222,6 +252,12 @@ export interface ActiveEffectView {
222
252
  inactive?: boolean;
223
253
  source?: (EffectSourceView | null);
224
254
  targets: EffectTargetView[];
255
+ /**
256
+ * Reviewed card-text and shared-message provenance when this public row
257
+ * was created by a resolving instruction. Absence means this registry
258
+ * does not retain a display declaration, never that text was inferred.
259
+ */
260
+ text?: (EffectTextRefsView | null);
225
261
  }
226
262
  export interface AddLobbyAiPlayerRequest {
227
263
  /**
@@ -265,6 +301,10 @@ export interface AdminMatchReplayResponse {
265
301
  * Compact durable match data safe for an administrator list view.
266
302
  */
267
303
  export interface AdminMatchSummary {
304
+ /**
305
+ * Feedback collected for individual completed AI games in this match.
306
+ */
307
+ aiFeedback: AiGameFeedback[];
268
308
  completedAtMs?: (number | null);
269
309
  createdAtMs: number;
270
310
  format: MatchFormat;
@@ -365,6 +405,19 @@ export type AiDecisionSearchMode = ("mcts" | "setupEvaluator" | "fastPath");
365
405
  * adjusted without changing the SDK surface.
366
406
  */
367
407
  export type AiDifficulty = ("easy" | "medium" | "hard" | "unfair");
408
+ /**
409
+ * One immutable player assessment of an AI opponent for a completed game.
410
+ */
411
+ export interface AiGameFeedback {
412
+ comments?: (string | null);
413
+ gameNumber: number;
414
+ rating: AiGameFeedbackRating;
415
+ submittedAtMs: number;
416
+ }
417
+ /**
418
+ * Rating submitted by a player after completing one Solo-versus-AI game.
419
+ */
420
+ export type AiGameFeedbackRating = ("poorly" | "okay" | "good");
368
421
  /**
369
422
  * Explicit AI seat configuration.
370
423
  */
@@ -578,6 +631,20 @@ export interface CardReferenceMatchView {
578
631
  cardType: CardType;
579
632
  title: string;
580
633
  }
634
+ export interface CardTextRef {
635
+ /**
636
+ * Canonical card identity that owns this reviewed printed slot.
637
+ */
638
+ cardId: number;
639
+ /**
640
+ * Full semantic-contract fingerprint pinning this reference to reviewed text.
641
+ */
642
+ contractFingerprint: string;
643
+ /**
644
+ * Durable reviewed slot identifier within the canonical card contract.
645
+ */
646
+ slot: string;
647
+ }
581
648
  /**
582
649
  * Canonical card families from production card data.
583
650
  */
@@ -675,6 +742,10 @@ export interface CreateLimitedEventRequest {
675
742
  * Set code used for booster generation.
676
743
  */
677
744
  setCode: string;
745
+ /**
746
+ * Optional lobby-owned pick and deck-construction schedule.
747
+ */
748
+ timerSettings?: (LimitedLobbyTimerSettings | null);
678
749
  }
679
750
  export interface CreateLobbyRequest {
680
751
  config: LobbyConfig;
@@ -1045,6 +1116,10 @@ export interface DelayedEffectOrderOptionView {
1045
1116
  label: string;
1046
1117
  occurrenceSequence: number;
1047
1118
  sourceCardId?: (number | null);
1119
+ /**
1120
+ * Reviewed text retained by the delayed follow-up when it was created.
1121
+ */
1122
+ text?: (EffectTextRefsView | null);
1048
1123
  }
1049
1124
  /**
1050
1125
  * Public trigger point for a delayed effect.
@@ -1077,6 +1152,10 @@ export interface DelayedEffectView {
1077
1152
  id: string;
1078
1153
  source?: (EffectSourceView | null);
1079
1154
  targets: EffectTargetView[];
1155
+ /**
1156
+ * Reviewed card-text and shared-message provenance for this public row.
1157
+ */
1158
+ text?: (EffectTextRefsView | null);
1080
1159
  timing: DelayedEffectTimingView;
1081
1160
  }
1082
1161
  export interface DistributionAssignment {
@@ -1105,6 +1184,24 @@ export interface DistributionTargetView {
1105
1184
  target: AbilityTarget;
1106
1185
  }
1107
1186
  export type DistributionTokenKindView = ("experience" | "shield" | "advantage");
1187
+ /**
1188
+ * Draft pick schedule. Vectors are ordered by remaining choices: leader
1189
+ * values cover 2 through 8, pack values cover 2 through 14.
1190
+ */
1191
+ export interface DraftLobbyTimerSettings {
1192
+ /**
1193
+ * Leader-pick duration in seconds for 2 through 8 leaders remaining.
1194
+ */
1195
+ leaderPickSeconds: number[];
1196
+ /**
1197
+ * Pack-pick duration in seconds for 2 through 14 cards remaining.
1198
+ */
1199
+ packPickSeconds: number[];
1200
+ /**
1201
+ * Review duration between booster packs in seconds.
1202
+ */
1203
+ reviewSeconds: number;
1204
+ }
1108
1205
  /**
1109
1206
  * One configured booster round for a chaos draft.
1110
1207
  */
@@ -1114,14 +1211,6 @@ export interface DraftRoundConfig {
1114
1211
  */
1115
1212
  setCode: string;
1116
1213
  }
1117
- /**
1118
- * Typed game-state source for a dynamic Unit power ceiling.
1119
- */
1120
- export type DynamicPowerLimit = {
1121
- UpgradesOnUnits: {
1122
- relation: RelationFilter;
1123
- };
1124
- };
1125
1214
  /**
1126
1215
  * Public card subset affected by a play or cost modifier.
1127
1216
  */
@@ -1156,36 +1245,46 @@ export type EffectResolutionDraftStepView = ({
1156
1245
  purpose: TargetGroupPurpose;
1157
1246
  selected: AbilityTarget[];
1158
1247
  stepId: string;
1248
+ text?: (EffectTextRefsView | null);
1159
1249
  } | {
1160
1250
  editable: boolean;
1161
1251
  kind: "amount";
1162
1252
  label: string;
1163
1253
  selected: number;
1164
1254
  stepId: string;
1255
+ text?: (EffectTextRefsView | null);
1165
1256
  } | {
1166
1257
  editable: boolean;
1167
1258
  kind: "modes";
1168
1259
  label: string;
1260
+ /**
1261
+ * Exact reviewed Mode wrappers for every selected executable option.
1262
+ */
1263
+ modeTextReferences?: (CardTextRef | null)[];
1169
1264
  selected: number[];
1170
1265
  stepId: string;
1266
+ text?: (EffectTextRefsView | null);
1171
1267
  } | {
1172
1268
  editable: boolean;
1173
1269
  kind: "cards";
1174
1270
  label: string;
1175
1271
  selected: number[];
1176
1272
  stepId: string;
1273
+ text?: (EffectTextRefsView | null);
1177
1274
  } | {
1178
1275
  editable: boolean;
1179
1276
  kind: "name";
1180
1277
  label: string;
1181
1278
  selected: string;
1182
1279
  stepId: string;
1280
+ text?: (EffectTextRefsView | null);
1183
1281
  } | {
1184
1282
  editable: boolean;
1185
1283
  kind: "aspect";
1186
1284
  label: string;
1187
1285
  selected: string;
1188
1286
  stepId: string;
1287
+ text?: (EffectTextRefsView | null);
1189
1288
  } | {
1190
1289
  attackerId: number;
1191
1290
  editable: boolean;
@@ -1193,12 +1292,14 @@ export type EffectResolutionDraftStepView = ({
1193
1292
  label: string;
1194
1293
  stepId: string;
1195
1294
  target: AttackTarget;
1295
+ text?: (EffectTextRefsView | null);
1196
1296
  } | {
1197
1297
  editable: boolean;
1198
1298
  kind: "distribution";
1199
1299
  label: string;
1200
1300
  selected: DistributionAssignment[];
1201
1301
  stepId: string;
1302
+ text?: (EffectTextRefsView | null);
1202
1303
  });
1203
1304
  /**
1204
1305
  * Engine-owned answers collected for one uncommitted semantic effect.
@@ -1212,6 +1313,10 @@ export interface EffectResolutionDraftView {
1212
1313
  * Printed label of originating effect, retained for descendants.
1213
1314
  */
1214
1315
  originLabel: string;
1316
+ /**
1317
+ * Exact reviewed text owner for the originating command.
1318
+ */
1319
+ originText?: (EffectTextRefsView | null);
1215
1320
  sourceCardId: number;
1216
1321
  steps: EffectResolutionDraftStepView[];
1217
1322
  }
@@ -1259,6 +1364,10 @@ export type EffectTargetView = ({
1259
1364
  } | {
1260
1365
  seat: Seat;
1261
1366
  type: "leader";
1367
+ } | {
1368
+ leaderIndex: number;
1369
+ seat: Seat;
1370
+ type: "leaderByIndex";
1262
1371
  } | {
1263
1372
  seat: Seat;
1264
1373
  type: "base";
@@ -1269,6 +1378,32 @@ export type EffectTargetView = ({
1269
1378
  cardId: number;
1270
1379
  type: "card";
1271
1380
  });
1381
+ /**
1382
+ * Locale-neutral reviewed text that owns visible effect work.
1383
+ *
1384
+ * Clients resolve these catalog references in their selected locale. Empty
1385
+ * fields mean runtime work came from an unmigrated declaration; they never
1386
+ * authorize reconstructing English from a label. Explicit system messages
1387
+ * remain present in `shared_messages` instead of being mistaken for absence.
1388
+ */
1389
+ export interface EffectTextRefsView {
1390
+ /**
1391
+ * Printed ability that created this resolution.
1392
+ */
1393
+ ability?: (CardTextRef | null);
1394
+ /**
1395
+ * Nested printed effects enclosing this visible work, outermost first.
1396
+ */
1397
+ effects?: CardTextRef[];
1398
+ /**
1399
+ * Printed mode selected before the current continuation, if any.
1400
+ */
1401
+ selectedMode?: (CardTextRef | null);
1402
+ /**
1403
+ * Finite SDK messages explicitly declared for this outcome.
1404
+ */
1405
+ sharedMessages?: SimulatorMessage[];
1406
+ }
1272
1407
  export interface ErrorPayload {
1273
1408
  code: string;
1274
1409
  message: string;
@@ -1282,6 +1417,35 @@ export interface ErrorPayload {
1282
1417
  */
1283
1418
  retryAtMs?: (number | null);
1284
1419
  }
1420
+ /**
1421
+ * Reviewed printed ownership for inputs accepted by one event-play command.
1422
+ *
1423
+ * Target groups retain their native ownership/order. Mode references stay
1424
+ * position-aligned with submitted mode indexes, including legacy `None`
1425
+ * entries, so sparse bindings never shift a selected option's identity.
1426
+ */
1427
+ export interface EventPlayInputProvenance {
1428
+ /**
1429
+ * One explicit Mode reference per submitted mode index, in command order.
1430
+ */
1431
+ modeTextReferences?: (CardTextRef | null)[];
1432
+ /**
1433
+ * One compact ownership record per submitted target or capture pair, in
1434
+ * command order.
1435
+ *
1436
+ * This intentionally excludes target candidates and the selected target
1437
+ * itself. Event history needs printed ownership, while candidate lists can
1438
+ * reveal hidden resources and live board information.
1439
+ */
1440
+ targetInputs?: EventPlayTargetInputProvenance[];
1441
+ }
1442
+ /**
1443
+ * Printed ownership for one submitted event target.
1444
+ */
1445
+ export interface EventPlayTargetInputProvenance {
1446
+ purpose: TargetGroupPurpose;
1447
+ textReferences?: CardTextRef[];
1448
+ }
1285
1449
  export interface ExploitOptionsView {
1286
1450
  candidateUnitIds: number[];
1287
1451
  max: number;
@@ -1692,8 +1856,21 @@ export type GameEvent = ("setupCompleted" | {
1692
1856
  } | {
1693
1857
  eventPlayed: {
1694
1858
  cardId: number;
1859
+ /**
1860
+ * Exact reviewed owners for inputs supplied while playing this event.
1861
+ *
1862
+ * This is emitted only for migrated declarations. It captures the
1863
+ * play command before later event clauses can replace the active
1864
+ * prompt, which lets draft/history consumers retain the source input
1865
+ * rather than borrowing a descendant's text.
1866
+ */
1867
+ inputProvenance?: (EventPlayInputProvenance | null);
1695
1868
  playedWithSmuggle: boolean;
1696
1869
  seat: Seat;
1870
+ /**
1871
+ * Exact printed event declaration exposed when this public event was played.
1872
+ */
1873
+ text?: (EffectTextRefsView | null);
1697
1874
  };
1698
1875
  } | {
1699
1876
  upgradePlayed: {
@@ -1785,6 +1962,17 @@ export type GameEvent = ("setupCompleted" | {
1785
1962
  cardIds: number[];
1786
1963
  seat: Seat;
1787
1964
  };
1965
+ } | {
1966
+ cardsChosenFromDiscard: {
1967
+ /**
1968
+ * Printed card identities in command order; duplicates represent distinct copies.
1969
+ */
1970
+ cardIds: number[];
1971
+ /**
1972
+ * Player who made the selection, which may differ from the discard-pile owner.
1973
+ */
1974
+ seat: Seat;
1975
+ };
1788
1976
  } | {
1789
1977
  namedCardChosen: {
1790
1978
  name: string;
@@ -1824,6 +2012,10 @@ export type GameEvent = ("setupCompleted" | {
1824
2012
  source: ActionAbilitySource;
1825
2013
  sourceCardId?: (number | null);
1826
2014
  targets?: AbilityTarget[];
2015
+ /**
2016
+ * Exact public Action or Epic Action declaration that was used.
2017
+ */
2018
+ text?: (EffectTextRefsView | null);
1827
2019
  };
1828
2020
  } | {
1829
2021
  triggeredAbilityResolved: {
@@ -1831,6 +2023,10 @@ export type GameEvent = ("setupCompleted" | {
1831
2023
  seat: Seat;
1832
2024
  sourceCardId: number;
1833
2025
  sourceUnitId?: (number | null);
2026
+ /**
2027
+ * Exact public trigger declaration and currently resolved effect.
2028
+ */
2029
+ text?: (EffectTextRefsView | null);
1834
2030
  window: AbilityWindow;
1835
2031
  };
1836
2032
  } | {
@@ -2106,6 +2302,11 @@ export interface GameState {
2106
2302
  * Whether this snapshot belongs to a server-authorized Playground match.
2107
2303
  */
2108
2304
  playground?: boolean;
2305
+ /**
2306
+ * Host-only Playground ability projection. Empty for normal matches and
2307
+ * while a resolution owns the command boundary.
2308
+ */
2309
+ playgroundActionAbilities?: PlaygroundActionAbilityView[];
2109
2310
  /**
2110
2311
  * Printed cards supplied by every configured Playground deck.
2111
2312
  */
@@ -2353,7 +2554,12 @@ export interface KickLobbySpectatorRequest {
2353
2554
  export interface LeaderActionView {
2354
2555
  creditTokenCounts: number[];
2355
2556
  label: string;
2557
+ modeChoice?: (ModeChoiceView | null);
2356
2558
  targetGroups: TargetSelectionGroup[];
2559
+ /**
2560
+ * Reviewed declaration text for a migrated leader action.
2561
+ */
2562
+ text?: (EffectTextRefsView | null);
2357
2563
  }
2358
2564
  export interface LeaderDeployActionView {
2359
2565
  /**
@@ -2428,6 +2634,15 @@ export interface LeaderStateView {
2428
2634
  flipped: boolean;
2429
2635
  unitId?: (number | null);
2430
2636
  }
2637
+ /**
2638
+ * Explicit departure from one direct Limited Event seat.
2639
+ */
2640
+ export interface LeaveLimitedEventRequest {
2641
+ /**
2642
+ * Seat token returned by create or join.
2643
+ */
2644
+ seatToken: string;
2645
+ }
2431
2646
  export interface LeaveLobbyRequest {
2432
2647
  playerToken: string;
2433
2648
  }
@@ -2652,6 +2867,21 @@ export interface LimitedEventSeatView {
2652
2867
  */
2653
2868
  seatIndex: number;
2654
2869
  }
2870
+ /**
2871
+ * Server messages emitted by direct Limited Event sockets.
2872
+ */
2873
+ export type LimitedEventServerMessage = ({
2874
+ payload: LimitedEventSnapshot;
2875
+ type: "snapshot";
2876
+ } | {
2877
+ payload: {
2878
+ nonce?: (string | null);
2879
+ };
2880
+ type: "pong";
2881
+ } | {
2882
+ payload: ErrorPayload;
2883
+ type: "error";
2884
+ });
2655
2885
  /**
2656
2886
  * Public snapshot of one limited event.
2657
2887
  */
@@ -2750,6 +2980,23 @@ export interface LimitedEventViewerView {
2750
2980
  */
2751
2981
  seatIndex: number;
2752
2982
  }
2983
+ /**
2984
+ * Limited-event timing controls owned by a lobby host.
2985
+ */
2986
+ export interface LimitedLobbyTimerSettings {
2987
+ /**
2988
+ * Deck construction duration in seconds.
2989
+ */
2990
+ deckBuildingSeconds: number;
2991
+ /**
2992
+ * Enables informational deck construction deadline displays.
2993
+ */
2994
+ deckBuildingTimerEnabled: boolean;
2995
+ /**
2996
+ * Draft-only pick and review schedule. Sealed lobbies omit it.
2997
+ */
2998
+ draft?: (DraftLobbyTimerSettings | null);
2999
+ }
2753
3000
  /**
2754
3001
  * One generated pack card plus collation metadata.
2755
3002
  */
@@ -2896,6 +3143,19 @@ export interface LobbyDeckSetPreview {
2896
3143
  */
2897
3144
  leader?: (number | null);
2898
3145
  }
3146
+ /**
3147
+ * Per-game clock values shared by constructed and Limited lobbies.
3148
+ */
3149
+ export interface LobbyGameTimerSettings {
3150
+ /**
3151
+ * Seconds of reserve time granted to each player.
3152
+ */
3153
+ reserveSeconds: number;
3154
+ /**
3155
+ * Seconds allocated to each normal turn before reserve is used.
3156
+ */
3157
+ turnSeconds: number;
3158
+ }
2899
3159
  export interface LobbyKickedPayload {
2900
3160
  /**
2901
3161
  * Player or spectator identity removed from this lobby.
@@ -3100,6 +3360,11 @@ export interface LobbySnapshot {
3100
3360
  requiredPlayerCount: number;
3101
3361
  spectators?: LobbySpectatorView[];
3102
3362
  status: LobbyStatus;
3363
+ /**
3364
+ * Host-selected timer schedule for this lobby. Missing values identify
3365
+ * records created before configurable timers were introduced.
3366
+ */
3367
+ timerSettings?: (LobbyTimerSettings | null);
3103
3368
  visibility: LobbyVisibility;
3104
3369
  }
3105
3370
  export interface LobbySpectatorView {
@@ -3134,6 +3399,19 @@ export type LobbyStatus = ("waiting" | "started" | "closed");
3134
3399
  export interface LobbySyncRequest {
3135
3400
  playerToken: string;
3136
3401
  }
3402
+ /**
3403
+ * Host-selected timing rules for a lobby and its started event or match.
3404
+ */
3405
+ export interface LobbyTimerSettings {
3406
+ /**
3407
+ * Per-turn and reserve-bank settings for the final game.
3408
+ */
3409
+ game: LobbyGameTimerSettings;
3410
+ /**
3411
+ * Limited-only draft and deck-construction settings.
3412
+ */
3413
+ limited?: (LimitedLobbyTimerSettings | null);
3414
+ }
3137
3415
  export type LobbyVisibility = ("private" | "public");
3138
3416
  export interface LobbyWelcomePayload {
3139
3417
  lobbyId: string;
@@ -3527,7 +3805,8 @@ export interface MatchSavePayload {
3527
3805
  };
3528
3806
  /**
3529
3807
  * Wire-format version. Always [`MATCH_SAVE_VERSION`] for newly minted
3530
- * payloads; restore rejects mismatches.
3808
+ * payloads; restore accepts every [`SUPPORTED_SAVE_VERSIONS`] entry and
3809
+ * rejects anything else.
3531
3810
  */
3532
3811
  version: number;
3533
3812
  }
@@ -3720,6 +3999,10 @@ export interface PendingAbilityAspectChoiceView {
3720
3999
  */
3721
4000
  promptProvenance?: (PromptProvenanceView | null);
3722
4001
  sourceCardId: number;
4002
+ /**
4003
+ * Reviewed printed text owning this chooser payload.
4004
+ */
4005
+ text?: (EffectTextRefsView | null);
3723
4006
  }
3724
4007
  export interface PendingAbilityAttackChoiceView {
3725
4008
  abilityId: number;
@@ -3748,6 +4031,10 @@ export interface PendingAbilityAttackChoiceView {
3748
4031
  */
3749
4032
  revealedCardIds?: number[];
3750
4033
  sourceCardId: number;
4034
+ /**
4035
+ * Reviewed printed text owning this chooser payload.
4036
+ */
4037
+ text?: (EffectTextRefsView | null);
3751
4038
  }
3752
4039
  export interface PendingAbilityCardChoiceView {
3753
4040
  abilityId: number;
@@ -3781,6 +4068,10 @@ export interface PendingAbilityCardChoiceView {
3781
4068
  revealMode: HiddenCardChoiceMode;
3782
4069
  searchedCards: CardInstanceView[];
3783
4070
  sourceCardId: number;
4071
+ /**
4072
+ * Reviewed printed text owning this private chooser payload.
4073
+ */
4074
+ text?: (EffectTextRefsView | null);
3784
4075
  }
3785
4076
  /**
3786
4077
  * Coarse family of one pending ability: [`PendingAbilityKind`]'s variant
@@ -3814,11 +4105,22 @@ export interface PendingAbilityModeChoiceView {
3814
4105
  max: number;
3815
4106
  min: number;
3816
4107
  optionLabels: string[];
4108
+ /**
4109
+ * Reviewed printed text for each matching mode option.
4110
+ *
4111
+ * Index aligns with `option_labels`; `None` denotes an engine/system
4112
+ * option rather than inferred prose.
4113
+ */
4114
+ optionTextReferences?: (CardTextRef | null)[];
3817
4115
  /**
3818
4116
  * Parent/stage identity and interaction policy inherited from resolution.
3819
4117
  */
3820
4118
  promptProvenance?: (PromptProvenanceView | null);
3821
4119
  sourceCardId: number;
4120
+ /**
4121
+ * Reviewed printed text owning this chooser payload.
4122
+ */
4123
+ text?: (EffectTextRefsView | null);
3822
4124
  }
3823
4125
  export interface PendingAbilityNameChoiceView {
3824
4126
  abilityId: number;
@@ -3833,6 +4135,10 @@ export interface PendingAbilityNameChoiceView {
3833
4135
  */
3834
4136
  promptProvenance?: (PromptProvenanceView | null);
3835
4137
  sourceCardId: number;
4138
+ /**
4139
+ * Reviewed printed text owning this chooser payload.
4140
+ */
4141
+ text?: (EffectTextRefsView | null);
3836
4142
  }
3837
4143
  /**
3838
4144
  * One queued ability shown while a player-order choice is pending.
@@ -3845,6 +4151,11 @@ export interface PendingAbilityOrderAbilityView {
3845
4151
  id: number;
3846
4152
  label: string;
3847
4153
  sourceCardId: number;
4154
+ /**
4155
+ * Reviewed text retained by the queued ability when its producer made it
4156
+ * public. The order prompt does not infer ownership from source cards.
4157
+ */
4158
+ text?: (EffectTextRefsView | null);
3848
4159
  }
3849
4160
  /**
3850
4161
  * Payload for [`PromptState::ChooseTriggeredAbilityPlayerOrder`].
@@ -3910,6 +4221,10 @@ export interface PendingAbilityView {
3910
4221
  * Groups retain ordering, bounds, and structural purpose together.
3911
4222
  */
3912
4223
  targetPlan: TargetSelectionPlanView;
4224
+ /**
4225
+ * Reviewed printed ability, selected mode, and current effect ownership.
4226
+ */
4227
+ text?: (EffectTextRefsView | null);
3913
4228
  /**
3914
4229
  * Trigger window this ability was collected in.
3915
4230
  *
@@ -3980,6 +4295,10 @@ export interface PendingDistributionView {
3980
4295
  */
3981
4296
  promptProvenance?: (PromptProvenanceView | null);
3982
4297
  sourceCardId: number;
4298
+ /**
4299
+ * Reviewed printed text owning this chooser payload.
4300
+ */
4301
+ text?: (EffectTextRefsView | null);
3983
4302
  title: string;
3984
4303
  validTargets: DistributionTargetView[];
3985
4304
  }
@@ -4057,13 +4376,54 @@ export type PlayCardZone = ("hand" | "resource" | "discardPile");
4057
4376
  * One server-authoritative human-player room lifecycle event.
4058
4377
  */
4059
4378
  export type PlayerPresenceStatus = ("joined" | "disconnected" | "reconnected" | "left");
4060
- export type PlayerTargetPattern = (("SelfPlayer" | "EachPlayer" | "OpponentPlayer" | "ChosenOpponent" | "ChosenPlayer" | "DefendingPlayer" | "RememberedPlayer" | "RememberedUnitController" | "OtherThanRememberedPlayer") | "EachOpponent" | "EachOpponentWhoseBaseDamagedBySourceThisPhase" | "RememberedTargetController" | {
4061
- RelativeToRememberedPlayer: SeatDirection;
4062
- } | "ControllerOfLowerCostRememberedUnit");
4379
+ /**
4380
+ * Playground-only action ability that may be executed without normal action
4381
+ * timing, usage, condition, or cost gates.
4382
+ */
4383
+ export interface PlaygroundActionAbilityView {
4384
+ label: string;
4385
+ modeChoice?: (ModeChoiceView | null);
4386
+ seat: Seat;
4387
+ source: ActionAbilitySource;
4388
+ targetGroups: TargetSelectionGroup[];
4389
+ /**
4390
+ * Exact public Action or Epic Action declaration when migrated.
4391
+ */
4392
+ text?: (EffectTextRefsView | null);
4393
+ }
4394
+ /**
4395
+ * One in-play card whose Playground-editable state may be set exactly.
4396
+ *
4397
+ * Every field is a target value rather than a delta, so a client that shows
4398
+ * current counts can submit what the board should look like instead of
4399
+ * reconstructing the sequence of adjustments that gets there. Anything the
4400
+ * engine derives — keywords, clone identity, controller, arena, card text —
4401
+ * stays out of this patch and remains read-only.
4402
+ */
4403
+ export type PlaygroundCardStateChange = ({
4404
+ advantageTokens?: (number | null);
4405
+ damage?: (number | null);
4406
+ experienceTokens?: (number | null);
4407
+ /**
4408
+ * `true` readies the unit even while an effect forbids readying.
4409
+ */
4410
+ ready?: (boolean | null);
4411
+ shieldTokens?: (number | null);
4412
+ type: "unit";
4413
+ unitId: number;
4414
+ } | {
4415
+ damage: number;
4416
+ seat: Seat;
4417
+ type: "base";
4418
+ });
4063
4419
  /**
4064
4420
  * Host-authorized raw scenario mutation for a Playground match.
4065
4421
  */
4066
4422
  export type PlaygroundCommand = ({
4423
+ cardId: number;
4424
+ seat: Seat;
4425
+ type: "addResource";
4426
+ } | {
4067
4427
  card_ids: number[];
4068
4428
  seat: Seat;
4069
4429
  type: "setDrawQueue";
@@ -4077,10 +4437,20 @@ export type PlaygroundCommand = ({
4077
4437
  cardId: number;
4078
4438
  seat: Seat;
4079
4439
  type: "playCardForFree";
4440
+ } | {
4441
+ modeIndices: number[];
4442
+ seat: Seat;
4443
+ source: ActionAbilitySource;
4444
+ target?: (AbilityTarget | null);
4445
+ targets: AbilityTarget[];
4446
+ type: "executeActionAbility";
4080
4447
  } | {
4081
4448
  amount: number;
4082
4449
  target: PlaygroundDamageTarget;
4083
4450
  type: "setDamage";
4451
+ } | {
4452
+ change: PlaygroundCardStateChange;
4453
+ type: "changeCardState";
4084
4454
  } | {
4085
4455
  target: PlaygroundDefeatTarget;
4086
4456
  type: "defeatCard";
@@ -4089,6 +4459,15 @@ export type PlaygroundCommand = ({
4089
4459
  cardId: number;
4090
4460
  ownerSeat: Seat;
4091
4461
  type: "captureCard";
4462
+ } | {
4463
+ cardId: number;
4464
+ leaderIndex: number;
4465
+ seat: Seat;
4466
+ type: "swapLeader";
4467
+ } | {
4468
+ cardId: number;
4469
+ seat: Seat;
4470
+ type: "swapBase";
4092
4471
  });
4093
4472
  /**
4094
4473
  * One board target whose damage counter Playground may set exactly.
@@ -4127,7 +4506,6 @@ export interface PlaygroundExportPayload {
4127
4506
  export interface PrepareLobbyLimitedAiDecksRequest {
4128
4507
  playerToken: string;
4129
4508
  }
4130
- export type PresenceFilter = ("Any" | "Required" | "Forbidden");
4131
4509
  /**
4132
4510
  * Stable parent/stage identity shared by every prompt opened during an effect.
4133
4511
  */
@@ -4391,6 +4769,9 @@ export interface RejectedPlayView {
4391
4769
  cardInstanceId: number;
4392
4770
  reason: string;
4393
4771
  }
4772
+ /**
4773
+ * Restricts a target by controller relation to the effect source.
4774
+ */
4394
4775
  export type RelationFilter = ("Any" | "Friendly" | "Enemy");
4395
4776
  /**
4396
4777
  * HTTP request body for offering, accepting, or declining a rematch.
@@ -4532,10 +4913,6 @@ export interface SaveMatchRequest {
4532
4913
  * Player slot in clockwise multiplayer order.
4533
4914
  */
4534
4915
  export type Seat = ("one" | "two" | "three" | "four");
4535
- /**
4536
- * Relative multiplayer seat direction.
4537
- */
4538
- export type SeatDirection = ("Left" | "Right");
4539
4916
  /**
4540
4917
  * Per-seat stance on a two-sided post-game offer.
4541
4918
  *
@@ -4644,10 +5021,6 @@ export interface SeatState {
4644
5021
  */
4645
5022
  sideboardCount: number;
4646
5023
  }
4647
- /**
4648
- * How far back an `exclude_previously_selected` filter looks.
4649
- */
4650
- export type SelectionScope = ("ThisEffect" | "ThisClause");
4651
5024
  /**
4652
5025
  * Public reason a match series ended.
4653
5026
  */
@@ -4831,6 +5204,65 @@ export interface SimulatorAvailabilityResponse {
4831
5204
  */
4832
5205
  maintenance: MaintenanceStatus;
4833
5206
  }
5207
+ /**
5208
+ * Typed engine-origin simulator copy with a stable SDK message id.
5209
+ */
5210
+ export type SimulatorMessage = ({
5211
+ kind: "abilityUnavailable";
5212
+ } | {
5213
+ kind: "action.exhaust";
5214
+ } | {
5215
+ count: number;
5216
+ kind: "amount.resources";
5217
+ } | {
5218
+ kind: "choice.none";
5219
+ } | {
5220
+ kind: "chooseTarget";
5221
+ } | {
5222
+ kind: "chooseTargets";
5223
+ max: number;
5224
+ min: number;
5225
+ } | {
5226
+ kind: "controls.cancel";
5227
+ } | {
5228
+ kind: "controls.confirm";
5229
+ } | {
5230
+ kind: "controls.decline";
5231
+ } | {
5232
+ kind: "controls.done";
5233
+ } | {
5234
+ kind: "duration.phase";
5235
+ } | {
5236
+ count: number;
5237
+ kind: "duration.rounds";
5238
+ } | {
5239
+ keyword: string;
5240
+ kind: "keyword.name";
5241
+ } | {
5242
+ kind: "keyword.overwhelm";
5243
+ } | {
5244
+ kind: "keyword.raid";
5245
+ } | {
5246
+ kind: "keyword.sentinel";
5247
+ } | {
5248
+ kind: "legacyText";
5249
+ text: string;
5250
+ } | {
5251
+ kind: "targetPurpose.attachUpgrade";
5252
+ } | {
5253
+ kind: "targetPurpose.chooseTarget";
5254
+ } | {
5255
+ amount: number;
5256
+ kind: "targetPurpose.dealDamage";
5257
+ } | {
5258
+ amount: number;
5259
+ kind: "targetPurpose.giveShield";
5260
+ } | {
5261
+ amount: number;
5262
+ kind: "targetPurpose.heal";
5263
+ } | {
5264
+ kind: "timing.onceEachRound";
5265
+ });
4834
5266
  /**
4835
5267
  * One cursor-paginated admin report list page.
4836
5268
  */
@@ -4950,6 +5382,28 @@ export interface StartLobbyRequest {
4950
5382
  export interface StartTournamentEventRequest {
4951
5383
  playerToken: string;
4952
5384
  }
5385
+ /**
5386
+ * Participant-authorized feedback for one completed Solo-versus-AI game.
5387
+ */
5388
+ export interface SubmitAiGameFeedbackRequest {
5389
+ comments?: (string | null);
5390
+ gameNumber: number;
5391
+ /**
5392
+ * @minItems 1
5393
+ */
5394
+ identities: [HistoryIdentityInput, ...(HistoryIdentityInput)[]];
5395
+ rating: AiGameFeedbackRating;
5396
+ }
5397
+ /**
5398
+ * Result of an idempotent AI-game-feedback submission.
5399
+ */
5400
+ export interface SubmitAiGameFeedbackResponse {
5401
+ /**
5402
+ * `false` means this game had already received feedback.
5403
+ */
5404
+ created: boolean;
5405
+ feedback: AiGameFeedback;
5406
+ }
4953
5407
  export interface SubmitLobbyLimitedDeckRequest {
4954
5408
  deck: DeckInput;
4955
5409
  deckId?: (string | null);
@@ -5129,6 +5583,13 @@ export interface TargetSelectionGroup {
5129
5583
  * effect requests targets but has no classifiable structural meaning.
5130
5584
  */
5131
5585
  purpose?: (TargetGroupPurpose | null);
5586
+ /**
5587
+ * Reviewed printed text that produced this exact group.
5588
+ *
5589
+ * References are locale-neutral and preserve nested printed-effect
5590
+ * ownership without placing card prose in public match state.
5591
+ */
5592
+ textReferences?: CardTextRef[];
5132
5593
  validTargets: AbilityTarget[];
5133
5594
  }
5134
5595
  /**
@@ -5198,6 +5659,10 @@ export interface TournamentRoomPlayerView {
5198
5659
  deck?: (LobbyDeckPreview | null);
5199
5660
  deckReady: boolean;
5200
5661
  host: boolean;
5662
+ /**
5663
+ * Whether server automation permanently controls this participant.
5664
+ */
5665
+ isAi?: boolean;
5201
5666
  joinedAtMs: number;
5202
5667
  name: string;
5203
5668
  playerId: string;
@@ -5359,7 +5824,6 @@ export interface UndoRespondMatchRequest {
5359
5824
  */
5360
5825
  seatToken: string;
5361
5826
  }
5362
- export type UniquenessFilter = ("Any" | "Unique" | "NonUnique");
5363
5827
  export type UnitAbilitySuppressionView = ("none" | "partial" | "full");
5364
5828
  /**
5365
5829
  * Mirror of one [`UnitState::copied_card`] value on the wire.
@@ -5378,242 +5842,6 @@ export interface UnitCopiedCardEntry {
5378
5842
  unitInstanceId: number;
5379
5843
  }
5380
5844
  export type UnitDefeatCause = ("other" | "damage");
5381
- export type UnitExtremum = ("LeastRemainingHp" | "MostPower" | "HighestPrintedCost");
5382
- export interface UnitFilter {
5383
- /**
5384
- * Matches when any complete alternative filter matches.
5385
- *
5386
- * This keeps `one_of((unit_selector_a, unit_selector_b))` orthogonal
5387
- * without flattening distinct restrictions into one lossy filter.
5388
- */
5389
- alternatives?: UnitFilter[];
5390
- arena?: (CardArena | null);
5391
- attacked_base_this_phase: boolean;
5392
- /**
5393
- * Requires current control by one typed player independently from the
5394
- * broad source-relative relation.
5395
- */
5396
- controller?: (PlayerTargetPattern | null);
5397
- /**
5398
- * Marks a count whose Units must all be controlled by one other player.
5399
- *
5400
- * This is consumed by `Condition::AnotherPlayerControlsUnitsAtLeast`
5401
- * before the filter reaches ordinary target matching.
5402
- */
5403
- controller_is_another_player?: boolean;
5404
- controller_is_remembered_player: boolean;
5405
- dealt_base_damage_this_phase: boolean;
5406
- /**
5407
- * Matches a Unit in the arena opposite the resolving source Unit.
5408
- */
5409
- different_arena_from_source?: boolean;
5410
- different_aspect_from_remembered_card: boolean;
5411
- /**
5412
- * Requires legal attachment for Upgrade retained by preceding choice.
5413
- */
5414
- eligible_for_remembered_upgrade?: boolean;
5415
- exact_cost?: (number | null);
5416
- /**
5417
- * Only matches units whose cost equals context.remembered_unit_cost.
5418
- */
5419
- exact_cost_same_as_remembered_cost?: boolean;
5420
- exact_power_equal_ready_resources: boolean;
5421
- exact_remaining_hp_equal_ready_resources: boolean;
5422
- exact_title?: (string | null);
5423
- /**
5424
- * Matches any unit whose title is in this list. When combined with
5425
- * required_traits_any, either a matching title or trait satisfies the
5426
- * name/trait requirement.
5427
- */
5428
- exact_titles_any: string[];
5429
- /**
5430
- * Excludes Unit hosting resolving source Upgrade.
5431
- */
5432
- exclude_attached_unit?: boolean;
5433
- /**
5434
- * Excludes only the Unit that dealt the immediately preceding damage.
5435
- */
5436
- exclude_previous_damage_dealer?: boolean;
5437
- /**
5438
- * Excludes every Unit already selected earlier in the resolving effect.
5439
- *
5440
- * Distinct from `require_other`, which only knows the source Unit and the
5441
- * single most recent selection: a third sequential choice ("Give a third
5442
- * friendly unit +1/+1") has to exclude both earlier picks.
5443
- */
5444
- exclude_previously_selected?: (SelectionScope | null);
5445
- /**
5446
- * Excludes units retained by a preceding multi-target choice.
5447
- */
5448
- exclude_remembered_units?: boolean;
5449
- excluded_aspects: string[];
5450
- /**
5451
- * Excludes units currently controlled by one typed player.
5452
- */
5453
- excluded_controller?: (PlayerTargetPattern | null);
5454
- /**
5455
- * Excludes units with any listed canonical title.
5456
- */
5457
- excluded_titles?: string[];
5458
- excluded_traits: string[];
5459
- /**
5460
- * Restricts iteration to Units exploited while playing resolving source card.
5461
- */
5462
- exploited_to_play_source?: boolean;
5463
- extremum?: (UnitExtremum | null);
5464
- max_cost?: (number | null);
5465
- /**
5466
- * Only matches units whose printed cost is strictly less than the amount of
5467
- * combat damage dealt to a base this attack
5468
- * (`context.combat_damage_dealt_to_base`). Shin Hati ASH 51762.
5469
- */
5470
- max_cost_less_than_combat_damage_to_base?: boolean;
5471
- /**
5472
- * Filters out units whose cost exceeds the cost stored in context.remembered_unit_cost.
5473
- */
5474
- max_cost_same_or_less_than_remembered_cost: boolean;
5475
- /**
5476
- * Filters out units whose printed cost exceeds resources paid to play the
5477
- * source card for current trigger.
5478
- */
5479
- max_cost_same_or_less_than_resources_paid_to_play?: boolean;
5480
- max_cost_same_or_less_than_source: boolean;
5481
- max_power?: (number | null);
5482
- /**
5483
- * Dynamic alternative to a fixed `max_power`.
5484
- */
5485
- max_power_dynamic?: (DynamicPowerLimit | null);
5486
- /**
5487
- * Only matches a unit whose power is strictly less than at least one
5488
- * friendly unit's power (Ahsoka Tano 51727 action target restriction).
5489
- */
5490
- max_power_less_than_any_friendly?: boolean;
5491
- /**
5492
- * Only matches Units with strictly less power than remembered Unit.
5493
- */
5494
- max_power_less_than_remembered_power?: boolean;
5495
- max_power_less_than_source: boolean;
5496
- /**
5497
- * Filters out units whose power exceeds the power stored in context.remembered_unit_power.
5498
- */
5499
- max_power_same_or_less_than_remembered_power: boolean;
5500
- max_remaining_hp?: (number | null);
5501
- max_remaining_hp_less_than_source: boolean;
5502
- min_cost?: (number | null);
5503
- /**
5504
- * Only matches units whose cost is strictly greater than the cost stored in
5505
- * context.remembered_unit_cost (e.g. Reckless Sacrifice's "a unit that costs
5506
- * more than the discarded card").
5507
- */
5508
- min_cost_greater_than_remembered_cost?: boolean;
5509
- min_hp?: (number | null);
5510
- min_power?: (number | null);
5511
- min_remaining_hp?: (number | null);
5512
- /**
5513
- * Only matches Units with at least this many distinct active keywords.
5514
- */
5515
- minimum_distinct_keywords?: (number | null);
5516
- non_leader: boolean;
5517
- /**
5518
- * Requires canonical ownership by one typed player independently from
5519
- * current controller relation.
5520
- */
5521
- owner?: (PlayerTargetPattern | null);
5522
- relation: RelationFilter;
5523
- /**
5524
- * Only matches units that attacked during the current phase.
5525
- */
5526
- require_attacked_this_phase?: boolean;
5527
- require_damaged: boolean;
5528
- /**
5529
- * Only matches units that entered play this phase (UnitState::entered_this_phase).
5530
- */
5531
- require_entered_this_phase: boolean;
5532
- require_exhausted: boolean;
5533
- /**
5534
- * Only matches units that have at least one keyword (printed or granted).
5535
- */
5536
- require_has_keyword?: boolean;
5537
- /**
5538
- * Only matches Units healed at least once during current phase.
5539
- */
5540
- require_healed_this_phase?: boolean;
5541
- /**
5542
- * Restrict to leader units (deployed leaders). Set by "a friendly leader"
5543
- * targets, e.g. Mando's N-1 Starfighter (ASH 52696).
5544
- */
5545
- require_leader?: boolean;
5546
- /**
5547
- * Filters out units that have an Experience token attached.
5548
- */
5549
- require_no_experience: boolean;
5550
- require_no_pilot: boolean;
5551
- /**
5552
- * Filters out units that attacked earlier this phase.
5553
- */
5554
- require_not_attacked_this_phase: boolean;
5555
- /**
5556
- * Only matches Units that did not enter play during current phase.
5557
- */
5558
- require_not_entered_this_phase?: boolean;
5559
- /**
5560
- * Only matches Units that did not enter play during current round.
5561
- */
5562
- require_not_entered_this_round?: boolean;
5563
- require_other: boolean;
5564
- require_ready: boolean;
5565
- /**
5566
- * Only matches units that have at least one Shield token attached.
5567
- */
5568
- require_shield_token?: boolean;
5569
- require_undamaged: boolean;
5570
- required_aspects: string[];
5571
- required_aspects_any: string[];
5572
- required_card_or_upgrade_traits_any: string[];
5573
- required_keywords_any: string[];
5574
- required_traits: string[];
5575
- required_traits_any: string[];
5576
- requires_chosen_aspect: boolean;
5577
- /**
5578
- * Matches the arena occupied by Unit selected earlier in this ability.
5579
- */
5580
- same_arena_as_remembered_unit?: boolean;
5581
- same_arena_as_source: boolean;
5582
- same_name_as_remembered_card: boolean;
5583
- /**
5584
- * Matches Units with same name as Unit stored by preceding target choice.
5585
- */
5586
- same_name_as_remembered_unit?: boolean;
5587
- /**
5588
- * Requires the selected units' printed costs to be at most this value.
5589
- */
5590
- selected_max_combined_cost?: (number | null);
5591
- /**
5592
- * Requires selected Units' current combined power to be at most this value.
5593
- */
5594
- selected_max_combined_power?: (number | null);
5595
- /**
5596
- * Requires the selected units' combined remaining HP to be at most this
5597
- * value (Pre Vizsla ASH 51947: "with a total of N or less remaining HP").
5598
- */
5599
- selected_max_combined_remaining_hp?: (number | null);
5600
- /**
5601
- * Requires every selected unit in a multi-unit selection to share an arena.
5602
- */
5603
- selected_same_arena?: boolean;
5604
- /**
5605
- * Requires every selected Unit to share at least one Trait.
5606
- */
5607
- selected_share_trait?: boolean;
5608
- shares_aspect_with_context_unit: boolean;
5609
- /**
5610
- * Requires the target to share a trait with a leader card controlled by the source player.
5611
- */
5612
- shares_trait_with_friendly_leader: boolean;
5613
- token_filter: PresenceFilter;
5614
- uniqueness_filter: UniquenessFilter;
5615
- upgrade_filter: PresenceFilter;
5616
- }
5617
5845
  export interface UnitStateView {
5618
5846
  /**
5619
5847
  * Whether the unit currently loses all or most of its abilities.
@@ -5744,13 +5972,49 @@ export interface UpdateLobbySettingsRequest {
5744
5972
  * Replacement BO1/BO3 length for one-deck Duel lobbies.
5745
5973
  */
5746
5974
  bestOfMatches?: (number | null);
5975
+ /**
5976
+ * Clears the deterministic match seed, restoring random matches.
5977
+ */
5978
+ clearMatchSeed?: boolean;
5979
+ /**
5980
+ * Clears the deterministic Limited pool seed, restoring random pools.
5981
+ */
5982
+ clearPackSeed?: boolean;
5983
+ /**
5984
+ * Replacement Chaos Draft booster sequence.
5985
+ */
5986
+ draftRounds?: (DraftRoundConfig[] | null);
5747
5987
  gameTimerEnabled?: (boolean | null);
5748
5988
  /**
5749
5989
  * Replacement constructed format for one-deck Duel lobbies.
5750
5990
  */
5751
5991
  matchFormat?: (ConstructedFormat | null);
5992
+ /**
5993
+ * Replacement deterministic match seed.
5994
+ */
5995
+ matchSeed?: (string | null);
5996
+ /**
5997
+ * Replacement deterministic Limited pool seed.
5998
+ */
5999
+ packSeed?: (string | null);
6000
+ /**
6001
+ * Enables or disables draft pick auto-selection countdowns.
6002
+ */
6003
+ pickTimerEnabled?: (boolean | null);
5752
6004
  playerCount?: (number | null);
5753
6005
  playerToken: string;
6006
+ /**
6007
+ * Replacement Sealed booster count.
6008
+ */
6009
+ sealedPackCount?: (number | null);
6010
+ /**
6011
+ * Replacement Limited set code for sealed and normal Draft lobbies.
6012
+ */
6013
+ setCode?: (string | null);
6014
+ /**
6015
+ * Replaces timer durations for the final match and Limited event.
6016
+ */
6017
+ timerSettings?: (LobbyTimerSettings | null);
5754
6018
  /**
5755
6019
  * Replacement legality profile for Trilogy lobbies.
5756
6020
  */