From f19021532991fdc7880ac28e77037133cf57ac4b Mon Sep 17 00:00:00 2001
From: WEBXOSS <webxoss@gmail.com>
Date: Thu, 30 Mar 2017 14:19:20 +0800
Subject: [PATCH] implement trap related effects

---
 CardInfo.js | 134 ++++++++++++++++++++++++++++------------------------
 1 file changed, 72 insertions(+), 62 deletions(-)

diff --git a/CardInfo.js b/CardInfo.js
index 63ae459..203aba5 100644
--- a/CardInfo.js
+++ b/CardInfo.js
@@ -127693,16 +127693,6 @@ var CardInfo = {
 		"limiting": "あや",
 		"imgUrl": "http://www.takaratomy.co.jp/products/wixoss/wxwp/images/card/WX15/WX15-017.jpg",
 		"illust": "夜ノみつき",
-		faqs: [
-			{
-				"q": "【トラップ】とは何ですか?",
-				"a": "カードの効果によって、【トラップ】としてシグニゾーンに設置された裏向きのカードをのことを指します。\n【トラップ】は自分のシグニゾーン1つにつき1つまで設置することができます。\n相手のシグニがアタックしたとき、その正面にシグニがない場合、そこにある【トラップ】を表向きにすることができます(しないことも可能です)。それが《トラップアイコン》を持っている場合、その効果を発動できます。その後、その【トラップ】はトラッシュに置かれます。"
-			},
-			{
-				"q": "シグニがあるシグニゾーンの【トラップ】に《トリップ・トラップ》を使用した場合、それを発動できますか?",
-				"a": "はい、できます。《トリップ・トラップ》などのように効果によって【トラップ】を発動する場合、同じシグニゾーンにシグニがあっても発動できます。"
-			}
-		],
 		"classes": [],
 		"costWhite": 0,
 		"costBlack": 0,
@@ -127730,7 +127720,18 @@ var CardInfo = {
 		],
 		artsEffect: {
 			actionAsyn: function () {
-				// TODO...
+				var zones = this.player.signiZones.filter(function (zone) {
+					return zone.trap;
+				},this);
+				return this.player.selectAsyn('LAUNCH',zones).callback(this,function (zone) {
+					if (!zone) return;
+					var card = zone.trap;
+					return this.player.opponent.showCardsAsyn([card]).callback(this,function () {
+						return card.trap.actionAsyn.call(card);
+					}).callback(this,function () {
+						card.trash();
+					});
+				});
 			}
 		}
 	},
@@ -128359,28 +128360,6 @@ var CardInfo = {
 		"limiting": "あや",
 		"imgUrl": "http://www.takaratomy.co.jp/products/wixoss/wxwp/images/card/WX15/WX15-035.jpg",
 		"illust": "かにゃぴい",
-		faqs: [
-			{
-				"q": "【トラップ】とは何ですか?",
-				"a": "カードの効果によって、【トラップ】としてシグニゾーンに設置された裏向きのカードをのことを指します。\n【トラップ】は自分のシグニゾーン1つにつき1つまで設置することができます。\n相手のシグニがアタックしたとき、その正面にシグニがない場合、そこにある【トラップ】を表向きにすることができます(しないことも可能です)。それが《トラップアイコン》を持っている場合、その効果を発動できます。その後、その【トラップ】はトラッシュに置かれます。"
-			},
-			{
-				"q": "自動能力で発動した【トラップ】は、発動後どうなりますか?",
-				"a": "通常の【トラップ】と同様に、発動後トラッシュに置かれます。"
-			},
-			{
-				"q": "《トラップアイコン》を持っていないカードでも【トラップ】として設置することはできますか?",
-				"a": "はい、可能です。そのカードが何であるか問わず【トラップ】として設置できますし、また相手シグニのアタックで表向きにすることもできます。ただし、その表向きにしたカードに《トラップアイコン》がなければそのカードは何も発動することはなく、トラッシュへ置かれます。"
-			},
-			{
-				"q": "アタックはしたいですが、《超罠 ハニトラ》の下にあるトラップは発動させたくありません。発動させないことを選べますか?",
-				"a": "いいえ、アタックしたときに同じシグニゾーンに【トラップ】がある場合、それを発動させるのは強制となります。"
-			},
-			{
-				"q": "《FREEZE THROUGH》を使用して、次にこのシグニでアタックをして同じシグニゾーンにある《中罠 シューピン》のトラップ能力を発動しました。アタックしている《超罠 ハニトラ》はアサシンを得ますか?また、正面にシグニがある場合にダメージは与えますか?",
-				"a": "はい、《超罠 ハニトラ》はアサシンを得ますし、正面にシグニがあったとしてもアサシンの効果によって正面のシグニとはバトルをせずに対戦相手にダメージを与えます。"
-			}
-		],
 		"classes": [
 			"精武",
 			"トリック"
@@ -128411,7 +128390,13 @@ var CardInfo = {
 		constEffects: [{
 			auto: 'onAttack',
 			actionAsyn: function () {
-				// TODO...
+				var card = this.zone.trap;
+				if (!card) return;
+				return this.player.opponent.showCardsAsyn([card]).callback(this,function () {
+					return card.trap.actionAsyn.call(card);
+				}).callback(this,function () {
+					card.trash();
+				});
 			},
 		}],
 		// ======================
@@ -129565,25 +129550,19 @@ var CardInfo = {
 			"[Trap]: You may put 1 of your other [Trap] on the field into the trash, and pay [Blue]. If you do, banish 1 of your opponent's SIGNI."
 		],
 		trap: {
-			// TODO...
-			// not cost
-			costBlue: 1,
-			costCondition: function () {
-				return this.getTraps().some(function (card) {
-					return (card !== this);
-				},this);
-			},
-			costAsyn: function () {
-				var cards = this.getTraps().filter(function (card) {
-					return (card !== this);
-				},this);
-				return this.player.selectAsyn('PAY',cards).callback(this,function (card) {
-					if (!card) return;
-					card.trash();
-				});
-			},
 			actionAsyn: function () {
-				return this.banishSigniAsyn();
+				var cost = { costBlue: 1 };
+				if (!this.player.enoughEner(cost)) return;
+				var zones = this.player.signiZones.filter(function (zone) {
+					return zone.trap && (zone !== this.zone);
+				},this);
+				return this.player.selectOptionalAsyn('TRASH',zones).callback(this,function (zone) {
+					if (!zone) return;
+					zone.trap.trash();
+					return this.player.payCostAsyn(cost).callback(this,function () {
+						return this.banishSigniAsyn();
+					});
+				});
 			},
 		},
 		// ======================
@@ -130585,8 +130564,7 @@ var CardInfo = {
 		],
 		startUpEffects: [{
 			actionAsyn: function () {
-				// TODO...
-				// copy WX15-049
+				return this.player.setTrapFromDeckTopAsyn(2);
 			}
 		}],
 	},
@@ -135123,9 +135101,14 @@ var CardInfo = {
 				var cards = this.player.mainDeck.getTopCards(2);
 				if (!cards.length) return;
 				this.player.informCards(cards);
-				return this.player.selectOptionalAsyn('TARGET',cards).callback(this,function (card) {
+				return this.player.selectAsyn('TARGET',cards).callback(this,function (card) {
 					if (!card) return;
-					// TODO...
+					removeFromArr(card,cards);
+					return this.player.selectAsyn('TARGET',this.player.signiZones).callback(this,function (zone) {
+						card.trapTo(zone);
+					});
+				}).callback(this,function () {
+					this.game.moveCards(cards,this.player.handZone);
 				});
 			},
 		},
@@ -135145,10 +135128,14 @@ var CardInfo = {
 			actionAsyn: function () {
 				var card = this.player.mainDeck.cards[0];
 				if (!card) return;
-				this.player.informCards([card]);
-				return this.player.selectOptionalAsyn('TARGET',cards).callback(this,function (card) {
-					if (!card) return;
-					// TODO...
+				return this.player.showCardsAsyn([card]).callback(this,function () {
+					return this.player.selectOptionalAsyn('TARGET',this.player.signiZones).callback(this,function (zone) {
+						if (!zone) {
+							card.moveTo(this.player.handZone);
+						} else {
+							card.trapTo(zone);
+						}
+					})
 				});
 			}
 		}
@@ -135204,7 +135191,23 @@ var CardInfo = {
 					source: this,
 					description: '2166-const-0',
 					actionAsyn: function () {
-						// !TODO...
+						var card = this.player.mainDeck.cards[0];
+						return this.player.showCardsAsyn([card]).callback(this,function () {
+							if (!card) return true;
+							return this.player.selectOptionalAsyn('TARGET',this.player.signiZones).callback(this,function (zone) {
+								if (!zone) return true;
+								card.trapTo(zone);
+								return false;
+							})
+						}).callback(this,function (flag) {
+							if (!flag) return;
+							return this.player.selectOptionalAsyn('TARGET',this.player.hands).callback(this,function (card) {
+								if (!card) return;
+								return this.player.selectAsyn('TARGET',this.player.signiZones).callback(this,function (zone) {
+									card.trapTo(zone);
+								});
+							});
+						});
 					}
 				});
 				add(this,'onBanish',effect);
@@ -135262,7 +135265,14 @@ var CardInfo = {
 					source: this,
 					description: '2167-const-0',
 					actionAsyn: function () {
-						// TODO...
+						var card = this.player.mainDeck.cards[0];
+						if (!card) return;
+						return this.player.showCardsAsyn([card]).callback(this,function () {
+							return this.player.selectOptionalAsyn('TARGET',this.player.signiZones).callback(this,function (zone) {
+								if (!zone) return;
+								card.trapTo(zone);
+							});
+						});
 					}
 				});
 				add(this,'onBanish',effect);