From 36a0f2b25b2aa902514b109113ccc4d2df23a68d Mon Sep 17 00:00:00 2001 From: WEBXOSS Date: Wed, 4 Oct 2017 15:19:59 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=AB=20implement=20multi=20spell=20effe?= =?UTF-8?q?cts=20selection=20(for=20WX17-040)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CardInfo.js | 1 - Player.js | 66 ++++++++++++++++++++++++++++++++--------------------- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/CardInfo.js b/CardInfo.js index 9b99b9c..1cb0d73 100644 --- a/CardInfo.js +++ b/CardInfo.js @@ -125800,7 +125800,6 @@ var CardInfo = { "対戦相手のライフクロスの枚数があなたより多い場合、対戦相手のシグニ1体をバニッシュする。" ], getMinEffectCount: function () { - // TODO: getMinEffectCount 这个函数只在arts上用到过,不知道spell上是否能用 return 1; }, getMaxEffectCount: function () { diff --git a/Player.js b/Player.js index d7aa100..3a2c594 100644 --- a/Player.js +++ b/Player.js @@ -533,7 +533,7 @@ Player.prototype.useSpellAsyn = function () { Player.prototype.handleSpellAsyn = function (card,ignoreCost,costObj,arg) { if (!costObj) costObj = card; if (!arg) arg = {}; - var effect,target,costArg; + var effects,targets,costArg; this.game.setData(this,'flagSpellUsed',true); var count = this.game.getData(this,'CodeHeartAMS') || 0; this.game.setData(this,'CodeHeartAMS',count + 1); @@ -558,37 +558,50 @@ Player.prototype.handleSpellAsyn = function (card,ignoreCost,costObj,arg) { return this.payCostAsyn(costObj); }).callback(this,function (_costArg) { costArg = _costArg; - // 如果魔法卡的效果不止一个,选择其中一个发动 + // 如果魔法卡的效果不止一个,选择其中n个发动 if (card.spellEffects.length === 1) { - effect = card.spellEffects[0]; + effects = card.spellEffects.slice(); } else { - return this.selectAsyn('SPELL_EFFECT',card.spellEffects).callback(this,function (eff) { - effect = eff; - return this.opponent.showEffectsAsyn([eff]); + var min,max; + if (!card.getMinEffectCount || !card.getMaxEffectCount) { + min = max = 1; + } else { + min = card.getMinEffectCount(costObj); + max = card.getMaxEffectCount(costObj); + } + return this.selectSomeAsyn('SPELL_EFFECT',card.artsEffects,min,max,false).callback(this,function (effs) { + effects = effs; + if (card.costChangeAfterChoose) { + card.costChangeAfterChoose.call(card,costObj,effs); + } + return this.opponent.showEffectsAsyn(effs); }); } }).callback(this,function () { // 3. 娶(划掉)取对象. card.activate(); - if (effect.getTargets) { - // 简单的取对象,即从目标卡片中选一张. (也可以不选,空发) - if (effect.targetCovered) { - // 从废弃区等[卡片可能被覆盖的区域]取对象 - return this.selectAsyn('TARGET',effect.getTargets.call(card)).callback(this,function (card) { - if (!card) return card; - return this.opponent.showCardsAsyn([card]).callback(this,function () { - return card; + return Callback.forEach(effects,function (effect,idx) { + return Callback.immediately().callback(this,function () { + if (effect.getTargets) { + // 简单的取对象,即从目标卡片中选一张. + if (!effect.targetCovered) return this.selectTargetAsyn(effect.getTargets.call(card)); + // 从废弃区等[卡片可能被覆盖的区域]取对象 + return this.selectAsyn('TARGET',effect.getTargets.call(card)).callback(this,function (card) { + if (!card) return card; + return this.opponent.showCardsAsyn([card]).callback(this,function () { + return card; + }); }); - }); - } - return this.selectTargetAsyn(effect.getTargets.call(card)); - } - if (effect.getTargetAdvancedAsyn) { - // 复杂(高级)的取对象. - return effect.getTargetAdvancedAsyn.call(card,costArg); - } + } + if (effect.getTargetAdvancedAsyn) { + // 复杂(高级)的取对象. + return effect.getTargetAdvancedAsyn.call(card,costArg); + } + }).callback(this,function (target) { + targets[idx] = target; + }); + },this); }).callback(this,function (t) { - target = t; return this.game.blockEndAsyn(); // ------ 块结束 ------ }).callback(this,function () { @@ -597,8 +610,9 @@ Player.prototype.handleSpellAsyn = function (card,ignoreCost,costObj,arg) { }).callback(this,function (canceled) { // 5. 处理. // "处理+放置到废弃区"放在1个block里. - return this.game.blockAsyn(effect.source,this,function () { - return Callback.immediately().callback(this,function () { + return this.game.blockAsyn(card,this,function () { + return Callback.forEach(effects,function (effect,idx) { + var target = targets[idx]; // "结束这个回合",处理直接结束. if (this.game.phase.checkForcedEndTurn()) return; // "不会被取消" @@ -619,7 +633,7 @@ Player.prototype.handleSpellAsyn = function (card,ignoreCost,costObj,arg) { } } return effect.actionAsyn.call(card,target,costArg); - }).callback(this,function () { + },this).callback(this,function () { // 6. 放到废弃区 // 恢复控制权 card.player = card.owner;