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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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 "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]);