Skip to main content

wowlab_sentinel/mcp/schema/
tables.rs

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