diff --git a/Card.js b/Card.js index cb3f6aa..c2bd81d 100644 --- a/Card.js +++ b/Card.js @@ -95,6 +95,9 @@ function Card (game,player,zone,pid,side) { this.sideB = info.sideB? new Card(game,player,zone,info.sideB,this) : null; } + // Lostorage + this.rise = info.rise; + // 杂项 this.effectFilters = []; this.registeredEffects = []; @@ -106,7 +109,8 @@ function Card (game,player,zone,pid,side) { // 时点 this.onMove = new Timming(game); this.onEnterField = new Timming(game); - this.onLeaveField = new Timming(game); + this.onLeaveField = new Timming(game); // 常时效果中「离场时」的时点 + this.onLeaveField2 = new Timming(game); // 包括被 rise 等而成为卡垫的时点 this.onBurst = new Timming(game); this.onAttack = new Timming(game); this.onStartUp = new Timming(game); @@ -179,7 +183,7 @@ Card.prototype.cookEffect = function (rawEffect,type,offset) { }; Card.prototype.setupConstEffects = function () { - this.constEffects.forEach(function (eff) { + this.constEffects.forEach(function (eff,idx) { var createTimming,destroyTimming,once; if (eff.duringGame) { createTimming = null; @@ -191,9 +195,20 @@ Card.prototype.setupConstEffects = function () { once = eff.once; } else { createTimming = this.onEnterField; - destroyTimming = this.onLeaveField; + destroyTimming = this.onLeaveField2; once = false; } + var action = eff.action + if (eff.auto) { + action = function (set,add) { + var effect = this.game.newEffect({ + source: this, + description: this.cid+'-'+'const-'+idx, + actionAsyn: eff.actionAsyn, + }); + add(this,eff.auto,effect); + }; + } this.game.addConstEffect({ source: this, createTimming: createTimming, @@ -202,7 +217,7 @@ Card.prototype.setupConstEffects = function () { cross: !!eff.cross, fixed: !!eff.fixed, condition: eff.condition, - action: eff.action + action: action, },true); },this); }; @@ -312,6 +327,14 @@ Card.prototype.canSummon = function () { Card.prototype.canSummonWith = function (signis) { // 类型 if (this.type !== 'SIGNI') return false; + // rise + var riseTargets = [] + if (this.rise) { + riseTargets = signis.filter(function (signi) { + return this.rise(signi) + },this) + if (!riseTargets.length) return false; + } // <绿罗植 世界树> if (this.player.canNotUseColorlessSigni) { if (this.hasColor('colorless')) { @@ -328,16 +351,24 @@ Card.prototype.canSummonWith = function (signis) { // 等级限制 if (this.level > this.player.lrig.level) return false; // SIGNI 数量限制 - if (signis.length >= this.player.getSigniAmountLimit()) { + var length = signis.length; + if (this.rise) length--; + if (length >= this.player.getSigniAmountLimit()) { return false; } // 界限限制 var totalLevel = signis.reduce(function (total,signi) { return total + signi.level; },this.level); + if (this.rise) { + // rise 减去等级最高的目标即可 + totalLevel -= Math.max.apply(Math,riseTargets.map(function (signi) { + return signi.level; + })); + } if (totalLevel > this.player.lrig.limit) return false; // 召唤区限制 - var zones = this.player.getSummonZones(signis); + var zones = this.player.getSummonZones(signis,this.rise); if (!zones.length) return false; // 结束 return true; @@ -750,6 +781,8 @@ Card.prototype.moveTo = function (zone,arg) { var leaveFieldEvent = null; var lrigChangeEvent = null; var charm = null; + + /* 处理离开区域逻辑 */ if (card.zone.name === 'HandZone') { // 离开手牌 removeFromArr(card,card.player.hands); @@ -757,6 +790,7 @@ Card.prototype.moveTo = function (zone,arg) { // 离开 SigniZone if (inArr(card,card.player.signis)) { // 是 SIGNI + // 以下代码 rise 里复用了,虽然说 DRY 原则,但这里也不太好抽离,养肥了再抽吧( leaveFieldEvent = moveEvent; card.frozen = false; card.fieldData = {}; @@ -774,15 +808,36 @@ Card.prototype.moveTo = function (zone,arg) { } } } + + /* 处理进入区域逻辑 */ if (zone.name === 'HandZone') { // 进入手牌 zone.player.hands.push(card); } else if (zone.name === 'SigniZone') { if (card.zone.name !== 'SigniZone' || zone.player !== card.player) { + // 进入 SIGNI 区 if (zone.getActualCards().length) { - // 放置到 SIGNI 下面的卡 + // rise + if (card.rise) { + // 被 rise 的卡“离场” + signi = zone.getActualCards()[0]; + removeFromArr(signi,signi.player.signis); + signi.frozen = false; + signi.fieldData = {}; + signi.fieldTurnData = {}; + charm = signi.charm; + signi.charm = null; + signi.onLeaveField2.trigger({}); + // 出场 + arg.bottom = false; + enterFieldEvent = moveEvent; + card.player.signis.push(card); + } else { + // 放置到 SIGNI 下面的卡 + // (目前不用处理) + } } else { - // 进入 SigniZone + // 出场 enterFieldEvent = moveEvent; zone.player.signis.push(card); } @@ -882,6 +937,7 @@ Card.prototype.moveTo = function (zone,arg) { } else if (leaveFieldEvent) { // card.player.onSignisChange.trigger(); card.onLeaveField.trigger(leaveFieldEvent); + card.onLeaveField2.trigger(leaveFieldEvent); card.player.onSigniLeaveField.trigger(leaveFieldEvent); // SIGNI 离场时,下面的卡送入废弃区, // 此处理在块结束时执行。 @@ -896,7 +952,7 @@ Card.prototype.moveTo = function (zone,arg) { } else if (lrigChangeEvent) { // card.player.onLrigChange.trigger(lrigChangeEvent); var oldLrig = lrigChangeEvent.oldLrig; - if (oldLrig) oldLrig.onLeaveField.trigger(); + if (oldLrig) oldLrig.onLeaveField2.trigger(); card.onEnterField.trigger(enterFieldEvent); if (!(arg.dontTriggerStartUp || card.player.lrigStartUpBanned)) { card.onStartUp.trigger(enterFieldEvent); @@ -1280,10 +1336,7 @@ Card.prototype.banishAsyn = function (arg) { // }; Card.prototype.summonAsyn = function (optional,dontTriggerStartUp,down) { - var zones = this.player.signiZones.filter(function (zone) { - return (zone.getActualCards().length === 0); - },this); - if (!this.canSummon() || !zones.length) return Callback.immediately(); + if (!this.canSummon()) return Callback.immediately(); return Callback.immediately().callback(this,function () { if (optional) { return this.player.selectOptionalAsyn('SUMMON_SIGNI',[this]); diff --git a/CardInfo.js b/CardInfo.js index c47fd72..c7c221f 100644 --- a/CardInfo.js +++ b/CardInfo.js @@ -58445,7 +58445,7 @@ var CardInfo = { this.player.signis.forEach(function (signi) { this.game.addConstEffect({ source: signi, - destroyTimming: [signi.onLeaveField,this.game.phase.onTurnEnd], + destroyTimming: [signi.onLeaveField2,this.game.phase.onTurnEnd], condition: function () { var opposingSigni = this.getOpposingSigni(); if (!opposingSigni) return false; @@ -124590,7 +124590,7 @@ var CardInfo = { "【起】《ターン1回》《赤》《赤》《赤》:ターン終了時まで、あなたの《ライズアイコン》を持つシグニ1体は「このシグニが正面にあるシグニ1体をバニッシュしたとき、このシグニをアップする。」を得る。" ], actionEffectTexts_zh_CN: [ - "【起】《1回合1次》【红】【红】【红】:直到回合结束为止,你的1只持有【※】的SIGNI获得「这只SIGNI对面的SIGNI被驱逐时,将这只SIGNI竖置」。" + "【起】《1回合1次》【红】【红】【红】:直到回合结束为止,你的1只持有【Rise】的SIGNI获得「这只SIGNI对面的SIGNI被驱逐时,将这只SIGNI竖置」。" ], actionEffectTexts_en: [ "[Action] [1/Turn] [Red] [Red] [Red]: Until end of turn, 1 of your SIGNI with Rise gets \"When the SIGNI in front of this SIGNI is banished, up this SIGNI.\"." @@ -124600,7 +124600,7 @@ var CardInfo = { costRed: 3, actionAsyn: function () { var filter = function (card) { - return card.hasBurst(); + return card.rise; } return this.player.selectSelfSigniAsyn(filter).callback(this,function (card) { if (!card) return; @@ -125548,7 +125548,51 @@ var CardInfo = { "Banish 1 of your <Valor> SIGNI with Rise. If you do, banish 1 of your opponent's SIGNI with power 12000 or less.", ], spellEffect: [{ - // TODO... + getTargets: function () { + return this.player.signis.filter(function (signi) { + return !signi.rise && signi.hasClass('武勇'); + },this); + }, + actionAsyn: function (card) { + return card.banishAsyn().callback(this,function (succ) { + if (!succ) return; + var filter = function (card) { + return card.rise && card.hasClass('武勇'); + }; + return this.player.seekAsyn(filter,1); + }); + } + },{ + getTargetAdvancedAsyn: function () { + var targets = []; + var pSignis = this.player.signis.filter(function (signi) { + return signi.rise && signi.hasClass('武勇'); + }); + var oSignis = this.player.opponent.signis.filter(function (signi) { + return signi.power <= 12000; + },this); + return this.player.selectTargetOptionalAsyn(pSignis).callback(this,function (targetA) { + if (!targetA) return; + targets.push(targetA); + return this.player.selectTargetAsyn(oSignis).callback(this,function (targetB) { + if (!targetB) return; + targets.push(targetB); + }); + }).callback(this,function () { + return targets; + }); + }, + actionAsyn: function (targets) { + var targetA = targets[0]; + var targetB = targets[1]; + if (!inArr(targetA,this.player.signis)) return; + return targetA.banishAsyn().callback(this,function (succ) { + if (!succ) return; + if (!inArr(targetB,this.player.opponent.signis)) return; + if (targetB.power > 12000) return; + return targetB.banishAsyn(); + }); + } }], }, "2018": { diff --git a/Player.js b/Player.js index 2af3711..55e7d31 100644 --- a/Player.js +++ b/Player.js @@ -28,6 +28,7 @@ function Player (game,io,mainDeck,lrigDeck) { // 然后在调用堆栈的最后将整个队列发送. this.messagePacks = []; // 用于保存录像. this.rebuildCount = 0; + this.coin = 0; // 快捷方式 this.hands = []; // 手牌 @@ -404,7 +405,7 @@ Player.prototype.summonSigniAsyn = function () { return Callback.never(); } return this.selectAsyn('SUMMON_SIGNI',cards).callback(this,function (card) { - return this.selectSummonZoneAsyn(true).callback(this,function (zone) { + return this.selectSummonZoneAsyn(true,card.rise).callback(this,function (zone) { if (!zone) return; return this.game.blockAsyn(this,function () { card.moveTo(zone); @@ -459,8 +460,8 @@ Player.prototype.summonResonaAsyn = function (card) { }); }; -Player.prototype.selectSummonZoneAsyn = function (optional) { - var zones = this.getSummonZones(); +Player.prototype.selectSummonZoneAsyn = function (optional,rise) { + var zones = this.getSummonZones(null,rise); if (!zones.length) { debugger; return Callback.immediately(null); @@ -469,13 +470,17 @@ Player.prototype.selectSummonZoneAsyn = function (optional) { return this.selectAsyn('SUMMON_SIGNI_ZONE',zones); }; -Player.prototype.getSummonZones = function (signis) { +Player.prototype.getSummonZones = function (signis,rise) { if (!signis) signis = this.signis; var forcedZones = []; var zones = this.signiZones.filter(function (zone,idx) { if (zone.disabled) return false; var signi = zone.getActualCards()[0]; - if (signi && inArr(signi,signis)) return false; + if (rise) { + if (!signi || !rise(signi)) return false; + } else { + if (signi && inArr(signi,signis)) return false; + } var opposingSigni = this.opponent.signiZones[2-idx].getActualCards()[0]; if (opposingSigni && opposingSigni.forceSummonZone) { forcedZones.push(zone); @@ -1385,7 +1390,7 @@ Player.prototype.needEner = function (obj) { if (obj.costChange) { obj = obj.costChange(); } - var costs = [obj.costColorless,obj.costWhite,obj.costBlack,obj.costRed,obj.costBlue,obj.costGreen]; + var costs = [obj.costColorless,obj.costWhite,obj.costBlack,obj.costRed,obj.costBlue,obj.costGreen,costCoin]; return costs.some(function (cost) { return cost > 0; }); @@ -1665,6 +1670,7 @@ Player.prototype.enoughCost = function (obj) { if (obj.costChange) { obj = obj.costChange(); } + if (obj.costCoin && obj.costCoin >= this.coin) return false; if (!this.enoughEner(obj)) return false; if (obj.costDown && obj.source && !obj.source.isUp) return false; if (obj.costCondition && obj.source) { @@ -1821,6 +1827,11 @@ Player.prototype.payCostAsyn = function (obj,cancelable) { if (obj.costDown && obj.source) { obj.source.down(); } + // Coin + if (obj.costCoin) { + this.coin -= obj.costCoin + if (this.coin < 0) this.coin = 0 + } // 其它 if (obj.costAsyn) { if (obj.source) return obj.costAsyn.call(obj.source); @@ -2203,6 +2214,13 @@ Player.prototype.setCrossPair = function () { pair.crossed = [card,pair]; }; +Player.prototype.gainCoins = function(count) { + this.coin += count; + if (this.coin > 5) { + this.coin = 5; + } +}; + // For test: Player.prototype.matchCard = function (arg) {