2015-06-13 19:36:02 +00:00
|
|
|
module.exports = {
|
|
|
|
|
|
|
|
"agile": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "agile",
|
|
|
|
description: "Can be placed in either the Close Combat or Ranged Combat row. Cannot be moved once placed.",
|
2015-06-19 15:15:26 +00:00
|
|
|
cancelPlacement: true,
|
2015-06-19 19:53:48 +00:00
|
|
|
onBeforePlace: function(card){
|
2015-06-19 15:15:26 +00:00
|
|
|
var self = this;
|
|
|
|
this.send("played:agile", {cardID: card.getID()}, true);
|
2015-06-19 19:53:48 +00:00
|
|
|
this.on("agile:setField", function(type){
|
2015-06-19 15:15:26 +00:00
|
|
|
self.off("agile:setField");
|
|
|
|
card.changeType(type)
|
|
|
|
self.placeCard(card, {
|
|
|
|
disabled: true
|
|
|
|
});
|
|
|
|
self.hand.remove(card);
|
|
|
|
})
|
|
|
|
}
|
2015-06-13 19:36:02 +00:00
|
|
|
},
|
|
|
|
"medic": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "medic",
|
|
|
|
description: "Choose one card from your discard pile (excluding heroes / special cards) to play instantly.",
|
2015-06-19 12:14:37 +00:00
|
|
|
waitResponse: true,
|
2015-06-19 19:53:48 +00:00
|
|
|
onAfterPlace: function(card){
|
2015-06-19 12:14:37 +00:00
|
|
|
var discard = this.getDiscard();
|
|
|
|
|
|
|
|
discard = this.filter(discard, {
|
|
|
|
"ability": "hero",
|
2015-06-23 13:01:39 +00:00
|
|
|
"type": [card.constructor.TYPE.SPECIAL, card.constructor.TYPE.WEATHER]
|
2015-06-19 12:14:37 +00:00
|
|
|
})
|
2015-06-13 19:36:02 +00:00
|
|
|
|
2015-06-19 12:14:37 +00:00
|
|
|
this.send("played:medic", {
|
|
|
|
cards: JSON.stringify(discard)
|
|
|
|
}, true);
|
|
|
|
}
|
2015-06-13 19:36:02 +00:00
|
|
|
},
|
|
|
|
"morale_boost": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "morale_boost",
|
|
|
|
description: "Adds +1 strength to all units in the row, excluding itself.",
|
2015-06-19 19:53:48 +00:00
|
|
|
onEachCardPlace: function(card){
|
2015-06-14 18:50:53 +00:00
|
|
|
var field = this.field[card.getType()];
|
2015-06-19 19:53:48 +00:00
|
|
|
var id = card.getID();
|
|
|
|
if(!field.isOnField(card)){
|
|
|
|
field.get().forEach(function(_card){
|
|
|
|
if(_card.getID() == id) return;
|
2015-06-26 06:51:30 +00:00
|
|
|
if(_card.hasAbility("hero")) return;
|
2015-06-19 19:53:48 +00:00
|
|
|
if(_card.getType() != card.getType()) return;
|
|
|
|
_card.setBoost(id, 0);
|
|
|
|
})
|
|
|
|
this.off("EachCardPlace", card.getUidEvents("EachCardPlace"));
|
|
|
|
return;
|
|
|
|
}
|
2015-06-13 19:36:02 +00:00
|
|
|
|
2015-06-19 19:53:48 +00:00
|
|
|
field.get().forEach(function(_card){
|
|
|
|
if(_card.getID() == id) return;
|
2015-06-26 06:51:30 +00:00
|
|
|
if(_card.hasAbility("hero")) return;
|
2015-06-19 19:53:48 +00:00
|
|
|
if(_card.getType() != card.getType()) return;
|
|
|
|
_card.setBoost(id, 1);
|
2015-06-13 19:36:02 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"muster": {
|
2015-06-19 12:14:37 +00:00
|
|
|
name: "muster",
|
2015-06-25 19:34:04 +00:00
|
|
|
description: "Find any cards with the same name in your deck and play them instantly.",
|
2015-06-13 19:36:02 +00:00
|
|
|
onAfterPlace: function(card){
|
2015-06-19 12:14:37 +00:00
|
|
|
var musterType = card.getMusterType();
|
2015-06-13 19:36:02 +00:00
|
|
|
var self = this;
|
|
|
|
|
2015-06-19 12:14:37 +00:00
|
|
|
var cardsDeck = this.deck.find("musterType", musterType);
|
|
|
|
var cardsHand = this.hand.find("musterType", musterType);
|
|
|
|
|
2015-06-19 19:53:48 +00:00
|
|
|
cardsDeck.forEach(function(_card){
|
2015-06-20 11:08:28 +00:00
|
|
|
if(_card.getID() === card.getID()) return;
|
2015-06-14 18:50:53 +00:00
|
|
|
self.deck.removeFromDeck(_card);
|
2015-06-19 12:14:37 +00:00
|
|
|
self.placeCard(_card, {
|
|
|
|
suppress: "muster"
|
|
|
|
});
|
|
|
|
})
|
2015-06-19 19:53:48 +00:00
|
|
|
cardsHand.forEach(function(_card){
|
2015-06-20 11:08:28 +00:00
|
|
|
if(_card.getID() === card.getID()) return;
|
2015-06-19 12:14:37 +00:00
|
|
|
self.hand.remove(_card);
|
|
|
|
self.placeCard(_card, {
|
|
|
|
suppress: "muster"
|
|
|
|
});
|
2015-06-13 19:36:02 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"tight_bond": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "tight_bond",
|
|
|
|
description: "Place next to a card with the name same to double the strength of both cards.",
|
2015-06-13 19:36:02 +00:00
|
|
|
onAfterPlace: function(card){
|
2015-06-14 18:50:53 +00:00
|
|
|
var field = this.field[card.getType()];
|
|
|
|
var cards = field.get();
|
2015-06-13 19:36:02 +00:00
|
|
|
var lastInsert = cards.length;
|
|
|
|
|
|
|
|
if(lastInsert < 2) return;
|
|
|
|
|
|
|
|
if(cards[lastInsert - 2].getName() == cards[lastInsert - 1].getName()){
|
2015-06-20 11:08:28 +00:00
|
|
|
cards[lastInsert - 2].setBoost(cards[lastInsert - 2].getID(), +cards[lastInsert - 2].getPower());
|
|
|
|
cards[lastInsert - 1].setBoost(cards[lastInsert - 1].getID(), +cards[lastInsert - 1].getPower());
|
2015-06-13 19:36:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"spy": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "spy",
|
|
|
|
description: "Place on your opponents battlefield (counts towards their total strength) then draw two new cards from your deck.",
|
2015-06-13 19:36:02 +00:00
|
|
|
changeSide: true,
|
2015-06-25 19:34:04 +00:00
|
|
|
onAfterPlace: function(){
|
2015-06-14 18:50:53 +00:00
|
|
|
this.draw(2);
|
2015-06-13 19:36:02 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
"weather_fog": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "weather_fog",
|
|
|
|
description: "Sets the strength of all Ranged Combat cards to 1 for both players.",
|
2015-06-21 14:50:50 +00:00
|
|
|
weather: 1/*,
|
2015-06-19 19:53:48 +00:00
|
|
|
onEachTurn: function(card){
|
2015-06-13 19:36:02 +00:00
|
|
|
var targetRow = card.constructor.TYPE.RANGED;
|
|
|
|
var forcedPower = 1;
|
2015-06-14 18:50:53 +00:00
|
|
|
var field1 = this.field[targetRow].get();
|
|
|
|
var field2 = this.foe.field[targetRow].get();
|
2015-06-13 19:36:02 +00:00
|
|
|
|
|
|
|
var field = field1.concat(field2);
|
|
|
|
|
2015-06-19 19:53:48 +00:00
|
|
|
field.forEach(function(_card){
|
2015-06-13 19:36:02 +00:00
|
|
|
if(_card.getRawAbility() == "hero") return;
|
|
|
|
_card.setForcedPower(forcedPower);
|
|
|
|
});
|
2015-06-14 18:50:53 +00:00
|
|
|
},
|
2015-06-19 19:53:48 +00:00
|
|
|
onEachCardPlace: function(card){
|
2015-06-14 18:50:53 +00:00
|
|
|
var targetRow = card.constructor.TYPE.RANGED;
|
|
|
|
var forcedPower = 1;
|
|
|
|
var field1 = this.field[targetRow].get();
|
|
|
|
var field2 = this.foe.field[targetRow].get();
|
|
|
|
|
|
|
|
var field = field1.concat(field2);
|
2015-06-13 19:36:02 +00:00
|
|
|
|
2015-06-19 19:53:48 +00:00
|
|
|
field.forEach(function(_card){
|
2015-06-14 18:50:53 +00:00
|
|
|
if(_card.getRawAbility() == "hero") return;
|
|
|
|
_card.setForcedPower(forcedPower);
|
|
|
|
});
|
2015-06-21 14:50:50 +00:00
|
|
|
}*/
|
2015-06-13 19:36:02 +00:00
|
|
|
},
|
|
|
|
"weather_rain": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "weather_rain",
|
|
|
|
description: "Sets the strength of all Siege Combat cards to 1 for both players.",
|
2015-06-21 14:50:50 +00:00
|
|
|
weather: 2
|
|
|
|
/*onEachTurn: function(card){
|
2015-06-13 19:36:02 +00:00
|
|
|
var targetRow = card.constructor.TYPE.SIEGE;
|
|
|
|
var forcedPower = 1;
|
2015-06-14 18:50:53 +00:00
|
|
|
var field1 = this.field[targetRow].get();
|
|
|
|
var field2 = this.foe.field[targetRow].get();
|
2015-06-13 19:36:02 +00:00
|
|
|
|
|
|
|
var field = field1.concat(field2);
|
|
|
|
|
2015-06-19 19:53:48 +00:00
|
|
|
field.forEach(function(_card){
|
2015-06-13 19:36:02 +00:00
|
|
|
if(_card.getRawAbility() == "hero") return;
|
|
|
|
_card.setForcedPower(forcedPower);
|
|
|
|
});
|
2015-06-21 14:50:50 +00:00
|
|
|
},
|
|
|
|
onEachCardPlace: function(card){
|
|
|
|
var targetRow = card.constructor.TYPE.SIEGE;
|
2015-06-13 19:36:02 +00:00
|
|
|
var forcedPower = 1;
|
2015-06-14 18:50:53 +00:00
|
|
|
var field1 = this.field[targetRow].get();
|
|
|
|
var field2 = this.foe.field[targetRow].get();
|
2015-06-13 19:36:02 +00:00
|
|
|
|
|
|
|
var field = field1.concat(field2);
|
|
|
|
|
2015-06-19 19:53:48 +00:00
|
|
|
field.forEach(function(_card){
|
2015-06-13 19:36:02 +00:00
|
|
|
if(_card.getRawAbility() == "hero") return;
|
|
|
|
_card.setForcedPower(forcedPower);
|
|
|
|
});
|
2015-06-21 14:50:50 +00:00
|
|
|
}*/
|
|
|
|
},
|
|
|
|
"weather_frost": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "weather_frost",
|
|
|
|
description: "Sets the strength of all Close Combat cards to 1 for both players.",
|
2015-06-21 14:50:50 +00:00
|
|
|
weather: 0
|
|
|
|
/*
|
|
|
|
onEachTurn: function(card){
|
|
|
|
var targetRow = card.constructor.TYPE.CLOSE_COMBAT;
|
|
|
|
var forcedPower = 1;
|
|
|
|
var field1 = this.field[targetRow].get();
|
|
|
|
var field2 = this.foe.field[targetRow].get();
|
2015-06-13 19:36:02 +00:00
|
|
|
|
2015-06-21 14:50:50 +00:00
|
|
|
var field = field1.concat(field2);
|
|
|
|
|
|
|
|
field.forEach(function(_card){
|
|
|
|
if(_card.getRawAbility() == "hero") return;
|
|
|
|
_card.setForcedPower(forcedPower);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
onEachCardPlace: function(card){
|
|
|
|
var targetRow = card.constructor.TYPE.CLOSE_COMBAT;
|
|
|
|
var forcedPower = 1;
|
|
|
|
var field1 = this.field[targetRow].get();
|
|
|
|
var field2 = this.foe.field[targetRow].get();
|
|
|
|
|
|
|
|
var field = field1.concat(field2);
|
|
|
|
|
|
|
|
field.forEach(function(_card){
|
|
|
|
if(_card.getRawAbility() == "hero") return;
|
|
|
|
_card.setForcedPower(forcedPower);
|
|
|
|
});
|
|
|
|
}*/
|
2015-06-13 19:36:02 +00:00
|
|
|
},
|
2015-06-21 14:50:50 +00:00
|
|
|
"weather_clear": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "weather_clear",
|
|
|
|
description: "Removes all Weather Card (Biting Frost, Impenetrable Fog and Torrential Rain) effects.",
|
2015-06-21 14:50:50 +00:00
|
|
|
weather: 5
|
|
|
|
/*onAfterPlace: function(card){
|
2015-06-13 19:36:02 +00:00
|
|
|
var targetRow = card.constructor.TYPE.WEATHER;
|
2015-06-21 14:50:50 +00:00
|
|
|
var field = this.field[targetRow];
|
|
|
|
field.removeAll();
|
2015-06-13 19:36:02 +00:00
|
|
|
|
2015-06-21 14:50:50 +00:00
|
|
|
for(var i = card.constructor.TYPE.CLOSE_COMBAT; i < card.constructor.TYPE.SIEGE; i++) {
|
|
|
|
var _field1, _field2, _field;
|
|
|
|
_field1 = this.field[i].get();
|
|
|
|
_field2 = this.foe.field[i].get();
|
|
|
|
_field = _field1.concat(_field2);
|
|
|
|
|
|
|
|
_field.forEach(function(_card){
|
|
|
|
if(_card.getRawAbility() == "hero") return;
|
|
|
|
_card.setForcedPower(-1);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
}*/
|
2015-06-13 19:36:02 +00:00
|
|
|
},
|
|
|
|
"decoy": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "decoy",
|
|
|
|
description: "Decoy: Swap with a card on the battlefield to return it to your hand.",
|
2015-06-13 19:36:02 +00:00
|
|
|
replaceWith: true
|
2015-06-18 13:06:13 +00:00
|
|
|
},
|
2015-06-26 11:17:28 +00:00
|
|
|
"scorch_card": {
|
|
|
|
name: "scorch",
|
|
|
|
description: "Scorch: Discard after playing. Kills the strongest card(s) in the battlefield.",
|
|
|
|
scorch: true,
|
|
|
|
removeImmediately: true,
|
|
|
|
nextTurn: true
|
|
|
|
},
|
2015-06-25 19:34:04 +00:00
|
|
|
"scorch": {
|
|
|
|
name: "scorch",
|
2015-06-26 11:17:28 +00:00
|
|
|
description: "Scorch: Discard after playing. Kills the strongest card(s) in the battlefield.",
|
|
|
|
scorch: true
|
2015-06-25 19:34:04 +00:00
|
|
|
},
|
2015-06-21 14:50:50 +00:00
|
|
|
"commanders_horn": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "commanders_horn",
|
|
|
|
description: "Commander's Horn: Doubles the strength of all unit cards in a row. Limited to 1 per row.",
|
2015-06-22 16:48:08 +00:00
|
|
|
commandersHorn: true
|
2015-06-21 14:50:50 +00:00
|
|
|
},
|
|
|
|
"commanders_horn_card": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "commanders_horn",
|
|
|
|
description: "Commander's Horn: Doubles the strength of all unit cards in a row. Limited to 1 per row.",
|
2015-06-21 14:50:50 +00:00
|
|
|
cancelPlacement: true,
|
|
|
|
commandersHorn: true,
|
2015-06-22 16:48:08 +00:00
|
|
|
isCommandersHornCard: true
|
2015-06-21 14:50:50 +00:00
|
|
|
},
|
2015-06-18 13:06:13 +00:00
|
|
|
"foltest_leader1": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "",
|
|
|
|
description: "",
|
2015-06-19 19:53:48 +00:00
|
|
|
onActivate: function(){
|
2015-06-18 13:06:13 +00:00
|
|
|
var cards = this.deck.find("key", "impenetrable_fog")
|
|
|
|
if(!cards.length) return;
|
|
|
|
var card = this.deck.removeFromDeck(cards[0]);
|
|
|
|
this.placeCard(card);
|
|
|
|
}
|
2015-06-19 12:14:37 +00:00
|
|
|
},
|
2015-06-21 14:50:50 +00:00
|
|
|
"foltest_leader2": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "",
|
|
|
|
description: "",
|
2015-06-21 14:50:50 +00:00
|
|
|
onActivate: function(){
|
|
|
|
this.setWeather(5);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"foltest_leader3": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "",
|
|
|
|
description: "Doubles the strength of all Siege units, unless a Commander's Horn is already in play on that row",
|
2015-06-21 14:50:50 +00:00
|
|
|
onActivate: function(){
|
2015-06-22 16:48:08 +00:00
|
|
|
this.setHorn("commanders_horn", 2);
|
2015-06-21 14:50:50 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
"foltest_leader4": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "",
|
|
|
|
description: "",
|
2015-06-21 14:50:50 +00:00
|
|
|
onActivate: function(){
|
2015-06-22 18:19:06 +00:00
|
|
|
//scorch siege
|
2015-06-21 14:50:50 +00:00
|
|
|
}
|
|
|
|
},
|
2015-06-19 19:59:33 +00:00
|
|
|
"francesca_leader1": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "",
|
|
|
|
description: "",
|
2015-06-19 19:59:33 +00:00
|
|
|
onActivate: function(){
|
2015-06-22 18:19:06 +00:00
|
|
|
var cards = this.deck.find("key", "biting_frost")
|
|
|
|
if(!cards.length) return;
|
|
|
|
var card = this.deck.removeFromDeck(cards[0]);
|
|
|
|
this.placeCard(card);
|
2015-06-19 19:59:33 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
"francesca_leader2": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "",
|
|
|
|
description: "",
|
2015-06-19 19:59:33 +00:00
|
|
|
onActivate: function(){
|
2015-06-22 18:19:06 +00:00
|
|
|
this.setHorn("commanders_horn", 1);
|
2015-06-19 19:59:33 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
"francesca_leader3": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "",
|
|
|
|
description: "",
|
2015-06-19 19:59:33 +00:00
|
|
|
onActivate: function(){
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"francesca_leader4": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "",
|
|
|
|
description: "",
|
2015-06-19 19:59:33 +00:00
|
|
|
onActivate: function(){
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"eredin_leader1": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "",
|
|
|
|
description: "",
|
2015-06-19 19:59:33 +00:00
|
|
|
onActivate: function(){
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"eredin_leader2": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "",
|
|
|
|
description: "",
|
2015-06-19 19:59:33 +00:00
|
|
|
onActivate: function(){
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"eredin_leader3": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "",
|
|
|
|
description: "",
|
2015-06-19 19:59:33 +00:00
|
|
|
onActivate: function(){
|
2015-06-22 18:19:06 +00:00
|
|
|
|
2015-06-19 19:59:33 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
"eredin_leader4": {
|
2015-06-25 19:34:04 +00:00
|
|
|
name: "",
|
|
|
|
description: "",
|
2015-06-19 19:59:33 +00:00
|
|
|
onActivate: function(){
|
2015-06-22 18:19:06 +00:00
|
|
|
this.setHorn("commanders_horn", 0);
|
2015-06-19 19:59:33 +00:00
|
|
|
}
|
|
|
|
},
|
2015-06-25 19:34:04 +00:00
|
|
|
"hero": {
|
|
|
|
name: "hero",
|
|
|
|
description: "Hero: Not affected by special cards, weather cards or abilities."
|
|
|
|
}
|
2015-06-13 19:36:02 +00:00
|
|
|
}
|