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