local ____lualib = require("lualib_bundle") local __TS__Number = ____lualib.__TS__Number local __TS__ArrayFind = ____lualib.__TS__ArrayFind local __TS__NumberIsFinite = ____lualib.__TS__NumberIsFinite local __TS__ArrayFilter = ____lualib.__TS__ArrayFilter local __TS__ArrayMap = ____lualib.__TS__ArrayMap local __TS__ArraySort = ____lualib.__TS__ArraySort local ____exports = {} local function cards1to13(self) return { { id = 1, quality = 4, defaultCard = false, inherent = true, deck_slots = 3, price_free = 20800, max_copies = 1, values = {vampirism_bonus = {7, 9, 11}, damage_multiplier = {0.5, 1.25, 2}, max_health_penalty_pct = {25, 20, 15}} }, { id = 2, inherent = true, deck_slots = 3, quality = 4, defaultCard = false, price_free = 20800, max_copies = 1, values = {speed_bonus = {45, 60, 75}, speed_limit = {0, 1100, 1350}, pass_through_units = {0, 0, 1}, attacktime = {0, 0, 50}} }, { id = 3, quality = 1, defaultCard = true, price_free = 0, max_copies = 2, values = {damage_pct = {2.5, 3.5, 4.5}} }, { id = 4, quality = 2, defaultCard = true, price_free = 0, max_copies = 2, values = {card_bonus = {1, 2, 3}} }, { id = 5, quality = 2, defaultCard = true, price_free = 0, max_copies = 2, values = {card_bonus_pct = {1.15, 1.35, 1.67}} }, { id = 6, quality = 5, defaultCard = false, price_free = 83200, max_copies = 1, values = {card_show_count = {3}, min_card_choice = {4}, free_reroll_charges = {0, 2, 2}} }, { id = 7, quality = 2, defaultCard = true, price_free = 0, max_copies = 2, values = {daynight_bonus_pct = {35, 40, 45}} }, { id = 8, quality = 2, defaultCard = true, price_free = 0, max_copies = 2, values = {damage_bonus_health_decress = {2.5, 3.5, 4.5}, stack_health_threshold = {900, 1200, 1500}} }, { id = 9, quality = 4, defaultCard = false, price_free = 20800, max_copies = 1, values = {greed_net_worth_per_stack = {100, 100, 100}, kill_gold_bonus_pct = {15, 20, 25}} }, { id = 10, quality = 1, defaultCard = true, price_free = 0, max_copies = 2, values = {debuff_duration = {3.5, 4, 4.5}, incoming_damage_per_fired_stack_pct = {1, 1.35, 1.7}, max_incoming_damage_bonus_pct = {30, 45, 60}} }, { id = 11, quality = 1, defaultCard = true, price_free = 0, max_copies = 2, values = {primary_attribute_bonus_per_level = {2, 3, 4}, universal_all_bonus_per_level = {1, 1.5, 2}} }, { id = 12, quality = 4, defaultCard = false, price_free = 20800, max_copies = 1, values = { scan_interval = {8, 6, 4.5}, scan_radius = {900, 1200, 1500}, mark_duration = {5, 7, 9}, bonus_damage_pct = {22, 30, 40}, on_kill_heal_pct = {6, 8, 10}, on_kill_mana = {35, 50, 70}, boss_penalty_pct = {50, 40, 30} } }, { id = 13, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = {fired_stacks_on_hit = {1, 2, 3}, explosion_chance_pct = {12, 18, 24}, explosion_radius = {175, 240, 300}, explosion_damage_per_stack = {3, 4.5, 6}} }, { id = 14, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = { proc_chance_pct = {18, 24, 30}, main_target_bonus_damage_pct = {25, 35, 45}, fired_stacks = {1, 2, 3}, ricochet_radius = {300, 420, 540}, ricochet_damage_pct = {60, 80, 100} } }, { id = 15, quality = 2, defaultCard = false, price_free = 5200, max_copies = 2, values = {base_crit_chance_pct = {15, 20, 25}, crit_multiplier_pct = {200, 240, 280}, crit_multiplier_bonus_pct_per_luck = {0.5, 1, 1.5}} }, { id = 16, quality = 2, defaultCard = false, price_free = 5200, max_copies = 2, values = {max_stacks = {200, 260, 320}, spell_amp_per_stack_pct = {0.1, 0.15, 0.2}} }, { id = 17, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = {min_health_pct_to_activate = {30}, health_cost_pct = {5}, curse_damage_pct_per_curse_stack = {10, 20, 30}} }, { id = 18, quality = 2, defaultCard = false, price_free = 5200, max_copies = 2, values = {base_luck_bonus = {3, 5, 7}, luck_per_card_taken = {0.25, 0.5, 0.75}} }, { id = 19, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = {ghost_step_chance_pct = {12, 18, 24}, ghost_step_duration = {2.5, 3.2, 4}, ghost_step_move_speed_pct = {15, 22, 30}, ghost_step_evasion_pct = {15, 22, 30}} }, { id = 20, quality = 2, defaultCard = false, price_free = 5200, max_copies = 2, values = {gold_per_step = {100, 70, 40}, move_speed_pct_per_step = {0.25, 0.35, 0.45}, speed_limit = {10000, 12000, 14000}} }, { id = 21, quality = 4, defaultCard = false, price_free = 20800, inherent = false, deck_slots = 4, max_copies = 1, values = {wave_pure_damage_base = {125, 170, 215}, wave_pure_damage_base_hand = {0.15, 0.25, 0.35}} }, { id = 22, quality = 2, defaultCard = true, price_free = 0, max_copies = 2, values = {morning_gold_base = {700, 700, 700}, morning_gold_decay_per_night = {100, 100, 100}, pickup_gold_pct = {0, 50, 50}, pre_night_gold_pct = {0, 0, 50}} }, { id = 23, quality = 4, defaultCard = false, price_free = 20800, deck_slots = 3, max_copies = 1, values = {gold_income_pct_per_minute = {2, 3.5, 5}, gold_tick_interval_sec = {60}, min_earned_gold_pct_of_dividend_required = {25}} }, { id = 24, quality = 2, defaultCard = false, price_free = 5200, max_copies = 2, values = {gold_per_step = {100, 80, 60}, attack_damage_per_step = {1.5, 1.75, 2}, spell_amp_per_step_pct = {1.5, 1.75, 2}} }, { id = 25, quality = 2, defaultCard = false, price_free = 5200, max_copies = 2, inherent = true, values = {mana_per_step = {50}, spell_amp_per_step_pct = {0.5, 0.75, 1}, mana_regen_per_step = {0.1, 0.15, 0.2}, max_mana_bonus_pct = {0, 0, 25}} }, { id = 26, quality = 4, defaultCard = true, price_free = 0, max_copies = 1, values = {trigger_health_threshold = {100}, heal_pct_per_second = {10, 14, 18}, cooldown_seconds = {120, 100, 80}, invisibility_duration = {10, 12, 14}} }, { id = 27, quality = 2, defaultCard = true, price_free = 0, max_copies = 2, values = {mana_to_damage_pct = {1.5, 2, 2.5}} }, { id = 28, quality = 2, defaultCard = true, price_free = 0, max_copies = 2, values = {health_to_damage_pct = {1.5, 2, 2.5}} }, { id = 29, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = {night_vampirism_pct = {10, 14, 18}, night_incoming_damage_reduce_pct = {5, 7, 9}} }, { id = 30, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = {strength_per_level = {0.5, 1, 1.5}, agility_penalty_per_level = {1, 0.5, 0.25}, intellect_penalty_per_level = {1, 0.5, 0.25}} }, { id = 31, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = {agility_per_level = {0.5, 1, 1.5}, strength_penalty_per_level = {1, 0.5, 0.25}, intellect_penalty_per_level = {1, 0.5, 0.25}} }, { id = 32, quality = 2, defaultCard = false, price_free = 5200, max_copies = 2, values = {base_cooldown_reduction_pct = {6, 9, 11}, cooldown_loss_per_death_pct = {3}} }, { id = 33, quality = 2, defaultCard = false, price_free = 5200, max_copies = 2, values = {mana_increase_pct = {15, 25, 35}} }, { id = 34, quality = 3, defaultCard = true, price_free = 0, max_copies = 2, values = {heal_from_enemy_max_hp_pct = {15, 22, 30}, heal_from_attack_damage_pct = {100, 130, 160}} }, { id = 35, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = {poison_duration = {1, 2, 3}, poison_tick_interval = {1, 0.8, 0.6}, damage_current_hp_pct = {5, 7, 9}, boss_damage_current_hp_pct = {1, 1.4, 1.8}} }, { id = 36, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = {crystals_per_step = {2}, damage_pct_per_step = {1, 2, 3}, max_bonus_pct = {80, 160, 320}} }, { id = 37, quality = 1, defaultCard = true, price_free = 0, max_copies = 2, values = {base_crystals = {10, 15, 20}, crystals_per_night = {5, 7, 9}} }, { id = 38, quality = 5, defaultCard = false, price_free = 83200, max_copies = 1, deck_slots = 5, values = {multiplier = {1.25, 1.5, 1.75}} }, { id = 39, quality = 2, defaultCard = false, price_free = 5200, max_copies = 2, values = {gold_per_crystal = {50, 75, 100}} }, { id = 40, quality = 2, defaultCard = false, price_free = 5200, max_copies = 2, values = {gold_per_crystal = {75, 50, 25}} }, { id = 41, quality = 3, defaultCard = false, price_free = 10400, canupgrade = true, max_copies = 2, values = {pool_pairs = {1, 1, 2}} }, { id = 42, quality = 2, defaultCard = true, price_free = 0, max_copies = 2, values = {exp_bonus_pct = {10, 15, 20}} }, { id = 43, quality = 1, defaultCard = true, price_free = 0, max_copies = 2, values = {bat_reduction = {0.1, 0.15, 0.2}, projectile_speed_bonus = {0, 300, 0}, attack_anim_reduction_pct = {0, 0, 33}} }, { id = 44, quality = 2, defaultCard = false, price_free = 5200, max_copies = 2, values = {bonus_move_speed_pct = {5, 7, 9}, bonus_evasion_pct = {5, 7, 9}, luck_bonus_pct_per_point = {0.5, 0.7, 0.9}, max_evasion_pct = {35, 45, 55}} }, { id = 45, quality = 4, defaultCard = false, inherent = true, price_free = 20800, deck_slots = 2, max_copies = 1, values = {max_bonus_pct = {30, 40, 50}, decay_pct_per_minute = {5}} }, { id = 46, quality = 4, defaultCard = false, price_free = 20800, max_copies = 1, values = {damage_to_mana_pct = {20, 25, 30}} }, { id = 47, quality = 4, defaultCard = false, price_free = 20800, canupgrade = true, max_copies = 1, inherent = true, deck_slots = 4, values = {exp_bonus_pct = {35, 50, 65}, exp_boost_duration_sec = {180, 180, 180}} }, { id = 48, quality = 3, defaultCard = true, price_free = 0, max_copies = 1, values = {trigger_hp_pct = {25}, shield_heal_max_hp_pct = {30, 45, 60}, insurance_duration = {3.5, 4.5, 5.5}, incoming_damage_reduction_pct = {100}} }, { id = 49, quality = 3, defaultCard = false, price_free = 10400, canupgrade = false, max_copies = 1, values = {} }, { id = 50, quality = 3, defaultCard = false, price_free = 10400, canupgrade = false, max_copies = 1, values = {} }, { id = 51, quality = 4, defaultCard = false, price_free = 20800, max_copies = 1, values = {gold_from_damage_taken_pct = {11, 16, 21}, incoming_damage_base_pct = {25, 20, 15}, incoming_damage_per_100_taken = {0.1, 0.1, 0.1}, morning_gold_cap = {250, 400, 550}} }, { id = 52, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = {night_duration_reduce_sec = {15, 20, 25}, enemy_stats_bonus_pct = {15, 20, 25}} }, { id = 53, quality = 4, defaultCard = false, price_free = 20800, max_copies = 1, values = {trigger_card_id = {3, 3, 3}, extra_card_choices = {1, 2, 3}} }, { id = 54, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = {intellect_per_level = {0.5, 1, 1.5}, strength_penalty_per_level = {1, 0.5, 0.25}, agility_penalty_per_level = {1, 0.5, 0.25}} }, { id = 55, quality = 1, defaultCard = true, price_free = 0, max_copies = 2, values = {max_health_bonus_pct = {25, 50, 75}} }, { id = 56, quality = 3, defaultCard = false, purchasable = false, obtainable = false, price_free = 10400, max_copies = 2, values = {creep_reflect_pct = {15, 22, 30}} }, { id = 57, quality = 5, defaultCard = false, price_free = 83200, canupgrade = false, max_copies = 1, deck_slots = 5, values = {} }, { id = 58, quality = 5, defaultCard = false, inherent = true, price_free = 83200, max_copies = 1, deck_slots = 2, values = {extra_selections_on_start = {3, 4, 5}, cards_per_selection = {3, 4, 5}} }, { id = 59, quality = 3, defaultCard = false, purchasable = false, obtainable = false, canupgrade = true, deck_builder_non_deckable = true, deck_builder_unlock_card_id = 62, price_free = 10400, max_copies = 2, values = {xp_reward = {500, 800, 1200}} }, { id = 60, quality = 3, defaultCard = false, purchasable = false, obtainable = false, canupgrade = true, deck_builder_non_deckable = true, deck_builder_unlock_card_id = 62, price_free = 10400, max_copies = 2, values = {gold_reward = {250, 500, 750}} }, { id = 61, quality = 3, defaultCard = false, purchasable = false, obtainable = false, canupgrade = true, deck_builder_non_deckable = true, deck_builder_unlock_card_id = 62, price_free = 10400, max_copies = 2, values = {crystals_reward = {12, 18, 24}} }, { id = 62, quality = 4, defaultCard = false, price_free = 20800, canupgrade = false, max_copies = 1, values = {} }, { id = 63, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = {bonus_card_choices = {3, 4, 5}} }, { id = 64, quality = 4, defaultCard = false, price_free = 20800, max_copies = 1, values = {hp_threshold_pct = {20, 25, 30}, crit_multiplier_pct = {200, 250, 300}} }, { id = 65, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = {target_hp_full_pct = {100, 100, 100}, crit_multiplier_pct = {300, 450, 500}} }, { id = 66, quality = 5, defaultCard = false, price_free = 83200, max_copies = 1, values = {bonus_from_health_pct = {50, 65, 80}, bonus_from_mana_pct = {50, 65, 80}} }, { id = 67, quality = 5, defaultCard = false, price_free = 83200, max_copies = 1, inherent = true, deck_slots = 3, values = { hp_per_strength = {0.1}, outgoing_pct_per_strength = {0.05}, proc_chance_pct = {40, 45, 50}, proc_cooldown_sec = {3}, bonus_damage_from_max_hp_pct = {60, 80, 100} } }, { id = 68, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, canupgrade = false, values = {curse_stacks = {1, 2, 3}, cursed_offer_slots = {3, 3, 3}} }, { id = 69, quality = 4, defaultCard = false, price_free = 20800, max_copies = 1, values = {outgoing_damage_per_curse_stack_pct = {1, 2.5, 4}, other_cards_effectiveness_pct = {50, 35, 20}} }, { id = 70, quality = 4, defaultCard = false, price_free = 20800, max_copies = 1, values = {incoming_reduction_per_rage_pct = {0.1, 0.15, 0.2}} }, { id = 71, quality = 2, defaultCard = false, price_free = 5200, max_copies = 2, values = {max_health_pct_per_curse_stack = {1}, self_damage_max_hp_pct_per_sec = {2.5, 2, 1.5}} }, { id = 72, quality = 4, defaultCard = false, price_free = 20800, max_copies = 1, values = {cooldown_reduction_pct = {15, 25, 35}} }, { id = 73, quality = 4, defaultCard = false, price_free = 10400, deck_slots = 3, max_copies = 1, values = {deferred_damage_pct = {30, 40, 50}, deferred_dot_duration_sec = {3, 3.5, 4}} }, { id = 74, quality = 5, defaultCard = false, price_free = 83200, max_copies = 1, inherent = true, deck_slots = 3, values = {crit_mult_bonus_pct = {30, 60, 90}, enemy_armor_reduction_pct = {20, 25, 30}, aura_radius = {600, 900, 1200}} }, { id = 75, quality = 5, defaultCard = false, price_free = 83200, max_copies = 1, values = { mana_cost_pct = {15}, base_damage = {90, 120, 150}, damage_from_max_mana_pct = {5, 7, 11}, blast_radius = {175}, search_radius = {1000}, blast_interval_sec = {5, 4, 3}, blast_delay_sec = {1.2, 1, 0.8} } }, { id = 76, quality = 4, defaultCard = false, price_free = 20800, max_copies = 1, values = {target_count = {1, 2, 3}, radius = {250, 300, 350}, mana_damage_pct = {20, 40, 60}} }, { id = 77, quality = 5, defaultCard = false, price_free = 83200, max_copies = 1, values = {damage_reduction_pct = {60, 70, 80}, mana_per_mitigated_damage = {1, 0.8, 0.67}} }, { id = 78, quality = 4, defaultCard = false, price_free = 20800, max_copies = 1, values = {stack_duration_sec = {10, 12, 14}, max_mana_pct_per_stack = {0.5, 1, 1.5}} }, { id = 79, quality = 3, deck_slots = 4, defaultCard = false, price_free = 10400, canupgrade = false, max_copies = 2, values = {} }, { id = 80, quality = 5, defaultCard = false, inherent = true, deck_slots = 3, price_free = 83200, max_copies = 1, values = {outgoing_damage_per_curse_stack_pct = {5, 7, 9}} }, { id = 81, quality = 5, defaultCard = false, purchasable = false, canupgrade = true, deck_builder_non_deckable = true, deck_builder_unlock_card_id = 80, price_free = 0, max_copies = 1, values = {outgoing_damage_pct = {15, 15, 15}, spell_amp_pct = {15, 15, 15}} }, { id = 82, quality = 5, defaultCard = false, purchasable = false, canupgrade = true, deck_builder_non_deckable = true, deck_builder_unlock_card_id = 80, price_free = 0, max_copies = 1, values = {max_health_pct = {20, 20, 20}, max_mana_pct = {20, 20, 20}} }, { id = 83, quality = 5, defaultCard = false, purchasable = false, canupgrade = true, deck_builder_non_deckable = true, deck_builder_unlock_card_id = 80, price_free = 0, max_copies = 1, values = {model_scale_pct = {20, 20, 20}, physical_vampirism_pct = {10, 10, 10}, magical_vampirism_pct = {10, 10, 10}} }, { id = 84, quality = 2, defaultCard = false, purchasable = false, obtainable = false, canupgrade = true, deck_builder_non_deckable = true, deck_builder_unlock_card_id = 33, price_free = 5200, max_copies = 2, values = {spell_amp_from_mana_pct = {15, 20, 25}, spell_amp_mana_scale = 0.1} }, { id = 85, quality = 3, defaultCard = false, price_free = 10400, max_copies = 2, values = {bonus_card_choices = {1, 2, 3}, slag_pool_copies = {2}} }, { id = 86, quality = 1, defaultCard = false, purchasable = false, obtainable = false, canupgrade = false, deck_builder_non_deckable = true, price_free = 0, max_copies = 0, values = {} }, { id = 87, quality = 4, defaultCard = false, price_free = 20800, deck_slots = 5, max_copies = 1, canupgrade = false, values = {attr_pct_per_slag = {1.25, 1.5, 1.75}} }, { id = 88, quality = 2, defaultCard = false, price_free = 5200, max_copies = 2, canupgrade = false, deck_slots = 2, values = {free_rerolls_on_slag = {1}} } } end local function buildAll(self) return {unpack(cards1to13(nil))} end ____exports.ALL_CARD_CATALOG_DEFS = buildAll(nil) --- Лимит слотов в deck builder и при нормализации колоды на сервере. ____exports.DECK_BUILDER_SLOT_CAPACITY = 30 ____exports.FROSTMOURNE_CARD_ID = 80 ____exports.FROSTMOURNE_SHARD_CARD_IDS = {81, 82, 83} --- Карта желания и её дары (59–61): только через выбор, не в колоду. ____exports.WISH_CARD_ID = 62 ____exports.WISH_GIFT_CARD_IDS = {59, 60, 61} ____exports.MANA_SURGE_CARD_ID = 33 ____exports.SMALL_MANA_SURGE_CARD_ID = 84 ____exports.FISHING_CARD_ID = 85 --- Пустая карта-шлак в пуле (только через «Рыбаловство»). ____exports.SLAG_CARD_ID = 86 function ____exports.isWishGiftCardId(self, cardId) local id = math.floor(__TS__Number(cardId)) for ____, giftId in ipairs(____exports.WISH_GIFT_CARD_IDS) do if giftId == id then return true end end return false end function ____exports.getDeckBuilderUnlockRequiredMessage(self, unlockCardId) local id = math.floor(__TS__Number(unlockCardId)) if id == ____exports.FROSTMOURNE_CARD_ID then return "Нужна купленная карта «Фростморн»" end if id == ____exports.WISH_CARD_ID then return "Нужна купленная карта «Карта желания»" end if id == ____exports.MANA_SURGE_CARD_ID then return "Нужна купленная карта «Буйство маны»" end return "Нужна купленная родительская карта" end function ____exports.isFrostmourneShardCardId(self, cardId) local id = math.floor(__TS__Number(cardId)) for ____, shardId in ipairs(____exports.FROSTMOURNE_SHARD_CARD_IDS) do if shardId == id then return true end end return false end --- Сколько слотов колоды занимает карта по каталогу (по умолчанию 1). function ____exports.getCardDeckSlotsFromCatalog(self, cardId) local row = __TS__ArrayFind( ____exports.ALL_CARD_CATALOG_DEFS, function(____, c) return c.id == cardId end ) local configured = __TS__Number(row and row.deck_slots) if __TS__NumberIsFinite(configured) and configured > 0 then return math.floor(configured) end return 1 end ____exports.DEFAULT_DECK_CARD_IDS = __TS__ArraySort( __TS__ArrayMap( __TS__ArrayFilter( ____exports.ALL_CARD_CATALOG_DEFS, function(____, c) return c.defaultCard end ), function(____, c) return c.id end ), function(____, a, b) return a - b end ) --- Строки для витрины магазина (только нестартовые карты). function ____exports.getCardShopRows(self) return __TS__ArrayMap( __TS__ArrayFilter( ____exports.ALL_CARD_CATALOG_DEFS, function(____, c) return not c.defaultCard end ), function(____, c) return {id = c.id, price_free = c.price_free, quality = c.quality} end ) end --- Компенсация дубликата БП по id вида card_data_N. function ____exports.buildCardPurchaseCompensationMap(self) local r = {} for ____, c in ipairs(____exports.ALL_CARD_CATALOG_DEFS) do if not c.defaultCard and c.price_free > 0 then r["card_data_" .. tostring(c.id)] = {price_free = c.price_free} end end return r end return ____exports