mirror of
https://github.com/webxoss/webxoss-core.git
synced 2024-11-19 22:39:53 +01:00
120 lines
No EOL
3.7 KiB
JavaScript
120 lines
No EOL
3.7 KiB
JavaScript
'use strict';
|
|
|
|
function EffectManager (game) {
|
|
this.game = game;
|
|
this.player = null;
|
|
this.playerTriggeredEffects = [];
|
|
this.opponentTriggeredEffects = [];
|
|
this.triggeredEffects = []; // 1回合1次的效果
|
|
|
|
this.currentEffect = null;
|
|
}
|
|
|
|
// 根据 this.player 返回相应的满足发动条件的 effects .
|
|
EffectManager.prototype.getPlayerEffects = function () {
|
|
var effects = (this.player === this.game.turnPlayer)? this.playerTriggeredEffects : this.opponentTriggeredEffects;
|
|
effects = effects.filter(function (effect) {
|
|
return effect.checkCondition();
|
|
},this);
|
|
return effects;
|
|
};
|
|
|
|
EffectManager.prototype.clearPlayerEffects = function () {
|
|
var effects = (this.player === this.game.turnPlayer)? this.playerTriggeredEffects : this.opponentTriggeredEffects;
|
|
this.game.pushEffectSource(null);
|
|
effects.forEach(function (effect) {
|
|
effect.end();
|
|
},this);
|
|
this.game.popEffectSource();
|
|
effects.length = 0;
|
|
};
|
|
|
|
EffectManager.prototype.removePlayerEffect = function (effect) {
|
|
var effects = (this.player === this.game.turnPlayer)? this.playerTriggeredEffects : this.opponentTriggeredEffects;
|
|
removeFromArr(effect,effects);
|
|
// 迸发结束
|
|
var flag = effect.isBurst && effects.every(function (eff) {
|
|
return !eff.isBurst || (eff.source !== effect.source);
|
|
},this);
|
|
if (!flag) return;
|
|
this.game.pushEffectSource(null);
|
|
effect.end();
|
|
this.game.popEffectSource();
|
|
};
|
|
|
|
EffectManager.prototype.addTriggeredEffect = function (effect) {
|
|
if (effect.source.player === this.game.turnPlayer) {
|
|
this.playerTriggeredEffects.push(effect);
|
|
} else {
|
|
this.opponentTriggeredEffects.push(effect);
|
|
}
|
|
};
|
|
|
|
EffectManager.prototype.removeTriggeredEffectBySource = function (source) {
|
|
[this.playerTriggeredEffects,this.opponentTriggeredEffects].forEach(function (effects) {
|
|
for (var i = 0; i < effects.length; i++) {
|
|
var effect = effects[i];
|
|
if (effect.source === source) {
|
|
effects.splice(i,1);
|
|
i--;
|
|
}
|
|
}
|
|
})
|
|
};
|
|
|
|
EffectManager.prototype.handleEffectsAsyn = function () {
|
|
// 过滤不满足条件的效果
|
|
// this.playerTriggeredEffects = this.playerTriggeredEffects.filter(function (effect) {
|
|
// return (!effect.condition || effect.condition.call(effect.source,effect.event));
|
|
// },this);
|
|
// this.opponentTriggeredEffects = this.opponentTriggeredEffects.filter(function (effect) {
|
|
// return (!effect.condition || effect.condition.call(effect.source,effect.event));
|
|
// },this);
|
|
|
|
// 回合玩家具有优先权
|
|
// if (!this.player) {
|
|
// this.player = this.game.turnPlayer;
|
|
// }
|
|
this.player = this.game.turnPlayer;
|
|
|
|
var effects = this.getPlayerEffects();
|
|
// 若优先玩家无触发效果,移交优先权
|
|
if (!effects.length) {
|
|
this.clearPlayerEffects();
|
|
this.player = this.player.opponent;
|
|
effects = this.getPlayerEffects();
|
|
}
|
|
// 若双方均无触发效果,结束处理
|
|
if (!effects.length) {
|
|
// this.player = null;
|
|
this.clearPlayerEffects();
|
|
return Callback.immediately();
|
|
}
|
|
// 处理优先玩家的触发效果
|
|
var allOptional = effects.every(function (effect) {
|
|
return effect.isOptional();
|
|
},this);
|
|
var needConfirm = true;
|
|
return Callback.immediately().callback(this,function () {
|
|
if (effects.length === 1) return effects[0];
|
|
needConfirm = false;
|
|
if (allOptional) {
|
|
return this.player.selectOptionalAsyn('EFFECTS',effects);
|
|
}
|
|
return this.player.selectAsyn('EFFECTS',effects);
|
|
}).callback(this,function (effect) {
|
|
if (!effect) {
|
|
this.clearPlayerEffects();
|
|
return Callback.immediately();
|
|
}
|
|
// removeFromArr(effect,effects);
|
|
return this.game.blockAsyn(effect.source,this,function () {
|
|
return effect.handleAsyn(needConfirm).callback(this,function () {
|
|
this.removePlayerEffect(effect);
|
|
});
|
|
});
|
|
});
|
|
};
|
|
|
|
|
|
global.EffectManager = EffectManager; |