Files
pixelheros/assets/script/game/common/config/CardSet.ts
walkpan dbe376033d refactor: 移除未使用的代码并优化卡牌获取逻辑
- 删除 MissionCardComp 中未使用的接口定义和注释代码
- 移除 MissionComp 中未实现的英雄死亡、升级和复活相关事件处理
- 重构 CardSet 中的 getCardPoolByLv 和 getCardsByLv 方法,增加类型过滤和等级模式参数
- 清理 MissionComp 中的冗余代码和注释,简化局内数据初始化逻辑
2026-03-14 09:09:47 +08:00

185 lines
5.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/** 卡牌大类定义 */
export enum CardType {
Hero = 1,
Skill = 2,
Potion = 3,
Special = 4,
Buff = 5,
Debuff = 6,
}
/** 卡池等级定义 */
export enum CardKind {
LV1 = 1,
LV2 = 2,
LV3 = 3,
LV4 = 4,
LV5 = 5,
LV6 = 6,
}
/** 通用卡牌配置 */
export interface CardConfig {
uuid: number
type: CardType
cost: number
weight: number
lv: CardKind
}
/** 特殊卡效果类型 */
export enum SpecialEffectType {
DrawHero = 1,
RepeatNextUse = 2,
}
/** 特殊卡效果参数 */
export interface SpecialCardEffect {
type: SpecialEffectType
drawHeroCount?: number
drawHeroLv?: CardKind
repeatNextUseTimes?: number
}
/** 特殊卡完整配置 */
export interface SpecialCardConfig extends CardConfig {
effect: SpecialCardEffect
}
/** 卡池默认初始等级 */
export const CARD_POOL_INIT_LEVEL = CardKind.LV1
/** 卡池等级上限 */
export const CARD_POOL_MAX_LEVEL = CardKind.LV6
/** 基础卡池英雄、技能、Buff、Debuff */
export const CardPoolList: CardConfig[] = [
{ uuid: 5001, type: CardType.Hero, cost: 3, weight: 20, lv: 1 },
{ uuid: 5003, type: CardType.Hero, cost: 3, weight: 20, lv: 1 },
{ uuid: 5002, type: CardType.Hero, cost: 3, weight: 25, lv: 2 },
{ uuid: 5005, type: CardType.Hero, cost: 3, weight: 25, lv: 2 },
{ uuid: 5004, type: CardType.Hero, cost: 3, weight: 30, lv: 3 },
{ uuid: 5006, type: CardType.Hero, cost: 3, weight: 35, lv: 4 },
{ uuid: 5007, type: CardType.Hero, cost: 3, weight: 40, lv: 5 },
{ uuid: 6001, type: CardType.Skill, cost: 1, weight: 20, lv: 1 },
{ uuid: 6002, type: CardType.Skill, cost: 1, weight: 20, lv: 1 },
{ uuid: 6003, type: CardType.Skill, cost: 2, weight: 25, lv: 2 },
{ uuid: 6100, type: CardType.Skill, cost: 4, weight: 25, lv: 2 },
{ uuid: 6004, type: CardType.Skill, cost: 3, weight: 30, lv: 3 },
{ uuid: 6102, type: CardType.Skill, cost: 4, weight: 35, lv: 4 },
{ uuid: 6101, type: CardType.Skill, cost: 5, weight: 40, lv: 5 },
{ uuid: 6103, type: CardType.Skill, cost: 6, weight: 45, lv: 6 },
{ uuid: 10001, type: CardType.Buff, cost: 2, weight: 30, lv: 1 },
{ uuid: 10101, type: CardType.Buff, cost: 3, weight: 26, lv: 2 },
{ uuid: 10011, type: CardType.Buff, cost: 3, weight: 24, lv: 3 },
{ uuid: 10311, type: CardType.Buff, cost: 4, weight: 20, lv: 4 },
{ uuid: 10302, type: CardType.Buff, cost: 5, weight: 18, lv: 5 },
{ uuid: 10201, type: CardType.Debuff, cost: 3, weight: 24, lv: 2 },
{ uuid: 10211, type: CardType.Debuff, cost: 4, weight: 20, lv: 3 },
{ uuid: 10312, type: CardType.Debuff, cost: 4, weight: 18, lv: 4 },
{ uuid: 20001, type: CardType.Debuff, cost: 5, weight: 14, lv: 5 },
{ uuid: 20011, type: CardType.Debuff, cost: 6, weight: 12, lv: 6 },
]
/** 特殊卡定义表 */
export const SpecialCardList: Record<number, SpecialCardConfig> = {
7001: {
uuid: 7001,
type: CardType.Special,
cost: 6,
weight: 20,
lv: CardKind.LV3,
effect: {
type: SpecialEffectType.DrawHero,
drawHeroCount: 4,
drawHeroLv: CardKind.LV3,
},
},
7002: {
uuid: 7002,
type: CardType.Special,
cost: 5,
weight: 20,
lv: CardKind.LV4,
effect: {
type: SpecialEffectType.RepeatNextUse,
repeatNextUseTimes: 1,
},
},
}
/** 规范等级到合法区间 [LV1, LV6] */
const clampCardLv = (lv: number): CardKind => {
const value = Math.floor(lv)
if (value < CARD_POOL_INIT_LEVEL) return CARD_POOL_INIT_LEVEL
if (value > CARD_POOL_MAX_LEVEL) return CARD_POOL_MAX_LEVEL
return value as CardKind
}
/** 单次按权重抽取一张卡 */
const weightedPick = (cards: CardConfig[]): CardConfig | null => {
if (cards.length === 0) return null
const totalWeight = cards.reduce((total, card) => total + card.weight, 0)
let random = Math.random() * totalWeight
for (const card of cards) {
random -= card.weight
if (random <= 0) return card
}
return cards[cards.length - 1]
}
/** 连续抽取 count 张卡,允许重复 */
const pickCards = (cards: CardConfig[], count: number): CardConfig[] => {
if (cards.length === 0 || count <= 0) return []
const selected: CardConfig[] = []
while (selected.length < count) {
const pick = weightedPick(cards)
if (!pick) break
selected.push(pick)
}
return selected
}
/** 获取指定等级可出现的基础卡池 */
export const getCardPoolByLv = (lv: number, onlyCurrentLv: boolean = false): CardConfig[] => {
const cardLv = clampCardLv(lv)
if (onlyCurrentLv) {
return CardPoolList.filter(card => card.lv === cardLv)
}
return CardPoolList.filter(card => card.lv <= cardLv)
}
const normalizeTypeFilter = (type: CardType | CardType[]): Set<CardType> => {
const list = Array.isArray(type) ? type : [type]
const hasBuffLike = list.includes(CardType.Buff) || list.includes(CardType.Debuff)
if (hasBuffLike) {
return new Set<CardType>([...list, CardType.Buff, CardType.Debuff])
}
return new Set<CardType>(list)
}
/** 常规发牌:前 2 英雄 + 后 2 其他;支持按类型和等级模式过滤 */
export const getCardsByLv = (
lv: number,
type?: CardType | CardType[],
onlyCurrentLv: boolean = false
): CardConfig[] => {
const pool = getCardPoolByLv(lv, onlyCurrentLv)
if (type !== undefined) {
const typeSet = normalizeTypeFilter(type)
const filteredPool = pool.filter(card => typeSet.has(card.type))
return pickCards(filteredPool, 4)
}
const heroPool = pool.filter(card => card.type === CardType.Hero)
const otherPool = pool.filter(card => card.type !== CardType.Hero)
const heroes = pickCards(heroPool, 2)
const others = pickCards(otherPool, 2)
return [...heroes, ...others]
}