Skip to main content

wowlab_sentinel/mcp/schema/
tables.rs

1use wowlab_types::{
2    data::{
3        CooldownSetSpellEntry, EmpowerStage, EncounterEntry, ItemClassification, ItemDropSource,
4        ItemEffect, ItemSetInfo, ItemStat, KeyFloorEntry, KeyLevelRewardEntry, KnowledgeSource,
5        LearnSpell, PointLimits, PowerCostEntry, PvpTierRewardEntry, RppmMod, SpellEffect,
6        TierInstanceEntry, TrackedAffixEntry, TrackedDungeonEntry, TraitEdge, TraitNode,
7        TraitSubTree,
8    },
9    table_registry::GameDataTable,
10};
11
12use crate::mcp::mcp_table;
13
14#[rustfmt::skip]
15mcp_table!(GameDataTable::ArmorLocation, "armor_damage", "Armor slot multipliers by armor type", [
16    // #t:aligned
17    "id": Int                ,
18    "patch_version": Text    ,
19    "cloth_modifier": Float  ,
20    "leather_modifier": Float,
21    "chain_modifier": Float  ,
22    "plate_modifier": Float  ,
23    "modifier": Float        ,
24]);
25
26#[rustfmt::skip]
27mcp_table!(GameDataTable::Classes, "core", "Class data: name, color, spell_class_set", [
28    // #t:aligned
29    "id": Int                   ,
30    "patch_version": Text       ,
31    "name": Text                ,
32    "filename": Text            ,
33    "icon_file_id": Int         ,
34    "color": Text               ,
35    "spell_class_set": Int      ,
36    "primary_stat_priority": Int,
37    "roles_mask": Int           ,
38    "file_name": Text           ,
39]);
40
41#[rustfmt::skip]
42mcp_table!(GameDataTable::CooldownSets, "spell_metadata", "Shared cooldown groups per spec", [
43    // #t:aligned
44    "id": Int                                 ,
45    "patch_version": Text                     ,
46    "chr_specialization": Int                 ,
47    "spells": Json(Vec<CooldownSetSpellEntry>),
48]);
49
50#[rustfmt::skip]
51mcp_table!(GameDataTable::CurvePoints, "item_scaling", "Data points for curve interpolation", [
52    // #t:aligned
53    "id": Int                ,
54    "patch_version": Text    ,
55    "curve_id": Int          ,
56    "order_index": Int       ,
57    "pos_0": Float           ,
58    "pos_1": Float           ,
59    "pos_pre_squish_0": Float,
60    "pos_pre_squish_1": Float,
61]);
62
63#[rustfmt::skip]
64mcp_table!(GameDataTable::Curves, "item_scaling", "Curve definitions for level-scaled values", [
65    // #t:aligned
66    "id": Int            ,
67    "patch_version": Text,
68    "type": Int          ,
69    "flags": Int         ,
70]);
71
72#[rustfmt::skip]
73mcp_table!(GameDataTable::Enchantments, "supporting", "Enchantment data: effects, scaling, item level range", [
74    // #t:aligned
75    "id": Int                       ,
76    "patch_version": Text           ,
77    "name": Text                    ,
78    "duration": Int                 ,
79    "flags": Int                    ,
80    "icon_file_data_id": Int        ,
81    "item_level_min": Int           ,
82    "item_level_max": Int           ,
83    "item_level": Int               ,
84    "charges": Int                  ,
85    "scaling_class": Int            ,
86    "scaling_class_restricted": Int ,
87    "condition_id": Int             ,
88    "min_level": Int                ,
89    "max_level": Int                ,
90    "required_skill_id": Int        ,
91    "required_skill_rank": Int      ,
92    "transmog_use_condition_id": Int,
93    "transmog_cost": Int            ,
94    "item_visual": Int              ,
95    "effect_0": Int                 ,
96    "effect_1": Int                 ,
97    "effect_2": Int                 ,
98    "effect_arg_0": Int             ,
99    "effect_arg_1": Int             ,
100    "effect_arg_2": Int             ,
101    "effect_points_min_0": Float    ,
102    "effect_points_min_1": Float    ,
103    "effect_points_min_2": Float    ,
104    "effect_scaling_points_0": Float,
105    "effect_scaling_points_1": Float,
106    "effect_scaling_points_2": Float,
107]);
108
109#[rustfmt::skip]
110mcp_table!(GameDataTable::ExpectedStatMods, "combat_scaling", "Stat modifier multipliers for content tuning", [
111    // #t:aligned
112    "id": Int                            ,
113    "patch_version": Text                ,
114    "creature_health_mod": Float         ,
115    "player_health_mod": Float           ,
116    "creature_auto_attack_dps_mod": Float,
117    "creature_armor_mod": Float          ,
118    "player_mana_mod": Float             ,
119    "player_primary_stat_mod": Float     ,
120    "player_secondary_stat_mod": Float   ,
121    "armor_constant_mod": Float          ,
122    "creature_spell_damage_mod": Float   ,
123]);
124
125#[rustfmt::skip]
126mcp_table!(GameDataTable::ExpectedStats, "combat_scaling", "Expected stat values per level and expansion", [
127    // #t:aligned
128    "id": Int                        ,
129    "patch_version": Text            ,
130    "expansion_id": Int              ,
131    "lvl": Int                       ,
132    "creature_health": Float         ,
133    "player_health": Float           ,
134    "creature_auto_attack_dps": Float,
135    "creature_armor": Float          ,
136    "player_mana": Float             ,
137    "player_primary_stat": Float     ,
138    "player_secondary_stat": Float   ,
139    "armor_constant": Float          ,
140    "creature_spell_damage": Float   ,
141    "content_set_id": Int            ,
142]);
143
144#[rustfmt::skip]
145mcp_table!(GameDataTable::GemProperties, "supporting", "Gem type and enchantment mappings", [
146    // #t:aligned
147    "id": Int            ,
148    "patch_version": Text,
149    "enchant_id": Int    ,
150    "type": Int          ,
151]);
152
153#[rustfmt::skip]
154mcp_table!(GameDataTable::GlobalColors, "ui_reference", "Named UI color values", [
155    // #t:aligned
156    "id": Int            ,
157    "patch_version": Text,
158    "name": Text         ,
159    "color": Text        ,
160]);
161
162#[rustfmt::skip]
163mcp_table!(GameDataTable::GlobalStrings, "ui_reference", "Localized UI strings by tag", [
164    // #t:aligned
165    "id": Int            ,
166    "patch_version": Text,
167    "tag": Text          ,
168    "value": Text        ,
169    "flags": Int         ,
170]);
171
172#[rustfmt::skip]
173mcp_table!(GameDataTable::ItemArmorQuality, "armor_damage", "Armor quality multipliers", [
174    // #t:aligned
175    "id": Int            ,
176    "patch_version": Text,
177    "qualitymod_0": Float,
178    "qualitymod_1": Float,
179    "qualitymod_2": Float,
180    "qualitymod_3": Float,
181    "qualitymod_4": Float,
182    "qualitymod_5": Float,
183    "qualitymod_6": Float,
184]);
185
186#[rustfmt::skip]
187mcp_table!(GameDataTable::ItemArmorShield, "armor_damage", "Shield armor values by item level and quality", [
188    // #t:aligned
189    "id": Int            ,
190    "patch_version": Text,
191    "item_level": Int    ,
192    "quality_0": Float   ,
193    "quality_1": Float   ,
194    "quality_2": Float   ,
195    "quality_3": Float   ,
196    "quality_4": Float   ,
197    "quality_5": Float   ,
198    "quality_6": Float   ,
199]);
200
201#[rustfmt::skip]
202mcp_table!(GameDataTable::ItemArmorTotal, "armor_damage", "Total armor by item level and armor type", [
203    // #t:aligned
204    "id": Int            ,
205    "patch_version": Text,
206    "item_level": Int    ,
207    "cloth": Float       ,
208    "leather": Float     ,
209    "mail": Float        ,
210    "plate": Float       ,
211]);
212
213#[rustfmt::skip]
214mcp_table!(GameDataTable::ItemBonuses, "item_scaling", "Bonus ID value mappings for item modifications", [
215    // #t:aligned
216    "id": Int                       ,
217    "patch_version": Text           ,
218    "value_0": Int                  ,
219    "value_1": Int                  ,
220    "value_2": Int                  ,
221    "value_3": Int                  ,
222    "parent_item_bonus_list_id": Int,
223    "type": Int                     ,
224    "order_index": Int              ,
225]);
226
227#[rustfmt::skip]
228mcp_table!(GameDataTable::ItemDamageScaling, "armor_damage", "Weapon DPS by item level, type, and quality", [
229    // #t:aligned
230    "id": Int            ,
231    "patch_version": Text,
232    "weapon_type": Text  ,
233    "item_level": Int    ,
234    "quality_0": Float   ,
235    "quality_1": Float   ,
236    "quality_2": Float   ,
237    "quality_3": Float   ,
238    "quality_4": Float   ,
239    "quality_5": Float   ,
240    "quality_6": Float   ,
241]);
242
243#[rustfmt::skip]
244mcp_table!(GameDataTable::Items, "core", "Item data: name, ilvl, quality, stats, sockets, effects", [
245    // #t:aligned
246    "id": Int                                         ,
247    "patch_version": Text                             ,
248    "name": Text                                      ,
249    "description": Text                               ,
250    "file_name": Text                                 ,
251    "item_level": Int                                 ,
252    "quality": Int                                    ,
253    "required_level": Int                             ,
254    "binding": Int                                    ,
255    "buy_price": Int                                  ,
256    "sell_price": Int                                 ,
257    "max_count": Int                                  ,
258    "stackable": Int                                  ,
259    "speed": Int                                      ,
260    "class_id": Int                                   ,
261    "subclass_id": Int                                ,
262    "inventory_type": Int                             ,
263    "classification": Json(Option<ItemClassification>),
264    "stats": Json(Vec<ItemStat>)                      ,
265    "effects": Json(Vec<ItemEffect>)                  ,
266    "sockets": IntArray                               ,
267    "socket_bonus_enchant_id": Int                    ,
268    "flags": IntArray                                 ,
269    "allowable_class": Int                            ,
270    "allowable_race": Int                             ,
271    "expansion_id": Int                               ,
272    "item_set_id": Int                                ,
273    "set_info": Json(Option<ItemSetInfo>)             ,
274    "drop_sources": Json(Vec<ItemDropSource>)         ,
275    "dmg_variance": Float                             ,
276    "gem_properties": Int                             ,
277    "modified_crafting_reagent_item_id": Int          ,
278]);
279
280#[rustfmt::skip]
281mcp_table!(GameDataTable::PowerTypes, "spell_metadata", "Resource type definitions (mana, rage, energy, etc.)", [
282    // #t:aligned
283    "id": Int                     ,
284    "patch_version": Text         ,
285    "name_global_string_tag": Text,
286    "cost_global_string_tag": Text,
287    "power_type_enum": Int        ,
288    "min_power": Int              ,
289    "max_base_power": Int         ,
290    "center_power": Int           ,
291    "default_power": Int          ,
292    "display_modifier": Float     ,
293    "regen_interrupt_time_ms": Int,
294    "regen_peace": Float          ,
295    "regen_combat": Float         ,
296    "flags": Int                  ,
297]);
298
299#[rustfmt::skip]
300mcp_table!(GameDataTable::RandPropPoints, "item_scaling", "Random property stat budgets by item level and quality", [
301    // #t:aligned
302    "id": Int                     ,
303    "patch_version": Text         ,
304    "damage_replace_stat_f": Float,
305    "damage_secondary_f": Float   ,
306    "damage_replace_stat": Int    ,
307    "damage_secondary": Int       ,
308    "epic_f_0": Float             ,
309    "epic_f_1": Float             ,
310    "epic_f_2": Float             ,
311    "epic_f_3": Float             ,
312    "epic_f_4": Float             ,
313    "superior_f_0": Float         ,
314    "superior_f_1": Float         ,
315    "superior_f_2": Float         ,
316    "superior_f_3": Float         ,
317    "superior_f_4": Float         ,
318    "good_f_0": Float             ,
319    "good_f_1": Float             ,
320    "good_f_2": Float             ,
321    "good_f_3": Float             ,
322    "good_f_4": Float             ,
323    "epic_0": Int                 ,
324    "epic_1": Int                 ,
325    "epic_2": Int                 ,
326    "epic_3": Int                 ,
327    "epic_4": Int                 ,
328    "superior_0": Int             ,
329    "superior_1": Int             ,
330    "superior_2": Int             ,
331    "superior_3": Int             ,
332    "superior_4": Int             ,
333    "good_0": Int                 ,
334    "good_1": Int                 ,
335    "good_2": Int                 ,
336    "good_3": Int                 ,
337    "good_4": Int                 ,
338]);
339
340#[rustfmt::skip]
341mcp_table!(GameDataTable::SpecializationSpells, "spell_metadata", "Spec spell assignments and overrides", [
342    // #t:aligned
343    "id": Int                ,
344    "patch_version": Text    ,
345    "spec_id": Int           ,
346    "spell_id": Int          ,
347    "overrides_spell_id": Int,
348]);
349
350#[rustfmt::skip]
351mcp_table!(GameDataTable::Specs, "core", "Specializations: name, class, role, mastery", [
352    // #t:aligned
353    "id": Int                   ,
354    "patch_version": Text       ,
355    "name": Text                ,
356    "description": Text         ,
357    "class_id": Int             ,
358    "class_name": Text          ,
359    "role": Int                 ,
360    "order_index": Int          ,
361    "icon_file_id": Int         ,
362    "primary_stat_priority": Int,
363    "mastery_spell_id_0": Int   ,
364    "mastery_spell_id_1": Int   ,
365    "file_name": Text           ,
366]);
367
368#[rustfmt::skip]
369mcp_table!(GameDataTable::Traits, "core", "Full talent trees per spec: nodes, edges, sub-trees", [
370    // #t:aligned
371    "spec_id": Int                      ,
372    "patch_version": Text               ,
373    "spec_name": Text                   ,
374    "class_name": Text                  ,
375    "tree_id": Int                      ,
376    "all_node_ids": IntArray            ,
377    "nodes": Json(Vec<TraitNode>)       ,
378    "edges": Json(Vec<TraitEdge>)       ,
379    "sub_trees": Json(Vec<TraitSubTree>),
380    "point_limits": Json(PointLimits)   ,
381]);
382
383#[rustfmt::skip]
384mcp_table!(GameDataTable::Spells, "core", "Spell data: timing, effects, costs, school, aura info", [
385    // #t:aligned
386    "id": Int                                ,
387    "patch_version": Text                    ,
388    "name": Text                             ,
389    "description": Text                      ,
390    "aura_description": Text                 ,
391    "description_variables": Text            ,
392    "file_name": Text                        ,
393    "is_passive": Bool                       ,
394    "knowledge_source": Json(KnowledgeSource),
395    "cast_time": Int                         ,
396    "recovery_time": Int                     ,
397    "start_recovery_time": Int               ,
398    "mana_cost": Int                         ,
399    "power_costs": Json(Vec<PowerCostEntry>) ,
400    "charge_recovery_time": Int              ,
401    "max_charges": Int                       ,
402    "range_max_0": Float                     ,
403    "range_max_1": Float                     ,
404    "range_min_0": Float                     ,
405    "range_min_1": Float                     ,
406    "cone_degrees": Float                    ,
407    "radius_max": Float                      ,
408    "radius_min": Float                      ,
409    "defense_type": Int                      ,
410    "school_mask": Int                       ,
411    "bonus_coefficient_from_ap": Float       ,
412    "effect_bonus_coefficient": Float        ,
413    "interrupt_aura_0": Int                  ,
414    "interrupt_aura_1": Int                  ,
415    "interrupt_channel_0": Int               ,
416    "interrupt_channel_1": Int               ,
417    "interrupt_flags": Int                   ,
418    "duration": Int                          ,
419    "max_duration": Int                      ,
420    "can_empower": Bool                      ,
421    "empower_stages": Json(Vec<EmpowerStage>),
422    "dispel_type": Int                       ,
423    "facing_caster_flags": Int               ,
424    "speed": Float                           ,
425    "spell_class_mask_1": Int                ,
426    "spell_class_mask_2": Int                ,
427    "spell_class_mask_3": Int                ,
428    "spell_class_mask_4": Int                ,
429    "spell_class_set": Int                   ,
430    "base_level": Int                        ,
431    "max_level": Int                         ,
432    "max_passive_aura_level": Int            ,
433    "spell_level": Int                       ,
434    "caster_aura_spell": Int                 ,
435    "caster_aura_state": Int                 ,
436    "exclude_caster_aura_spell": Int         ,
437    "exclude_caster_aura_state": Int         ,
438    "exclude_target_aura_spell": Int         ,
439    "exclude_target_aura_state": Int         ,
440    "target_aura_spell": Int                 ,
441    "target_aura_state": Int                 ,
442    "replacement_spell_id": Int              ,
443    "shapeshift_exclude_0": Int              ,
444    "shapeshift_exclude_1": Int              ,
445    "shapeshift_mask_0": Int                 ,
446    "shapeshift_mask_1": Int                 ,
447    "stance_bar_order": Int                  ,
448    "required_totem_category_0": Int         ,
449    "required_totem_category_1": Int         ,
450    "totem_0": Int                           ,
451    "totem_1": Int                           ,
452    "attributes": IntArray                   ,
453    "effect_trigger_spell": IntArray         ,
454    "implicit_target": IntArray              ,
455    "learn_spells": Json(Vec<LearnSpell>)    ,
456    "effects": Json(Vec<SpellEffect>)        ,
457    "min_scaling_level": Int                 ,
458    "max_scaling_level": Int                 ,
459    "max_stacks": Int                        ,
460    "periodic_type": Text                    ,
461    "tick_period_ms": Int                    ,
462    "refresh_behavior": Text                 ,
463    "duration_hasted": Bool                  ,
464    "hasted_ticks": Bool                     ,
465    "pandemic_refresh": Bool                 ,
466    "rolling_periodic": Bool                 ,
467    "tick_may_crit": Bool                    ,
468    "tick_on_application": Bool              ,
469    "rppm_base_rate": Float                  ,
470    "rppm_flags": Int                        ,
471    "rppm_mods": Json(Vec<RppmMod>)          ,
472    "labels": Json(Vec<i32>)                 ,
473]);
474
475#[rustfmt::skip]
476mcp_table!(GameDataTable::JournalTiers, "loot", "Curated current-season raid/dungeon tier with embedded instance list", [
477    // #t:aligned
478    "id": Int                                ,
479    "patch_version": Text                    ,
480    "name": Text                             ,
481    "expansion": Int                         ,
482    "player_condition_id": Int               ,
483    "instances": Json(Vec<TierInstanceEntry>),
484]);
485
486#[rustfmt::skip]
487mcp_table!(GameDataTable::JournalInstances, "loot", "Current-tier instances (raids/dungeons) with encounters and asset paths", [
488    // #t:aligned
489    "id": Int                              ,
490    "patch_version": Text                  ,
491    "name": Text                           ,
492    "description": Text                    ,
493    "map_id": Int                          ,
494    "kind": Text                           ,
495    "is_mythic_plus": Bool                 ,
496    "is_current_season": Bool              ,
497    "tier_id": Int                         ,
498    "tier_name": Text                      ,
499    "tier_order_index": Int                ,
500    "encounters": Json(Vec<EncounterEntry>),
501    "background_file_data_id": Int         ,
502    "background_storage_path": Text        ,
503    "button_file_data_id": Int             ,
504    "button_storage_path": Text            ,
505    "button_small_file_data_id": Int       ,
506    "lore_file_data_id": Int               ,
507    "lore_storage_path": Text              ,
508    "loadscreen_file_data_id": Int         ,
509    "loadscreen_storage_path": Text        ,
510    "loadscreen_seo_storage_path": Text    ,
511]);
512
513#[rustfmt::skip]
514mcp_table!(GameDataTable::Difficulties, "loot", "Difficulty rows from Difficulty DBC with derived kind (raid/dungeon/pvp/world/scenario)", [
515    // #t:aligned
516    "id": Int            ,
517    "patch_version": Text,
518    "name": Text         ,
519    "instance_type": Int ,
520    "order_index": Int   ,
521    "min_players": Int   ,
522    "max_players": Int   ,
523    "flags": Int         ,
524    "item_context": Int  ,
525    "kind": Text         ,
526]);
527
528#[rustfmt::skip]
529mcp_table!(GameDataTable::CraftedProducts, "loot", "Crafted gear: one row per (CraftingData, quality variant) with profession resolved via the recipe spell chain", [
530    // #t:aligned
531    "id": Int                   ,
532    "patch_version": Text       ,
533    "crafting_data_id": Int     ,
534    "crafted_item_id": Int      ,
535    "crafted_item_name": Text   ,
536    "quality_tier": Int         ,
537    "quality_item_id": Int      ,
538    "quality_item_name": Text   ,
539    "quality_item_level": Int   ,
540    "profession_id": Int        ,
541    "profession_name": Text     ,
542    "profession_enum_value": Int,
543    "item_bonus_tree_id": Int   ,
544]);
545
546#[rustfmt::skip]
547mcp_table!(GameDataTable::Professions, "loot", "Profession definitions with display name keyed by ProfessionEnumValue", [
548    // #t:aligned
549    "id": Int                   ,
550    "patch_version": Text       ,
551    "skill_line_id": Int        ,
552    "profession_enum_value": Int,
553    "name": Text                ,
554]);
555
556#[rustfmt::skip]
557mcp_table!(GameDataTable::ItemDropScaling, "loot", "Per-(item, source_kind, difficulty_key) resolved Upgrade/Flair BonusIDs precomputed at sync time from the WoW-Lab-Data bonus resolver. upgrade_id/flair_id are 0 for baseline difficulties (e.g. dungeon Normal)", [
558    // #t:aligned
559    "id": Int             ,
560    "patch_version": Text ,
561    "item_id": Int        ,
562    "source_kind": Text   ,
563    "difficulty_key": Text,
564    "upgrade_id": Int     ,
565    "flair_id": Int       ,
566]);
567
568#[rustfmt::skip]
569mcp_table!(GameDataTable::PvpTiers, "seasons", "PvP tier definitions (Combatant/Challenger/Rival/...) 1:1 from PvpTier DBC", [
570    // #t:aligned
571    "id": Int            ,
572    "patch_version": Text,
573    "name": Text         ,
574    "min_rating": Int    ,
575    "max_rating": Int    ,
576    "prev_tier": Int     ,
577    "next_tier": Int     ,
578    "bracket_id": Int    ,
579    "rank": Int          ,
580    "rank_icon": Int     ,
581]);
582
583#[rustfmt::skip]
584mcp_table!(meta, "supporting", "Sync metadata singleton: published snapshot revision and canonical patch version", [
585    // #t:aligned
586    "id": Int              ,
587    "revision": Int        ,
588    "patch_version": Text  ,
589    "synced_at": Timestamp ,
590    "table_revisions": Json,
591]);
592
593#[rustfmt::skip]
594mcp_table!(GameDataTable::PvpSeasons, "seasons", "Current PvP season with embedded tier rewards", [
595    // #t:aligned
596    "id": Int                                    ,
597    "patch_version": Text                        ,
598    "milestone_season": Int                      ,
599    "alliance_achievement_id": Int               ,
600    "horde_achievement_id": Int                  ,
601    "tier_rewards": Json(Vec<PvpTierRewardEntry>),
602]);
603
604#[rustfmt::skip]
605mcp_table!(GameDataTable::MythicPlusSeasons, "seasons", "Current M+ season with key-level rewards, tracked dungeons/affixes/floors, and crest currency context", [
606    // #t:aligned
607    "id": Int                                         ,
608    "patch_version": Text                             ,
609    "milestone_season": Int                           ,
610    "start_time_event": Int                           ,
611    "expansion_level": Int                            ,
612    "heroic_lfg_dungeon_min_gear": Int                ,
613    "display_season_id": Int                          ,
614    "display_season_name": Text                       ,
615    "display_season_index": Int                       ,
616    "delves_season_id": Int                           ,
617    "item_group_ilvl_scaling_id": Int                 ,
618    "bonus_list_groups": IntArray                     ,
619    "crest_currencies": IntArray                      ,
620    "valorstones_currency_id": Int                    ,
621    "tracked_dungeons": Json(Vec<TrackedDungeonEntry>),
622    "tracked_affixes": Json(Vec<TrackedAffixEntry>)   ,
623    "key_floors": Json(Vec<KeyFloorEntry>)            ,
624    "key_rewards": Json(Vec<KeyLevelRewardEntry>)     ,
625]);
626
627#[rustfmt::skip]
628mcp_table!(GameDataTable::DelvesSeasons, "seasons", "DelvesSeason 1:1 from DBC", [
629    // #t:aligned
630    "id": Int            ,
631    "patch_version": Text,
632    "faction_id": Int    ,
633]);
634
635#[rustfmt::skip]
636mcp_table!(GameDataTable::Currencies, "currencies", "CurrencyTypes with embedded CurrencyCategory.Name_lang as category_name", [
637    // #t:aligned
638    "id": Int                   ,
639    "patch_version": Text       ,
640    "name": Text                ,
641    "category_id": Int          ,
642    "category_name": Text       ,
643    "icon_file_id": Int         ,
644    "max_qty": Int              ,
645    "max_earnable_per_week": Int,
646    "quality": Int              ,
647    "order_index": Int          ,
648    "flags": Int                ,
649]);
650
651#[rustfmt::skip]
652mcp_table!(GameDataTable::CurrencyCategories, "currencies", "CurrencyCategory 1:1 from DBC", [
653    // #t:aligned
654    "id": Int                ,
655    "patch_version": Text    ,
656    "name": Text             ,
657    "flags": Int             ,
658    "expansion_id": Int      ,
659    "parent_category_id": Int,
660]);
661
662#[rustfmt::skip]
663mcp_table!(GameDataTable::ItemBonusListGroups, "item_scaling", "ItemBonusListGroup 1:1 — clusters bonus list groups under their season-level ItemGroupIlvlScalingID", [
664    // #t:aligned
665    "id": Int                        ,
666    "patch_version": Text            ,
667    "sequence_spell_id": Int         ,
668    "player_condition_id": Int       ,
669    "item_extended_cost_id": Int     ,
670    "item_logical_cost_group_id": Int,
671    "item_group_ilvl_scaling_id": Int,
672]);
673
674#[rustfmt::skip]
675mcp_table!(GameDataTable::ItemGroupIlvlScalingEntries, "item_scaling", "ItemGroupIlvlScalingEntry 1:1 — per-(group, currency) cost scaling factors", [
676    // #t:aligned
677    "id": Int                        ,
678    "patch_version": Text            ,
679    "currency_type_id": Int          ,
680    "item_id": Int                   ,
681    "cost_scaling": Float            ,
682    "flags": Int                     ,
683    "player_condition_id": Int       ,
684    "conditional_cost_scaling": Float,
685    "item_group_ilvl_scaling_id": Int,
686]);
687
688#[rustfmt::skip]
689mcp_table!(GameDataTable::ItemConversions, "item_scaling", "ItemConversion parent rows with embedded ItemConversionEntry.ItemID list (catalysts)", [
690    // #t:aligned
691    "id": Int                                  ,
692    "patch_version": Text                      ,
693    "item_bonus_tree_id": Int                  ,
694    "item_logical_cost_group_id": Int          ,
695    "alternate_item_logical_cost_group_id": Int,
696    "player_condition_id": Int                 ,
697    "items": IntArray                          ,
698]);
699
700#[rustfmt::skip]
701mcp_table!(GameDataTable::ChallengeModeItemBonusOverrides, "item_scaling", "ChallengeModeItemBonusOverride 1:1 — M+ swaps src→dst bonus tree based on time event", [
702    // #t:aligned
703    "id": Int                            ,
704    "patch_version": Text                ,
705    "item_bonus_tree_group_id": Int      ,
706    "dst_item_bonus_tree_id": Int        ,
707    "value": Int                         ,
708    "required_time_event_passed": Int    ,
709    "required_time_event_not_passed": Int,
710    "src_item_bonus_tree_id": Int        ,
711]);
712
713#[rustfmt::skip]
714mcp_table!(GameDataTable::ItemBonusSequenceSpells, "item_scaling", "ItemBonusSequenceSpell 1:1 — spark items used by upgrade sequences", [
715    // #t:aligned
716    "id": Int            ,
717    "patch_version": Text,
718    "spell_id": Int      ,
719    "item_id": Int       ,
720]);
721
722#[rustfmt::skip]
723mcp_table!(GameDataTable::ItemLevelSelectors, "item_scaling", "ItemLevelSelector 1:1 — minimum item level + quality set link", [
724    // #t:aligned
725    "id": Int                                ,
726    "patch_version": Text                    ,
727    "min_item_level": Int                    ,
728    "item_level_selector_quality_set_id": Int,
729    "azerite_unlock_mapping_set_id": Int     ,
730]);
731
732#[rustfmt::skip]
733mcp_table!(GameDataTable::ItemLevelSelectorQualitySets, "item_scaling", "ItemLevelSelectorQualitySet 1:1 — rare/epic ilvl thresholds", [
734    // #t:aligned
735    "id": Int            ,
736    "patch_version": Text,
737    "ilvl_rare": Int     ,
738    "ilvl_epic": Int     ,
739]);
740
741#[rustfmt::skip]
742mcp_table!(GameDataTable::ItemLevelSelectorQualities, "item_scaling", "ItemLevelSelectorQuality 1:1 — per-quality bonus list within a quality set", [
743    // #t:aligned
744    "id": Int                        ,
745    "patch_version": Text            ,
746    "quality_item_bonus_list_id": Int,
747    "quality": Int                   ,
748    "parent_ils_quality_set_id": Int ,
749]);
750
751#[rustfmt::skip]
752mcp_table!(GameDataTable::HpPerSta, "combat_scaling", "Health per stamina by level", [
753    // #t:aligned
754    "level": Int         ,
755    "patch_version": Text,
756    "health": Float      ,
757]);
758
759#[rustfmt::skip]
760mcp_table!(GameDataTable::CombatRatings, "combat_scaling", "Combat rating -> percent conversion by level", [
761    // #t:aligned
762    "level": Int                     ,
763    "patch_version": Text            ,
764    "unused_0": Float                ,
765    "defense_skill": Float           ,
766    "dodge": Float                   ,
767    "parry": Float                   ,
768    "block": Float                   ,
769    "hit_melee": Float               ,
770    "hit_ranged": Float              ,
771    "hit_spell": Float               ,
772    "crit_melee": Float              ,
773    "crit_ranged": Float             ,
774    "crit_spell": Float              ,
775    "corruption": Float              ,
776    "corruption_resistance": Float   ,
777    "speed": Float                   ,
778    "resilience_crit_taken": Float   ,
779    "resilience_player_damage": Float,
780    "lifesteal": Float               ,
781    "haste_melee": Float             ,
782    "haste_ranged": Float            ,
783    "haste_spell": Float             ,
784    "avoidance": Float               ,
785    "sturdiness": Float              ,
786    "unused_7": Float                ,
787    "expertise": Float               ,
788    "armor_penetration": Float       ,
789    "mastery": Float                 ,
790    "pvp_power": Float               ,
791    "unused_27": Float               ,
792    "versatility_damage_done": Float ,
793    "versatility_healing_done": Float,
794    "versatility_damage_taken": Float,
795    "unused_12": Float               ,
796]);
797
798#[rustfmt::skip]
799mcp_table!(GameDataTable::CombatRatingsMultByIlvl, "combat_scaling", "Secondary-stat diminishing-returns multiplier by item level", [
800    // #t:aligned
801    "item_level": Int          ,
802    "patch_version": Text      ,
803    "armor_multiplier": Float  ,
804    "weapon_multiplier": Float ,
805    "trinket_multiplier": Float,
806    "jewelry_multiplier": Float,
807]);
808
809#[rustfmt::skip]
810mcp_table!(GameDataTable::StaminaMultByIlvl, "combat_scaling", "Stamina multiplier by item level", [
811    // #t:aligned
812    "item_level": Int          ,
813    "patch_version": Text      ,
814    "armor_multiplier": Float  ,
815    "weapon_multiplier": Float ,
816    "trinket_multiplier": Float,
817    "jewelry_multiplier": Float,
818]);
819
820#[rustfmt::skip]
821mcp_table!(GameDataTable::BaseMp, "combat_scaling", "Base mana per class by level", [
822    // #t:aligned
823    "level": Int         ,
824    "patch_version": Text,
825    "rogue": Float       ,
826    "druid": Float       ,
827    "hunter": Float      ,
828    "mage": Float        ,
829    "paladin": Float     ,
830    "priest": Float      ,
831    "shaman": Float      ,
832    "warlock": Float     ,
833    "warrior": Float     ,
834    "death_knight": Float,
835    "monk": Float        ,
836    "demon_hunter": Float,
837    "evoker": Float      ,
838    "adventurer": Float  ,
839    "traveler": Float    ,
840]);
841
842#[rustfmt::skip]
843mcp_table!(GameDataTable::SpellScaling, "combat_scaling", "Spell scaling base per class by level", [
844    // #t:aligned
845    "level": Int                ,
846    "patch_version": Text       ,
847    "rogue": Float              ,
848    "druid": Float              ,
849    "hunter": Float             ,
850    "mage": Float               ,
851    "paladin": Float            ,
852    "priest": Float             ,
853    "shaman": Float             ,
854    "warlock": Float            ,
855    "warrior": Float            ,
856    "death_knight": Float       ,
857    "monk": Float               ,
858    "demon_hunter": Float       ,
859    "evoker": Float             ,
860    "adventurer": Float         ,
861    "traveler": Float           ,
862    "item": Float               ,
863    "consumable": Float         ,
864    "gem1": Float               ,
865    "gem2": Float               ,
866    "gem3": Float               ,
867    "health": Float             ,
868    "damage_replace_stat": Float,
869    "damage_secondary": Float   ,
870    "mana_consumable": Float    ,
871]);
872
873#[rustfmt::skip]
874mcp_table!(GameDataTable::ArmorMitigationByLvl, "combat_scaling", "Armor mitigation constant by level", [
875    // #t:aligned
876    "level": Int         ,
877    "patch_version": Text,
878    "constant": Float    ,
879]);
880
881#[rustfmt::skip]
882mcp_table!(GameDataTable::NpcTotalHp, "combat_scaling", "NPC total health curve by level", [
883    // #t:aligned
884    "level": Int         ,
885    "patch_version": Text,
886    "rogue": Float       ,
887    "druid": Float       ,
888    "hunter": Float      ,
889    "mage": Float        ,
890    "paladin": Float     ,
891    "priest": Float      ,
892    "shaman": Float      ,
893    "warlock": Float     ,
894    "warrior": Float     ,
895    "death_knight": Float,
896    "monk": Float        ,
897    "demon_hunter": Float,
898]);
899
900#[rustfmt::skip]
901mcp_table!(GameDataTable::NpcDamageByClass, "combat_scaling", "NPC damage curve by level", [
902    // #t:aligned
903    "level": Int         ,
904    "patch_version": Text,
905    "rogue": Float       ,
906    "druid": Float       ,
907    "hunter": Float      ,
908    "mage": Float        ,
909    "paladin": Float     ,
910    "priest": Float      ,
911    "shaman": Float      ,
912    "warlock": Float     ,
913    "warrior": Float     ,
914    "death_knight": Float,
915    "monk": Float        ,
916    "demon_hunter": Float,
917]);
918
919#[rustfmt::skip]
920mcp_table!(GameDataTable::ChallengeModeHealth, "combat_scaling", "Mythic+ enemy health multiplier by keystone level", [
921    // #t:aligned
922    "challenge_level": Int,
923    "patch_version": Text ,
924    "scalar": Float       ,
925]);
926
927#[rustfmt::skip]
928mcp_table!(GameDataTable::ChallengeModeDamage, "combat_scaling", "Mythic+ enemy damage multiplier by keystone level", [
929    // #t:aligned
930    "challenge_level": Int,
931    "patch_version": Text ,
932    "scalar": Float       ,
933]);
934
935#[rustfmt::skip]
936mcp_table!(GameDataTable::ItemSocketCostPerLevel, "item_scaling", "Gem socket stat budget by item level", [
937    // #t:aligned
938    "item_level": Int    ,
939    "patch_version": Text,
940    "socket_cost": Float ,
941]);
942
943#[rustfmt::skip]
944mcp_table!(GameDataTable::ProfessionRatings, "supporting", "Profession stat rating conversions by expansion", [
945    // #t:aligned
946    "expansion": Text                             ,
947    "patch_version": Text                         ,
948    "inspiration_craft_crit": Float               ,
949    "resourcefulness_reagent_reduction": Float    ,
950    "finesse_gather_extra": Float                 ,
951    "deftness_gather_time_decrease": Float        ,
952    "perception_gather_discover": Float           ,
953    "craft_speed_time_decrease": Float            ,
954    "multicraft_craft_extra": Float               ,
955    "ingenuity_concentration_refund_chance": Float,
956    "unused_was_perception_gather_range": Float   ,
957]);
958
959#[rustfmt::skip]
960mcp_table!(GameDataTable::BaseProfessionRatings, "supporting", "Base profession stat rating conversions by profession", [
961    // #t:aligned
962    "profession": Text                              ,
963    "patch_version": Text                           ,
964    "inspiration_craft_crit": Float                 ,
965    "resourcefulness_reagent_reduction": Float      ,
966    "finesse_gather_extra": Float                   ,
967    "deftness_gather_time_decrease": Float          ,
968    "perception_gather_discover": Float             ,
969    "craft_speed_time_decrease": Float              ,
970    "multicraft_craft_extra": Float                 ,
971    "unused_was_finesse_gather_time_increase": Float,
972    "unused_was_perception_gather_range": Float     ,
973]);