hella-types 0.0.6 → 0.0.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.
package/src/index.ts CHANGED
@@ -1,5 +1,22 @@
1
1
  import * as t from 'io-ts';
2
2
 
3
+ const stringIO = t.type({
4
+ m_defined: t.boolean,
5
+ m_value: t.union([t.string, t.null]),
6
+ });
7
+ const stringArrayIO = t.type({
8
+ m_defined: t.boolean,
9
+ m_value: t.union([t.array(t.string), t.null]),
10
+ });
11
+ const numberIO = t.type({
12
+ m_defined: t.boolean,
13
+ m_value: t.union([t.number, t.null]),
14
+ });
15
+ const booleanIO = t.type({
16
+ m_defined: t.boolean,
17
+ m_value: t.boolean,
18
+ });
19
+
3
20
  export const AttributesKeyFrameIO = t.type({
4
21
  level: t.number,
5
22
  data: t.type({
@@ -29,94 +46,33 @@ export const AttributesKeyFrameIO = t.type({
29
46
  });
30
47
  export const BlackboardIO = t.type({
31
48
  key: t.string,
32
- value: t.union([t.number, t.undefined]),
33
- valueStr: t.union([t.string, t.undefined]),
49
+ value: t.union([t.number, t.null]),
50
+ valueStr: t.union([t.string, t.null, t.undefined]),
34
51
  });
35
52
  export const EnemyAttributesIO = t.type({
36
- maxHp: t.type({
37
- m_defined: t.boolean,
38
- m_value: t.number,
39
- }),
40
- atk: t.type({
41
- m_defined: t.boolean,
42
- m_value: t.number,
43
- }),
44
- def: t.type({
45
- m_defined: t.boolean,
46
- m_value: t.number,
47
- }),
48
- magicResistance: t.type({
49
- m_defined: t.boolean,
50
- m_value: t.number,
51
- }),
52
- cost: t.type({
53
- m_defined: t.boolean,
54
- m_value: t.number,
55
- }),
56
- blockCnt: t.type({
57
- m_defined: t.boolean,
58
- m_value: t.number,
59
- }),
60
- moveSpeed: t.type({
61
- m_defined: t.boolean,
62
- m_value: t.number,
63
- }),
64
- attackSpeed: t.type({
65
- m_defined: t.boolean,
66
- m_value: t.number,
67
- }),
68
- baseAttackTime: t.type({
69
- m_defined: t.boolean,
70
- m_value: t.number,
71
- }),
72
- respawnTime: t.type({
73
- m_defined: t.boolean,
74
- m_value: t.number,
75
- }),
76
- hpRecoveryPerSec: t.type({
77
- m_defined: t.boolean,
78
- m_value: t.number,
79
- }),
80
- spRecoveryPerSec: t.type({
81
- m_defined: t.boolean,
82
- m_value: t.number,
83
- }),
84
- maxDeployCount: t.type({
85
- m_defined: t.boolean,
86
- m_value: t.number,
87
- }),
88
- massLevel: t.type({
89
- m_defined: t.boolean,
90
- m_value: t.number,
91
- }),
92
- baseForceLevel: t.type({
93
- m_defined: t.boolean,
94
- m_value: t.number,
95
- }),
96
- tauntLevel: t.type({
97
- m_defined: t.boolean,
98
- m_value: t.number,
99
- }),
100
- stunImmune: t.type({
101
- m_defined: t.boolean,
102
- m_value: t.boolean,
103
- }),
104
- silenceImmune: t.type({
105
- m_defined: t.boolean,
106
- m_value: t.boolean,
107
- }),
108
- sleepImmune: t.type({
109
- m_defined: t.boolean,
110
- m_value: t.boolean,
111
- }),
112
- frozenImmune: t.type({
113
- m_defined: t.boolean,
114
- m_value: t.boolean,
115
- }),
116
- levitateImmune: t.type({
117
- m_defined: t.boolean,
118
- m_value: t.boolean,
119
- }),
53
+ maxHp: numberIO,
54
+ atk: numberIO,
55
+ def: numberIO,
56
+ magicResistance: numberIO,
57
+ cost: numberIO,
58
+ blockCnt: numberIO,
59
+ moveSpeed: numberIO,
60
+ attackSpeed: numberIO,
61
+ baseAttackTime: numberIO,
62
+ respawnTime: numberIO,
63
+ hpRecoveryPerSec: numberIO,
64
+ spRecoveryPerSec: numberIO,
65
+ maxDeployCount: numberIO,
66
+ massLevel: numberIO,
67
+ baseForceLevel: numberIO,
68
+ tauntLevel: t.union([numberIO, t.undefined]), // legacy
69
+ epDamageResistance: t.union([numberIO, t.undefined]), // legacy
70
+ epResistance: t.union([numberIO, t.undefined]), // ~
71
+ stunImmune: booleanIO,
72
+ silenceImmune: booleanIO,
73
+ sleepImmune: t.union([booleanIO, t.undefined]),
74
+ frozenImmune: t.union([booleanIO, t.undefined]), // legacy
75
+ levitateImmune: t.union([booleanIO, t.undefined]), // legacy
120
76
  });
121
77
  export const EnemySkillsIO = t.type({
122
78
  prefabKey: t.string,
@@ -124,14 +80,32 @@ export const EnemySkillsIO = t.type({
124
80
  cooldown: t.number,
125
81
  initCooldown: t.number,
126
82
  spCost: t.number,
127
- blackboard: t.array(BlackboardIO),
83
+ blackboard: t.union([t.array(BlackboardIO), t.null]),
128
84
  });
129
85
  export const EnemySpDataIO = t.type({
130
- spType: t.number,
86
+ spType: t.string,
131
87
  maxSp: t.number,
132
88
  initSp: t.number,
133
89
  increment: t.number,
134
90
  });
91
+ export const EnemyData = t.type({
92
+ name: stringIO,
93
+ description: stringIO,
94
+ prefabKey: stringIO,
95
+ attributes: EnemyAttributesIO,
96
+ applyWay: t.union([stringIO, t.undefined]), // legacy
97
+ motion: t.union([stringIO, t.undefined]), // legacy
98
+ enemyTags: t.union([stringArrayIO, t.undefined]), // legacy
99
+ lifePointReduce: numberIO,
100
+ levelType: t.union([stringIO, numberIO, t.undefined]), // legacy
101
+ rangeRadius: numberIO,
102
+ numOfExtraDrops: t.union([numberIO, t.undefined]), // legacy
103
+ viewRadius: t.union([numberIO, t.undefined]), // legacy
104
+ notCountInTotal: t.union([booleanIO, t.undefined]), // legacy
105
+ talentBlackboard: t.union([t.array(BlackboardIO), t.null]),
106
+ skills: t.union([t.array(EnemySkillsIO), t.null]),
107
+ spData: t.union([EnemySpDataIO, t.null]),
108
+ });
135
109
  export const GridRangeIO = t.type({
136
110
  id: t.string,
137
111
  direction: t.number,
@@ -204,13 +178,13 @@ export const WorkshopFormulaIO = t.type({
204
178
  ),
205
179
  });
206
180
  export const OperatorUnlockCondIO = t.type({
207
- phase: t.string,
181
+ phase: t.union([t.string, t.number]),
208
182
  level: t.number,
209
183
  });
210
184
  export const LevelUpCostCondIO = t.type({
211
185
  unlockCond: OperatorUnlockCondIO,
212
186
  lvlUpTime: t.number,
213
- levelUpCost: t.array(LevelUpCostIO),
187
+ levelUpCost: t.union([t.array(LevelUpCostIO), t.null]),
214
188
  });
215
189
  export const StageDefinesIO = t.type({
216
190
  characterInsts: t.array(t.any),
@@ -220,27 +194,30 @@ export const StageDefinesIO = t.type({
220
194
  row: t.number,
221
195
  col: t.number,
222
196
  }),
223
- direction: t.number,
197
+ direction: t.union([t.string, t.number]), // legacy
224
198
  hidden: t.boolean,
225
- alias: t.string,
226
- uniEquipIds: t.array(
227
- t.type({
228
- key: t.string,
229
- level: t.number,
230
- })
199
+ alias: t.union([t.string, t.null]),
200
+ uniEquipIds: t.union([
201
+ t.array(
202
+ t.type({
203
+ key: t.string,
204
+ level: t.number,
205
+ })
206
+ ),
207
+ t.null, t.undefined] // legacy
231
208
  ),
232
209
  inst: t.type({
233
210
  characterKey: t.string,
234
211
  level: t.number,
235
- phase: t.number,
212
+ phase: t.union([t.string, t.number]), // legacy
236
213
  favorPoint: t.number,
237
214
  potentialRank: t.number,
238
215
  }),
239
216
  skillIndex: t.number,
240
217
  mainSkillLvl: t.number,
241
- skinId: t.string,
242
- tmplId: t.string,
243
- overrideSkillBlackboard: t.array(BlackboardIO),
218
+ skinId: t.union([t.string, t.null]),
219
+ tmplId: t.union([t.string, t.null, t.undefined]),
220
+ overrideSkillBlackboard: t.union([t.array(BlackboardIO), t.null, t.undefined]),
244
221
  })
245
222
  ),
246
223
  characterCards: t.array(t.any),
@@ -253,8 +230,34 @@ export const StageEffectIO = t.type({
253
230
  y: t.number,
254
231
  z: t.number,
255
232
  }),
256
- direction: t.number,
233
+ direction: t.union([t.string, t.number]), // legacy
257
234
  });
235
+ export const StageActionIO = t.type({
236
+ preDelay: t.number,
237
+ actions: t.array(
238
+ t.type({
239
+ actionType: t.union([t.string, t.number]), // legacy
240
+ managedByScheduler: t.boolean,
241
+ key: t.string,
242
+ count: t.number,
243
+ preDelay: t.number,
244
+ interval: t.number,
245
+ routeIndex: t.number,
246
+ blockFragment: t.boolean,
247
+ autoPreviewRoute: t.boolean,
248
+ autoDisplayEnemyInfo: t.union([t.boolean, t.undefined]), // legacy
249
+ isUnharmfulAndAlwaysCountAsKilled: t.boolean,
250
+ hiddenGroup: t.union([t.string, t.null]),
251
+ randomSpawnGroupKey: t.union([t.string, t.null, t.undefined]), // legacy
252
+ randomSpawnGroupPackKey: t.union([t.string, t.null, t.undefined]), // legacy
253
+ randomType: t.union([t.string, t.number, t.undefined]), // legacy
254
+ weight: t.union([t.number, t.undefined]), // legacy
255
+ dontBlockWave: t.union([t.boolean, t.undefined]), // legacy
256
+ isValid: t.union([t.boolean, t.undefined]), // legacy
257
+ extraMeta: t.union([t.null, t.undefined]), // legacy
258
+ })
259
+ ),
260
+ })
258
261
  export const StageDataIO = t.type({
259
262
  options: t.type({
260
263
  characterLimit: t.number,
@@ -265,126 +268,114 @@ export const StageDataIO = t.type({
265
268
  moveMultiplier: t.number,
266
269
  steeringEnabled: t.boolean,
267
270
  isTrainingLevel: t.boolean,
268
- isHardTrainingLevel: t.boolean,
269
- functionDisableMask: t.number,
270
- }),
271
- levelId: t.string,
272
- mapId: t.string,
273
- bgmEvent: t.string,
274
- environmentSe: t.string,
271
+ isHardTrainingLevel: t.union([t.boolean, t.undefined]), // legacy
272
+ isPredefinedCardsSelectable: t.union([t.boolean, t.undefined]), // legacy
273
+ maxPlayTime: t.union([t.number, t.undefined]), // legacy
274
+ functionDisableMask: t.union([t.string, t.number]),
275
+ configBlackBoard: t.union([t.array(BlackboardIO), t.null, t.undefined]), // legacy
276
+ }),
277
+ levelId: t.union([t.string, t.null]),
278
+ mapId: t.union([t.string, t.null]),
279
+ bgmEvent: t.union([t.string, t.null]),
280
+ environmentSe: t.union([t.string, t.null]),
275
281
  mapData: t.type({
276
282
  map: t.array(t.array(t.number)),
277
283
  tiles: t.array(
278
284
  t.type({
279
285
  tileKey: t.string,
280
- heightType: t.number,
281
- buildableType: t.number,
282
- passableMask: t.number,
283
- playerSideMask: t.number,
284
- blackboard: BlackboardIO,
285
- effects: t.array(StageEffectIO),
286
+ heightType: t.union([t.string, t.number]), // keep number for legacy stages (monster hunter, vignettes, etc.)
287
+ buildableType: t.union([t.string, t.number]), // ~
288
+ passableMask: t.union([t.string, t.number]), // ~
289
+ playerSideMask: t.union([t.string, t.number, t.undefined]), // ~
290
+ blackboard: t.union([t.array(BlackboardIO), t.null]),
291
+ effects: t.union([t.array(StageEffectIO), t.null]),
286
292
  })
287
293
  ),
288
- blockEdges: t.null,
289
- tags: t.array(t.string),
290
- effects: t.array(StageEffectIO),
291
- layerRects: t.array(t.string),
292
- width: t.number,
293
- height: t.number,
294
+ blockEdges: t.union([t.array(t.any), t.null]),
295
+ tags: t.union([t.array(t.string), t.null]),
296
+ effects: t.union([t.array(StageEffectIO), t.null]),
297
+ layerRects: t.union([t.null, t.undefined]),
294
298
  }),
295
299
  tilesDisallowToLocate: t.array(t.any),
296
- runes: t.array(
297
- t.type({
298
- difficultyMask: t.number,
299
- key: t.string,
300
- professionMask: t.number,
301
- buildableMask: t.number,
302
- blackboard: t.array(BlackboardIO),
303
- })
304
- ),
305
- globalBuffs: t.array(
306
- t.type({
307
- prefabKey: t.string,
308
- blackboard: t.array(BlackboardIO),
309
- overrideCameraEffect: t.null,
310
- passProfessionMaskFlag: t.boolean,
311
- professionMask: t.number,
312
- })
313
- ),
300
+ runes: t.union([
301
+ t.array(
302
+ t.type({
303
+ difficultyMask: t.union([t.string, t.number]), // legacy
304
+ key: t.string,
305
+ professionMask: t.union([t.string, t.number, t.undefined]), // legacy
306
+ buildableMask: t.union([t.string, t.number]), // legacy
307
+ blackboard: t.array(BlackboardIO),
308
+ })
309
+ ),
310
+ t.null
311
+ ]),
312
+ globalBuffs: t.union([
313
+ t.array(
314
+ t.type({
315
+ prefabKey: t.string,
316
+ blackboard: t.union([t.array(BlackboardIO), t.null]),
317
+ overrideCameraEffect: t.null,
318
+ passProfessionMaskFlag: t.union([t.boolean, t.undefined]),
319
+ professionMask: t.union([t.string, t.number, t.undefined]),
320
+ })
321
+ ),
322
+ t.null
323
+ ]),
314
324
  routes: t.array(
315
- t.type({
316
- motionMode: t.number,
317
- startPosition: t.type({
318
- row: t.number,
319
- col: t.number,
320
- }),
321
- endPosition: t.type({
322
- row: t.number,
323
- col: t.number,
324
- }),
325
- spawnRandomRange: t.type({
326
- x: t.number,
327
- y: t.number,
328
- }),
329
- spawnOffset: t.type({
330
- x: t.number,
331
- y: t.number,
325
+ t.union([
326
+ t.type({
327
+ motionMode: t.union([t.string, t.number]), // keep number for legacy
328
+ startPosition: t.type({
329
+ row: t.number,
330
+ col: t.number,
331
+ }),
332
+ endPosition: t.type({
333
+ row: t.number,
334
+ col: t.number,
335
+ }),
336
+ spawnRandomRange: t.type({
337
+ x: t.number,
338
+ y: t.number,
339
+ }),
340
+ spawnOffset: t.type({
341
+ x: t.number,
342
+ y: t.number,
343
+ }),
344
+ checkpoints: t.union([
345
+ t.array(
346
+ t.type({
347
+ type: t.union([t.string, t.number]), // keep number for legacy
348
+ time: t.number,
349
+ position: t.type({
350
+ row: t.number,
351
+ col: t.number,
352
+ }),
353
+ reachOffset: t.type({
354
+ x: t.number,
355
+ y: t.number,
356
+ }),
357
+ randomizeReachOffset: t.boolean,
358
+ reachDistance: t.number,
359
+ })
360
+ ),
361
+ t.null
362
+ ]),
363
+ allowDiagonalMove: t.boolean,
364
+ visitEveryTileCenter: t.boolean,
365
+ visitEveryNodeCenter: t.boolean,
366
+ visitEveryCheckPoint: t.union([t.boolean, t.undefined]), // legacy
332
367
  }),
333
- checkpoints: t.array(
334
- t.type({
335
- type: t.number,
336
- time: t.number,
337
- position: t.type({
338
- row: t.number,
339
- col: t.number,
340
- }),
341
- reachOffset: t.type({
342
- x: t.number,
343
- y: t.number,
344
- }),
345
- randomizeReachOffset: t.boolean,
346
- reachDistance: t.number,
347
- })
348
- ),
349
- allowDiagonalMove: t.boolean,
350
- visitEveryTileCenter: t.boolean,
351
- visitEveryNodeCenter: t.boolean,
352
- visitEveryCheckPoint: t.boolean,
353
- })
368
+ t.null // legacy
369
+ ])
354
370
  ),
355
- extraRoutes: t.array(t.any),
371
+ extraRoutes: t.union([t.array(t.any), t.undefined]),
356
372
  enemies: t.array(t.any),
357
373
  enemyDbRefs: t.array(
358
374
  t.type({
359
375
  useDb: t.boolean,
360
376
  id: t.string,
361
377
  level: t.number,
362
- overwrittenData: t.type({
363
- name: t.type({
364
- m_defined: t.boolean,
365
- m_value: t.number,
366
- }),
367
- description: t.type({
368
- m_defined: t.boolean,
369
- m_value: t.number,
370
- }),
371
- prefabKey: t.type({
372
- m_defined: t.boolean,
373
- m_value: t.number,
374
- }),
375
- attributes: EnemyAttributesIO,
376
- lifePointReduce: t.type({
377
- m_defined: t.boolean,
378
- m_value: t.number,
379
- }),
380
- rangeRadius: t.type({
381
- m_defined: t.boolean,
382
- m_value: t.number,
383
- }),
384
- talentBlackboard: t.array(BlackboardIO),
385
- skills: t.array(EnemySkillsIO),
386
- spData: EnemySpDataIO,
387
- }),
378
+ overwrittenData: t.union([EnemyData, t.null]),
388
379
  })
389
380
  ),
390
381
  waves: t.array(
@@ -392,69 +383,30 @@ export const StageDataIO = t.type({
392
383
  preDelay: t.number,
393
384
  postDelay: t.number,
394
385
  maxTimeWaitingForNextWave: t.number,
395
- fragments: t.array(
396
- t.type({
397
- preDelay: t.number,
398
- actions: t.array(
399
- t.type({
400
- actionType: t.number,
401
- managedByScheduler: t.boolean,
402
- key: t.string,
403
- count: t.number,
404
- preDelay: t.number,
405
- interval: t.number,
406
- routeIndex: t.number,
407
- blockFragment: t.boolean,
408
- autoPreviewRoute: t.boolean,
409
- isUnharmfulAndAlwaysCountAsKilled: t.boolean,
410
- hiddenGroup: t.string,
411
- randomSpawnGroupKey: t.string,
412
- weight: t.number,
413
- dontBlockWave: t.boolean,
414
- })
415
- ),
416
- name: t.string,
417
- })
418
- ),
386
+ fragments: t.array(StageActionIO),
387
+ advancedWaveTag: t.union([t.string, t.null, t.undefined]), // legacy
419
388
  })
420
389
  ),
421
- branches: t.type({
422
- frosts: t.type({
423
- phases: t.array(
424
- t.type({
425
- preDelay: t.number,
426
- actions: t.array(
427
- t.type({
428
- actionType: t.number,
429
- managedByScheduler: t.boolean,
430
- key: t.string,
431
- count: t.number,
432
- preDelay: t.number,
433
- interval: t.number,
434
- routeIndex: t.number,
435
- blockFragment: t.boolean,
436
- autoPreviewRoute: t.boolean,
437
- isUnharmfulAndAlwaysCountAsKilled: t.boolean,
438
- hiddenGroup: t.string,
439
- randomSpawnGroupKey: t.string,
440
- weight: t.number,
441
- weightValue: t.number,
442
- })
443
- ),
444
- })
445
- ),
446
- }),
447
- }),
448
- predefines: StageDefinesIO,
449
- hardPredefines: StageDefinesIO,
390
+ branches: t.union([
391
+ t.record(
392
+ t.string,
393
+ t.type({
394
+ phases: t.array(StageActionIO),
395
+ }),
396
+ ),
397
+ t.null
398
+ ]),
399
+ predefines: t.union([StageDefinesIO, t.null]),
400
+ hardPredefines: t.union([StageDefinesIO, t.null, t.undefined]),
450
401
  excludeCharIdList: t.null,
451
402
  randomSeed: t.number,
452
- operaConfig: t.string,
403
+ operaConfig: t.union([t.string, t.null, t.undefined]),
404
+ runtimeData: t.union([t.null, t.undefined]), // legacy
453
405
  });
454
406
  export const RogueRelicIO = t.type({
455
407
  id: t.string,
456
408
  name: t.string,
457
- description: t.string,
409
+ description: t.union([t.string, t.null]),
458
410
  usage: t.string,
459
411
  obtainApproach: t.string,
460
412
  iconId: t.string,
@@ -464,7 +416,7 @@ export const RogueRelicIO = t.type({
464
416
  value: t.number,
465
417
  sortId: t.number,
466
418
  canSacrifice: t.boolean,
467
- unlockCondDesc: t.string,
419
+ unlockCondDesc: t.union([t.string, t.null]),
468
420
  });
469
421
  export const RogueStageIO = t.type({
470
422
  excel: t.type({
@@ -475,11 +427,11 @@ export const RogueStageIO = t.type({
475
427
  name: t.string,
476
428
  loadingPicId: t.string,
477
429
  description: t.string,
478
- eliteDesc: t.string,
430
+ eliteDesc: t.union([t.string, t.null]),
479
431
  isBoss: t.number,
480
432
  isElite: t.number,
481
433
  difficulty: t.string,
482
- capsulePool: t.string,
434
+ capsulePool: t.union([t.string, t.null]),
483
435
  capsuleProb: t.number,
484
436
  vutresProb: t.array(t.number),
485
437
  boxProb: t.array(t.number),
@@ -493,8 +445,8 @@ export const RogueVariationIO = t.type({
493
445
  innerName: t.string,
494
446
  functionDesc: t.string,
495
447
  desc: t.string,
496
- iconId: t.string,
497
- sound: t.string,
448
+ iconId: t.union([t.string, t.null]),
449
+ sound: t.union([t.string, t.null]),
498
450
  });
499
451
  export const SandboxStageIO = t.type({
500
452
  excel: t.type({
@@ -539,18 +491,13 @@ export const EnemyIO = t.type({
539
491
  excel: t.type({
540
492
  enemyId: t.string,
541
493
  enemyIndex: t.string,
542
- enemyTags: t.array(t.string),
494
+ enemyTags: t.union([t.array(t.string), t.null]),
543
495
  sortId: t.number,
544
496
  name: t.string,
545
- enemyRace: t.string,
546
497
  enemyLevel: t.string,
547
498
  description: t.string,
548
- attackType: t.string,
549
- endure: t.string,
550
- attack: t.string,
551
- defence: t.string,
552
- resistance: t.string,
553
- ability: t.string,
499
+ attackType: t.null,
500
+ ability: t.null,
554
501
  isInvalidKilled: t.boolean,
555
502
  overrideKillCntInfos: t.record(t.string, t.any),
556
503
  hideInHandbook: t.boolean,
@@ -560,40 +507,7 @@ export const EnemyIO = t.type({
560
507
  Value: t.array(
561
508
  t.type({
562
509
  level: t.number,
563
- enemyData: t.type({
564
- name: t.type({
565
- m_defined: t.boolean,
566
- m_value: t.string,
567
- }),
568
- description: t.type({
569
- m_defined: t.boolean,
570
- m_value: t.string,
571
- }),
572
- prefabKey: t.type({
573
- m_defined: t.boolean,
574
- m_value: t.string,
575
- }),
576
- attributes: EnemyAttributesIO,
577
- lifePointReduce: t.type({
578
- m_defined: t.boolean,
579
- m_value: t.number,
580
- }),
581
- levelType: t.type({
582
- m_defined: t.boolean,
583
- m_value: t.number,
584
- }),
585
- rangeRadius: t.type({
586
- m_defined: t.boolean,
587
- m_value: t.number,
588
- }),
589
- numOfExtraDrops: t.type({
590
- m_defined: t.boolean,
591
- m_value: t.number,
592
- }),
593
- talentBlackboard: t.array(BlackboardIO),
594
- skills: t.array(EnemySkillsIO),
595
- spData: EnemySpDataIO,
596
- }),
510
+ enemyData: EnemyData,
597
511
  })
598
512
  ),
599
513
  }),
@@ -608,22 +522,22 @@ export const GameEventIO = t.type({
608
522
  rewardEndTime: t.number,
609
523
  displayOnHome: t.boolean,
610
524
  hasStage: t.boolean,
611
- templateShopId: t.string,
612
- medalGroupId: t.string,
525
+ templateShopId: t.union([t.string, t.null]),
526
+ medalGroupId: t.union([t.string, t.null]),
613
527
  isReplicate: t.boolean,
614
528
  });
615
529
  export const ItemIO = t.type({
616
530
  data: t.type({
617
531
  itemId: t.string,
618
532
  name: t.string,
619
- description: t.string,
620
- rarity: t.number,
533
+ description: t.union([t.string, t.null]),
534
+ rarity: t.string,
621
535
  iconId: t.string,
622
536
  overrideBkg: t.null,
623
- stackIconId: t.string,
537
+ stackIconId: t.union([t.string, t.null]),
624
538
  sortId: t.number,
625
- usage: t.string,
626
- obtainApproach: t.string,
539
+ usage: t.union([t.string, t.null]),
540
+ obtainApproach: t.union([t.string, t.null]),
627
541
  classifyType: t.string,
628
542
  itemType: t.string,
629
543
  stageDropList: t.array(
@@ -639,7 +553,7 @@ export const ItemIO = t.type({
639
553
  })
640
554
  ),
641
555
  }),
642
- formula: t.union([ManufactFormulaIO, WorkshopFormulaIO]),
556
+ formula: t.union([ManufactFormulaIO, WorkshopFormulaIO, t.null]),
643
557
  });
644
558
  export const ModuleIO = t.type({
645
559
  info: t.type({
@@ -649,66 +563,75 @@ export const ModuleIO = t.type({
649
563
  uniEquipDesc: t.string,
650
564
  typeIcon: t.string,
651
565
  typeName1: t.string,
652
- typeName2: t.string,
566
+ typeName2: t.union([t.string, t.null]),
653
567
  equipShiningColor: t.string,
654
- showEvolvePhase: t.number,
655
- unlockEvolvePhase: t.number,
568
+ showEvolvePhase: t.string,
569
+ unlockEvolvePhase: t.string,
656
570
  charId: t.string,
657
- tmplId: t.string,
571
+ tmplId: t.union([t.string, t.null]),
658
572
  showLevel: t.number,
659
573
  unlockLevel: t.number,
660
574
  unlockFavorPoint: t.number,
661
575
  missionList: t.array(t.string),
662
- itemCost: t.record(t.string, t.array(LevelUpCostIO)),
576
+ itemCost: t.union([t.record(t.string, t.array(LevelUpCostIO)), t.null]),
663
577
  type: t.string,
664
578
  uniEquipGetTime: t.number,
665
579
  charEquipOrder: t.number,
666
580
  }),
667
- data: t.type({
668
- phases: t.array(
669
- t.type({
670
- equipLevel: t.number,
671
- parts: t.array(
672
- t.type({
673
- resKey: t.string,
674
- target: t.string,
675
- isToken: t.boolean,
676
- addOrOverrideTalentDataBundle: t.type({
677
- candidates: t.array(
678
- t.type({
679
- displayRangeId: t.boolean,
680
- upgradeDescription: t.string,
681
- talentIndex: t.number,
682
- unlockCondition: OperatorUnlockCondIO,
683
- requiredPotentialRank: t.number,
684
- prefabKey: t.string,
685
- name: t.string,
686
- description: t.string,
687
- rangeId: t.string,
688
- blackboard: t.array(BlackboardIO),
689
- })
690
- ),
691
- }),
692
- overrideTraitDataBundle: t.type({
693
- candidates: t.array(
694
- t.type({
695
- additionalDescription: t.string,
696
- unlockCondition: OperatorUnlockCondIO,
697
- requiredPotentialRank: t.number,
698
- blackboard: t.array(BlackboardIO),
699
- overrideDescripton: t.string,
700
- prefabKey: t.string,
701
- rangeId: t.string,
702
- })
703
- ),
704
- }),
705
- })
706
- ),
707
- attributeBlackboard: t.array(BlackboardIO),
708
- tokenAttributeBlackboard: t.record(t.string, t.array(BlackboardIO)),
709
- })
710
- ),
711
- }),
581
+ data: t.union([
582
+ t.type({
583
+ phases: t.array(
584
+ t.type({
585
+ equipLevel: t.number,
586
+ parts: t.array(
587
+ t.type({
588
+ resKey: t.union([t.string, t.null]),
589
+ target: t.string,
590
+ isToken: t.boolean,
591
+ addOrOverrideTalentDataBundle: t.type({
592
+ candidates: t.union([
593
+ t.array(
594
+ t.type({
595
+ displayRangeId: t.boolean,
596
+ upgradeDescription: t.string,
597
+ talentIndex: t.number,
598
+ unlockCondition: OperatorUnlockCondIO,
599
+ requiredPotentialRank: t.number,
600
+ prefabKey: t.string,
601
+ name: t.union([t.string, t.null]),
602
+ description: t.union([t.string, t.null]),
603
+ rangeId: t.union([t.string, t.null]),
604
+ blackboard: t.array(BlackboardIO),
605
+ })
606
+ ),
607
+ t.null
608
+ ]),
609
+ }),
610
+ overrideTraitDataBundle: t.type({
611
+ candidates: t.union([
612
+ t.array(
613
+ t.type({
614
+ additionalDescription: t.union([t.string, t.null]),
615
+ unlockCondition: OperatorUnlockCondIO,
616
+ requiredPotentialRank: t.number,
617
+ blackboard: t.array(BlackboardIO),
618
+ overrideDescripton: t.union([t.string, t.null]),
619
+ prefabKey: t.union([t.string, t.null]),
620
+ rangeId: t.union([t.string, t.null]),
621
+ })
622
+ ),
623
+ t.null
624
+ ]),
625
+ }),
626
+ })
627
+ ),
628
+ attributeBlackboard: t.array(BlackboardIO),
629
+ tokenAttributeBlackboard: t.record(t.string, t.array(BlackboardIO)),
630
+ })
631
+ ),
632
+ }),
633
+ t.null
634
+ ]),
712
635
  });
713
636
  export const ParadoxIO = t.type({
714
637
  excel: t.type({
@@ -722,7 +645,7 @@ export const ParadoxIO = t.type({
722
645
  description: t.string,
723
646
  unlockParam: t.array(
724
647
  t.type({
725
- unlockType: t.number,
648
+ unlockType: t.string,
726
649
  unlockParam1: t.string,
727
650
  unlockParam2: t.string,
728
651
  unlockParam3: t.null,
@@ -754,24 +677,24 @@ export const SandboxActIO = t.type({
754
677
  });
755
678
  export const SkillIO = t.type({
756
679
  skillId: t.string,
757
- iconId: t.string,
680
+ iconId: t.union([t.string, t.null]),
758
681
  hidden: t.boolean,
759
682
  levels: t.array(
760
683
  t.type({
761
684
  name: t.string,
762
- rangeId: t.string,
763
- description: t.string,
685
+ rangeId: t.union([t.string, t.null]),
686
+ description: t.union([t.string, t.null]),
764
687
  skillType: t.string,
765
- durationType: t.number,
688
+ durationType: t.string,
766
689
  spData: t.type({
767
- spType: t.string,
690
+ spType: t.union([t.string, t.number]),
768
691
  levelUpCost: t.null,
769
692
  maxChargeTime: t.number,
770
693
  spCost: t.number,
771
694
  initSp: t.number,
772
695
  increment: t.number,
773
696
  }),
774
- prefabId: t.string,
697
+ prefabId: t.union([t.string, t.null]),
775
698
  duration: t.number,
776
699
  blackboard: t.array(BlackboardIO),
777
700
  })
@@ -780,43 +703,45 @@ export const SkillIO = t.type({
780
703
  export const SkinIO = t.type({
781
704
  skinId: t.string,
782
705
  charId: t.string,
783
- tokenSkinMap: t.array(
784
- t.type({
785
- tokenId: t.string,
786
- tokenSkinId: t.string,
787
- })
788
- ),
789
- illustId: t.string,
790
- dynIllustId: t.string,
706
+ tokenSkinMap: t.union([
707
+ t.array(
708
+ t.type({
709
+ tokenId: t.string,
710
+ tokenSkinId: t.string,
711
+ })
712
+ ),
713
+ t.null
714
+ ]),
715
+ illustId: t.union([t.string, t.null]),
716
+ dynIllustId: t.union([t.string, t.null]),
791
717
  avatarId: t.string,
792
- portraitId: t.string,
793
- dynPortraitId: t.string,
794
- dynEntranceId: t.string,
795
- buildingId: t.string,
718
+ portraitId: t.union([t.string, t.null]),
719
+ dynPortraitId: t.union([t.string, t.null]),
720
+ dynEntranceId: t.union([t.string, t.null]),
721
+ buildingId: t.union([t.string, t.null]),
796
722
  battleSkin: t.type({
797
723
  overwritePrefab: t.boolean,
798
- skinOrPrefabId: t.string,
724
+ skinOrPrefabId: t.union([t.string, t.null]),
799
725
  }),
800
726
  isBuySkin: t.boolean,
801
- tmplId: t.string,
802
- voiceId: t.string,
727
+ tmplId: t.union([t.string, t.null]),
728
+ voiceId: t.union([t.string, t.null]),
803
729
  voiceType: t.string,
804
730
  displaySkin: t.type({
805
- skinName: t.string,
806
- colorList: t.tuple([t.string, t.string, t.string, t.string, t.string]),
807
- titleList: t.tuple([t.string, t.string]),
808
- modelName: t.string,
809
- drawerList: t.array(t.string),
810
- skinGroupId: t.string,
811
- skinGroupName: t.string,
731
+ skinName: t.union([t.string, t.null]),
732
+ colorList: t.union([t.tuple([t.string, t.string, t.string, t.string, t.string]), t.null]),
733
+ modelName: t.union([t.string, t.null]),
734
+ drawerList: t.union([t.array(t.string), t.null]),
735
+ skinGroupId: t.union([t.string, t.null]),
736
+ skinGroupName: t.union([t.string, t.null]),
812
737
  skinGroupSortIndex: t.number,
813
- content: t.string,
814
- dialog: t.string,
815
- usage: t.string,
816
- description: t.string,
817
- obtainApproach: t.string,
738
+ content: t.union([t.string, t.null]),
739
+ dialog: t.union([t.string, t.null]),
740
+ usage: t.union([t.string, t.null]),
741
+ description: t.union([t.string, t.null]),
742
+ obtainApproach: t.union([t.string, t.null]),
818
743
  sortId: t.number,
819
- displayTagId: t.string,
744
+ displayTagId: t.union([t.string, t.null]),
820
745
  getTime: t.number,
821
746
  onYear: t.number,
822
747
  onPeriod: t.number,
@@ -829,10 +754,13 @@ export const StageIO = t.type({
829
754
  performanceStageFlag: t.string,
830
755
  diffGroup: t.string,
831
756
  unlockCondition: t.array(
832
- t.type({
833
- stageId: t.string,
834
- completeState: t.number,
835
- })
757
+ t.union([
758
+ t.type({
759
+ stageId: t.string,
760
+ completeState: t.string,
761
+ }),
762
+ t.null
763
+ ])
836
764
  ),
837
765
  stageId: t.string,
838
766
  levelId: t.string,
@@ -840,18 +768,18 @@ export const StageIO = t.type({
840
768
  code: t.string,
841
769
  name: t.string,
842
770
  description: t.string,
843
- hardStagedId: t.string,
844
- dangerLevel: t.string,
771
+ hardStagedId: t.union([t.string, t.null]),
772
+ dangerLevel: t.union([t.string, t.null]),
845
773
  dangerPoint: t.number,
846
774
  loadingPicId: t.string,
847
775
  canPractice: t.boolean,
848
776
  canBattleReplay: t.boolean,
849
777
  apCost: t.number,
850
778
  apFailReturn: t.number,
851
- etItemId: t.string,
779
+ etItemId: t.union([t.string, t.null]),
852
780
  etCost: t.number,
853
781
  etFailReturn: t.number,
854
- etButtonStyle: t.string,
782
+ etButtonStyle: t.union([t.string, t.null]),
855
783
  apProtectTimes: t.number,
856
784
  diamondOnceDrop: t.number,
857
785
  practiceTicketCost: t.number,
@@ -863,14 +791,14 @@ export const StageIO = t.type({
863
791
  passFavor: t.number,
864
792
  completeFavor: t.number,
865
793
  slProgress: t.number,
866
- displayMainItem: t.string,
794
+ displayMainItem: t.union([t.string, t.null]),
867
795
  hilightMark: t.boolean,
868
796
  bossMark: t.boolean,
869
797
  isPredefined: t.boolean,
870
798
  isHardPredefined: t.boolean,
871
799
  isSkillSelectablePredefined: t.boolean,
872
800
  isStoryOnly: t.boolean,
873
- appearanceStyle: t.number,
801
+ appearanceStyle: t.string,
874
802
  stageDropInfo: t.type({
875
803
  firstPassRewards: t.null,
876
804
  firstCompleteRewards: t.null,
@@ -885,16 +813,49 @@ export const StageIO = t.type({
885
813
  ),
886
814
  displayDetailRewards: t.array(
887
815
  t.type({
888
- occPercent: t.number,
816
+ occPercent: t.string,
889
817
  type: t.string,
890
818
  id: t.string,
891
819
  dropType: t.string,
892
820
  })
893
821
  ),
894
822
  }),
895
- startButtonOverrideId: t.string,
823
+ canUseCharm: t.boolean,
824
+ canUseTech: t.boolean,
825
+ canUseTrapTool: t.boolean,
826
+ canUseBattlePerformance: t.boolean,
827
+ startButtonOverrideId: t.union([t.string, t.null]),
896
828
  isStagePatch: t.boolean,
897
- mainStageId: t.string,
829
+ mainStageId: t.union([t.string, t.null]),
830
+ extraCondition: t.union([
831
+ t.array(
832
+ t.type({
833
+ index: t.number,
834
+ template: t.string,
835
+ unlockParam: t.array(t.string),
836
+ })
837
+ ),
838
+ t.null
839
+ ]),
840
+ extraInfo: t.union([
841
+ t.array(
842
+ t.type({
843
+ stageId: t.string,
844
+ rewards: t.array(
845
+ t.type({
846
+ id: t.string,
847
+ count: t.number,
848
+ type: t.string,
849
+ })
850
+ ),
851
+ progressInfo: t.type({
852
+ progressType: t.string,
853
+ descList: t.record(t.string, t.string),
854
+ })
855
+ })
856
+ ),
857
+ t.null
858
+ ])
898
859
  }),
899
860
  levels: StageDataIO,
900
861
  });
@@ -915,96 +876,105 @@ export const OperatorIO = t.type({
915
876
  skill: BaseIO,
916
877
  })
917
878
  ),
918
- paradox: ParadoxIO,
879
+ paradox: t.union([ParadoxIO, t.null]),
919
880
  data: t.type({
920
881
  name: t.string,
921
882
  description: t.string,
922
883
  canUseGeneralPotentialItem: t.boolean,
923
- potentialItemId: t.string,
924
- nationId: t.string,
925
- groupId: t.string,
926
- teamId: t.string,
927
- displayNumber: t.string,
928
- tokenKey: t.string,
884
+ potentialItemId: t.union([t.string, t.null]),
885
+ nationId: t.union([t.string, t.null]),
886
+ groupId: t.union([t.string, t.null]),
887
+ teamId: t.union([t.string, t.null]),
888
+ displayNumber: t.union([t.string, t.null]),
889
+ // tokenKey: t.string,
929
890
  appellation: t.string,
930
891
  position: t.string,
931
892
  tagList: t.array(t.string),
932
- itemUsage: t.string,
933
- itemDesc: t.string,
934
- itemObtainApproach: t.string,
893
+ itemUsage: t.union([t.string, t.null]),
894
+ itemDesc: t.union([t.string, t.null]),
895
+ itemObtainApproach: t.union([t.string, t.null]),
935
896
  isNotObtainable: t.boolean,
936
897
  isSpChar: t.boolean,
937
898
  maxPotentialLevel: t.number,
938
899
  rarity: t.string,
939
900
  profession: t.string,
940
901
  subProfessionId: t.string,
941
- trait: t.type({
942
- candidates: t.array(
943
- t.type({
944
- unlockCondition: OperatorUnlockCondIO,
945
- requiredPotentialRank: t.number,
946
- blackboard: t.array(BlackboardIO),
947
- overrideDescripton: t.string,
948
- prefabKey: t.string,
949
- rangeId: t.string,
950
- })
951
- ),
952
- }),
902
+ trait: t.union([
903
+ t.type({
904
+ candidates: t.array(
905
+ t.type({
906
+ unlockCondition: OperatorUnlockCondIO,
907
+ requiredPotentialRank: t.number,
908
+ blackboard: t.array(BlackboardIO),
909
+ overrideDescripton: t.union([t.string, t.null]),
910
+ prefabKey: t.union([t.string, t.null]),
911
+ rangeId: t.union([t.string, t.null]),
912
+ })
913
+ ),
914
+ }),
915
+ t.null
916
+ ]),
953
917
  phases: t.array(
954
918
  t.type({
955
919
  characterPrefabKey: t.string,
956
920
  rangeId: t.string,
957
921
  maxLevel: t.number,
958
922
  attributesKeyFrames: t.array(AttributesKeyFrameIO),
959
- evolveCost: t.array(LevelUpCostIO),
923
+ evolveCost: t.union([t.array(LevelUpCostIO), t.null]),
960
924
  })
961
925
  ),
962
926
  skills: t.array(
963
927
  t.type({
964
928
  skillId: t.string,
965
- overridePrefabKey: t.string,
966
- overrideTokenKey: t.string,
929
+ overridePrefabKey: t.union([t.string, t.null]),
930
+ overrideTokenKey: t.union([t.string, t.null]),
967
931
  levelUpCostCond: t.array(LevelUpCostCondIO),
968
932
  unlockCond: OperatorUnlockCondIO,
969
933
  })
970
934
  ),
971
- talents: t.array(
972
- t.type({
973
- candidates: t.array(
974
- t.type({
975
- unlockCondition: OperatorUnlockCondIO,
976
- requiredPotentialRank: t.number,
977
- prefabKey: t.string,
978
- name: t.string,
979
- description: t.string,
980
- rangeId: t.string,
981
- blackboard: t.array(BlackboardIO),
982
- })
983
- ),
984
- })
985
- ),
935
+ talents: t.union([
936
+ t.array(
937
+ t.type({
938
+ candidates: t.array(
939
+ t.type({
940
+ unlockCondition: OperatorUnlockCondIO,
941
+ requiredPotentialRank: t.number,
942
+ prefabKey: t.string,
943
+ name: t.string,
944
+ description: t.string,
945
+ rangeId: t.union([t.string, t.null]),
946
+ blackboard: t.array(BlackboardIO),
947
+ })
948
+ ),
949
+ })
950
+ ),
951
+ t.null
952
+ ]),
986
953
  potentialRanks: t.array(
987
954
  t.type({
988
- type: t.number,
955
+ type: t.string,
989
956
  description: t.string,
990
- buff: t.type({
991
- attributes: t.type({
992
- abnormalFlags: t.null,
993
- abnormalImmunes: t.null,
994
- abnormalAntis: t.null,
995
- abnormalCombos: t.null,
996
- abnormalComboImmunes: t.null,
997
- attributeModifiers: t.array(
998
- t.type({
999
- attributeType: t.number,
1000
- formulaItem: t.number,
1001
- value: t.number,
1002
- loadFromBlackboard: t.boolean,
1003
- fetchBaseValueFromSourceEntity: t.boolean,
1004
- })
1005
- ),
957
+ buff: t.union([
958
+ t.type({
959
+ attributes: t.type({
960
+ abnormalFlags: t.null,
961
+ abnormalImmunes: t.null,
962
+ abnormalAntis: t.null,
963
+ abnormalCombos: t.null,
964
+ abnormalComboImmunes: t.null,
965
+ attributeModifiers: t.array(
966
+ t.type({
967
+ attributeType: t.string,
968
+ formulaItem: t.string,
969
+ value: t.number,
970
+ loadFromBlackboard: t.boolean,
971
+ fetchBaseValueFromSourceEntity: t.boolean,
972
+ })
973
+ ),
974
+ }),
1006
975
  }),
1007
- }),
976
+ t.null
977
+ ]),
1008
978
  equivalentCost: t.null,
1009
979
  })
1010
980
  ),
@@ -1012,7 +982,7 @@ export const OperatorIO = t.type({
1012
982
  allSkillLvlup: t.array(
1013
983
  t.type({
1014
984
  unlockCond: OperatorUnlockCondIO,
1015
- lvlUpCost: t.array(LevelUpCostIO),
985
+ lvlUpCost: t.union([t.array(LevelUpCostIO), t.null]),
1016
986
  })
1017
987
  ),
1018
988
  }),