ddb_ruby 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3519 +0,0 @@
1
- # This code may look unusually verbose for Ruby (and it is), but
2
- # it performs some subtle and complex validation of JSON data.
3
- #
4
- # To parse this JSON, add 'dry-struct' and 'dry-types' gems, then do:
5
- #
6
- # character = Character.from_json! "{…}"
7
- # puts character.optional_class_features.first
8
- #
9
- # If from_json! succeeds, the value returned matches the schema.
10
-
11
- # require 'json'
12
- # require 'dry-types'
13
- # require 'dry-struct'
14
-
15
- module DdbRuby
16
- module Types
17
- include Dry.Types(default: :nominal)
18
-
19
- Integer = Coercible::Integer
20
- Bool = Types::Params::Bool
21
- Hash = Coercible::Hash
22
- String = Coercible::String
23
- Double = Coercible::Float | Coercible::Integer
24
- Restriction = Coercible::String.enum("Concentration", "")
25
- EntityType = Coercible::String.enum("class-feature")
26
- ContainerDefinitionKey = Coercible::String.enum("1581111423:53552888")
27
- FilterType = Coercible::String.enum("Armor", "Other Gear", "Potion", "Weapon")
28
- Rarity = Coercible::String.enum("Common", "Rare", "Uncommon")
29
- end
30
-
31
- class Activation < Dry::Struct
32
- attribute :activation_time, Types::Integer.optional
33
- attribute :activation_type, Types::Integer.optional
34
-
35
- def self.from_dynamic!(d)
36
- d = Types::Hash[d]
37
- new(
38
- activation_time: d.fetch("activationTime"),
39
- activation_type: d.fetch("activationType"),
40
- )
41
- end
42
-
43
- def self.from_json!(json)
44
- from_dynamic!(JSON.parse(json))
45
- end
46
-
47
- def to_dynamic
48
- {
49
- "activationTime" => activation_time,
50
- "activationType" => activation_type,
51
- }
52
- end
53
-
54
- def to_json(options = nil)
55
- JSON.generate(to_dynamic, options)
56
- end
57
- end
58
-
59
- class ClassLimitedUse < Dry::Struct
60
- attribute :limited_use_name, Types::Nil
61
- attribute :stat_modifier_uses_id, Types::Nil
62
- attribute :reset_type, Types::Integer
63
- attribute :number_used, Types::Integer
64
- attribute :min_number_consumed, Types::Integer
65
- attribute :max_number_consumed, Types::Integer
66
- attribute :max_uses, Types::Integer
67
- attribute :operator, Types::Integer
68
- attribute :use_proficiency_bonus, Types::Bool
69
- attribute :proficiency_bonus_operator, Types::Integer
70
- attribute :reset_dice, Types::Nil
71
-
72
- def self.from_dynamic!(d)
73
- d = Types::Hash[d]
74
- new(
75
- limited_use_name: d.fetch("name"),
76
- stat_modifier_uses_id: d.fetch("statModifierUsesId"),
77
- reset_type: d.fetch("resetType"),
78
- number_used: d.fetch("numberUsed"),
79
- min_number_consumed: d.fetch("minNumberConsumed"),
80
- max_number_consumed: d.fetch("maxNumberConsumed"),
81
- max_uses: d.fetch("maxUses"),
82
- operator: d.fetch("operator"),
83
- use_proficiency_bonus: d.fetch("useProficiencyBonus"),
84
- proficiency_bonus_operator: d.fetch("proficiencyBonusOperator"),
85
- reset_dice: d.fetch("resetDice"),
86
- )
87
- end
88
-
89
- def self.from_json!(json)
90
- from_dynamic!(JSON.parse(json))
91
- end
92
-
93
- def to_dynamic
94
- {
95
- "name" => limited_use_name,
96
- "statModifierUsesId" => stat_modifier_uses_id,
97
- "resetType" => reset_type,
98
- "numberUsed" => number_used,
99
- "minNumberConsumed" => min_number_consumed,
100
- "maxNumberConsumed" => max_number_consumed,
101
- "maxUses" => max_uses,
102
- "operator" => operator,
103
- "useProficiencyBonus" => use_proficiency_bonus,
104
- "proficiencyBonusOperator" => proficiency_bonus_operator,
105
- "resetDice" => reset_dice,
106
- }
107
- end
108
-
109
- def to_json(options = nil)
110
- JSON.generate(to_dynamic, options)
111
- end
112
- end
113
-
114
- class ClassRange < Dry::Struct
115
- attribute :range, Types::Nil
116
- attribute :long_range, Types::Nil
117
- attribute :aoe_type, Types::Nil
118
- attribute :aoe_size, Types::Nil
119
- attribute :has_aoe_special_description, Types::Bool
120
- attribute :minimum_range, Types::Nil
121
-
122
- def self.from_dynamic!(d)
123
- d = Types::Hash[d]
124
- new(
125
- range: d.fetch("range"),
126
- long_range: d.fetch("longRange"),
127
- aoe_type: d.fetch("aoeType"),
128
- aoe_size: d.fetch("aoeSize"),
129
- has_aoe_special_description: d.fetch("hasAoeSpecialDescription"),
130
- minimum_range: d.fetch("minimumRange"),
131
- )
132
- end
133
-
134
- def self.from_json!(json)
135
- from_dynamic!(JSON.parse(json))
136
- end
137
-
138
- def to_dynamic
139
- {
140
- "range" => range,
141
- "longRange" => long_range,
142
- "aoeType" => aoe_type,
143
- "aoeSize" => aoe_size,
144
- "hasAoeSpecialDescription" => has_aoe_special_description,
145
- "minimumRange" => minimum_range,
146
- }
147
- end
148
-
149
- def to_json(options = nil)
150
- JSON.generate(to_dynamic, options)
151
- end
152
- end
153
-
154
- class ActionsClass < Dry::Struct
155
- attribute :component_id, Types::Integer
156
- attribute :component_type_id, Types::Integer
157
- attribute :id, Types::String
158
- attribute :entity_type_id, Types::String
159
- attribute :limited_use, ClassLimitedUse.optional
160
- attribute :class_name, Types::String
161
- attribute :description, Types::String.optional
162
- attribute :snippet, Types::String
163
- attribute :ability_modifier_stat_id, Types::Nil
164
- attribute :on_miss_description, Types::String.optional
165
- attribute :save_fail_description, Types::String.optional
166
- attribute :save_success_description, Types::String.optional
167
- attribute :save_stat_id, Types::Nil
168
- attribute :fixed_save_dc, Types::Nil
169
- attribute :attack_type_range, Types::Nil
170
- attribute :action_type, Types::Integer
171
- attribute :attack_subtype, Types::Nil
172
- attribute :dice, Types::Nil
173
- attribute :value, Types::Nil
174
- attribute :damage_type_id, Types::Nil
175
- attribute :is_martial_arts, Types::Bool
176
- attribute :is_proficient, Types::Bool
177
- attribute :spell_range_type, Types::Nil
178
- attribute :display_as_attack, Types::Nil
179
- attribute :range, ClassRange
180
- attribute :activation, Activation
181
- attribute :number_of_targets, Types::Nil
182
- attribute :fixed_to_hit, Types::Nil
183
- attribute :ammunition, Types::Nil
184
-
185
- def self.from_dynamic!(d)
186
- d = Types::Hash[d]
187
- new(
188
- component_id: d.fetch("componentId"),
189
- component_type_id: d.fetch("componentTypeId"),
190
- id: d.fetch("id"),
191
- entity_type_id: d.fetch("entityTypeId"),
192
- limited_use: d.fetch("limitedUse") ? ClassLimitedUse.from_dynamic!(d.fetch("limitedUse")) : nil,
193
- class_name: d.fetch("name"),
194
- description: d.fetch("description"),
195
- snippet: d.fetch("snippet"),
196
- ability_modifier_stat_id: d.fetch("abilityModifierStatId"),
197
- on_miss_description: d.fetch("onMissDescription"),
198
- save_fail_description: d.fetch("saveFailDescription"),
199
- save_success_description: d.fetch("saveSuccessDescription"),
200
- save_stat_id: d.fetch("saveStatId"),
201
- fixed_save_dc: d.fetch("fixedSaveDc"),
202
- attack_type_range: d.fetch("attackTypeRange"),
203
- action_type: d.fetch("actionType"),
204
- attack_subtype: d.fetch("attackSubtype"),
205
- dice: d.fetch("dice"),
206
- value: d.fetch("value"),
207
- damage_type_id: d.fetch("damageTypeId"),
208
- is_martial_arts: d.fetch("isMartialArts"),
209
- is_proficient: d.fetch("isProficient"),
210
- spell_range_type: d.fetch("spellRangeType"),
211
- display_as_attack: d.fetch("displayAsAttack"),
212
- range: ClassRange.from_dynamic!(d.fetch("range")),
213
- activation: Activation.from_dynamic!(d.fetch("activation")),
214
- number_of_targets: d.fetch("numberOfTargets"),
215
- fixed_to_hit: d.fetch("fixedToHit"),
216
- ammunition: d.fetch("ammunition"),
217
- )
218
- end
219
-
220
- def self.from_json!(json)
221
- from_dynamic!(JSON.parse(json))
222
- end
223
-
224
- def to_dynamic
225
- {
226
- "componentId" => component_id,
227
- "componentTypeId" => component_type_id,
228
- "id" => id,
229
- "entityTypeId" => entity_type_id,
230
- "limitedUse" => limited_use&.to_dynamic,
231
- "name" => class_name,
232
- "description" => description,
233
- "snippet" => snippet,
234
- "abilityModifierStatId" => ability_modifier_stat_id,
235
- "onMissDescription" => on_miss_description,
236
- "saveFailDescription" => save_fail_description,
237
- "saveSuccessDescription" => save_success_description,
238
- "saveStatId" => save_stat_id,
239
- "fixedSaveDc" => fixed_save_dc,
240
- "attackTypeRange" => attack_type_range,
241
- "actionType" => action_type,
242
- "attackSubtype" => attack_subtype,
243
- "dice" => dice,
244
- "value" => value,
245
- "damageTypeId" => damage_type_id,
246
- "isMartialArts" => is_martial_arts,
247
- "isProficient" => is_proficient,
248
- "spellRangeType" => spell_range_type,
249
- "displayAsAttack" => display_as_attack,
250
- "range" => range.to_dynamic,
251
- "activation" => activation.to_dynamic,
252
- "numberOfTargets" => number_of_targets,
253
- "fixedToHit" => fixed_to_hit,
254
- "ammunition" => ammunition,
255
- }
256
- end
257
-
258
- def to_json(options = nil)
259
- JSON.generate(to_dynamic, options)
260
- end
261
- end
262
-
263
- class HigherLevelDefinition < Dry::Struct
264
- attribute :level, Types::Integer
265
- attribute :type_id, Types::Integer
266
- attribute :dice, Types::Nil
267
- attribute :value, Types::Integer
268
- attribute :details, Types::String
269
-
270
- def self.from_dynamic!(d)
271
- d = Types::Hash[d]
272
- new(
273
- level: d.fetch("level"),
274
- type_id: d.fetch("typeId"),
275
- dice: d.fetch("dice"),
276
- value: d.fetch("value"),
277
- details: d.fetch("details"),
278
- )
279
- end
280
-
281
- def self.from_json!(json)
282
- from_dynamic!(JSON.parse(json))
283
- end
284
-
285
- def to_dynamic
286
- {
287
- "level" => level,
288
- "typeId" => type_id,
289
- "dice" => dice,
290
- "value" => value,
291
- "details" => details,
292
- }
293
- end
294
-
295
- def to_json(options = nil)
296
- JSON.generate(to_dynamic, options)
297
- end
298
- end
299
-
300
- class AtHigherLevels < Dry::Struct
301
- attribute :higher_level_definitions, Types.Array(HigherLevelDefinition)
302
- attribute :additional_attacks, Types.Array(Types::Any)
303
- attribute :additional_targets, Types.Array(Types::Any)
304
- attribute :area_of_effect, Types.Array(Types::Any)
305
- attribute :duration, Types.Array(Types::Any)
306
- attribute :creatures, Types.Array(Types::Any)
307
- attribute :special, Types.Array(Types::Any)
308
- attribute :points, Types.Array(Types::Any)
309
- attribute :range, Types.Array(Types::Any)
310
-
311
- def self.from_dynamic!(d)
312
- d = Types::Hash[d]
313
- new(
314
- higher_level_definitions: d.fetch("higherLevelDefinitions").map { |x| HigherLevelDefinition.from_dynamic!(x) },
315
- additional_attacks: d.fetch("additionalAttacks"),
316
- additional_targets: d.fetch("additionalTargets"),
317
- area_of_effect: d.fetch("areaOfEffect"),
318
- duration: d.fetch("duration"),
319
- creatures: d.fetch("creatures"),
320
- special: d.fetch("special"),
321
- points: d.fetch("points"),
322
- range: d.fetch("range"),
323
- )
324
- end
325
-
326
- def self.from_json!(json)
327
- from_dynamic!(JSON.parse(json))
328
- end
329
-
330
- def to_dynamic
331
- {
332
- "higherLevelDefinitions" => higher_level_definitions.map { |x| x.to_dynamic },
333
- "additionalAttacks" => additional_attacks,
334
- "additionalTargets" => additional_targets,
335
- "areaOfEffect" => area_of_effect,
336
- "duration" => duration,
337
- "creatures" => creatures,
338
- "special" => special,
339
- "points" => points,
340
- "range" => range,
341
- }
342
- end
343
-
344
- def to_json(options = nil)
345
- JSON.generate(to_dynamic, options)
346
- end
347
- end
348
-
349
- module Restriction
350
- Concentration = "Concentration"
351
- Empty = ""
352
- end
353
-
354
- class DefinitionDuration < Dry::Struct
355
- attribute :duration_interval, Types::Integer
356
- attribute :duration_unit, Types::String
357
- attribute :duration_type, Types::Restriction
358
-
359
- def self.from_dynamic!(d)
360
- d = Types::Hash[d]
361
- new(
362
- duration_interval: d.fetch("durationInterval"),
363
- duration_unit: d.fetch("durationUnit"),
364
- duration_type: d.fetch("durationType"),
365
- )
366
- end
367
-
368
- def self.from_json!(json)
369
- from_dynamic!(JSON.parse(json))
370
- end
371
-
372
- def to_dynamic
373
- {
374
- "durationInterval" => duration_interval,
375
- "durationUnit" => duration_unit,
376
- "durationType" => duration_type,
377
- }
378
- end
379
-
380
- def to_json(options = nil)
381
- JSON.generate(to_dynamic, options)
382
- end
383
- end
384
-
385
- class Die < Dry::Struct
386
- attribute :dice_count, Types::Integer.optional
387
- attribute :dice_value, Types::Integer.optional
388
- attribute :dice_multiplier, Types::Integer.optional
389
- attribute :fixed_value, Types::Integer.optional
390
- attribute :dice_string, Types::String.optional
391
-
392
- def self.from_dynamic!(d)
393
- d = Types::Hash[d]
394
- new(
395
- dice_count: d.fetch("diceCount"),
396
- dice_value: d.fetch("diceValue"),
397
- dice_multiplier: d.fetch("diceMultiplier"),
398
- fixed_value: d.fetch("fixedValue"),
399
- dice_string: d.fetch("diceString"),
400
- )
401
- end
402
-
403
- def self.from_json!(json)
404
- from_dynamic!(JSON.parse(json))
405
- end
406
-
407
- def to_dynamic
408
- {
409
- "diceCount" => dice_count,
410
- "diceValue" => dice_value,
411
- "diceMultiplier" => dice_multiplier,
412
- "fixedValue" => fixed_value,
413
- "diceString" => dice_string,
414
- }
415
- end
416
-
417
- def to_json(options = nil)
418
- JSON.generate(to_dynamic, options)
419
- end
420
- end
421
-
422
- class BackgroundDuration < Dry::Struct
423
- attribute :duration_interval, Types::Integer
424
- attribute :duration_unit, Types::String
425
-
426
- def self.from_dynamic!(d)
427
- d = Types::Hash[d]
428
- new(
429
- duration_interval: d.fetch("durationInterval"),
430
- duration_unit: d.fetch("durationUnit"),
431
- )
432
- end
433
-
434
- def self.from_json!(json)
435
- from_dynamic!(JSON.parse(json))
436
- end
437
-
438
- def to_dynamic
439
- {
440
- "durationInterval" => duration_interval,
441
- "durationUnit" => duration_unit,
442
- }
443
- end
444
-
445
- def to_json(options = nil)
446
- JSON.generate(to_dynamic, options)
447
- end
448
- end
449
-
450
- class ItemElement < Dry::Struct
451
- attribute :fixed_value, Types::Integer.optional
452
- attribute :id, Types::String
453
- attribute :entity_id, Types::Integer.optional
454
- attribute :entity_type_id, Types::Integer.optional
455
- attribute :background_type, Types::String
456
- attribute :sub_type, Types::String
457
- attribute :dice, Die.optional
458
- attribute :restriction, Types::Restriction.optional
459
- attribute :stat_id, Types::Nil
460
- attribute :requires_attunement, Types::Bool
461
- attribute :duration, BackgroundDuration.optional
462
- attribute :friendly_type_name, Types::String
463
- attribute :friendly_subtype_name, Types::String
464
- attribute :is_granted, Types::Bool
465
- attribute :bonus_types, Types.Array(Types::Any)
466
- attribute :value, Types::Integer.optional
467
- attribute :available_to_multiclass, Types::Bool.optional
468
- attribute :modifier_type_id, Types::Integer
469
- attribute :modifier_sub_type_id, Types::Integer
470
- attribute :component_id, Types::Integer
471
- attribute :component_type_id, Types::Integer
472
- attribute :die, Die.optional
473
- attribute :count, Types::Integer.optional
474
- attribute :duration_unit, Types::Nil.optional
475
- attribute :use_primary_stat, Types::Bool.optional
476
- attribute :at_higher_levels, AtHigherLevels.optional
477
-
478
- def self.from_dynamic!(d)
479
- d = Types::Hash[d]
480
- new(
481
- fixed_value: d.fetch("fixedValue"),
482
- id: d.fetch("id"),
483
- entity_id: d.fetch("entityId"),
484
- entity_type_id: d.fetch("entityTypeId"),
485
- background_type: d.fetch("type"),
486
- sub_type: d.fetch("subType"),
487
- dice: d.fetch("dice") ? Die.from_dynamic!(d.fetch("dice")) : nil,
488
- restriction: d.fetch("restriction"),
489
- stat_id: d.fetch("statId"),
490
- requires_attunement: d.fetch("requiresAttunement"),
491
- duration: d.fetch("duration") ? BackgroundDuration.from_dynamic!(d.fetch("duration")) : nil,
492
- friendly_type_name: d.fetch("friendlyTypeName"),
493
- friendly_subtype_name: d.fetch("friendlySubtypeName"),
494
- is_granted: d.fetch("isGranted"),
495
- bonus_types: d.fetch("bonusTypes"),
496
- value: d.fetch("value"),
497
- available_to_multiclass: d.fetch("availableToMulticlass"),
498
- modifier_type_id: d.fetch("modifierTypeId"),
499
- modifier_sub_type_id: d.fetch("modifierSubTypeId"),
500
- component_id: d.fetch("componentId"),
501
- component_type_id: d.fetch("componentTypeId"),
502
- die: d["die"] ? Die.from_dynamic!(d["die"]) : nil,
503
- count: d["count"],
504
- duration_unit: d["durationUnit"],
505
- use_primary_stat: d["usePrimaryStat"],
506
- at_higher_levels: d["atHigherLevels"] ? AtHigherLevels.from_dynamic!(d["atHigherLevels"]) : nil,
507
- )
508
- end
509
-
510
- def self.from_json!(json)
511
- from_dynamic!(JSON.parse(json))
512
- end
513
-
514
- def to_dynamic
515
- {
516
- "fixedValue" => fixed_value,
517
- "id" => id,
518
- "entityId" => entity_id,
519
- "entityTypeId" => entity_type_id,
520
- "type" => background_type,
521
- "subType" => sub_type,
522
- "dice" => dice&.to_dynamic,
523
- "restriction" => restriction,
524
- "statId" => stat_id,
525
- "requiresAttunement" => requires_attunement,
526
- "duration" => duration&.to_dynamic,
527
- "friendlyTypeName" => friendly_type_name,
528
- "friendlySubtypeName" => friendly_subtype_name,
529
- "isGranted" => is_granted,
530
- "bonusTypes" => bonus_types,
531
- "value" => value,
532
- "availableToMulticlass" => available_to_multiclass,
533
- "modifierTypeId" => modifier_type_id,
534
- "modifierSubTypeId" => modifier_sub_type_id,
535
- "componentId" => component_id,
536
- "componentTypeId" => component_type_id,
537
- "die" => die&.to_dynamic,
538
- "count" => count,
539
- "durationUnit" => duration_unit,
540
- "usePrimaryStat" => use_primary_stat,
541
- "atHigherLevels" => at_higher_levels&.to_dynamic,
542
- }
543
- end
544
-
545
- def to_json(options = nil)
546
- JSON.generate(to_dynamic, options)
547
- end
548
- end
549
-
550
- class DefinitionRange < Dry::Struct
551
- attribute :origin, Types::String
552
- attribute :range_value, Types::Integer
553
- attribute :aoe_type, Types::Nil
554
- attribute :aoe_value, Types::Nil
555
-
556
- def self.from_dynamic!(d)
557
- d = Types::Hash[d]
558
- new(
559
- origin: d.fetch("origin"),
560
- range_value: d.fetch("rangeValue"),
561
- aoe_type: d.fetch("aoeType"),
562
- aoe_value: d.fetch("aoeValue"),
563
- )
564
- end
565
-
566
- def self.from_json!(json)
567
- from_dynamic!(JSON.parse(json))
568
- end
569
-
570
- def to_dynamic
571
- {
572
- "origin" => origin,
573
- "rangeValue" => range_value,
574
- "aoeType" => aoe_type,
575
- "aoeValue" => aoe_value,
576
- }
577
- end
578
-
579
- def to_json(options = nil)
580
- JSON.generate(to_dynamic, options)
581
- end
582
- end
583
-
584
- class Source < Dry::Struct
585
- attribute :source_id, Types::Integer
586
- attribute :page_number, Types::Integer.optional
587
- attribute :source_type, Types::Integer
588
-
589
- def self.from_dynamic!(d)
590
- d = Types::Hash[d]
591
- new(
592
- source_id: d.fetch("sourceId"),
593
- page_number: d.fetch("pageNumber"),
594
- source_type: d.fetch("sourceType"),
595
- )
596
- end
597
-
598
- def self.from_json!(json)
599
- from_dynamic!(JSON.parse(json))
600
- end
601
-
602
- def to_dynamic
603
- {
604
- "sourceId" => source_id,
605
- "pageNumber" => page_number,
606
- "sourceType" => source_type,
607
- }
608
- end
609
-
610
- def to_json(options = nil)
611
- JSON.generate(to_dynamic, options)
612
- end
613
- end
614
-
615
- class ItemDefinition < Dry::Struct
616
- attribute :id, Types::Integer
617
- attribute :definition_key, Types::String
618
- attribute :definition_name, Types::String
619
- attribute :level, Types::Integer
620
- attribute :school, Types::String
621
- attribute :duration, DefinitionDuration
622
- attribute :activation, Activation
623
- attribute :range, DefinitionRange
624
- attribute :as_part_of_weapon_attack, Types::Bool
625
- attribute :description, Types::String
626
- attribute :snippet, Types::String
627
- attribute :concentration, Types::Bool
628
- attribute :ritual, Types::Bool
629
- attribute :range_area, Types::Nil
630
- attribute :damage_effect, Types::Nil
631
- attribute :components, Types.Array(Types::Integer)
632
- attribute :components_description, Types::String
633
- attribute :save_dc_ability_id, Types::Nil
634
- attribute :healing, Types::Nil
635
- attribute :healing_dice, Types.Array(Types::Any)
636
- attribute :temp_hp_dice, Types.Array(Types::Any)
637
- attribute :attack_type, Types::Nil
638
- attribute :can_cast_at_higher_level, Types::Bool
639
- attribute :is_homebrew, Types::Bool
640
- attribute :version, Types::Nil
641
- attribute :source_id, Types::Nil
642
- attribute :source_page_number, Types::Integer
643
- attribute :requires_saving_throw, Types::Bool
644
- attribute :requires_attack_roll, Types::Bool
645
- attribute :at_higher_levels, AtHigherLevels
646
- attribute :modifiers, Types.Array(ItemElement)
647
- attribute :conditions, Types.Array(Types::Any)
648
- attribute :tags, Types.Array(Types::String)
649
- attribute :casting_time_description, Types::String
650
- attribute :scale_type, Types::String
651
- attribute :sources, Types.Array(Source)
652
- attribute :spell_groups, Types.Array(Types::Any)
653
-
654
- def self.from_dynamic!(d)
655
- d = Types::Hash[d]
656
- new(
657
- id: d.fetch("id"),
658
- definition_key: d.fetch("definitionKey"),
659
- definition_name: d.fetch("name"),
660
- level: d.fetch("level"),
661
- school: d.fetch("school"),
662
- duration: DefinitionDuration.from_dynamic!(d.fetch("duration")),
663
- activation: Activation.from_dynamic!(d.fetch("activation")),
664
- range: DefinitionRange.from_dynamic!(d.fetch("range")),
665
- as_part_of_weapon_attack: d.fetch("asPartOfWeaponAttack"),
666
- description: d.fetch("description"),
667
- snippet: d.fetch("snippet"),
668
- concentration: d.fetch("concentration"),
669
- ritual: d.fetch("ritual"),
670
- range_area: d.fetch("rangeArea"),
671
- damage_effect: d.fetch("damageEffect"),
672
- components: d.fetch("components"),
673
- components_description: d.fetch("componentsDescription"),
674
- save_dc_ability_id: d.fetch("saveDcAbilityId"),
675
- healing: d.fetch("healing"),
676
- healing_dice: d.fetch("healingDice"),
677
- temp_hp_dice: d.fetch("tempHpDice"),
678
- attack_type: d.fetch("attackType"),
679
- can_cast_at_higher_level: d.fetch("canCastAtHigherLevel"),
680
- is_homebrew: d.fetch("isHomebrew"),
681
- version: d.fetch("version"),
682
- source_id: d.fetch("sourceId"),
683
- source_page_number: d.fetch("sourcePageNumber"),
684
- requires_saving_throw: d.fetch("requiresSavingThrow"),
685
- requires_attack_roll: d.fetch("requiresAttackRoll"),
686
- at_higher_levels: AtHigherLevels.from_dynamic!(d.fetch("atHigherLevels")),
687
- modifiers: d.fetch("modifiers").map { |x| ItemElement.from_dynamic!(x) },
688
- conditions: d.fetch("conditions"),
689
- tags: d.fetch("tags"),
690
- casting_time_description: d.fetch("castingTimeDescription"),
691
- scale_type: d.fetch("scaleType"),
692
- sources: d.fetch("sources").map { |x| Source.from_dynamic!(x) },
693
- spell_groups: d.fetch("spellGroups"),
694
- )
695
- end
696
-
697
- def self.from_json!(json)
698
- from_dynamic!(JSON.parse(json))
699
- end
700
-
701
- def to_dynamic
702
- {
703
- "id" => id,
704
- "definitionKey" => definition_key,
705
- "name" => definition_name,
706
- "level" => level,
707
- "school" => school,
708
- "duration" => duration.to_dynamic,
709
- "activation" => activation.to_dynamic,
710
- "range" => range.to_dynamic,
711
- "asPartOfWeaponAttack" => as_part_of_weapon_attack,
712
- "description" => description,
713
- "snippet" => snippet,
714
- "concentration" => concentration,
715
- "ritual" => ritual,
716
- "rangeArea" => range_area,
717
- "damageEffect" => damage_effect,
718
- "components" => components,
719
- "componentsDescription" => components_description,
720
- "saveDcAbilityId" => save_dc_ability_id,
721
- "healing" => healing,
722
- "healingDice" => healing_dice,
723
- "tempHpDice" => temp_hp_dice,
724
- "attackType" => attack_type,
725
- "canCastAtHigherLevel" => can_cast_at_higher_level,
726
- "isHomebrew" => is_homebrew,
727
- "version" => version,
728
- "sourceId" => source_id,
729
- "sourcePageNumber" => source_page_number,
730
- "requiresSavingThrow" => requires_saving_throw,
731
- "requiresAttackRoll" => requires_attack_roll,
732
- "atHigherLevels" => at_higher_levels.to_dynamic,
733
- "modifiers" => modifiers.map { |x| x.to_dynamic },
734
- "conditions" => conditions,
735
- "tags" => tags,
736
- "castingTimeDescription" => casting_time_description,
737
- "scaleType" => scale_type,
738
- "sources" => sources.map { |x| x.to_dynamic },
739
- "spellGroups" => spell_groups,
740
- }
741
- end
742
-
743
- def to_json(options = nil)
744
- JSON.generate(to_dynamic, options)
745
- end
746
- end
747
-
748
- class Item < Dry::Struct
749
- attribute :override_save_dc, Types::Nil
750
- attribute :limited_use, Types::Nil
751
- attribute :id, Types::Integer
752
- attribute :entity_type_id, Types::Integer
753
- attribute :definition, ItemDefinition
754
- attribute :definition_id, Types::Integer
755
- attribute :prepared, Types::Bool
756
- attribute :counts_as_known_spell, Types::Nil
757
- attribute :uses_spell_slot, Types::Bool
758
- attribute :cast_at_level, Types::Nil
759
- attribute :always_prepared, Types::Bool
760
- attribute :restriction, Types::Nil
761
- attribute :spell_casting_ability_id, Types::Nil
762
- attribute :display_as_attack, Types::Bool
763
- attribute :additional_description, Types::Nil
764
- attribute :cast_only_as_ritual, Types::Bool
765
- attribute :ritual_casting_type, Types::Nil
766
- attribute :range, DefinitionRange
767
- attribute :activation, Activation
768
- attribute :base_level_at_will, Types::Bool
769
- attribute :at_will_limited_use_level, Types::Nil
770
- attribute :is_signature_spell, Types::Nil
771
- attribute :component_id, Types::Integer
772
- attribute :component_type_id, Types::Integer
773
- attribute :spell_list_id, Types::Nil
774
-
775
- def self.from_dynamic!(d)
776
- d = Types::Hash[d]
777
- new(
778
- override_save_dc: d.fetch("overrideSaveDc"),
779
- limited_use: d.fetch("limitedUse"),
780
- id: d.fetch("id"),
781
- entity_type_id: d.fetch("entityTypeId"),
782
- definition: ItemDefinition.from_dynamic!(d.fetch("definition")),
783
- definition_id: d.fetch("definitionId"),
784
- prepared: d.fetch("prepared"),
785
- counts_as_known_spell: d.fetch("countsAsKnownSpell"),
786
- uses_spell_slot: d.fetch("usesSpellSlot"),
787
- cast_at_level: d.fetch("castAtLevel"),
788
- always_prepared: d.fetch("alwaysPrepared"),
789
- restriction: d.fetch("restriction"),
790
- spell_casting_ability_id: d.fetch("spellCastingAbilityId"),
791
- display_as_attack: d.fetch("displayAsAttack"),
792
- additional_description: d.fetch("additionalDescription"),
793
- cast_only_as_ritual: d.fetch("castOnlyAsRitual"),
794
- ritual_casting_type: d.fetch("ritualCastingType"),
795
- range: DefinitionRange.from_dynamic!(d.fetch("range")),
796
- activation: Activation.from_dynamic!(d.fetch("activation")),
797
- base_level_at_will: d.fetch("baseLevelAtWill"),
798
- at_will_limited_use_level: d.fetch("atWillLimitedUseLevel"),
799
- is_signature_spell: d.fetch("isSignatureSpell"),
800
- component_id: d.fetch("componentId"),
801
- component_type_id: d.fetch("componentTypeId"),
802
- spell_list_id: d.fetch("spellListId"),
803
- )
804
- end
805
-
806
- def self.from_json!(json)
807
- from_dynamic!(JSON.parse(json))
808
- end
809
-
810
- def to_dynamic
811
- {
812
- "overrideSaveDc" => override_save_dc,
813
- "limitedUse" => limited_use,
814
- "id" => id,
815
- "entityTypeId" => entity_type_id,
816
- "definition" => definition.to_dynamic,
817
- "definitionId" => definition_id,
818
- "prepared" => prepared,
819
- "countsAsKnownSpell" => counts_as_known_spell,
820
- "usesSpellSlot" => uses_spell_slot,
821
- "castAtLevel" => cast_at_level,
822
- "alwaysPrepared" => always_prepared,
823
- "restriction" => restriction,
824
- "spellCastingAbilityId" => spell_casting_ability_id,
825
- "displayAsAttack" => display_as_attack,
826
- "additionalDescription" => additional_description,
827
- "castOnlyAsRitual" => cast_only_as_ritual,
828
- "ritualCastingType" => ritual_casting_type,
829
- "range" => range.to_dynamic,
830
- "activation" => activation.to_dynamic,
831
- "baseLevelAtWill" => base_level_at_will,
832
- "atWillLimitedUseLevel" => at_will_limited_use_level,
833
- "isSignatureSpell" => is_signature_spell,
834
- "componentId" => component_id,
835
- "componentTypeId" => component_type_id,
836
- "spellListId" => spell_list_id,
837
- }
838
- end
839
-
840
- def to_json(options = nil)
841
- JSON.generate(to_dynamic, options)
842
- end
843
- end
844
-
845
- class Actions < Dry::Struct
846
- attribute :race, Types.Array(Types::Any)
847
- attribute :actions_class, Types.Array(ActionsClass)
848
- attribute :background, Types::Nil
849
- attribute :item, Types.Array(Item).optional
850
- attribute :feat, Types.Array(Types::Any)
851
-
852
- def self.from_dynamic!(d)
853
- d = Types::Hash[d]
854
- new(
855
- race: d.fetch("race"),
856
- actions_class: d.fetch("class").map { |x| ActionsClass.from_dynamic!(x) },
857
- background: d.fetch("background"),
858
- item: d.fetch("item")&.map { |x| Item.from_dynamic!(x) },
859
- feat: d.fetch("feat"),
860
- )
861
- end
862
-
863
- def self.from_json!(json)
864
- from_dynamic!(JSON.parse(json))
865
- end
866
-
867
- def to_dynamic
868
- {
869
- "race" => race,
870
- "class" => actions_class.map { |x| x.to_dynamic },
871
- "background" => background,
872
- "item" => item&.map { |x| x.to_dynamic },
873
- "feat" => feat,
874
- }
875
- end
876
-
877
- def to_json(options = nil)
878
- JSON.generate(to_dynamic, options)
879
- end
880
- end
881
-
882
- class CustomBackground < Dry::Struct
883
- attribute :id, Types::Integer
884
- attribute :entity_type_id, Types::Integer
885
- attribute :custom_background_name, Types::Nil
886
- attribute :description, Types::Nil
887
- attribute :features_background, Types::Nil
888
- attribute :characteristics_background, Types::Nil
889
- attribute :features_background_definition_id, Types::Nil
890
- attribute :characteristics_background_definition_id, Types::Nil
891
- attribute :background_type, Types::Nil
892
-
893
- def self.from_dynamic!(d)
894
- d = Types::Hash[d]
895
- new(
896
- id: d.fetch("id"),
897
- entity_type_id: d.fetch("entityTypeId"),
898
- custom_background_name: d.fetch("name"),
899
- description: d.fetch("description"),
900
- features_background: d.fetch("featuresBackground"),
901
- characteristics_background: d.fetch("characteristicsBackground"),
902
- features_background_definition_id: d.fetch("featuresBackgroundDefinitionId"),
903
- characteristics_background_definition_id: d.fetch("characteristicsBackgroundDefinitionId"),
904
- background_type: d.fetch("backgroundType"),
905
- )
906
- end
907
-
908
- def self.from_json!(json)
909
- from_dynamic!(JSON.parse(json))
910
- end
911
-
912
- def to_dynamic
913
- {
914
- "id" => id,
915
- "entityTypeId" => entity_type_id,
916
- "name" => custom_background_name,
917
- "description" => description,
918
- "featuresBackground" => features_background,
919
- "characteristicsBackground" => characteristics_background,
920
- "featuresBackgroundDefinitionId" => features_background_definition_id,
921
- "characteristicsBackgroundDefinitionId" => characteristics_background_definition_id,
922
- "backgroundType" => background_type,
923
- }
924
- end
925
-
926
- def to_json(options = nil)
927
- JSON.generate(to_dynamic, options)
928
- end
929
- end
930
-
931
- class Bond < Dry::Struct
932
- attribute :id, Types::Integer
933
- attribute :description, Types::String
934
- attribute :dice_roll, Types::Integer
935
-
936
- def self.from_dynamic!(d)
937
- d = Types::Hash[d]
938
- new(
939
- id: d.fetch("id"),
940
- description: d.fetch("description"),
941
- dice_roll: d.fetch("diceRoll"),
942
- )
943
- end
944
-
945
- def self.from_json!(json)
946
- from_dynamic!(JSON.parse(json))
947
- end
948
-
949
- def to_dynamic
950
- {
951
- "id" => id,
952
- "description" => description,
953
- "diceRoll" => dice_roll,
954
- }
955
- end
956
-
957
- def to_json(options = nil)
958
- JSON.generate(to_dynamic, options)
959
- end
960
- end
961
-
962
- class BackgroundDefinition < Dry::Struct
963
- attribute :id, Types::Integer
964
- attribute :entity_type_id, Types::Integer
965
- attribute :definition_key, Types::String
966
- attribute :definition_name, Types::String
967
- attribute :description, Types::String
968
- attribute :snippet, Types::String
969
- attribute :short_description, Types::String
970
- attribute :skill_proficiencies_description, Types::String
971
- attribute :tool_proficiencies_description, Types::String
972
- attribute :languages_description, Types::String
973
- attribute :equipment_description, Types::String
974
- attribute :feature_name, Types::String
975
- attribute :feature_description, Types::String
976
- attribute :avatar_url, Types::Nil
977
- attribute :large_avatar_url, Types::Nil
978
- attribute :suggested_characteristics_description, Types::String
979
- attribute :suggested_proficiencies, Types::Nil
980
- attribute :suggested_languages, Types::Nil
981
- attribute :organization, Types::Nil
982
- attribute :contracts_description, Types::String
983
- attribute :spells_pre_description, Types::String
984
- attribute :spells_post_description, Types::String
985
- attribute :personality_traits, Types.Array(Bond)
986
- attribute :ideals, Types.Array(Bond)
987
- attribute :bonds, Types.Array(Bond)
988
- attribute :flaws, Types.Array(Bond)
989
- attribute :is_homebrew, Types::Bool
990
- attribute :sources, Types.Array(Source)
991
- attribute :spell_list_ids, Types.Array(Types::Any)
992
- attribute :feat_list, Types::Nil
993
-
994
- def self.from_dynamic!(d)
995
- d = Types::Hash[d]
996
- new(
997
- id: d.fetch("id"),
998
- entity_type_id: d.fetch("entityTypeId"),
999
- definition_key: d.fetch("definitionKey"),
1000
- definition_name: d.fetch("name"),
1001
- description: d.fetch("description"),
1002
- snippet: d.fetch("snippet"),
1003
- short_description: d.fetch("shortDescription"),
1004
- skill_proficiencies_description: d.fetch("skillProficienciesDescription"),
1005
- tool_proficiencies_description: d.fetch("toolProficienciesDescription"),
1006
- languages_description: d.fetch("languagesDescription"),
1007
- equipment_description: d.fetch("equipmentDescription"),
1008
- feature_name: d.fetch("featureName"),
1009
- feature_description: d.fetch("featureDescription"),
1010
- avatar_url: d.fetch("avatarUrl"),
1011
- large_avatar_url: d.fetch("largeAvatarUrl"),
1012
- suggested_characteristics_description: d.fetch("suggestedCharacteristicsDescription"),
1013
- suggested_proficiencies: d.fetch("suggestedProficiencies"),
1014
- suggested_languages: d.fetch("suggestedLanguages"),
1015
- organization: d.fetch("organization"),
1016
- contracts_description: d.fetch("contractsDescription"),
1017
- spells_pre_description: d.fetch("spellsPreDescription"),
1018
- spells_post_description: d.fetch("spellsPostDescription"),
1019
- personality_traits: d.fetch("personalityTraits").map { |x| Bond.from_dynamic!(x) },
1020
- ideals: d.fetch("ideals").map { |x| Bond.from_dynamic!(x) },
1021
- bonds: d.fetch("bonds").map { |x| Bond.from_dynamic!(x) },
1022
- flaws: d.fetch("flaws").map { |x| Bond.from_dynamic!(x) },
1023
- is_homebrew: d.fetch("isHomebrew"),
1024
- sources: d.fetch("sources").map { |x| Source.from_dynamic!(x) },
1025
- spell_list_ids: d.fetch("spellListIds"),
1026
- feat_list: d.fetch("featList"),
1027
- )
1028
- end
1029
-
1030
- def self.from_json!(json)
1031
- from_dynamic!(JSON.parse(json))
1032
- end
1033
-
1034
- def to_dynamic
1035
- {
1036
- "id" => id,
1037
- "entityTypeId" => entity_type_id,
1038
- "definitionKey" => definition_key,
1039
- "name" => definition_name,
1040
- "description" => description,
1041
- "snippet" => snippet,
1042
- "shortDescription" => short_description,
1043
- "skillProficienciesDescription" => skill_proficiencies_description,
1044
- "toolProficienciesDescription" => tool_proficiencies_description,
1045
- "languagesDescription" => languages_description,
1046
- "equipmentDescription" => equipment_description,
1047
- "featureName" => feature_name,
1048
- "featureDescription" => feature_description,
1049
- "avatarUrl" => avatar_url,
1050
- "largeAvatarUrl" => large_avatar_url,
1051
- "suggestedCharacteristicsDescription" => suggested_characteristics_description,
1052
- "suggestedProficiencies" => suggested_proficiencies,
1053
- "suggestedLanguages" => suggested_languages,
1054
- "organization" => organization,
1055
- "contractsDescription" => contracts_description,
1056
- "spellsPreDescription" => spells_pre_description,
1057
- "spellsPostDescription" => spells_post_description,
1058
- "personalityTraits" => personality_traits.map { |x| x.to_dynamic },
1059
- "ideals" => ideals.map { |x| x.to_dynamic },
1060
- "bonds" => bonds.map { |x| x.to_dynamic },
1061
- "flaws" => flaws.map { |x| x.to_dynamic },
1062
- "isHomebrew" => is_homebrew,
1063
- "sources" => sources.map { |x| x.to_dynamic },
1064
- "spellListIds" => spell_list_ids,
1065
- "featList" => feat_list,
1066
- }
1067
- end
1068
-
1069
- def to_json(options = nil)
1070
- JSON.generate(to_dynamic, options)
1071
- end
1072
- end
1073
-
1074
- class CharacterBackground < Dry::Struct
1075
- attribute :has_custom_background, Types::Bool
1076
- attribute :definition, BackgroundDefinition
1077
- attribute :definition_id, Types::Nil
1078
- attribute :custom_background, CustomBackground
1079
-
1080
- def self.from_dynamic!(d)
1081
- d = Types::Hash[d]
1082
- new(
1083
- has_custom_background: d.fetch("hasCustomBackground"),
1084
- definition: BackgroundDefinition.from_dynamic!(d.fetch("definition")),
1085
- definition_id: d.fetch("definitionId"),
1086
- custom_background: CustomBackground.from_dynamic!(d.fetch("customBackground")),
1087
- )
1088
- end
1089
-
1090
- def self.from_json!(json)
1091
- from_dynamic!(JSON.parse(json))
1092
- end
1093
-
1094
- def to_dynamic
1095
- {
1096
- "hasCustomBackground" => has_custom_background,
1097
- "definition" => definition.to_dynamic,
1098
- "definitionId" => definition_id,
1099
- "customBackground" => custom_background.to_dynamic,
1100
- }
1101
- end
1102
-
1103
- def to_json(options = nil)
1104
- JSON.generate(to_dynamic, options)
1105
- end
1106
- end
1107
-
1108
- class Stat < Dry::Struct
1109
- attribute :id, Types::Integer
1110
- attribute :stat_name, Types::Nil
1111
- attribute :value, Types::Integer.optional
1112
-
1113
- def self.from_dynamic!(d)
1114
- d = Types::Hash[d]
1115
- new(
1116
- id: d.fetch("id"),
1117
- stat_name: d.fetch("name"),
1118
- value: d.fetch("value"),
1119
- )
1120
- end
1121
-
1122
- def self.from_json!(json)
1123
- from_dynamic!(JSON.parse(json))
1124
- end
1125
-
1126
- def to_dynamic
1127
- {
1128
- "id" => id,
1129
- "name" => stat_name,
1130
- "value" => value,
1131
- }
1132
- end
1133
-
1134
- def to_json(options = nil)
1135
- JSON.generate(to_dynamic, options)
1136
- end
1137
- end
1138
-
1139
- class CharacterElement < Dry::Struct
1140
- attribute :user_id, Types::Integer
1141
- attribute :username, Types::String
1142
- attribute :character_id, Types::Integer
1143
- attribute :character_name, Types::String
1144
- attribute :character_url, Types::String
1145
- attribute :avatar_url, Types::String.optional
1146
- attribute :privacy_type, Types::Integer
1147
- attribute :campaign_id, Types::Nil
1148
- attribute :is_assigned, Types::Bool
1149
-
1150
- def self.from_dynamic!(d)
1151
- d = Types::Hash[d]
1152
- new(
1153
- user_id: d.fetch("userId"),
1154
- username: d.fetch("username"),
1155
- character_id: d.fetch("characterId"),
1156
- character_name: d.fetch("characterName"),
1157
- character_url: d.fetch("characterUrl"),
1158
- avatar_url: d.fetch("avatarUrl"),
1159
- privacy_type: d.fetch("privacyType"),
1160
- campaign_id: d.fetch("campaignId"),
1161
- is_assigned: d.fetch("isAssigned"),
1162
- )
1163
- end
1164
-
1165
- def self.from_json!(json)
1166
- from_dynamic!(JSON.parse(json))
1167
- end
1168
-
1169
- def to_dynamic
1170
- {
1171
- "userId" => user_id,
1172
- "username" => username,
1173
- "characterId" => character_id,
1174
- "characterName" => character_name,
1175
- "characterUrl" => character_url,
1176
- "avatarUrl" => avatar_url,
1177
- "privacyType" => privacy_type,
1178
- "campaignId" => campaign_id,
1179
- "isAssigned" => is_assigned,
1180
- }
1181
- end
1182
-
1183
- def to_json(options = nil)
1184
- JSON.generate(to_dynamic, options)
1185
- end
1186
- end
1187
-
1188
- class Campaign < Dry::Struct
1189
- attribute :id, Types::Integer
1190
- attribute :campaign_name, Types::String
1191
- attribute :description, Types::String
1192
- attribute :link, Types::String
1193
- attribute :public_notes, Types::String
1194
- attribute :dm_user_id, Types::Integer
1195
- attribute :dm_username, Types::String
1196
- attribute :characters, Types.Array(CharacterElement)
1197
-
1198
- def self.from_dynamic!(d)
1199
- d = Types::Hash[d]
1200
- new(
1201
- id: d.fetch("id"),
1202
- campaign_name: d.fetch("name"),
1203
- description: d.fetch("description"),
1204
- link: d.fetch("link"),
1205
- public_notes: d.fetch("publicNotes"),
1206
- dm_user_id: d.fetch("dmUserId"),
1207
- dm_username: d.fetch("dmUsername"),
1208
- characters: d.fetch("characters").map { |x| CharacterElement.from_dynamic!(x) },
1209
- )
1210
- end
1211
-
1212
- def self.from_json!(json)
1213
- from_dynamic!(JSON.parse(json))
1214
- end
1215
-
1216
- def to_dynamic
1217
- {
1218
- "id" => id,
1219
- "name" => campaign_name,
1220
- "description" => description,
1221
- "link" => link,
1222
- "publicNotes" => public_notes,
1223
- "dmUserId" => dm_user_id,
1224
- "dmUsername" => dm_username,
1225
- "characters" => characters.map { |x| x.to_dynamic },
1226
- }
1227
- end
1228
-
1229
- def to_json(options = nil)
1230
- JSON.generate(to_dynamic, options)
1231
- end
1232
- end
1233
-
1234
- class Definition1 < Dry::Struct
1235
- attribute :id, Types::Integer
1236
- attribute :entity_type_id, Types::Integer
1237
- attribute :definition_name, Types::String
1238
- attribute :description, Types::String
1239
- attribute :snippet, Types::String
1240
- attribute :activation, Types::Nil
1241
- attribute :source_id, Types::Integer
1242
- attribute :source_page_number, Types::Nil
1243
- attribute :creature_rules, Types.Array(Types::Any)
1244
- attribute :spell_list_ids, Types.Array(Types::Any)
1245
-
1246
- def self.from_dynamic!(d)
1247
- d = Types::Hash[d]
1248
- new(
1249
- id: d.fetch("id"),
1250
- entity_type_id: d.fetch("entityTypeId"),
1251
- definition_name: d.fetch("name"),
1252
- description: d.fetch("description"),
1253
- snippet: d.fetch("snippet"),
1254
- activation: d.fetch("activation"),
1255
- source_id: d.fetch("sourceId"),
1256
- source_page_number: d.fetch("sourcePageNumber"),
1257
- creature_rules: d.fetch("creatureRules"),
1258
- spell_list_ids: d.fetch("spellListIds"),
1259
- )
1260
- end
1261
-
1262
- def self.from_json!(json)
1263
- from_dynamic!(JSON.parse(json))
1264
- end
1265
-
1266
- def to_dynamic
1267
- {
1268
- "id" => id,
1269
- "entityTypeId" => entity_type_id,
1270
- "name" => definition_name,
1271
- "description" => description,
1272
- "snippet" => snippet,
1273
- "activation" => activation,
1274
- "sourceId" => source_id,
1275
- "sourcePageNumber" => source_page_number,
1276
- "creatureRules" => creature_rules,
1277
- "spellListIds" => spell_list_ids,
1278
- }
1279
- end
1280
-
1281
- def to_json(options = nil)
1282
- JSON.generate(to_dynamic, options)
1283
- end
1284
- end
1285
-
1286
- class OptionsClass < Dry::Struct
1287
- attribute :component_id, Types::Integer
1288
- attribute :component_type_id, Types::Integer
1289
- attribute :definition, Definition1
1290
-
1291
- def self.from_dynamic!(d)
1292
- d = Types::Hash[d]
1293
- new(
1294
- component_id: d.fetch("componentId"),
1295
- component_type_id: d.fetch("componentTypeId"),
1296
- definition: Definition1.from_dynamic!(d.fetch("definition")),
1297
- )
1298
- end
1299
-
1300
- def self.from_json!(json)
1301
- from_dynamic!(JSON.parse(json))
1302
- end
1303
-
1304
- def to_dynamic
1305
- {
1306
- "componentId" => component_id,
1307
- "componentTypeId" => component_type_id,
1308
- "definition" => definition.to_dynamic,
1309
- }
1310
- end
1311
-
1312
- def to_json(options = nil)
1313
- JSON.generate(to_dynamic, options)
1314
- end
1315
- end
1316
-
1317
- class Options < Dry::Struct
1318
- attribute :race, Types.Array(Types::Any)
1319
- attribute :options_class, Types.Array(OptionsClass)
1320
- attribute :background, Types::Nil
1321
- attribute :item, Types::Nil
1322
- attribute :feat, Types.Array(Types::Any)
1323
-
1324
- def self.from_dynamic!(d)
1325
- d = Types::Hash[d]
1326
- new(
1327
- race: d.fetch("race"),
1328
- options_class: d.fetch("class").map { |x| OptionsClass.from_dynamic!(x) },
1329
- background: d.fetch("background"),
1330
- item: d.fetch("item"),
1331
- feat: d.fetch("feat"),
1332
- )
1333
- end
1334
-
1335
- def self.from_json!(json)
1336
- from_dynamic!(JSON.parse(json))
1337
- end
1338
-
1339
- def to_dynamic
1340
- {
1341
- "race" => race,
1342
- "class" => options_class.map { |x| x.to_dynamic },
1343
- "background" => background,
1344
- "item" => item,
1345
- "feat" => feat,
1346
- }
1347
- end
1348
-
1349
- def to_json(options = nil)
1350
- JSON.generate(to_dynamic, options)
1351
- end
1352
- end
1353
-
1354
- class ChoicesBackground < Dry::Struct
1355
- attribute :component_id, Types::Integer
1356
- attribute :component_type_id, Types::Integer
1357
- attribute :id, Types::String
1358
- attribute :parent_choice_id, Types::String.optional
1359
- attribute :background_type, Types::Integer
1360
- attribute :sub_type, Types::Integer.optional
1361
- attribute :option_value, Types::Integer
1362
- attribute :label, Types::String.optional
1363
- attribute :is_optional, Types::Bool
1364
- attribute :is_infinite, Types::Bool
1365
- attribute :default_subtypes, Types.Array(Types::String)
1366
- attribute :display_order, Types::Nil
1367
- attribute :background_options, Types.Array(Types::Any)
1368
- attribute :option_ids, Types.Array(Types::Integer)
1369
-
1370
- def self.from_dynamic!(d)
1371
- d = Types::Hash[d]
1372
- new(
1373
- component_id: d.fetch("componentId"),
1374
- component_type_id: d.fetch("componentTypeId"),
1375
- id: d.fetch("id"),
1376
- parent_choice_id: d.fetch("parentChoiceId"),
1377
- background_type: d.fetch("type"),
1378
- sub_type: d.fetch("subType"),
1379
- option_value: d.fetch("optionValue"),
1380
- label: d.fetch("label"),
1381
- is_optional: d.fetch("isOptional"),
1382
- is_infinite: d.fetch("isInfinite"),
1383
- default_subtypes: d.fetch("defaultSubtypes"),
1384
- display_order: d.fetch("displayOrder"),
1385
- background_options: d.fetch("options"),
1386
- option_ids: d.fetch("optionIds"),
1387
- )
1388
- end
1389
-
1390
- def self.from_json!(json)
1391
- from_dynamic!(JSON.parse(json))
1392
- end
1393
-
1394
- def to_dynamic
1395
- {
1396
- "componentId" => component_id,
1397
- "componentTypeId" => component_type_id,
1398
- "id" => id,
1399
- "parentChoiceId" => parent_choice_id,
1400
- "type" => background_type,
1401
- "subType" => sub_type,
1402
- "optionValue" => option_value,
1403
- "label" => label,
1404
- "isOptional" => is_optional,
1405
- "isInfinite" => is_infinite,
1406
- "defaultSubtypes" => default_subtypes,
1407
- "displayOrder" => display_order,
1408
- "options" => background_options,
1409
- "optionIds" => option_ids,
1410
- }
1411
- end
1412
-
1413
- def to_json(options = nil)
1414
- JSON.generate(to_dynamic, options)
1415
- end
1416
- end
1417
-
1418
- class Option < Dry::Struct
1419
- attribute :id, Types::Integer
1420
- attribute :label, Types::String
1421
- attribute :description, Types::String.optional
1422
-
1423
- def self.from_dynamic!(d)
1424
- d = Types::Hash[d]
1425
- new(
1426
- id: d.fetch("id"),
1427
- label: d.fetch("label"),
1428
- description: d.fetch("description"),
1429
- )
1430
- end
1431
-
1432
- def self.from_json!(json)
1433
- from_dynamic!(JSON.parse(json))
1434
- end
1435
-
1436
- def to_dynamic
1437
- {
1438
- "id" => id,
1439
- "label" => label,
1440
- "description" => description,
1441
- }
1442
- end
1443
-
1444
- def to_json(options = nil)
1445
- JSON.generate(to_dynamic, options)
1446
- end
1447
- end
1448
-
1449
- class ChoiceDefinition < Dry::Struct
1450
- attribute :id, Types::String
1451
- attribute :choice_definition_options, Types.Array(Option)
1452
-
1453
- def self.from_dynamic!(d)
1454
- d = Types::Hash[d]
1455
- new(
1456
- id: d.fetch("id"),
1457
- choice_definition_options: d.fetch("options").map { |x| Option.from_dynamic!(x) },
1458
- )
1459
- end
1460
-
1461
- def self.from_json!(json)
1462
- from_dynamic!(JSON.parse(json))
1463
- end
1464
-
1465
- def to_dynamic
1466
- {
1467
- "id" => id,
1468
- "options" => choice_definition_options.map { |x| x.to_dynamic },
1469
- }
1470
- end
1471
-
1472
- def to_json(options = nil)
1473
- JSON.generate(to_dynamic, options)
1474
- end
1475
- end
1476
-
1477
- class DefinitionKeyNameMap < Dry::Struct
1478
-
1479
- def self.from_dynamic!(d)
1480
- d = Types::Hash[d]
1481
- new(
1482
- )
1483
- end
1484
-
1485
- def self.from_json!(json)
1486
- from_dynamic!(JSON.parse(json))
1487
- end
1488
-
1489
- def to_dynamic
1490
- {
1491
- }
1492
- end
1493
-
1494
- def to_json(options = nil)
1495
- JSON.generate(to_dynamic, options)
1496
- end
1497
- end
1498
-
1499
- class Choices < Dry::Struct
1500
- attribute :race, Types.Array(ChoicesBackground)
1501
- attribute :choices_class, Types.Array(ChoicesBackground)
1502
- attribute :background, Types.Array(ChoicesBackground)
1503
- attribute :item, Types::Nil
1504
- attribute :feat, Types.Array(ChoicesBackground)
1505
- attribute :choice_definitions, Types.Array(ChoiceDefinition)
1506
- attribute :definition_key_name_map, DefinitionKeyNameMap
1507
-
1508
- def self.from_dynamic!(d)
1509
- d = Types::Hash[d]
1510
- new(
1511
- race: d.fetch("race").map { |x| ChoicesBackground.from_dynamic!(x) },
1512
- choices_class: d.fetch("class").map { |x| ChoicesBackground.from_dynamic!(x) },
1513
- background: d.fetch("background").map { |x| ChoicesBackground.from_dynamic!(x) },
1514
- item: d.fetch("item"),
1515
- feat: d.fetch("feat").map { |x| ChoicesBackground.from_dynamic!(x) },
1516
- choice_definitions: d.fetch("choiceDefinitions").map { |x| ChoiceDefinition.from_dynamic!(x) },
1517
- definition_key_name_map: DefinitionKeyNameMap.from_dynamic!(d.fetch("definitionKeyNameMap")),
1518
- )
1519
- end
1520
-
1521
- def self.from_json!(json)
1522
- from_dynamic!(JSON.parse(json))
1523
- end
1524
-
1525
- def to_dynamic
1526
- {
1527
- "race" => race.map { |x| x.to_dynamic },
1528
- "class" => choices_class.map { |x| x.to_dynamic },
1529
- "background" => background.map { |x| x.to_dynamic },
1530
- "item" => item,
1531
- "feat" => feat.map { |x| x.to_dynamic },
1532
- "choiceDefinitions" => choice_definitions.map { |x| x.to_dynamic },
1533
- "definitionKeyNameMap" => definition_key_name_map.to_dynamic,
1534
- }
1535
- end
1536
-
1537
- def to_json(options = nil)
1538
- JSON.generate(to_dynamic, options)
1539
- end
1540
- end
1541
-
1542
- class ClassSpell < Dry::Struct
1543
- attribute :entity_type_id, Types::Integer
1544
- attribute :character_class_id, Types::Integer
1545
- attribute :spells, Types.Array(Types::Any)
1546
-
1547
- def self.from_dynamic!(d)
1548
- d = Types::Hash[d]
1549
- new(
1550
- entity_type_id: d.fetch("entityTypeId"),
1551
- character_class_id: d.fetch("characterClassId"),
1552
- spells: d.fetch("spells"),
1553
- )
1554
- end
1555
-
1556
- def self.from_json!(json)
1557
- from_dynamic!(JSON.parse(json))
1558
- end
1559
-
1560
- def to_dynamic
1561
- {
1562
- "entityTypeId" => entity_type_id,
1563
- "characterClassId" => character_class_id,
1564
- "spells" => spells,
1565
- }
1566
- end
1567
-
1568
- def to_json(options = nil)
1569
- JSON.generate(to_dynamic, options)
1570
- end
1571
- end
1572
-
1573
- module EntityType
1574
- ClassFeature = "class-feature"
1575
- end
1576
-
1577
- class LevelScale < Dry::Struct
1578
- attribute :id, Types::Integer
1579
- attribute :level, Types::Integer
1580
- attribute :description, Types::String
1581
- attribute :dice, Die.optional
1582
- attribute :fixed_value, Types::Integer
1583
-
1584
- def self.from_dynamic!(d)
1585
- d = Types::Hash[d]
1586
- new(
1587
- id: d.fetch("id"),
1588
- level: d.fetch("level"),
1589
- description: d.fetch("description"),
1590
- dice: d.fetch("dice") ? Die.from_dynamic!(d.fetch("dice")) : nil,
1591
- fixed_value: d.fetch("fixedValue"),
1592
- )
1593
- end
1594
-
1595
- def self.from_json!(json)
1596
- from_dynamic!(JSON.parse(json))
1597
- end
1598
-
1599
- def to_dynamic
1600
- {
1601
- "id" => id,
1602
- "level" => level,
1603
- "description" => description,
1604
- "dice" => dice&.to_dynamic,
1605
- "fixedValue" => fixed_value,
1606
- }
1607
- end
1608
-
1609
- def to_json(options = nil)
1610
- JSON.generate(to_dynamic, options)
1611
- end
1612
- end
1613
-
1614
- class LimitedUseElement < Dry::Struct
1615
- attribute :level, Types::Nil
1616
- attribute :uses, Types::Integer
1617
-
1618
- def self.from_dynamic!(d)
1619
- d = Types::Hash[d]
1620
- new(
1621
- level: d.fetch("level"),
1622
- uses: d.fetch("uses"),
1623
- )
1624
- end
1625
-
1626
- def self.from_json!(json)
1627
- from_dynamic!(JSON.parse(json))
1628
- end
1629
-
1630
- def to_dynamic
1631
- {
1632
- "level" => level,
1633
- "uses" => uses,
1634
- }
1635
- end
1636
-
1637
- def to_json(options = nil)
1638
- JSON.generate(to_dynamic, options)
1639
- end
1640
- end
1641
-
1642
- class ClassFeatureDefinition < Dry::Struct
1643
- attribute :id, Types::Integer
1644
- attribute :definition_key, Types::String
1645
- attribute :entity_type_id, Types::Integer
1646
- attribute :display_order, Types::Integer
1647
- attribute :definition_name, Types::String
1648
- attribute :description, Types::String
1649
- attribute :snippet, Types::String.optional
1650
- attribute :activation, Types::Nil
1651
- attribute :multi_class_description, Types::String
1652
- attribute :required_level, Types::Integer
1653
- attribute :is_sub_class_feature, Types::Bool
1654
- attribute :limited_use, Types.Array(LimitedUseElement)
1655
- attribute :hide_in_builder, Types::Bool
1656
- attribute :hide_in_sheet, Types::Bool
1657
- attribute :source_id, Types::Integer
1658
- attribute :source_page_number, Types::Integer.optional
1659
- attribute :creature_rules, Types.Array(Types::Any)
1660
- attribute :level_scales, Types.Array(LevelScale)
1661
- attribute :infusion_rules, Types.Array(Types::Any)
1662
- attribute :spell_list_ids, Types.Array(Types::Any)
1663
- attribute :class_id, Types::Integer
1664
- attribute :feature_type, Types::Integer
1665
- attribute :sources, Types.Array(Source)
1666
- attribute :affected_feature_definition_keys, Types.Array(Types::Any)
1667
- attribute :entity_type, Types::EntityType
1668
- attribute :entity_id, Types::String
1669
-
1670
- def self.from_dynamic!(d)
1671
- d = Types::Hash[d]
1672
- new(
1673
- id: d.fetch("id"),
1674
- definition_key: d.fetch("definitionKey"),
1675
- entity_type_id: d.fetch("entityTypeId"),
1676
- display_order: d.fetch("displayOrder"),
1677
- definition_name: d.fetch("name"),
1678
- description: d.fetch("description"),
1679
- snippet: d.fetch("snippet"),
1680
- activation: d.fetch("activation"),
1681
- multi_class_description: d.fetch("multiClassDescription"),
1682
- required_level: d.fetch("requiredLevel"),
1683
- is_sub_class_feature: d.fetch("isSubClassFeature"),
1684
- limited_use: d.fetch("limitedUse").map { |x| LimitedUseElement.from_dynamic!(x) },
1685
- hide_in_builder: d.fetch("hideInBuilder"),
1686
- hide_in_sheet: d.fetch("hideInSheet"),
1687
- source_id: d.fetch("sourceId"),
1688
- source_page_number: d.fetch("sourcePageNumber"),
1689
- creature_rules: d.fetch("creatureRules"),
1690
- level_scales: d.fetch("levelScales").map { |x| LevelScale.from_dynamic!(x) },
1691
- infusion_rules: d.fetch("infusionRules"),
1692
- spell_list_ids: d.fetch("spellListIds"),
1693
- class_id: d.fetch("classId"),
1694
- feature_type: d.fetch("featureType"),
1695
- sources: d.fetch("sources").map { |x| Source.from_dynamic!(x) },
1696
- affected_feature_definition_keys: d.fetch("affectedFeatureDefinitionKeys"),
1697
- entity_type: d.fetch("entityType"),
1698
- entity_id: d.fetch("entityID"),
1699
- )
1700
- end
1701
-
1702
- def self.from_json!(json)
1703
- from_dynamic!(JSON.parse(json))
1704
- end
1705
-
1706
- def to_dynamic
1707
- {
1708
- "id" => id,
1709
- "definitionKey" => definition_key,
1710
- "entityTypeId" => entity_type_id,
1711
- "displayOrder" => display_order,
1712
- "name" => definition_name,
1713
- "description" => description,
1714
- "snippet" => snippet,
1715
- "activation" => activation,
1716
- "multiClassDescription" => multi_class_description,
1717
- "requiredLevel" => required_level,
1718
- "isSubClassFeature" => is_sub_class_feature,
1719
- "limitedUse" => limited_use.map { |x| x.to_dynamic },
1720
- "hideInBuilder" => hide_in_builder,
1721
- "hideInSheet" => hide_in_sheet,
1722
- "sourceId" => source_id,
1723
- "sourcePageNumber" => source_page_number,
1724
- "creatureRules" => creature_rules,
1725
- "levelScales" => level_scales.map { |x| x.to_dynamic },
1726
- "infusionRules" => infusion_rules,
1727
- "spellListIds" => spell_list_ids,
1728
- "classId" => class_id,
1729
- "featureType" => feature_type,
1730
- "sources" => sources.map { |x| x.to_dynamic },
1731
- "affectedFeatureDefinitionKeys" => affected_feature_definition_keys,
1732
- "entityType" => entity_type,
1733
- "entityID" => entity_id,
1734
- }
1735
- end
1736
-
1737
- def to_json(options = nil)
1738
- JSON.generate(to_dynamic, options)
1739
- end
1740
- end
1741
-
1742
- class ClassClassFeature < Dry::Struct
1743
- attribute :definition, ClassFeatureDefinition
1744
- attribute :level_scale, LevelScale.optional
1745
-
1746
- def self.from_dynamic!(d)
1747
- d = Types::Hash[d]
1748
- new(
1749
- definition: ClassFeatureDefinition.from_dynamic!(d.fetch("definition")),
1750
- level_scale: d.fetch("levelScale") ? LevelScale.from_dynamic!(d.fetch("levelScale")) : nil,
1751
- )
1752
- end
1753
-
1754
- def self.from_json!(json)
1755
- from_dynamic!(JSON.parse(json))
1756
- end
1757
-
1758
- def to_dynamic
1759
- {
1760
- "definition" => definition.to_dynamic,
1761
- "levelScale" => level_scale&.to_dynamic,
1762
- }
1763
- end
1764
-
1765
- def to_json(options = nil)
1766
- JSON.generate(to_dynamic, options)
1767
- end
1768
- end
1769
-
1770
- class DefinitionClassFeature < Dry::Struct
1771
- attribute :id, Types::Integer
1772
- attribute :class_feature_name, Types::String
1773
- attribute :prerequisite, Types::Nil
1774
- attribute :description, Types::String
1775
- attribute :required_level, Types::Integer
1776
- attribute :display_order, Types::Integer
1777
-
1778
- def self.from_dynamic!(d)
1779
- d = Types::Hash[d]
1780
- new(
1781
- id: d.fetch("id"),
1782
- class_feature_name: d.fetch("name"),
1783
- prerequisite: d.fetch("prerequisite"),
1784
- description: d.fetch("description"),
1785
- required_level: d.fetch("requiredLevel"),
1786
- display_order: d.fetch("displayOrder"),
1787
- )
1788
- end
1789
-
1790
- def self.from_json!(json)
1791
- from_dynamic!(JSON.parse(json))
1792
- end
1793
-
1794
- def to_dynamic
1795
- {
1796
- "id" => id,
1797
- "name" => class_feature_name,
1798
- "prerequisite" => prerequisite,
1799
- "description" => description,
1800
- "requiredLevel" => required_level,
1801
- "displayOrder" => display_order,
1802
- }
1803
- end
1804
-
1805
- def to_json(options = nil)
1806
- JSON.generate(to_dynamic, options)
1807
- end
1808
- end
1809
-
1810
- class PrerequisiteMapping < Dry::Struct
1811
- attribute :id, Types::Integer
1812
- attribute :entity_id, Types::Integer
1813
- attribute :entity_type_id, Types::Integer
1814
- attribute :prerequisite_mapping_type, Types::String
1815
- attribute :sub_type, Types::String
1816
- attribute :value, Types::Integer.optional
1817
- attribute :friendly_type_name, Types::String
1818
- attribute :friendly_sub_type_name, Types::String
1819
-
1820
- def self.from_dynamic!(d)
1821
- d = Types::Hash[d]
1822
- new(
1823
- id: d.fetch("id"),
1824
- entity_id: d.fetch("entityId"),
1825
- entity_type_id: d.fetch("entityTypeId"),
1826
- prerequisite_mapping_type: d.fetch("type"),
1827
- sub_type: d.fetch("subType"),
1828
- value: d.fetch("value"),
1829
- friendly_type_name: d.fetch("friendlyTypeName"),
1830
- friendly_sub_type_name: d.fetch("friendlySubTypeName"),
1831
- )
1832
- end
1833
-
1834
- def self.from_json!(json)
1835
- from_dynamic!(JSON.parse(json))
1836
- end
1837
-
1838
- def to_dynamic
1839
- {
1840
- "id" => id,
1841
- "entityId" => entity_id,
1842
- "entityTypeId" => entity_type_id,
1843
- "type" => prerequisite_mapping_type,
1844
- "subType" => sub_type,
1845
- "value" => value,
1846
- "friendlyTypeName" => friendly_type_name,
1847
- "friendlySubTypeName" => friendly_sub_type_name,
1848
- }
1849
- end
1850
-
1851
- def to_json(options = nil)
1852
- JSON.generate(to_dynamic, options)
1853
- end
1854
- end
1855
-
1856
- class Prerequisite < Dry::Struct
1857
- attribute :description, Types::String
1858
- attribute :prerequisite_mappings, Types.Array(PrerequisiteMapping)
1859
-
1860
- def self.from_dynamic!(d)
1861
- d = Types::Hash[d]
1862
- new(
1863
- description: d.fetch("description"),
1864
- prerequisite_mappings: d.fetch("prerequisiteMappings").map { |x| PrerequisiteMapping.from_dynamic!(x) },
1865
- )
1866
- end
1867
-
1868
- def self.from_json!(json)
1869
- from_dynamic!(JSON.parse(json))
1870
- end
1871
-
1872
- def to_dynamic
1873
- {
1874
- "description" => description,
1875
- "prerequisiteMappings" => prerequisite_mappings.map { |x| x.to_dynamic },
1876
- }
1877
- end
1878
-
1879
- def to_json(options = nil)
1880
- JSON.generate(to_dynamic, options)
1881
- end
1882
- end
1883
-
1884
- class SpellRules < Dry::Struct
1885
- attribute :multi_class_spell_slot_divisor, Types::Integer
1886
- attribute :is_ritual_spell_caster, Types::Bool
1887
- attribute :level_cantrips_known_maxes, Types.Array(Types::Integer)
1888
- attribute :level_spell_known_maxes, Types.Array(Types::Integer)
1889
- attribute :level_spell_slots, Types.Array(Types.Array(Types::Integer))
1890
- attribute :multi_class_spell_slot_rounding, Types::Integer
1891
-
1892
- def self.from_dynamic!(d)
1893
- d = Types::Hash[d]
1894
- new(
1895
- multi_class_spell_slot_divisor: d.fetch("multiClassSpellSlotDivisor"),
1896
- is_ritual_spell_caster: d.fetch("isRitualSpellCaster"),
1897
- level_cantrips_known_maxes: d.fetch("levelCantripsKnownMaxes"),
1898
- level_spell_known_maxes: d.fetch("levelSpellKnownMaxes"),
1899
- level_spell_slots: d.fetch("levelSpellSlots"),
1900
- multi_class_spell_slot_rounding: d.fetch("multiClassSpellSlotRounding"),
1901
- )
1902
- end
1903
-
1904
- def self.from_json!(json)
1905
- from_dynamic!(JSON.parse(json))
1906
- end
1907
-
1908
- def to_dynamic
1909
- {
1910
- "multiClassSpellSlotDivisor" => multi_class_spell_slot_divisor,
1911
- "isRitualSpellCaster" => is_ritual_spell_caster,
1912
- "levelCantripsKnownMaxes" => level_cantrips_known_maxes,
1913
- "levelSpellKnownMaxes" => level_spell_known_maxes,
1914
- "levelSpellSlots" => level_spell_slots,
1915
- "multiClassSpellSlotRounding" => multi_class_spell_slot_rounding,
1916
- }
1917
- end
1918
-
1919
- def to_json(options = nil)
1920
- JSON.generate(to_dynamic, options)
1921
- end
1922
- end
1923
-
1924
- class SubclassDefinitionClass < Dry::Struct
1925
- attribute :id, Types::Integer
1926
- attribute :definition_key, Types::String
1927
- attribute :definition_name, Types::String
1928
- attribute :description, Types::String
1929
- attribute :equipment_description, Types::String.optional
1930
- attribute :parent_class_id, Types::Integer.optional
1931
- attribute :avatar_url, Types::String.optional
1932
- attribute :large_avatar_url, Types::String.optional
1933
- attribute :portrait_avatar_url, Types::String.optional
1934
- attribute :more_details_url, Types::String
1935
- attribute :spell_casting_ability_id, Types::Nil
1936
- attribute :sources, Types.Array(Source)
1937
- attribute :class_features, Types.Array(DefinitionClassFeature)
1938
- attribute :hit_dice, Types::Integer
1939
- attribute :wealth_dice, Die.optional
1940
- attribute :can_cast_spells, Types::Bool
1941
- attribute :knows_all_spells, Types::Nil
1942
- attribute :spell_prepare_type, Types::Nil
1943
- attribute :spell_container_name, Types::Nil
1944
- attribute :source_page_number, Types::Integer.optional
1945
- attribute :subclass_definition, Types::Nil
1946
- attribute :is_homebrew, Types::Bool
1947
- attribute :primary_abilities, Types.Array(Types::Integer).optional
1948
- attribute :spell_rules, SpellRules.optional
1949
- attribute :prerequisites, Types.Array(Prerequisite).optional
1950
-
1951
- def self.from_dynamic!(d)
1952
- d = Types::Hash[d]
1953
- new(
1954
- id: d.fetch("id"),
1955
- definition_key: d.fetch("definitionKey"),
1956
- definition_name: d.fetch("name"),
1957
- description: d.fetch("description"),
1958
- equipment_description: d.fetch("equipmentDescription"),
1959
- parent_class_id: d.fetch("parentClassId"),
1960
- avatar_url: d.fetch("avatarUrl"),
1961
- large_avatar_url: d.fetch("largeAvatarUrl"),
1962
- portrait_avatar_url: d.fetch("portraitAvatarUrl"),
1963
- more_details_url: d.fetch("moreDetailsUrl"),
1964
- spell_casting_ability_id: d.fetch("spellCastingAbilityId"),
1965
- sources: d.fetch("sources").map { |x| Source.from_dynamic!(x) },
1966
- class_features: d.fetch("classFeatures").map { |x| DefinitionClassFeature.from_dynamic!(x) },
1967
- hit_dice: d.fetch("hitDice"),
1968
- wealth_dice: d.fetch("wealthDice") ? Die.from_dynamic!(d.fetch("wealthDice")) : nil,
1969
- can_cast_spells: d.fetch("canCastSpells"),
1970
- knows_all_spells: d.fetch("knowsAllSpells"),
1971
- spell_prepare_type: d.fetch("spellPrepareType"),
1972
- spell_container_name: d.fetch("spellContainerName"),
1973
- source_page_number: d.fetch("sourcePageNumber"),
1974
- subclass_definition: d.fetch("subclassDefinition"),
1975
- is_homebrew: d.fetch("isHomebrew"),
1976
- primary_abilities: d.fetch("primaryAbilities"),
1977
- spell_rules: d.fetch("spellRules") ? SpellRules.from_dynamic!(d.fetch("spellRules")) : nil,
1978
- prerequisites: d.fetch("prerequisites")&.map { |x| Prerequisite.from_dynamic!(x) },
1979
- )
1980
- end
1981
-
1982
- def self.from_json!(json)
1983
- from_dynamic!(JSON.parse(json))
1984
- end
1985
-
1986
- def to_dynamic
1987
- {
1988
- "id" => id,
1989
- "definitionKey" => definition_key,
1990
- "name" => definition_name,
1991
- "description" => description,
1992
- "equipmentDescription" => equipment_description,
1993
- "parentClassId" => parent_class_id,
1994
- "avatarUrl" => avatar_url,
1995
- "largeAvatarUrl" => large_avatar_url,
1996
- "portraitAvatarUrl" => portrait_avatar_url,
1997
- "moreDetailsUrl" => more_details_url,
1998
- "spellCastingAbilityId" => spell_casting_ability_id,
1999
- "sources" => sources.map { |x| x.to_dynamic },
2000
- "classFeatures" => class_features.map { |x| x.to_dynamic },
2001
- "hitDice" => hit_dice,
2002
- "wealthDice" => wealth_dice&.to_dynamic,
2003
- "canCastSpells" => can_cast_spells,
2004
- "knowsAllSpells" => knows_all_spells,
2005
- "spellPrepareType" => spell_prepare_type,
2006
- "spellContainerName" => spell_container_name,
2007
- "sourcePageNumber" => source_page_number,
2008
- "subclassDefinition" => subclass_definition,
2009
- "isHomebrew" => is_homebrew,
2010
- "primaryAbilities" => primary_abilities,
2011
- "spellRules" => spell_rules&.to_dynamic,
2012
- "prerequisites" => prerequisites&.map { |x| x.to_dynamic },
2013
- }
2014
- end
2015
-
2016
- def to_json(options = nil)
2017
- JSON.generate(to_dynamic, options)
2018
- end
2019
- end
2020
-
2021
- class CharacterClass < Dry::Struct
2022
- attribute :id, Types::Integer
2023
- attribute :entity_type_id, Types::Integer
2024
- attribute :level, Types::Integer
2025
- attribute :is_starting_class, Types::Bool
2026
- attribute :hit_dice_used, Types::Integer
2027
- attribute :definition_id, Types::Integer
2028
- attribute :subclass_definition_id, Types::Nil
2029
- attribute :definition, SubclassDefinitionClass
2030
- attribute :subclass_definition, SubclassDefinitionClass
2031
- attribute :class_features, Types.Array(ClassClassFeature)
2032
-
2033
- def self.from_dynamic!(d)
2034
- d = Types::Hash[d]
2035
- new(
2036
- id: d.fetch("id"),
2037
- entity_type_id: d.fetch("entityTypeId"),
2038
- level: d.fetch("level"),
2039
- is_starting_class: d.fetch("isStartingClass"),
2040
- hit_dice_used: d.fetch("hitDiceUsed"),
2041
- definition_id: d.fetch("definitionId"),
2042
- subclass_definition_id: d.fetch("subclassDefinitionId"),
2043
- definition: SubclassDefinitionClass.from_dynamic!(d.fetch("definition")),
2044
- subclass_definition: SubclassDefinitionClass.from_dynamic!(d.fetch("subclassDefinition")),
2045
- class_features: d.fetch("classFeatures").map { |x| ClassClassFeature.from_dynamic!(x) },
2046
- )
2047
- end
2048
-
2049
- def self.from_json!(json)
2050
- from_dynamic!(JSON.parse(json))
2051
- end
2052
-
2053
- def to_dynamic
2054
- {
2055
- "id" => id,
2056
- "entityTypeId" => entity_type_id,
2057
- "level" => level,
2058
- "isStartingClass" => is_starting_class,
2059
- "hitDiceUsed" => hit_dice_used,
2060
- "definitionId" => definition_id,
2061
- "subclassDefinitionId" => subclass_definition_id,
2062
- "definition" => definition.to_dynamic,
2063
- "subclassDefinition" => subclass_definition.to_dynamic,
2064
- "classFeatures" => class_features.map { |x| x.to_dynamic },
2065
- }
2066
- end
2067
-
2068
- def to_json(options = nil)
2069
- JSON.generate(to_dynamic, options)
2070
- end
2071
- end
2072
-
2073
- class Configuration < Dry::Struct
2074
- attribute :starting_equipment_type, Types::Integer
2075
- attribute :ability_score_type, Types::Integer
2076
- attribute :show_help_text, Types::Bool
2077
-
2078
- def self.from_dynamic!(d)
2079
- d = Types::Hash[d]
2080
- new(
2081
- starting_equipment_type: d.fetch("startingEquipmentType"),
2082
- ability_score_type: d.fetch("abilityScoreType"),
2083
- show_help_text: d.fetch("showHelpText"),
2084
- )
2085
- end
2086
-
2087
- def self.from_json!(json)
2088
- from_dynamic!(JSON.parse(json))
2089
- end
2090
-
2091
- def to_dynamic
2092
- {
2093
- "startingEquipmentType" => starting_equipment_type,
2094
- "abilityScoreType" => ability_score_type,
2095
- "showHelpText" => show_help_text,
2096
- }
2097
- end
2098
-
2099
- def to_json(options = nil)
2100
- JSON.generate(to_dynamic, options)
2101
- end
2102
- end
2103
-
2104
- class Currencies < Dry::Struct
2105
- attribute :cp, Types::Integer
2106
- attribute :sp, Types::Integer
2107
- attribute :gp, Types::Integer
2108
- attribute :ep, Types::Integer
2109
- attribute :pp, Types::Integer
2110
-
2111
- def self.from_dynamic!(d)
2112
- d = Types::Hash[d]
2113
- new(
2114
- cp: d.fetch("cp"),
2115
- sp: d.fetch("sp"),
2116
- gp: d.fetch("gp"),
2117
- ep: d.fetch("ep"),
2118
- pp: d.fetch("pp"),
2119
- )
2120
- end
2121
-
2122
- def self.from_json!(json)
2123
- from_dynamic!(JSON.parse(json))
2124
- end
2125
-
2126
- def to_dynamic
2127
- {
2128
- "cp" => cp,
2129
- "sp" => sp,
2130
- "gp" => gp,
2131
- "ep" => ep,
2132
- "pp" => pp,
2133
- }
2134
- end
2135
-
2136
- def to_json(options = nil)
2137
- JSON.generate(to_dynamic, options)
2138
- end
2139
- end
2140
-
2141
- class DeathSaves < Dry::Struct
2142
- attribute :fail_count, Types::Nil
2143
- attribute :success_count, Types::Nil
2144
- attribute :is_stabilized, Types::Bool
2145
-
2146
- def self.from_dynamic!(d)
2147
- d = Types::Hash[d]
2148
- new(
2149
- fail_count: d.fetch("failCount"),
2150
- success_count: d.fetch("successCount"),
2151
- is_stabilized: d.fetch("isStabilized"),
2152
- )
2153
- end
2154
-
2155
- def self.from_json!(json)
2156
- from_dynamic!(JSON.parse(json))
2157
- end
2158
-
2159
- def to_dynamic
2160
- {
2161
- "failCount" => fail_count,
2162
- "successCount" => success_count,
2163
- "isStabilized" => is_stabilized,
2164
- }
2165
- end
2166
-
2167
- def to_json(options = nil)
2168
- JSON.generate(to_dynamic, options)
2169
- end
2170
- end
2171
-
2172
- class DefaultBackdrop < Dry::Struct
2173
- attribute :backdrop_avatar_url, Types::String
2174
- attribute :small_backdrop_avatar_url, Types::String
2175
- attribute :large_backdrop_avatar_url, Types::String
2176
- attribute :thumbnail_backdrop_avatar_url, Types::String
2177
-
2178
- def self.from_dynamic!(d)
2179
- d = Types::Hash[d]
2180
- new(
2181
- backdrop_avatar_url: d.fetch("backdropAvatarUrl"),
2182
- small_backdrop_avatar_url: d.fetch("smallBackdropAvatarUrl"),
2183
- large_backdrop_avatar_url: d.fetch("largeBackdropAvatarUrl"),
2184
- thumbnail_backdrop_avatar_url: d.fetch("thumbnailBackdropAvatarUrl"),
2185
- )
2186
- end
2187
-
2188
- def self.from_json!(json)
2189
- from_dynamic!(JSON.parse(json))
2190
- end
2191
-
2192
- def to_dynamic
2193
- {
2194
- "backdropAvatarUrl" => backdrop_avatar_url,
2195
- "smallBackdropAvatarUrl" => small_backdrop_avatar_url,
2196
- "largeBackdropAvatarUrl" => large_backdrop_avatar_url,
2197
- "thumbnailBackdropAvatarUrl" => thumbnail_backdrop_avatar_url,
2198
- }
2199
- end
2200
-
2201
- def to_json(options = nil)
2202
- JSON.generate(to_dynamic, options)
2203
- end
2204
- end
2205
-
2206
- class Decorations < Dry::Struct
2207
- attribute :avatar_url, Types::Nil
2208
- attribute :frame_avatar_url, Types::Nil
2209
- attribute :backdrop_avatar_url, Types::Nil
2210
- attribute :small_backdrop_avatar_url, Types::Nil
2211
- attribute :large_backdrop_avatar_url, Types::Nil
2212
- attribute :thumbnail_backdrop_avatar_url, Types::Nil
2213
- attribute :default_backdrop, DefaultBackdrop
2214
- attribute :avatar_id, Types::Nil
2215
- attribute :portrait_decoration_key, Types::Nil
2216
- attribute :frame_avatar_decoration_key, Types::Nil
2217
- attribute :frame_avatar_id, Types::Nil
2218
- attribute :backdrop_avatar_decoration_key, Types::Nil
2219
- attribute :backdrop_avatar_id, Types::Nil
2220
- attribute :small_backdrop_avatar_decoration_key, Types::String
2221
- attribute :small_backdrop_avatar_id, Types::Nil
2222
- attribute :large_backdrop_avatar_decoration_key, Types::String
2223
- attribute :large_backdrop_avatar_id, Types::Nil
2224
- attribute :thumbnail_backdrop_avatar_decoration_key, Types::String
2225
- attribute :thumbnail_backdrop_avatar_id, Types::Nil
2226
- attribute :theme_color, Types::Nil
2227
-
2228
- def self.from_dynamic!(d)
2229
- d = Types::Hash[d]
2230
- new(
2231
- avatar_url: d.fetch("avatarUrl"),
2232
- frame_avatar_url: d.fetch("frameAvatarUrl"),
2233
- backdrop_avatar_url: d.fetch("backdropAvatarUrl"),
2234
- small_backdrop_avatar_url: d.fetch("smallBackdropAvatarUrl"),
2235
- large_backdrop_avatar_url: d.fetch("largeBackdropAvatarUrl"),
2236
- thumbnail_backdrop_avatar_url: d.fetch("thumbnailBackdropAvatarUrl"),
2237
- default_backdrop: DefaultBackdrop.from_dynamic!(d.fetch("defaultBackdrop")),
2238
- avatar_id: d.fetch("avatarId"),
2239
- portrait_decoration_key: d.fetch("portraitDecorationKey"),
2240
- frame_avatar_decoration_key: d.fetch("frameAvatarDecorationKey"),
2241
- frame_avatar_id: d.fetch("frameAvatarId"),
2242
- backdrop_avatar_decoration_key: d.fetch("backdropAvatarDecorationKey"),
2243
- backdrop_avatar_id: d.fetch("backdropAvatarId"),
2244
- small_backdrop_avatar_decoration_key: d.fetch("smallBackdropAvatarDecorationKey"),
2245
- small_backdrop_avatar_id: d.fetch("smallBackdropAvatarId"),
2246
- large_backdrop_avatar_decoration_key: d.fetch("largeBackdropAvatarDecorationKey"),
2247
- large_backdrop_avatar_id: d.fetch("largeBackdropAvatarId"),
2248
- thumbnail_backdrop_avatar_decoration_key: d.fetch("thumbnailBackdropAvatarDecorationKey"),
2249
- thumbnail_backdrop_avatar_id: d.fetch("thumbnailBackdropAvatarId"),
2250
- theme_color: d.fetch("themeColor"),
2251
- )
2252
- end
2253
-
2254
- def self.from_json!(json)
2255
- from_dynamic!(JSON.parse(json))
2256
- end
2257
-
2258
- def to_dynamic
2259
- {
2260
- "avatarUrl" => avatar_url,
2261
- "frameAvatarUrl" => frame_avatar_url,
2262
- "backdropAvatarUrl" => backdrop_avatar_url,
2263
- "smallBackdropAvatarUrl" => small_backdrop_avatar_url,
2264
- "largeBackdropAvatarUrl" => large_backdrop_avatar_url,
2265
- "thumbnailBackdropAvatarUrl" => thumbnail_backdrop_avatar_url,
2266
- "defaultBackdrop" => default_backdrop.to_dynamic,
2267
- "avatarId" => avatar_id,
2268
- "portraitDecorationKey" => portrait_decoration_key,
2269
- "frameAvatarDecorationKey" => frame_avatar_decoration_key,
2270
- "frameAvatarId" => frame_avatar_id,
2271
- "backdropAvatarDecorationKey" => backdrop_avatar_decoration_key,
2272
- "backdropAvatarId" => backdrop_avatar_id,
2273
- "smallBackdropAvatarDecorationKey" => small_backdrop_avatar_decoration_key,
2274
- "smallBackdropAvatarId" => small_backdrop_avatar_id,
2275
- "largeBackdropAvatarDecorationKey" => large_backdrop_avatar_decoration_key,
2276
- "largeBackdropAvatarId" => large_backdrop_avatar_id,
2277
- "thumbnailBackdropAvatarDecorationKey" => thumbnail_backdrop_avatar_decoration_key,
2278
- "thumbnailBackdropAvatarId" => thumbnail_backdrop_avatar_id,
2279
- "themeColor" => theme_color,
2280
- }
2281
- end
2282
-
2283
- def to_json(options = nil)
2284
- JSON.generate(to_dynamic, options)
2285
- end
2286
- end
2287
-
2288
- class FeatDefinition < Dry::Struct
2289
- attribute :id, Types::Integer
2290
- attribute :entity_type_id, Types::Integer
2291
- attribute :definition_key, Types::String
2292
- attribute :definition_name, Types::String
2293
- attribute :description, Types::String
2294
- attribute :snippet, Types::String
2295
- attribute :activation, Activation
2296
- attribute :source_id, Types::Nil
2297
- attribute :source_page_number, Types::Nil
2298
- attribute :creature_rules, Types.Array(Types::Any)
2299
- attribute :prerequisites, Types.Array(Prerequisite)
2300
- attribute :is_homebrew, Types::Bool
2301
- attribute :sources, Types.Array(Source)
2302
- attribute :spell_list_ids, Types.Array(Types::Any)
2303
-
2304
- def self.from_dynamic!(d)
2305
- d = Types::Hash[d]
2306
- new(
2307
- id: d.fetch("id"),
2308
- entity_type_id: d.fetch("entityTypeId"),
2309
- definition_key: d.fetch("definitionKey"),
2310
- definition_name: d.fetch("name"),
2311
- description: d.fetch("description"),
2312
- snippet: d.fetch("snippet"),
2313
- activation: Activation.from_dynamic!(d.fetch("activation")),
2314
- source_id: d.fetch("sourceId"),
2315
- source_page_number: d.fetch("sourcePageNumber"),
2316
- creature_rules: d.fetch("creatureRules"),
2317
- prerequisites: d.fetch("prerequisites").map { |x| Prerequisite.from_dynamic!(x) },
2318
- is_homebrew: d.fetch("isHomebrew"),
2319
- sources: d.fetch("sources").map { |x| Source.from_dynamic!(x) },
2320
- spell_list_ids: d.fetch("spellListIds"),
2321
- )
2322
- end
2323
-
2324
- def self.from_json!(json)
2325
- from_dynamic!(JSON.parse(json))
2326
- end
2327
-
2328
- def to_dynamic
2329
- {
2330
- "id" => id,
2331
- "entityTypeId" => entity_type_id,
2332
- "definitionKey" => definition_key,
2333
- "name" => definition_name,
2334
- "description" => description,
2335
- "snippet" => snippet,
2336
- "activation" => activation.to_dynamic,
2337
- "sourceId" => source_id,
2338
- "sourcePageNumber" => source_page_number,
2339
- "creatureRules" => creature_rules,
2340
- "prerequisites" => prerequisites.map { |x| x.to_dynamic },
2341
- "isHomebrew" => is_homebrew,
2342
- "sources" => sources.map { |x| x.to_dynamic },
2343
- "spellListIds" => spell_list_ids,
2344
- }
2345
- end
2346
-
2347
- def to_json(options = nil)
2348
- JSON.generate(to_dynamic, options)
2349
- end
2350
- end
2351
-
2352
- class Feat < Dry::Struct
2353
- attribute :component_type_id, Types::Integer
2354
- attribute :component_id, Types::Integer
2355
- attribute :definition, FeatDefinition
2356
- attribute :definition_id, Types::Integer
2357
-
2358
- def self.from_dynamic!(d)
2359
- d = Types::Hash[d]
2360
- new(
2361
- component_type_id: d.fetch("componentTypeId"),
2362
- component_id: d.fetch("componentId"),
2363
- definition: FeatDefinition.from_dynamic!(d.fetch("definition")),
2364
- definition_id: d.fetch("definitionId"),
2365
- )
2366
- end
2367
-
2368
- def self.from_json!(json)
2369
- from_dynamic!(JSON.parse(json))
2370
- end
2371
-
2372
- def to_dynamic
2373
- {
2374
- "componentTypeId" => component_type_id,
2375
- "componentId" => component_id,
2376
- "definition" => definition.to_dynamic,
2377
- "definitionId" => definition_id,
2378
- }
2379
- end
2380
-
2381
- def to_json(options = nil)
2382
- JSON.generate(to_dynamic, options)
2383
- end
2384
- end
2385
-
2386
- module ContainerDefinitionKey
2387
- The158111142353552888 = "1581111423:53552888"
2388
- end
2389
-
2390
- module FilterType
2391
- Armor = "Armor"
2392
- OtherGear = "Other Gear"
2393
- Potion = "Potion"
2394
- Weapon = "Weapon"
2395
- end
2396
-
2397
- class Property < Dry::Struct
2398
- attribute :id, Types::Integer
2399
- attribute :property_name, Types::String
2400
- attribute :description, Types::String
2401
- attribute :notes, Types::String.optional
2402
-
2403
- def self.from_dynamic!(d)
2404
- d = Types::Hash[d]
2405
- new(
2406
- id: d.fetch("id"),
2407
- property_name: d.fetch("name"),
2408
- description: d.fetch("description"),
2409
- notes: d.fetch("notes"),
2410
- )
2411
- end
2412
-
2413
- def self.from_json!(json)
2414
- from_dynamic!(JSON.parse(json))
2415
- end
2416
-
2417
- def to_dynamic
2418
- {
2419
- "id" => id,
2420
- "name" => property_name,
2421
- "description" => description,
2422
- "notes" => notes,
2423
- }
2424
- end
2425
-
2426
- def to_json(options = nil)
2427
- JSON.generate(to_dynamic, options)
2428
- end
2429
- end
2430
-
2431
- module Rarity
2432
- Common = "Common"
2433
- Rare = "Rare"
2434
- Uncommon = "Uncommon"
2435
- end
2436
-
2437
- class InventoryDefinition < Dry::Struct
2438
- attribute :id, Types::Integer
2439
- attribute :base_type_id, Types::Integer
2440
- attribute :entity_type_id, Types::Integer
2441
- attribute :definition_key, Types::String
2442
- attribute :can_equip, Types::Bool
2443
- attribute :magic, Types::Bool
2444
- attribute :definition_name, Types::String
2445
- attribute :snippet, Types::String.optional
2446
- attribute :weight, Types::Double
2447
- attribute :weight_multiplier, Types::Integer
2448
- attribute :capacity, Types::String.optional
2449
- attribute :capacity_weight, Types::Integer
2450
- attribute :definition_type, Types::String
2451
- attribute :description, Types::String
2452
- attribute :can_attune, Types::Bool
2453
- attribute :attunement_description, Types::String.optional
2454
- attribute :rarity, Types::Rarity
2455
- attribute :is_homebrew, Types::Bool
2456
- attribute :version, Types::Nil
2457
- attribute :source_id, Types::Nil
2458
- attribute :source_page_number, Types::Nil
2459
- attribute :stackable, Types::Bool
2460
- attribute :bundle_size, Types::Integer
2461
- attribute :avatar_url, Types::Nil
2462
- attribute :large_avatar_url, Types::Nil
2463
- attribute :filter_type, Types::FilterType
2464
- attribute :cost, Types::Double.optional
2465
- attribute :is_pack, Types::Bool
2466
- attribute :tags, Types.Array(Types::String)
2467
- attribute :granted_modifiers, Types.Array(ItemElement)
2468
- attribute :sub_type, Types::String.optional
2469
- attribute :is_consumable, Types::Bool
2470
- attribute :weapon_behaviors, Types.Array(Types::Any)
2471
- attribute :base_item_id, Types::Integer.optional
2472
- attribute :base_armor_name, Types::String.optional
2473
- attribute :strength_requirement, Types::Integer.optional
2474
- attribute :armor_class, Types::Integer.optional
2475
- attribute :stealth_check, Types::Integer.optional
2476
- attribute :damage, Die.optional
2477
- attribute :damage_type, Types::String.optional
2478
- attribute :fixed_damage, Types::Nil
2479
- attribute :properties, Types.Array(Property).optional
2480
- attribute :attack_type, Types::Integer.optional
2481
- attribute :category_id, Types::Integer.optional
2482
- attribute :range, Types::Integer.optional
2483
- attribute :long_range, Types::Integer.optional
2484
- attribute :is_monk_weapon, Types::Bool
2485
- attribute :level_infusion_granted, Types::Nil
2486
- attribute :sources, Types.Array(Source)
2487
- attribute :armor_type_id, Types::Integer.optional
2488
- attribute :gear_type_id, Types::Integer.optional
2489
- attribute :grouped_id, Types::Integer.optional
2490
- attribute :can_be_added_to_inventory, Types::Bool
2491
- attribute :is_container, Types::Bool
2492
- attribute :is_custom_item, Types::Bool
2493
-
2494
- def self.from_dynamic!(d)
2495
- d = Types::Hash[d]
2496
- new(
2497
- id: d.fetch("id"),
2498
- base_type_id: d.fetch("baseTypeId"),
2499
- entity_type_id: d.fetch("entityTypeId"),
2500
- definition_key: d.fetch("definitionKey"),
2501
- can_equip: d.fetch("canEquip"),
2502
- magic: d.fetch("magic"),
2503
- definition_name: d.fetch("name"),
2504
- snippet: d.fetch("snippet"),
2505
- weight: d.fetch("weight"),
2506
- weight_multiplier: d.fetch("weightMultiplier"),
2507
- capacity: d.fetch("capacity"),
2508
- capacity_weight: d.fetch("capacityWeight"),
2509
- definition_type: d.fetch("type"),
2510
- description: d.fetch("description"),
2511
- can_attune: d.fetch("canAttune"),
2512
- attunement_description: d.fetch("attunementDescription"),
2513
- rarity: d.fetch("rarity"),
2514
- is_homebrew: d.fetch("isHomebrew"),
2515
- version: d.fetch("version"),
2516
- source_id: d.fetch("sourceId"),
2517
- source_page_number: d.fetch("sourcePageNumber"),
2518
- stackable: d.fetch("stackable"),
2519
- bundle_size: d.fetch("bundleSize"),
2520
- avatar_url: d.fetch("avatarUrl"),
2521
- large_avatar_url: d.fetch("largeAvatarUrl"),
2522
- filter_type: d.fetch("filterType"),
2523
- cost: d.fetch("cost"),
2524
- is_pack: d.fetch("isPack"),
2525
- tags: d.fetch("tags"),
2526
- granted_modifiers: d.fetch("grantedModifiers").map { |x| ItemElement.from_dynamic!(x) },
2527
- sub_type: d.fetch("subType"),
2528
- is_consumable: d.fetch("isConsumable"),
2529
- weapon_behaviors: d.fetch("weaponBehaviors"),
2530
- base_item_id: d.fetch("baseItemId"),
2531
- base_armor_name: d.fetch("baseArmorName"),
2532
- strength_requirement: d.fetch("strengthRequirement"),
2533
- armor_class: d.fetch("armorClass"),
2534
- stealth_check: d.fetch("stealthCheck"),
2535
- damage: d.fetch("damage") ? Die.from_dynamic!(d.fetch("damage")) : nil,
2536
- damage_type: d.fetch("damageType"),
2537
- fixed_damage: d.fetch("fixedDamage"),
2538
- properties: d.fetch("properties")&.map { |x| Property.from_dynamic!(x) },
2539
- attack_type: d.fetch("attackType"),
2540
- category_id: d.fetch("categoryId"),
2541
- range: d.fetch("range"),
2542
- long_range: d.fetch("longRange"),
2543
- is_monk_weapon: d.fetch("isMonkWeapon"),
2544
- level_infusion_granted: d.fetch("levelInfusionGranted"),
2545
- sources: d.fetch("sources").map { |x| Source.from_dynamic!(x) },
2546
- armor_type_id: d.fetch("armorTypeId"),
2547
- gear_type_id: d.fetch("gearTypeId"),
2548
- grouped_id: d.fetch("groupedId"),
2549
- can_be_added_to_inventory: d.fetch("canBeAddedToInventory"),
2550
- is_container: d.fetch("isContainer"),
2551
- is_custom_item: d.fetch("isCustomItem"),
2552
- )
2553
- end
2554
-
2555
- def self.from_json!(json)
2556
- from_dynamic!(JSON.parse(json))
2557
- end
2558
-
2559
- def to_dynamic
2560
- {
2561
- "id" => id,
2562
- "baseTypeId" => base_type_id,
2563
- "entityTypeId" => entity_type_id,
2564
- "definitionKey" => definition_key,
2565
- "canEquip" => can_equip,
2566
- "magic" => magic,
2567
- "name" => definition_name,
2568
- "snippet" => snippet,
2569
- "weight" => weight,
2570
- "weightMultiplier" => weight_multiplier,
2571
- "capacity" => capacity,
2572
- "capacityWeight" => capacity_weight,
2573
- "type" => definition_type,
2574
- "description" => description,
2575
- "canAttune" => can_attune,
2576
- "attunementDescription" => attunement_description,
2577
- "rarity" => rarity,
2578
- "isHomebrew" => is_homebrew,
2579
- "version" => version,
2580
- "sourceId" => source_id,
2581
- "sourcePageNumber" => source_page_number,
2582
- "stackable" => stackable,
2583
- "bundleSize" => bundle_size,
2584
- "avatarUrl" => avatar_url,
2585
- "largeAvatarUrl" => large_avatar_url,
2586
- "filterType" => filter_type,
2587
- "cost" => cost,
2588
- "isPack" => is_pack,
2589
- "tags" => tags,
2590
- "grantedModifiers" => granted_modifiers.map { |x| x.to_dynamic },
2591
- "subType" => sub_type,
2592
- "isConsumable" => is_consumable,
2593
- "weaponBehaviors" => weapon_behaviors,
2594
- "baseItemId" => base_item_id,
2595
- "baseArmorName" => base_armor_name,
2596
- "strengthRequirement" => strength_requirement,
2597
- "armorClass" => armor_class,
2598
- "stealthCheck" => stealth_check,
2599
- "damage" => damage&.to_dynamic,
2600
- "damageType" => damage_type,
2601
- "fixedDamage" => fixed_damage,
2602
- "properties" => properties&.map { |x| x.to_dynamic },
2603
- "attackType" => attack_type,
2604
- "categoryId" => category_id,
2605
- "range" => range,
2606
- "longRange" => long_range,
2607
- "isMonkWeapon" => is_monk_weapon,
2608
- "levelInfusionGranted" => level_infusion_granted,
2609
- "sources" => sources.map { |x| x.to_dynamic },
2610
- "armorTypeId" => armor_type_id,
2611
- "gearTypeId" => gear_type_id,
2612
- "groupedId" => grouped_id,
2613
- "canBeAddedToInventory" => can_be_added_to_inventory,
2614
- "isContainer" => is_container,
2615
- "isCustomItem" => is_custom_item,
2616
- }
2617
- end
2618
-
2619
- def to_json(options = nil)
2620
- JSON.generate(to_dynamic, options)
2621
- end
2622
- end
2623
-
2624
- class InventoryLimitedUse < Dry::Struct
2625
- attribute :max_uses, Types::Integer
2626
- attribute :number_used, Types::Integer
2627
- attribute :reset_type, Types::String
2628
- attribute :reset_type_description, Types::String
2629
-
2630
- def self.from_dynamic!(d)
2631
- d = Types::Hash[d]
2632
- new(
2633
- max_uses: d.fetch("maxUses"),
2634
- number_used: d.fetch("numberUsed"),
2635
- reset_type: d.fetch("resetType"),
2636
- reset_type_description: d.fetch("resetTypeDescription"),
2637
- )
2638
- end
2639
-
2640
- def self.from_json!(json)
2641
- from_dynamic!(JSON.parse(json))
2642
- end
2643
-
2644
- def to_dynamic
2645
- {
2646
- "maxUses" => max_uses,
2647
- "numberUsed" => number_used,
2648
- "resetType" => reset_type,
2649
- "resetTypeDescription" => reset_type_description,
2650
- }
2651
- end
2652
-
2653
- def to_json(options = nil)
2654
- JSON.generate(to_dynamic, options)
2655
- end
2656
- end
2657
-
2658
- class Inventory < Dry::Struct
2659
- attribute :id, Types::Integer
2660
- attribute :entity_type_id, Types::Integer
2661
- attribute :definition, InventoryDefinition
2662
- attribute :definition_id, Types::Integer
2663
- attribute :definition_type_id, Types::Integer
2664
- attribute :display_as_attack, Types::Nil
2665
- attribute :quantity, Types::Integer
2666
- attribute :is_attuned, Types::Bool
2667
- attribute :equipped, Types::Bool
2668
- attribute :equipped_entity_type_id, Types::Integer.optional
2669
- attribute :equipped_entity_id, Types::Integer.optional
2670
- attribute :charges_used, Types::Integer
2671
- attribute :limited_use, InventoryLimitedUse.optional
2672
- attribute :container_entity_id, Types::Integer
2673
- attribute :container_entity_type_id, Types::Integer
2674
- attribute :container_definition_key, Types::ContainerDefinitionKey
2675
- attribute :currency, Types::Nil
2676
-
2677
- def self.from_dynamic!(d)
2678
- d = Types::Hash[d]
2679
- new(
2680
- id: d.fetch("id"),
2681
- entity_type_id: d.fetch("entityTypeId"),
2682
- definition: InventoryDefinition.from_dynamic!(d.fetch("definition")),
2683
- definition_id: d.fetch("definitionId"),
2684
- definition_type_id: d.fetch("definitionTypeId"),
2685
- display_as_attack: d.fetch("displayAsAttack"),
2686
- quantity: d.fetch("quantity"),
2687
- is_attuned: d.fetch("isAttuned"),
2688
- equipped: d.fetch("equipped"),
2689
- equipped_entity_type_id: d.fetch("equippedEntityTypeId"),
2690
- equipped_entity_id: d.fetch("equippedEntityId"),
2691
- charges_used: d.fetch("chargesUsed"),
2692
- limited_use: d.fetch("limitedUse") ? InventoryLimitedUse.from_dynamic!(d.fetch("limitedUse")) : nil,
2693
- container_entity_id: d.fetch("containerEntityId"),
2694
- container_entity_type_id: d.fetch("containerEntityTypeId"),
2695
- container_definition_key: d.fetch("containerDefinitionKey"),
2696
- currency: d.fetch("currency"),
2697
- )
2698
- end
2699
-
2700
- def self.from_json!(json)
2701
- from_dynamic!(JSON.parse(json))
2702
- end
2703
-
2704
- def to_dynamic
2705
- {
2706
- "id" => id,
2707
- "entityTypeId" => entity_type_id,
2708
- "definition" => definition.to_dynamic,
2709
- "definitionId" => definition_id,
2710
- "definitionTypeId" => definition_type_id,
2711
- "displayAsAttack" => display_as_attack,
2712
- "quantity" => quantity,
2713
- "isAttuned" => is_attuned,
2714
- "equipped" => equipped,
2715
- "equippedEntityTypeId" => equipped_entity_type_id,
2716
- "equippedEntityId" => equipped_entity_id,
2717
- "chargesUsed" => charges_used,
2718
- "limitedUse" => limited_use&.to_dynamic,
2719
- "containerEntityId" => container_entity_id,
2720
- "containerEntityTypeId" => container_entity_type_id,
2721
- "containerDefinitionKey" => container_definition_key,
2722
- "currency" => currency,
2723
- }
2724
- end
2725
-
2726
- def to_json(options = nil)
2727
- JSON.generate(to_dynamic, options)
2728
- end
2729
- end
2730
-
2731
- class Modifiers < Dry::Struct
2732
- attribute :race, Types.Array(ItemElement)
2733
- attribute :modifiers_class, Types.Array(ItemElement)
2734
- attribute :background, Types.Array(ItemElement)
2735
- attribute :item, Types.Array(ItemElement)
2736
- attribute :feat, Types.Array(ItemElement)
2737
- attribute :condition, Types.Array(Types::Any)
2738
-
2739
- def self.from_dynamic!(d)
2740
- d = Types::Hash[d]
2741
- new(
2742
- race: d.fetch("race").map { |x| ItemElement.from_dynamic!(x) },
2743
- modifiers_class: d.fetch("class").map { |x| ItemElement.from_dynamic!(x) },
2744
- background: d.fetch("background").map { |x| ItemElement.from_dynamic!(x) },
2745
- item: d.fetch("item").map { |x| ItemElement.from_dynamic!(x) },
2746
- feat: d.fetch("feat").map { |x| ItemElement.from_dynamic!(x) },
2747
- condition: d.fetch("condition"),
2748
- )
2749
- end
2750
-
2751
- def self.from_json!(json)
2752
- from_dynamic!(JSON.parse(json))
2753
- end
2754
-
2755
- def to_dynamic
2756
- {
2757
- "race" => race.map { |x| x.to_dynamic },
2758
- "class" => modifiers_class.map { |x| x.to_dynamic },
2759
- "background" => background.map { |x| x.to_dynamic },
2760
- "item" => item.map { |x| x.to_dynamic },
2761
- "feat" => feat.map { |x| x.to_dynamic },
2762
- "condition" => condition,
2763
- }
2764
- end
2765
-
2766
- def to_json(options = nil)
2767
- JSON.generate(to_dynamic, options)
2768
- end
2769
- end
2770
-
2771
- class Notes < Dry::Struct
2772
- attribute :allies, Types::Nil
2773
- attribute :personal_possessions, Types::String
2774
- attribute :other_holdings, Types::Nil
2775
- attribute :organizations, Types::Nil
2776
- attribute :enemies, Types::Nil
2777
- attribute :backstory, Types::Nil
2778
- attribute :other_notes, Types::Nil
2779
-
2780
- def self.from_dynamic!(d)
2781
- d = Types::Hash[d]
2782
- new(
2783
- allies: d.fetch("allies"),
2784
- personal_possessions: d.fetch("personalPossessions"),
2785
- other_holdings: d.fetch("otherHoldings"),
2786
- organizations: d.fetch("organizations"),
2787
- enemies: d.fetch("enemies"),
2788
- backstory: d.fetch("backstory"),
2789
- other_notes: d.fetch("otherNotes"),
2790
- )
2791
- end
2792
-
2793
- def self.from_json!(json)
2794
- from_dynamic!(JSON.parse(json))
2795
- end
2796
-
2797
- def to_dynamic
2798
- {
2799
- "allies" => allies,
2800
- "personalPossessions" => personal_possessions,
2801
- "otherHoldings" => other_holdings,
2802
- "organizations" => organizations,
2803
- "enemies" => enemies,
2804
- "backstory" => backstory,
2805
- "otherNotes" => other_notes,
2806
- }
2807
- end
2808
-
2809
- def to_json(options = nil)
2810
- JSON.generate(to_dynamic, options)
2811
- end
2812
- end
2813
-
2814
- class PactMagic < Dry::Struct
2815
- attribute :level, Types::Integer
2816
- attribute :used, Types::Integer
2817
- attribute :available, Types::Integer
2818
-
2819
- def self.from_dynamic!(d)
2820
- d = Types::Hash[d]
2821
- new(
2822
- level: d.fetch("level"),
2823
- used: d.fetch("used"),
2824
- available: d.fetch("available"),
2825
- )
2826
- end
2827
-
2828
- def self.from_json!(json)
2829
- from_dynamic!(JSON.parse(json))
2830
- end
2831
-
2832
- def to_dynamic
2833
- {
2834
- "level" => level,
2835
- "used" => used,
2836
- "available" => available,
2837
- }
2838
- end
2839
-
2840
- def to_json(options = nil)
2841
- JSON.generate(to_dynamic, options)
2842
- end
2843
- end
2844
-
2845
- class Preferences < Dry::Struct
2846
- attribute :use_homebrew_content, Types::Bool
2847
- attribute :progression_type, Types::Integer
2848
- attribute :encumbrance_type, Types::Integer
2849
- attribute :ignore_coin_weight, Types::Bool
2850
- attribute :hit_point_type, Types::Integer
2851
- attribute :show_unarmed_strike, Types::Bool
2852
- attribute :show_scaled_spells, Types::Bool
2853
- attribute :primary_sense, Types::Integer
2854
- attribute :primary_movement, Types::Integer
2855
- attribute :privacy_type, Types::Integer
2856
- attribute :sharing_type, Types::Integer
2857
- attribute :ability_score_display_type, Types::Integer
2858
- attribute :enforce_feat_rules, Types::Bool
2859
- attribute :enforce_multiclass_rules, Types::Bool
2860
- attribute :enable_optional_class_features, Types::Bool
2861
- attribute :enable_optional_origins, Types::Bool
2862
- attribute :enable_dark_mode, Types::Bool
2863
- attribute :enable_container_currency, Types::Bool
2864
-
2865
- def self.from_dynamic!(d)
2866
- d = Types::Hash[d]
2867
- new(
2868
- use_homebrew_content: d.fetch("useHomebrewContent"),
2869
- progression_type: d.fetch("progressionType"),
2870
- encumbrance_type: d.fetch("encumbranceType"),
2871
- ignore_coin_weight: d.fetch("ignoreCoinWeight"),
2872
- hit_point_type: d.fetch("hitPointType"),
2873
- show_unarmed_strike: d.fetch("showUnarmedStrike"),
2874
- show_scaled_spells: d.fetch("showScaledSpells"),
2875
- primary_sense: d.fetch("primarySense"),
2876
- primary_movement: d.fetch("primaryMovement"),
2877
- privacy_type: d.fetch("privacyType"),
2878
- sharing_type: d.fetch("sharingType"),
2879
- ability_score_display_type: d.fetch("abilityScoreDisplayType"),
2880
- enforce_feat_rules: d.fetch("enforceFeatRules"),
2881
- enforce_multiclass_rules: d.fetch("enforceMulticlassRules"),
2882
- enable_optional_class_features: d.fetch("enableOptionalClassFeatures"),
2883
- enable_optional_origins: d.fetch("enableOptionalOrigins"),
2884
- enable_dark_mode: d.fetch("enableDarkMode"),
2885
- enable_container_currency: d.fetch("enableContainerCurrency"),
2886
- )
2887
- end
2888
-
2889
- def self.from_json!(json)
2890
- from_dynamic!(JSON.parse(json))
2891
- end
2892
-
2893
- def to_dynamic
2894
- {
2895
- "useHomebrewContent" => use_homebrew_content,
2896
- "progressionType" => progression_type,
2897
- "encumbranceType" => encumbrance_type,
2898
- "ignoreCoinWeight" => ignore_coin_weight,
2899
- "hitPointType" => hit_point_type,
2900
- "showUnarmedStrike" => show_unarmed_strike,
2901
- "showScaledSpells" => show_scaled_spells,
2902
- "primarySense" => primary_sense,
2903
- "primaryMovement" => primary_movement,
2904
- "privacyType" => privacy_type,
2905
- "sharingType" => sharing_type,
2906
- "abilityScoreDisplayType" => ability_score_display_type,
2907
- "enforceFeatRules" => enforce_feat_rules,
2908
- "enforceMulticlassRules" => enforce_multiclass_rules,
2909
- "enableOptionalClassFeatures" => enable_optional_class_features,
2910
- "enableOptionalOrigins" => enable_optional_origins,
2911
- "enableDarkMode" => enable_dark_mode,
2912
- "enableContainerCurrency" => enable_container_currency,
2913
- }
2914
- end
2915
-
2916
- def to_json(options = nil)
2917
- JSON.generate(to_dynamic, options)
2918
- end
2919
- end
2920
-
2921
- class DisplayConfiguration < Dry::Struct
2922
- attribute :racialtrait, Types::Integer
2923
- attribute :language, Types::Integer
2924
- attribute :abilityscore, Types::Integer
2925
- attribute :classfeature, Types::Integer
2926
-
2927
- def self.from_dynamic!(d)
2928
- d = Types::Hash[d]
2929
- new(
2930
- racialtrait: d.fetch("RACIALTRAIT"),
2931
- language: d.fetch("LANGUAGE"),
2932
- abilityscore: d.fetch("ABILITYSCORE"),
2933
- classfeature: d.fetch("CLASSFEATURE"),
2934
- )
2935
- end
2936
-
2937
- def self.from_json!(json)
2938
- from_dynamic!(JSON.parse(json))
2939
- end
2940
-
2941
- def to_dynamic
2942
- {
2943
- "RACIALTRAIT" => racialtrait,
2944
- "LANGUAGE" => language,
2945
- "ABILITYSCORE" => abilityscore,
2946
- "CLASSFEATURE" => classfeature,
2947
- }
2948
- end
2949
-
2950
- def to_json(options = nil)
2951
- JSON.generate(to_dynamic, options)
2952
- end
2953
- end
2954
-
2955
- class RacialTraitDefinition < Dry::Struct
2956
- attribute :id, Types::Integer
2957
- attribute :definition_key, Types::String
2958
- attribute :entity_type_id, Types::Integer
2959
- attribute :display_order, Types::Integer
2960
- attribute :definition_name, Types::String
2961
- attribute :description, Types::String
2962
- attribute :snippet, Types::String.optional
2963
- attribute :hide_in_builder, Types::Bool
2964
- attribute :hide_in_sheet, Types::Bool
2965
- attribute :activation, Types::Nil
2966
- attribute :source_id, Types::Integer
2967
- attribute :source_page_number, Types::Integer
2968
- attribute :creature_rules, Types.Array(Types::Any)
2969
- attribute :spell_list_ids, Types.Array(Types::Any)
2970
- attribute :feature_type, Types::Integer
2971
- attribute :sources, Types.Array(Source)
2972
- attribute :affected_feature_definition_keys, Types.Array(Types::Any)
2973
- attribute :is_called_out, Types::Bool
2974
- attribute :entity_type, Types::String
2975
- attribute :entity_id, Types::String
2976
- attribute :entity_race_id, Types::Integer
2977
- attribute :entity_race_type_id, Types::Integer
2978
- attribute :display_configuration, DisplayConfiguration
2979
- attribute :required_level, Types::Nil
2980
-
2981
- def self.from_dynamic!(d)
2982
- d = Types::Hash[d]
2983
- new(
2984
- id: d.fetch("id"),
2985
- definition_key: d.fetch("definitionKey"),
2986
- entity_type_id: d.fetch("entityTypeId"),
2987
- display_order: d.fetch("displayOrder"),
2988
- definition_name: d.fetch("name"),
2989
- description: d.fetch("description"),
2990
- snippet: d.fetch("snippet"),
2991
- hide_in_builder: d.fetch("hideInBuilder"),
2992
- hide_in_sheet: d.fetch("hideInSheet"),
2993
- activation: d.fetch("activation"),
2994
- source_id: d.fetch("sourceId"),
2995
- source_page_number: d.fetch("sourcePageNumber"),
2996
- creature_rules: d.fetch("creatureRules"),
2997
- spell_list_ids: d.fetch("spellListIds"),
2998
- feature_type: d.fetch("featureType"),
2999
- sources: d.fetch("sources").map { |x| Source.from_dynamic!(x) },
3000
- affected_feature_definition_keys: d.fetch("affectedFeatureDefinitionKeys"),
3001
- is_called_out: d.fetch("isCalledOut"),
3002
- entity_type: d.fetch("entityType"),
3003
- entity_id: d.fetch("entityID"),
3004
- entity_race_id: d.fetch("entityRaceId"),
3005
- entity_race_type_id: d.fetch("entityRaceTypeId"),
3006
- display_configuration: DisplayConfiguration.from_dynamic!(d.fetch("displayConfiguration")),
3007
- required_level: d.fetch("requiredLevel"),
3008
- )
3009
- end
3010
-
3011
- def self.from_json!(json)
3012
- from_dynamic!(JSON.parse(json))
3013
- end
3014
-
3015
- def to_dynamic
3016
- {
3017
- "id" => id,
3018
- "definitionKey" => definition_key,
3019
- "entityTypeId" => entity_type_id,
3020
- "displayOrder" => display_order,
3021
- "name" => definition_name,
3022
- "description" => description,
3023
- "snippet" => snippet,
3024
- "hideInBuilder" => hide_in_builder,
3025
- "hideInSheet" => hide_in_sheet,
3026
- "activation" => activation,
3027
- "sourceId" => source_id,
3028
- "sourcePageNumber" => source_page_number,
3029
- "creatureRules" => creature_rules,
3030
- "spellListIds" => spell_list_ids,
3031
- "featureType" => feature_type,
3032
- "sources" => sources.map { |x| x.to_dynamic },
3033
- "affectedFeatureDefinitionKeys" => affected_feature_definition_keys,
3034
- "isCalledOut" => is_called_out,
3035
- "entityType" => entity_type,
3036
- "entityID" => entity_id,
3037
- "entityRaceId" => entity_race_id,
3038
- "entityRaceTypeId" => entity_race_type_id,
3039
- "displayConfiguration" => display_configuration.to_dynamic,
3040
- "requiredLevel" => required_level,
3041
- }
3042
- end
3043
-
3044
- def to_json(options = nil)
3045
- JSON.generate(to_dynamic, options)
3046
- end
3047
- end
3048
-
3049
- class RacialTrait < Dry::Struct
3050
- attribute :definition, RacialTraitDefinition
3051
-
3052
- def self.from_dynamic!(d)
3053
- d = Types::Hash[d]
3054
- new(
3055
- definition: RacialTraitDefinition.from_dynamic!(d.fetch("definition")),
3056
- )
3057
- end
3058
-
3059
- def self.from_json!(json)
3060
- from_dynamic!(JSON.parse(json))
3061
- end
3062
-
3063
- def to_dynamic
3064
- {
3065
- "definition" => definition.to_dynamic,
3066
- }
3067
- end
3068
-
3069
- def to_json(options = nil)
3070
- JSON.generate(to_dynamic, options)
3071
- end
3072
- end
3073
-
3074
- class Normal < Dry::Struct
3075
- attribute :walk, Types::Integer
3076
- attribute :fly, Types::Integer
3077
- attribute :burrow, Types::Integer
3078
- attribute :swim, Types::Integer
3079
- attribute :climb, Types::Integer
3080
-
3081
- def self.from_dynamic!(d)
3082
- d = Types::Hash[d]
3083
- new(
3084
- walk: d.fetch("walk"),
3085
- fly: d.fetch("fly"),
3086
- burrow: d.fetch("burrow"),
3087
- swim: d.fetch("swim"),
3088
- climb: d.fetch("climb"),
3089
- )
3090
- end
3091
-
3092
- def self.from_json!(json)
3093
- from_dynamic!(JSON.parse(json))
3094
- end
3095
-
3096
- def to_dynamic
3097
- {
3098
- "walk" => walk,
3099
- "fly" => fly,
3100
- "burrow" => burrow,
3101
- "swim" => swim,
3102
- "climb" => climb,
3103
- }
3104
- end
3105
-
3106
- def to_json(options = nil)
3107
- JSON.generate(to_dynamic, options)
3108
- end
3109
- end
3110
-
3111
- class WeightSpeeds < Dry::Struct
3112
- attribute :normal, Normal
3113
- attribute :encumbered, Types::Nil
3114
- attribute :heavily_encumbered, Types::Nil
3115
- attribute :push_drag_lift, Types::Nil
3116
- attribute :override, Types::Nil
3117
-
3118
- def self.from_dynamic!(d)
3119
- d = Types::Hash[d]
3120
- new(
3121
- normal: Normal.from_dynamic!(d.fetch("normal")),
3122
- encumbered: d.fetch("encumbered"),
3123
- heavily_encumbered: d.fetch("heavilyEncumbered"),
3124
- push_drag_lift: d.fetch("pushDragLift"),
3125
- override: d.fetch("override"),
3126
- )
3127
- end
3128
-
3129
- def self.from_json!(json)
3130
- from_dynamic!(JSON.parse(json))
3131
- end
3132
-
3133
- def to_dynamic
3134
- {
3135
- "normal" => normal.to_dynamic,
3136
- "encumbered" => encumbered,
3137
- "heavilyEncumbered" => heavily_encumbered,
3138
- "pushDragLift" => push_drag_lift,
3139
- "override" => override,
3140
- }
3141
- end
3142
-
3143
- def to_json(options = nil)
3144
- JSON.generate(to_dynamic, options)
3145
- end
3146
- end
3147
-
3148
- class Race < Dry::Struct
3149
- attribute :is_sub_race, Types::Bool
3150
- attribute :base_race_name, Types::String
3151
- attribute :entity_race_id, Types::Integer
3152
- attribute :entity_race_type_id, Types::Integer
3153
- attribute :definition_key, Types::String
3154
- attribute :full_name, Types::String
3155
- attribute :base_race_id, Types::Integer
3156
- attribute :base_race_type_id, Types::Integer
3157
- attribute :description, Types::String
3158
- attribute :avatar_url, Types::String
3159
- attribute :large_avatar_url, Types::String
3160
- attribute :portrait_avatar_url, Types::String
3161
- attribute :more_details_url, Types::String
3162
- attribute :is_homebrew, Types::Bool
3163
- attribute :is_legacy, Types::Bool
3164
- attribute :group_ids, Types.Array(Types::Integer)
3165
- attribute :race_type, Types::Integer
3166
- attribute :supports_subrace, Types::Nil
3167
- attribute :sub_race_short_name, Types::Nil
3168
- attribute :base_name, Types::String
3169
- attribute :racial_traits, Types.Array(RacialTrait)
3170
- attribute :weight_speeds, WeightSpeeds
3171
- attribute :feat_ids, Types.Array(Types::Any)
3172
- attribute :size, Types::Nil
3173
- attribute :size_id, Types::Integer
3174
- attribute :sources, Types.Array(Source)
3175
-
3176
- def self.from_dynamic!(d)
3177
- d = Types::Hash[d]
3178
- new(
3179
- is_sub_race: d.fetch("isSubRace"),
3180
- base_race_name: d.fetch("baseRaceName"),
3181
- entity_race_id: d.fetch("entityRaceId"),
3182
- entity_race_type_id: d.fetch("entityRaceTypeId"),
3183
- definition_key: d.fetch("definitionKey"),
3184
- full_name: d.fetch("fullName"),
3185
- base_race_id: d.fetch("baseRaceId"),
3186
- base_race_type_id: d.fetch("baseRaceTypeId"),
3187
- description: d.fetch("description"),
3188
- avatar_url: d.fetch("avatarUrl"),
3189
- large_avatar_url: d.fetch("largeAvatarUrl"),
3190
- portrait_avatar_url: d.fetch("portraitAvatarUrl"),
3191
- more_details_url: d.fetch("moreDetailsUrl"),
3192
- is_homebrew: d.fetch("isHomebrew"),
3193
- is_legacy: d.fetch("isLegacy"),
3194
- group_ids: d.fetch("groupIds"),
3195
- race_type: d.fetch("type"),
3196
- supports_subrace: d.fetch("supportsSubrace"),
3197
- sub_race_short_name: d.fetch("subRaceShortName"),
3198
- base_name: d.fetch("baseName"),
3199
- racial_traits: d.fetch("racialTraits").map { |x| RacialTrait.from_dynamic!(x) },
3200
- weight_speeds: WeightSpeeds.from_dynamic!(d.fetch("weightSpeeds")),
3201
- feat_ids: d.fetch("featIds"),
3202
- size: d.fetch("size"),
3203
- size_id: d.fetch("sizeId"),
3204
- sources: d.fetch("sources").map { |x| Source.from_dynamic!(x) },
3205
- )
3206
- end
3207
-
3208
- def self.from_json!(json)
3209
- from_dynamic!(JSON.parse(json))
3210
- end
3211
-
3212
- def to_dynamic
3213
- {
3214
- "isSubRace" => is_sub_race,
3215
- "baseRaceName" => base_race_name,
3216
- "entityRaceId" => entity_race_id,
3217
- "entityRaceTypeId" => entity_race_type_id,
3218
- "definitionKey" => definition_key,
3219
- "fullName" => full_name,
3220
- "baseRaceId" => base_race_id,
3221
- "baseRaceTypeId" => base_race_type_id,
3222
- "description" => description,
3223
- "avatarUrl" => avatar_url,
3224
- "largeAvatarUrl" => large_avatar_url,
3225
- "portraitAvatarUrl" => portrait_avatar_url,
3226
- "moreDetailsUrl" => more_details_url,
3227
- "isHomebrew" => is_homebrew,
3228
- "isLegacy" => is_legacy,
3229
- "groupIds" => group_ids,
3230
- "type" => race_type,
3231
- "supportsSubrace" => supports_subrace,
3232
- "subRaceShortName" => sub_race_short_name,
3233
- "baseName" => base_name,
3234
- "racialTraits" => racial_traits.map { |x| x.to_dynamic },
3235
- "weightSpeeds" => weight_speeds.to_dynamic,
3236
- "featIds" => feat_ids,
3237
- "size" => size,
3238
- "sizeId" => size_id,
3239
- "sources" => sources.map { |x| x.to_dynamic },
3240
- }
3241
- end
3242
-
3243
- def to_json(options = nil)
3244
- JSON.generate(to_dynamic, options)
3245
- end
3246
- end
3247
-
3248
- class Traits < Dry::Struct
3249
- attribute :personality_traits, Types::String
3250
- attribute :ideals, Types::String
3251
- attribute :bonds, Types::String
3252
- attribute :flaws, Types::String
3253
- attribute :appearance, Types::Nil
3254
-
3255
- def self.from_dynamic!(d)
3256
- d = Types::Hash[d]
3257
- new(
3258
- personality_traits: d.fetch("personalityTraits"),
3259
- ideals: d.fetch("ideals"),
3260
- bonds: d.fetch("bonds"),
3261
- flaws: d.fetch("flaws"),
3262
- appearance: d.fetch("appearance"),
3263
- )
3264
- end
3265
-
3266
- def self.from_json!(json)
3267
- from_dynamic!(JSON.parse(json))
3268
- end
3269
-
3270
- def to_dynamic
3271
- {
3272
- "personalityTraits" => personality_traits,
3273
- "ideals" => ideals,
3274
- "bonds" => bonds,
3275
- "flaws" => flaws,
3276
- "appearance" => appearance,
3277
- }
3278
- end
3279
-
3280
- def to_json(options = nil)
3281
- JSON.generate(to_dynamic, options)
3282
- end
3283
- end
3284
-
3285
- class Character < Dry::Struct
3286
- attribute :id, Types::Integer
3287
- attribute :user_id, Types::Integer
3288
- attribute :username, Types::String
3289
- attribute :is_assigned_to_player, Types::Bool
3290
- attribute :readonly_url, Types::String
3291
- attribute :decorations, Decorations
3292
- attribute :character_name, Types::String
3293
- attribute :social_name, Types::Nil
3294
- attribute :gender, Types::String
3295
- attribute :faith, Types::String
3296
- attribute :age, Types::Integer
3297
- attribute :hair, Types::String
3298
- attribute :eyes, Types::String
3299
- attribute :skin, Types::String
3300
- attribute :height, Types::String
3301
- attribute :weight, Types::Integer
3302
- attribute :inspiration, Types::Bool
3303
- attribute :base_hit_points, Types::Integer
3304
- attribute :bonus_hit_points, Types::Nil
3305
- attribute :override_hit_points, Types::Nil
3306
- attribute :removed_hit_points, Types::Integer
3307
- attribute :temporary_hit_points, Types::Integer
3308
- attribute :current_xp, Types::Integer
3309
- attribute :alignment_id, Types::Integer
3310
- attribute :lifestyle_id, Types::Integer
3311
- attribute :stats, Types.Array(Stat)
3312
- attribute :bonus_stats, Types.Array(Stat)
3313
- attribute :override_stats, Types.Array(Stat)
3314
- attribute :background, CharacterBackground
3315
- attribute :race, Race
3316
- attribute :race_definition_id, Types::Nil
3317
- attribute :race_definition_type_id, Types::Nil
3318
- attribute :notes, Notes
3319
- attribute :traits, Traits
3320
- attribute :preferences, Preferences
3321
- attribute :configuration, Configuration
3322
- attribute :lifestyle, Types::Nil
3323
- attribute :inventory, Types.Array(Inventory)
3324
- attribute :currencies, Currencies
3325
- attribute :classes, Types.Array(CharacterClass)
3326
- attribute :feats, Types.Array(Feat)
3327
- attribute :features, Types.Array(Types::Any)
3328
- attribute :custom_defense_adjustments, Types.Array(Types::Any)
3329
- attribute :custom_senses, Types.Array(Types::Any)
3330
- attribute :custom_speeds, Types.Array(Types::Any)
3331
- attribute :custom_proficiencies, Types.Array(Types::Any)
3332
- attribute :custom_actions, Types.Array(Types::Any)
3333
- attribute :character_values, Types.Array(Types::Any)
3334
- attribute :conditions, Types.Array(Types::Any)
3335
- attribute :death_saves, DeathSaves
3336
- attribute :adjustment_xp, Types::Nil
3337
- attribute :spell_slots, Types.Array(PactMagic)
3338
- attribute :pact_magic, Types.Array(PactMagic)
3339
- attribute :active_source_categories, Types.Array(Types::Integer)
3340
- attribute :spells, Actions
3341
- attribute :character_options, Options
3342
- attribute :choices, Choices
3343
- attribute :actions, Actions
3344
- attribute :modifiers, Modifiers
3345
- attribute :class_spells, Types.Array(ClassSpell)
3346
- attribute :custom_items, Types.Array(Types::Any)
3347
- attribute :campaign, Campaign
3348
- attribute :creatures, Types.Array(Types::Any)
3349
- attribute :optional_origins, Types.Array(Types::Any)
3350
- attribute :optional_class_features, Types.Array(Types::Any)
3351
- attribute :date_modified, Types::String
3352
- attribute :provided_from, Types::String
3353
- attribute :can_edit, Types::Bool
3354
- attribute :status, Types::Integer
3355
- attribute :status_slug, Types::String
3356
- attribute :campaign_setting, Types::Nil
3357
-
3358
- def self.from_dynamic!(d)
3359
- d = Types::Hash[d]
3360
- new(
3361
- id: d.fetch("id"),
3362
- user_id: d.fetch("userId"),
3363
- username: d.fetch("username"),
3364
- is_assigned_to_player: d.fetch("isAssignedToPlayer"),
3365
- readonly_url: d.fetch("readonlyUrl"),
3366
- decorations: Decorations.from_dynamic!(d.fetch("decorations")),
3367
- character_name: d.fetch("name"),
3368
- social_name: d.fetch("socialName"),
3369
- gender: d.fetch("gender"),
3370
- faith: d.fetch("faith"),
3371
- age: d.fetch("age"),
3372
- hair: d.fetch("hair"),
3373
- eyes: d.fetch("eyes"),
3374
- skin: d.fetch("skin"),
3375
- height: d.fetch("height"),
3376
- weight: d.fetch("weight"),
3377
- inspiration: d.fetch("inspiration"),
3378
- base_hit_points: d.fetch("baseHitPoints"),
3379
- bonus_hit_points: d.fetch("bonusHitPoints"),
3380
- override_hit_points: d.fetch("overrideHitPoints"),
3381
- removed_hit_points: d.fetch("removedHitPoints"),
3382
- temporary_hit_points: d.fetch("temporaryHitPoints"),
3383
- current_xp: d.fetch("currentXp"),
3384
- alignment_id: d.fetch("alignmentId"),
3385
- lifestyle_id: d.fetch("lifestyleId"),
3386
- stats: d.fetch("stats").map { |x| Stat.from_dynamic!(x) },
3387
- bonus_stats: d.fetch("bonusStats").map { |x| Stat.from_dynamic!(x) },
3388
- override_stats: d.fetch("overrideStats").map { |x| Stat.from_dynamic!(x) },
3389
- background: CharacterBackground.from_dynamic!(d.fetch("background")),
3390
- race: Race.from_dynamic!(d.fetch("race")),
3391
- race_definition_id: d.fetch("raceDefinitionId"),
3392
- race_definition_type_id: d.fetch("raceDefinitionTypeId"),
3393
- notes: Notes.from_dynamic!(d.fetch("notes")),
3394
- traits: Traits.from_dynamic!(d.fetch("traits")),
3395
- preferences: Preferences.from_dynamic!(d.fetch("preferences")),
3396
- configuration: Configuration.from_dynamic!(d.fetch("configuration")),
3397
- lifestyle: d.fetch("lifestyle"),
3398
- inventory: d.fetch("inventory").map { |x| Inventory.from_dynamic!(x) },
3399
- currencies: Currencies.from_dynamic!(d.fetch("currencies")),
3400
- classes: d.fetch("classes").map { |x| CharacterClass.from_dynamic!(x) },
3401
- feats: d.fetch("feats").map { |x| Feat.from_dynamic!(x) },
3402
- features: d.fetch("features"),
3403
- custom_defense_adjustments: d.fetch("customDefenseAdjustments"),
3404
- custom_senses: d.fetch("customSenses"),
3405
- custom_speeds: d.fetch("customSpeeds"),
3406
- custom_proficiencies: d.fetch("customProficiencies"),
3407
- custom_actions: d.fetch("customActions"),
3408
- character_values: d.fetch("characterValues"),
3409
- conditions: d.fetch("conditions"),
3410
- death_saves: DeathSaves.from_dynamic!(d.fetch("deathSaves")),
3411
- adjustment_xp: d.fetch("adjustmentXp"),
3412
- spell_slots: d.fetch("spellSlots").map { |x| PactMagic.from_dynamic!(x) },
3413
- pact_magic: d.fetch("pactMagic").map { |x| PactMagic.from_dynamic!(x) },
3414
- active_source_categories: d.fetch("activeSourceCategories"),
3415
- spells: Actions.from_dynamic!(d.fetch("spells")),
3416
- character_options: Options.from_dynamic!(d.fetch("options")),
3417
- choices: Choices.from_dynamic!(d.fetch("choices")),
3418
- actions: Actions.from_dynamic!(d.fetch("actions")),
3419
- modifiers: Modifiers.from_dynamic!(d.fetch("modifiers")),
3420
- class_spells: d.fetch("classSpells").map { |x| ClassSpell.from_dynamic!(x) },
3421
- custom_items: d.fetch("customItems"),
3422
- campaign: Campaign.from_dynamic!(d.fetch("campaign")),
3423
- creatures: d.fetch("creatures"),
3424
- optional_origins: d.fetch("optionalOrigins"),
3425
- optional_class_features: d.fetch("optionalClassFeatures"),
3426
- date_modified: d.fetch("dateModified"),
3427
- provided_from: d.fetch("providedFrom"),
3428
- can_edit: d.fetch("canEdit"),
3429
- status: d.fetch("status"),
3430
- status_slug: d.fetch("statusSlug"),
3431
- campaign_setting: d.fetch("campaignSetting"),
3432
- )
3433
- end
3434
-
3435
- def self.from_json!(json)
3436
- from_dynamic!(JSON.parse(json))
3437
- end
3438
-
3439
- def to_dynamic
3440
- {
3441
- "id" => id,
3442
- "userId" => user_id,
3443
- "username" => username,
3444
- "isAssignedToPlayer" => is_assigned_to_player,
3445
- "readonlyUrl" => readonly_url,
3446
- "decorations" => decorations.to_dynamic,
3447
- "name" => character_name,
3448
- "socialName" => social_name,
3449
- "gender" => gender,
3450
- "faith" => faith,
3451
- "age" => age,
3452
- "hair" => hair,
3453
- "eyes" => eyes,
3454
- "skin" => skin,
3455
- "height" => height,
3456
- "weight" => weight,
3457
- "inspiration" => inspiration,
3458
- "baseHitPoints" => base_hit_points,
3459
- "bonusHitPoints" => bonus_hit_points,
3460
- "overrideHitPoints" => override_hit_points,
3461
- "removedHitPoints" => removed_hit_points,
3462
- "temporaryHitPoints" => temporary_hit_points,
3463
- "currentXp" => current_xp,
3464
- "alignmentId" => alignment_id,
3465
- "lifestyleId" => lifestyle_id,
3466
- "stats" => stats.map { |x| x.to_dynamic },
3467
- "bonusStats" => bonus_stats.map { |x| x.to_dynamic },
3468
- "overrideStats" => override_stats.map { |x| x.to_dynamic },
3469
- "background" => background.to_dynamic,
3470
- "race" => race.to_dynamic,
3471
- "raceDefinitionId" => race_definition_id,
3472
- "raceDefinitionTypeId" => race_definition_type_id,
3473
- "notes" => notes.to_dynamic,
3474
- "traits" => traits.to_dynamic,
3475
- "preferences" => preferences.to_dynamic,
3476
- "configuration" => configuration.to_dynamic,
3477
- "lifestyle" => lifestyle,
3478
- "inventory" => inventory.map { |x| x.to_dynamic },
3479
- "currencies" => currencies.to_dynamic,
3480
- "classes" => classes.map { |x| x.to_dynamic },
3481
- "feats" => feats.map { |x| x.to_dynamic },
3482
- "features" => features,
3483
- "customDefenseAdjustments" => custom_defense_adjustments,
3484
- "customSenses" => custom_senses,
3485
- "customSpeeds" => custom_speeds,
3486
- "customProficiencies" => custom_proficiencies,
3487
- "customActions" => custom_actions,
3488
- "characterValues" => character_values,
3489
- "conditions" => conditions,
3490
- "deathSaves" => death_saves.to_dynamic,
3491
- "adjustmentXp" => adjustment_xp,
3492
- "spellSlots" => spell_slots.map { |x| x.to_dynamic },
3493
- "pactMagic" => pact_magic.map { |x| x.to_dynamic },
3494
- "activeSourceCategories" => active_source_categories,
3495
- "spells" => spells.to_dynamic,
3496
- "options" => character_options.to_dynamic,
3497
- "choices" => choices.to_dynamic,
3498
- "actions" => actions.to_dynamic,
3499
- "modifiers" => modifiers.to_dynamic,
3500
- "classSpells" => class_spells.map { |x| x.to_dynamic },
3501
- "customItems" => custom_items,
3502
- "campaign" => campaign.to_dynamic,
3503
- "creatures" => creatures,
3504
- "optionalOrigins" => optional_origins,
3505
- "optionalClassFeatures" => optional_class_features,
3506
- "dateModified" => date_modified,
3507
- "providedFrom" => provided_from,
3508
- "canEdit" => can_edit,
3509
- "status" => status,
3510
- "statusSlug" => status_slug,
3511
- "campaignSetting" => campaign_setting,
3512
- }
3513
- end
3514
-
3515
- def to_json(options = nil)
3516
- JSON.generate(to_dynamic, options)
3517
- end
3518
- end
3519
- end