public static async Task activeEffect(this Card card, THHGame game, THHPlayer player, Card[] targets) { ITriggerEffect triggerEffect = card.define.getEffectOn <THHPlayer.ActiveEventArg>(game.triggers); if (triggerEffect != null) { await triggerEffect.execute(game, card, new object[] { new THHPlayer.ActiveEventArg(player, card, targets) }, targets); } IActiveEffect activeEffect = card.define.getActiveEffect(); if (activeEffect != null) { await activeEffect.execute(game, card, new object[] { new THHPlayer.ActiveEventArg(player, card, targets) }, targets); } }
public async Task <bool> tryUse(THHGame game, Card card, int position, params Card[] targets) { if (!card.isUsable(game, this, out _)) { //卡牌不可用 return(false); } if (targets.Any(t => t is Card targetCard && targetCard.isElusive() && (card.define is SkillCardDefine || card.define is SpellCardDefine))) { //目标是魔免 return(false); } if (card.define is SkillCardDefine) { //使用技能 card.setUsed(true); } await setGem(game, gem - card.getCost()); await game.triggers.doEvent(new UseEventArg() { player = this, card = card, position = position, targets = targets }, async arg => { THHPlayer player = arg.player; card = arg.card; targets = arg.targets; game.logger.log(arg.player + "使用" + arg.card + (targets.Length > 0 ? ",目标:" + string.Join <Card>(",", targets) : null)); if (arg.card.define is ServantCardDefine || (card.define is GeneratedCardDefine && (card.define as GeneratedCardDefine).type == CardDefineType.SERVANT)) { //随从卡,将卡置入战场 await tryPutIntoField(game, arg.player.hand, arg.card, arg.position); ITriggerEffect effect = arg.card.define.getEffectOn <ActiveEventArg>(game.triggers); if (effect != null) { ActiveEventArg active = new ActiveEventArg(player, card, targets); await game.triggers.doEvent(active, activeLogic); async Task activeLogic(ActiveEventArg eventArg) { await effect.execute(game, card, new object[] { eventArg }, targets); } } } else if (card.define is SkillCardDefine) { ITriggerEffect effect = arg.card.define.getEffectOn <ActiveEventArg>(game.triggers); await effect.execute(game, arg.card, new object[] { new ActiveEventArg(player, card, targets) }, arg.targets); } else if (card.define is SpellCardDefine || (card.define is GeneratedCardDefine && (card.define as GeneratedCardDefine).type == CardDefineType.SPELL)) { //法术卡,释放效果然后丢进墓地 player.hand.remove(game, card); ITriggerEffect effect = arg.card.define.getEffectOn <ActiveEventArg>(game.triggers); await effect.execute(game, card, new object[] { new ActiveEventArg(player, card, targets) }, targets); player.grave.add(game, card); } }); await game.updateDeath(); return(true); }