Commit 3b2ccfd3 authored by nanahira's avatar nanahira

Merge branch 'master' into rd

parents cf4e65e4 3bd53ba5
...@@ -15,14 +15,18 @@ build: ...@@ -15,14 +15,18 @@ build:
image: mono image: mono
script: script:
- sed -i '/download.mono-project.com/d' /etc/apt/sources.list /etc/apt/sources.list.d/* - sed -i '/download.mono-project.com/d' /etc/apt/sources.list /etc/apt/sources.list.d/*
- apt update && apt -y install p7zip-full - apt update && apt -y install p7zip-full tar
- msbuild /p:Configuration=Release /p:TargetFrameworkVersion=v4.6 - msbuild /p:Configuration=Release /p:TargetFrameworkVersion=v4.6
- mv -f bin/Release WindBot - mv -f bin/Release WindBot
- rm -rf WindBot/WindBot.exe.config - rm -rf WindBot/WindBot.exe.config
- mv -f BotWrapper/bin/Release/Bot.exe . - mv -f BotWrapper/bin/Release/Bot.exe .
- mv -f BotWrapper/bin/Release/bot.conf . - mv -f BotWrapper/bin/Release/bot.conf .
- mv -f BotWrapper/BotWrapper.sh ./bot
- chmod +x ./bot
- mkdir dist - mkdir dist
- 7z a -mx9 dist/WindBot.7z WindBot Bot.exe bot.conf - 7z a -mx9 dist/WindBot.7z WindBot Bot.exe bot.conf
- mv WindBot windbot
- tar zcvf dist/windbot.tar.gz windbot bot.conf bot
artifacts: artifacts:
paths: paths:
- dist/ - dist/
......
...@@ -2,26 +2,32 @@ ...@@ -2,26 +2,32 @@
# !name # !name
# command # command
# description # description
<<<<<<< HEAD # flags (avail flags: SUPPORT_MASTER_RULE_3, SUPPORT_NEW_MASTER_RULE, SUPPORT_MASTER_RULE_2020, SELECT_DECKFILE)
# flags (avail flags: SUPPORT_MASTER_RULE_3, SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020)
=======
# flags (avail flags: SUPPORT_MASTER_RULE_3, SUPPORT_NEW_MASTER_RULE, SUPPORT_MASTER_RULE_2020)
>>>>>>> 795ac990ff54118181873e013ffab43cc4ec9998
!随机-非常简单 !随机-非常简单
Random=AI_LV1 Random=AI_LV1
主要是一些沙包。 主要是一些沙包。
SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 SUPPORT_MASTER_RULE_2020
!随机-简单 !随机-简单
Random=AI_LV2 Random=AI_LV2
一些比较弱的卡组。 一些比较弱的卡组。
SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 SUPPORT_MASTER_RULE_2020
!随机-普通 !随机-普通
Random=AI_LV3 Random=AI_LV3
一些环境里可以看到的卡组。 一些环境里可以看到的卡组。
SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 SUPPORT_MASTER_RULE_2020
!随机-报社
Random=AI_ANTI_META
一些报复社会(针对主流卡组的弱点)的卡组。
SUPPORT_MASTER_RULE_2020
!P2-自选卡组
Name=P2 Deck=Lucky Dialog=gugugu.zh-CN
人机卡组由你选择。随缘出牌。可将你的卡组文件(.ydk)复制到WindBot的对应文件夹。
SELECT_DECKFILE SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!谜之剑士LV4-龙骑星爆 !谜之剑士LV4-龙骑星爆
Name=谜之剑士LV4 Deck=Dragunity Dialog=swordsman.zh-CN Name=谜之剑士LV4 Deck=Dragunity Dialog=swordsman.zh-CN
...@@ -31,12 +37,12 @@ AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 ...@@ -31,12 +37,12 @@ AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!谜之剑士LV4-R5 !谜之剑士LV4-R5
Name=谜之剑士LV4 Deck='Rank V' Dialog=swordsman.zh-CN Name=谜之剑士LV4 Deck='Rank V' Dialog=swordsman.zh-CN
5阶超量卡组。 5阶超量卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020
!谜之剑士LV4-异热同心武器 !谜之剑士LV4-异热同心武器
Name=谜之剑士LV4 Deck='Zexal Weapons' Dialog=swordsman.zh-CN Name=谜之剑士LV4 Deck='Zexal Weapons' Dialog=swordsman.zh-CN
神装电光皇卡组。 神装电光皇卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020
!谜之剑士LV4-8星同调 !谜之剑士LV4-8星同调
Name=谜之剑士LV4 Deck='Level VIII' Dialog=swordsman.zh-CN Name=谜之剑士LV4 Deck='Level VIII' Dialog=swordsman.zh-CN
...@@ -46,7 +52,7 @@ AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 ...@@ -46,7 +52,7 @@ AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!琪露诺-彩虹 !琪露诺-彩虹
Name=琪露诺 Deck=Rainbow Dialog=cirno.zh-CN Name=琪露诺 Deck=Rainbow Dialog=cirno.zh-CN
全属性凡骨卡组。 全属性凡骨卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020
!琪露诺-饼蛙 !琪露诺-饼蛙
Name=琪露诺 Deck='Toadally Awesome' Dialog=cirno.zh-CN Name=琪露诺 Deck='Toadally Awesome' Dialog=cirno.zh-CN
...@@ -56,7 +62,7 @@ AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 ...@@ -56,7 +62,7 @@ AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020
!复制植物-青眼 !复制植物-青眼
Name=复制植物 Deck=Blue-Eyes Dialog=copy.zh-CN Name=复制植物 Deck=Blue-Eyes Dialog=copy.zh-CN
青眼卡组。 青眼卡组。
AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020
!复制植物-十二兽 !复制植物-十二兽
Name=复制植物 Deck=Zoodiac Dialog=copy.zh-CN Name=复制植物 Deck=Zoodiac Dialog=copy.zh-CN
...@@ -83,24 +89,6 @@ Name=尼亚 Deck=Altergeist Dialog=near.zh-CN ...@@ -83,24 +89,6 @@ Name=尼亚 Deck=Altergeist Dialog=near.zh-CN
幻变骚灵卡组。 幻变骚灵卡组。
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
<<<<<<< HEAD
=======
!复制梁龙-闪刀姬
Name=复制梁龙 Deck=SkyStriker Dialog=anothercopy.zh-CN
旧式闪刀姬卡组。
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!复制梁龙-自奏圣乐
Name=复制梁龙 Deck=Orcust Dialog=anothercopy.zh-CN
旧式自奏圣乐卡组。
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!复制梁龙-转生炎兽
Name=复制梁龙 Deck=Salamangreat Dialog=anothercopy.zh-CN
转生炎兽卡组。
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
>>>>>>> 795ac990ff54118181873e013ffab43cc4ec9998
!永远之魂-削血 !永远之魂-削血
Name=永远之魂 Deck=Burn Dialog=soul.zh-CN Name=永远之魂 Deck=Burn Dialog=soul.zh-CN
老式削血卡组。 老式削血卡组。
...@@ -204,7 +192,6 @@ AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 ...@@ -204,7 +192,6 @@ AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!報社鬥士 !報社鬥士
Name=報社鬥士 Deck=GrenMajuThunderBoarder Dialog=kiwi.zh-TW Name=報社鬥士 Deck=GrenMajuThunderBoarder Dialog=kiwi.zh-TW
红莲雷王滑板卡组。 红莲雷王滑板卡组。
<<<<<<< HEAD
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!彩音-黑魔术师 !彩音-黑魔术师
...@@ -221,9 +208,6 @@ AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 ...@@ -221,9 +208,6 @@ AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
Name=朱露咲浅羽 Deck=Salamangreat Dialog=nlch.zh-CN Name=朱露咲浅羽 Deck=Salamangreat Dialog=nlch.zh-CN
浅羽的香喷喷曲奇。 浅羽的香喷喷曲奇。
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
=======
AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
>>>>>>> 795ac990ff54118181873e013ffab43cc4ec9998
!朱露咲浅羽-真红眼 !朱露咲浅羽-真红眼
Name=朱露咲浅羽 Deck=Dragun Dialog=nlch.zh-CN Name=朱露咲浅羽 Deck=Dragun Dialog=nlch.zh-CN
...@@ -234,3 +218,13 @@ AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 ...@@ -234,3 +218,13 @@ AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
Name=玻璃女巫 Deck=Witchcraft Dialog=verre.zh-CN Name=玻璃女巫 Deck=Witchcraft Dialog=verre.zh-CN
魔女术卡组。 魔女术卡组。
AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!源千雪-凭依装着
Name=源千雪 Deck=FamiliarPossessed Dialog=default.zh-CN
凭依装着卡组。
AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!璃璃子-时劫者
Name=璃璃子 Deck=TimeThief Dialog=default.zh-CN
时间潜行者卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
...@@ -5,17 +5,17 @@ ...@@ -5,17 +5,17 @@
53143898 53143898
53143898 53143898
42790071 42790071
42790071 14558127
14558127 14558127
14558127 14558127
89538537 89538537
89538537 89538537
89538537
23434538 23434538
23434538 23434538
23434538 23434538
25533642 25533642
25533642 25533642
25533642
2295440 2295440
18144506 18144506
35261759 35261759
......
#created by ...
#main
71197066
15397015
15397015
15397015
4376659
4376659
31764354
31887906
40542826
40542826
68881650
68881650
14558127
14558127
36584821
36584821
23434538
23434538
18144506
35261759
35261759
49238328
49238328
73915051
73915051
62256492
62256492
25704359
25704359
30241314
30241314
36975314
36975314
59305593
59305593
61740673
82732705
82732705
40605147
40605147
41420027
41420027
84749824
84749824
#extra
12014404
31833038
85289965
65330383
38342335
2857636
9839945
30674956
48815792
73309655
97661969
75452921
98978921
41999284
41999284
!side
14558127
23434538
12580477
14532163
14532163
14532163
8267140
8267140
24224830
24224830
65681983
65681983
10045474
10045474
10045474
#created by ... #created by ...
#main #main
65367484 65367484
65367484 71564252
65367484 71564252
71564252
56308388 56308388
56308388 56308388
56308388 56308388
67696066 67696066
67696066
82496097 82496097
82496097 82496097
82496097
74578720
74578720 74578720
74578720 74578720
19891131 19891131
19891131 19891131
19891131 19891131
70368879 14558127
70368879 14558127
70368879 23434538
23434538
12580477
18144507
35261759
35261759
49238328
49238328
81439173 81439173
10877309 10877309
10877309 10877309
10877309
81670445
81670445 81670445
81670445
18678554
18678554 18678554
18678554
26708437
26708437
26708437
57319935
57319935
98827725
98827725
98827725 98827725
36975314
36975314
40605147
40605147
40605147
41420027
41420027
41420027
76587747 76587747
76587747 76587747
76587747 84749824
84749824
#extra #extra
56832966 56832966
56832966 56832966
56832966 42421606
86532744 86532744
86532744 86532744
86532744 16195942
84013237
84013237 84013237
84013237 84013237
55285840 55285840
55285840 55285840
55285840
59208943
59208943 59208943
59208943 59208943
46772449
12014404
12014404
!side !side
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
95245544 95245544
95245544 95245544
14558127 14558127
14558127
38814750 38814750
38814750 38814750
38814750 38814750
...@@ -41,7 +42,6 @@ ...@@ -41,7 +42,6 @@
83301414 83301414
24224830 24224830
24224830 24224830
24224830
56894757 56894757
65681983 65681983
65681983 65681983
......
#created by ...
#main
71197066
15397015
15397015
15397015
4376659
4376659
31764354
31887906
40542826
40542826
68881650
68881650
14558127
14558127
36584821
36584821
18144506
35261759
35261759
49238328
49238328
24224830
24224830
73915051
73915051
62256492
62256492
25704359
25704359
30241314
30241314
36975314
36975314
59305593
59305593
61740673
82732705
82732705
40605147
40605147
41420027
41420027
84749824
84749824
#extra
12014404
31833038
85289965
65330383
38342335
2857636
9839945
30674956
48815792
73309655
97661969
75452921
98978921
41999284
41999284
!side
14558127
23434538
23434538
23434538
12580477
14532163
14532163
14532163
8267140
8267140
65681983
65681983
10045474
10045474
10045474
#created by ...
#main
71197066
15397015
15397015
4376659
4376659
31764354
31887906
40542826
40542826
68881650
68881650
14558127
14558127
14558127
36584821
36584821
23434538
23434538
23434538
14532163
14532163
14532163
18144506
35261759
35261759
49238328
49238328
73915051
73915051
62256492
62256492
10045474
10045474
10045474
25704359
25704359
36975314
36975314
61740673
82732705
82732705
40605147
41420027
41420027
#extra
12014404
31833038
85289965
65330383
38342335
2857636
9839945
30674956
48815792
73309655
97661969
75452921
98978921
41999284
41999284
!side
15397015
12580477
8267140
8267140
24224830
24224830
65681983
65681983
30241314
30241314
59305593
59305593
40605147
84749824
84749824
{
"welcome": [
"咱是一个机器人,名字叫老喵师,一个不怎么会打牌的存在。",
"欢迎下载了解喵版YGO主程序YGO-VI-EX。下载请微博搜索:老喵师1911。"
],
"deckerror": [
"啊,{0}又用不出来了。"
],
"duelstart": [
"没有人可以打不赢咱。",
"无能的咱,什么卡组都用不好。",
"你左手让咱,咱都不是你的对手。",
"嘛,无所谓了。"
],
"newturn": [
"啊,是咱的回合么。",
"抽一张卡。"
],
"endturn": [
"咱的运气不错,没能被你干掉。",
"无所谓了,看看下回合能做点啥了。"
],
"directattack": [
"用{0}进行攻击。",
"这卡还行,就拿{0}攻击吧。",
"时间还早,先拿{0}打过去。",
"运气不算太差,{0}的攻击应该能通过吧。"
],
"attack": [
"{0},攻击{1}。",
"没时间了,{0},赶快把{1}打了,咱要去看看哪里有BUG需要修了。",
"似乎行得通,{1}没有{0}强,{0}攻击。"
],
"ondirectattack": [
"习惯就好了。",
"{0}么,运气不错啊。",
"还行还行。"
],
"facedownmonstername": "怪兽",
"activate": [
"发动{0}的效果。",
"啊等下,使用{0}的效果。",
"这{0}咋用啊,交了算了。"
],
"summon": [
"召唤{0}",
"{0}似乎今天没有BUG。",
"{0}居然在服务器里更新了么。",
"{0}:老喵师这么菜就别打牌了。"
],
"setmonster": [
"放置一只怪兽,看看要不要结束回合。",
"没辙了,放置一只怪兽。"
],
"chaining": [
"发动{0}的效果进行连锁。",
"不要调皮,{0}发动。",
"还有张{0},发了。"
]
}
{
"welcome": [
"大家好我是新人",
"游戏王是怎么玩来着?",
"还好我不玩游戏王"
],
"deckerror": [
"卡组里{0}鸽了"
],
"duelstart": [
"不想干活怎么办",
"智商欠费不想干活怎么办"
],
"newturn": [
"好多可怕的新卡啊",
"这游戏好难玩",
"so lazy cant move"
],
"endturn": [
"搞得我只能鸽了",
"不是在此时,不知在何时",
"too hot need ice cream"
],
"directattack": [
"听起来很鸽",
"老鸽,稳"
],
"attack": [
"听起来不是很鸽",
"可怕"
],
"ondirectattack": [
"哇!",
"这么可怕的吗",
"听起来非常鸽",
"承受不住"
],
"facedownmonstername": "鸽子",
"activate": [
"不明觉鸽",
"鸽了,爽"
],
"summon": [
"可怕",
"不关我事",
"那还是不关我事",
"鸽了,爽"
],
"setmonster": [
"摸鱼中,不想更新",
"那还是鸽置吧"
],
"chaining": [
"那是什么",
"但我鸽了",
"无此服务",
"可怕"
]
}
{
"welcome": [
"都这个时候了咖啡店居然还有顾客……"
],
"deckerror": [
"啊,{0}不够了……"
],
"duelstart": [
"现在退出战场还来得及。",
"我是不会手下留情的,请拿出你最佳的状态和实力。"
],
"newturn": [
"终于到我了,那就抽卡。",
"总之先抽卡。"
],
"endturn": [
"你的运气不错,没能被我干掉。",
"算是我让你的。"
],
"directattack": [
"{0},直接攻击!",
"不堪一击!",
"弱小就要挨打!",
"丢你{0}!"
],
"attack": [
"{0},轮到你了。",
"{0},该你展示自己了。",
"还能站起来吗?"
],
"ondirectattack": [
"这点小伤,不算什么。",
"……我还能坚持住!"
],
"facedownmonstername": "怪兽",
"activate": [
"嗯……{0}应该管用。",
"接下来应该先用{0}……",
"嗯……总之先用{0}看看……"
],
"summon": [
"现在应该先出这个,{0}。",
"总之,把{0}拉出来就对了。"
],
"setmonster": [
"总之先加强一下防御。"
],
"chaining": [
"啊!这下死定了!我发动{0}!",
"太贸然了,难道你没意识到{0}的存在吗?"
]
}
\ No newline at end of file
{
"welcome": [
"早上好……啊?现在不是早上?"
],
"deckerror": [
"嘶……我醒了,{0}没了,我睡了。"
],
"duelstart": [
"我反正无所谓,你喜欢就行。",
"嘛,无所谓了。"
],
"newturn": [
"啊,是我的回合……",
"抽一张卡。"
],
"endturn": [
"睡了睡了,到我了记得叫醒我。",
"来来来,请开始你的表演。"
],
"directattack": [
"用{0}进行攻击!",
"还行,就拿{0}攻击吧。",
"尝尝这个{0}!"
],
"attack": [
"{1},挨下{0}这一拳吧!",
"胜利属于{0}!",
"{1}给我下去!"
],
"ondirectattack": [
"唔……",
"呕啊……!",
"(摆出Daisuke的姿势挡脸)"
],
"facedownmonstername": "怪兽",
"activate": [
"一花前辈用过的{0}就是好啊……",
"{0}……似乎能行。"
],
"summon": [
"啊,是没见过的孩子{0}呢。",
"{0}:糖歌这么体弱多病就别打牌了……"
],
"setmonster": [
"嗯……"
],
"chaining": [
"发动{0}的效果进行连锁。",
"在你做那件事之前我先发动{0}!",
"对3?王炸!"
]
}
\ No newline at end of file
{
"welcome": [
"这样啊……那好吧。"
],
"deckerror": [
"嗯?我的{0}呢?"
],
"duelstart": [
"考虑要不要给对面一点面子……"
],
"newturn": [
"……抽牌。",
"到我了吗?那就抽牌。",
"总之抽牌就对了。"
],
"endturn": [
"我要做的都已经完成了,下面就看你的了。",
"我已经没什么可做的了,换你来吧。",
"好了,接下来该轮到你了。"
],
"directattack": [
"{0},轮到你了。",
"{0},该你展示自己了。",
"还能站起来吗?",
"总之{0}直接一拳就对了。"
],
"attack": [
"{0},先给这个{1}一点颜色看看吧。",
"这个{1}在{0}面前实际上十分脆弱啊……",
"总之{0}先把{1}打倒就对了。",
"总之先让这个{1}消失。"
],
"ondirectattack": [
"这点小伤,不算什么。",
"只是{0}而已……",
"……我还能站起来!"
],
"facedownmonstername": "怪兽",
"activate": [
"先用这个{0}的能力看看。",
"嗯……{0}的能力应该管用。",
"总之,{0}的能力应该可以应付得了。"
],
"summon": [
"现在应该先出{0}。",
"总之把{0}拉出来就对了。",
"这种情况{0}应该能应付得过来。"
],
"setmonster": [
"先随便盖个东西看看……",
"总之先加强防御。"
],
"chaining": [
"对我的{0}没有戒心吗?",
"等一下!先让我把{0}用了!",
"在此之前先让我用了{0}再说!"
]
}
\ No newline at end of file
{
"welcome": [
"ZZZZZZZZZ……"
],
"deckerror": [
"我的{0}放哪儿了来着……"
],
"duelstart": [
"人类的本质就是抄来抄去,不爽不要玩。",
"问智秋抄来的卡组不会用,怎么办?"
],
"newturn": [
"到我了吗?那就抽牌。",
"总之抽牌就对了。"
],
"endturn": [
"这样算是正确的展开吗……",
"总觉得这波有点那啥……"
],
"directattack": [
"总之先让{0}来一击就对了。",
"然后是{0}的直接攻击!",
"丢你{0}!"
],
"attack": [
"{0},先给这个{1}一点颜色看看吧。",
"总之{0}先把{1}打倒就对了。",
"嗯……总之先让这个{1}消失。"
],
"ondirectattack": [
"咳咳……",
"我还年轻呢,这点不算啥。"
],
"facedownmonstername": "怪兽",
"activate": [
"现在应该使用{0}的效果。",
"总之把{0}的效果用了就OK了。"
],
"summon": [
"总之把{0}拉出来。",
"好像没什么可用的啊……那就{0}。",
"啊啊……{0}总之先上!"
],
"setmonster": [
"要不先随便盖个东西……?"
],
"chaining": [
"{0}一言,驷马难追!",
"中国电信新出的{0}真的太快了!",
"快人一步!"
]
}
\ No newline at end of file
{
"welcome": [
"啧,所以说不要在我看片的时候来打扰我啊!"
],
"deckerror": [
"秋叶!你是不是把我的{0}藏起来了!"
],
"duelstart": [
"快点打完,打完我好接着看电影。",
"哈啊……"
],
"newturn": [
"多罗。",
"rua!"
],
"endturn": [
"摸了,爽。",
"刚才看到哪儿了来着……"
],
"directattack": [
"{0}解除贤者模式!",
"{0}快去射对面啊!",
"不行!{0}必须现在就射对面!"
],
"attack": [
"{0}去干了那个{1}!",
"{0}我命令你,现在就射{1}!",
"不懂别瞎BB,{0}不用吃饱了也能射{1}。"
],
"ondirectattack": [
"不带这样的啊!",
"啊!!要……",
"真是的,就不能温柔点嘛。"
],
"facedownmonstername": "怪兽",
"activate": [
"用了{0}就很爽。",
"来点爽歪歪的{0}。"
],
"summon": [
"{0}进场了。",
"男主角{0}向我们走来。",
"无内鬼,来点20cm的{0}。"
],
"setmonster": [
"啧……先来个软点的好了。"
],
"chaining": [
"不够硬的家伙!还没有{0}来得硬呢!",
"气氛的最高潮!{0}!芜湖!",
"{0}起飞啦!"
]
}
\ No newline at end of file
{
"welcome": [
"又来啦?还是来找美妙子的吗?"
],
"deckerror": [
"美妙子现在不在,改天再来吧。"
],
"duelstart": [
"既然这样的话,那就先过我这关!",
"美妙子就在里面,不过你得先打赢我才能去见她。"
],
"newturn": [
"到我了吗?那就抽牌。",
"总之先抽卡。"
],
"endturn": [
"我的回合结束了。",
"轮到你了。"
],
"directattack": [
"时间还早,先拿{0}打过去。",
"运气不算太差,{0}的攻击应该能通过吧。"
],
"attack": [
"{0},攻击{1}。",
"似乎行得通,{1}没有{0}强,那就{0}攻击。"
],
"ondirectattack": [
"习惯了。",
"一般。"
],
"facedownmonstername": "怪兽",
"activate": [
"发动{0}的效果。",
"啊等下,使用{0}的效果。"
],
"summon": [
"召唤{0}。",
"总之,把{0}拉出来就对了。",
"让我召唤{0}。"
],
"setmonster": [
"没什么可做的啊……"
],
"chaining": [
"总之趁现在先把{0}用了就对了。",
"说得好,我发动{0}。",
"不知道{0}这时候能不能起作用,试试吧。"
]
}
\ No newline at end of file
{
"welcome": [
"是……是你?!"
],
"deckerror": [
"啊咧?好像{0}出了问题……"
],
"duelstart": [
"再比一局就再比一局!"
],
"newturn": [
"到我啦?那……抽牌。",
"啊啊啊啊……总之先抽牌……"
],
"endturn": [
"嗯,到你了。",
"差不多就这样了。"
],
"directattack": [
"对面什么都没有……那……{0},先打一炮吧。",
"不管那么多了{0}先打啊!"
],
"attack": [
"{0}……先A{1}一刀看看!",
"不管那么多了{0}先把那个{1}打掉啊!"
],
"ondirectattack": [
"啊咧?!",
"啊……又搞砸了……",
"啊啊啊啊啊放过我吧!"
],
"facedownmonstername": "怪兽",
"activate": [
"然后是{0}……再然后……",
"总之先用{0}看看……"
],
"summon": [
"好像没什么可用的啊……要不先出{0}?",
"啊……{0},拜托你啦!",
"啊啊……{0}总之先帮帮我!"
],
"setmonster": [
"嘛……先盖个家伙看看……"
],
"chaining": [
"啊啊啊啊我要用{0}!",
"等一下等一下先让我用{0}!",
"趁现在先把{0}用了再说!"
]
}
\ No newline at end of file
{
"welcome": [
"……嗯?请问你是……?"
],
"deckerror": [
"为什么我的{0}不能用了?"
],
"duelstart": [
"对面到底是个啥啊……",
"肚子饿了,想吃蛋糕……"
],
"newturn": [
"我的回合,抽卡。"
],
"endturn": [
"但愿能再一回合……",
"回合结束。"
],
"directattack": [
"{0},直接攻击!",
"{0},直接攻击对手!",
"这样……就可以吗?",
"这样……就可以吗?有点害怕。"
],
"attack": [
"{0},向对面的{1}试探一下看看。",
"{0},摸一下{1}看看。",
"对面的{1}长什么样子呢……?"
],
"ondirectattack": [
"啊咧?!",
"不过是{0}而已!",
"啊啊啊啊啊啊啊啊啊——"
],
"facedownmonstername": "怪兽",
"activate": [
"也许可以发动一下{0}就可以吧……",
"不知道发动一下{0}可不可以……"
],
"summon": [
"不知道{0}能活多久……",
"不知道{0}能坚持多久……",
"不知道{0}能挺住多久……"
],
"setmonster": [
"还是把这个放在这里好了。"
],
"chaining": [
"这时候发动{0}看看?",
"不知道{0}这时候能不能起作用,试试吧。"
]
}
\ No newline at end of file
{
"welcome": [
"嗯?今天又是谁来拜访?"
],
"deckerror": [
"没有{0}玩不了啊……"
],
"duelstart": [
"这可不是终点哦!",
"真正的起跑现在才要开始呢!"
],
"newturn": [
"终于到我了,那就抽卡。",
"总之先抽卡。"
],
"endturn": [
"差不多了……那就先休息一下喝杯茶吧。",
"下面轮到你了哦。"
],
"directattack": [
"总之先让{0}来一击就对了。",
"然后是……嗯,{0}的直接攻击。"
],
"attack": [
"总之先让{0}把那个{1}干掉。",
"然后是……嗯,{0}去攻打那个{1}。"
],
"ondirectattack": [
"哎呀!痛痛痛痛痛痛痛痛……",
"停一下停一下我还没准备好啊!"
],
"facedownmonstername": "怪兽",
"activate": [
"现在应该使用{0}的效果。",
"总之把{0}的效果用了就对了。"
],
"summon": [
"{0},我们走。",
"{0},来亮个相!"
],
"setmonster": [
"盖个前场。"
],
"chaining": [
"等一下!先让我把{0}用了!",
"在此之前先让我用了{0}再说!"
]
}
\ No newline at end of file
{
"welcome": [
"好吧好吧,如果你非要和我比一比,那就来吧!"
],
"deckerror": [
"嗯?我放这里那么大一个{0}呢?"
],
"duelstart": [
"真是让人伤脑筋呢。",
"冷静点……深呼吸……"
],
"newturn": [
"终于到我了,那就抽卡。",
"总之先抽卡。"
],
"endturn": [
"回合结束。",
"我的回合结束了。"
],
"directattack": [
"丢你{0}!"
],
"attack": [
"我的{0}一定比{1}厉害。"
],
"ondirectattack": [
"哎呀!痛痛痛痛痛痛痛痛……",
"停一下停一下我还没准备好啊!"
],
"facedownmonstername": "怪兽",
"activate": [
"{0}的效果在这里应该管用……",
"接下来应该使用{0}的效果……"
],
"summon": [
"{0}!",
"Come on, {0}!"
],
"setmonster": [
"盖个牌。"
],
"chaining": [
"别急,先让我把{0}发动了再说。",
"这是发动{0}的绝佳机会。"
]
}
\ No newline at end of file
{
"welcome": [
"喵?"
],
"deckerror": [
"嗯?我放这里那么大一个{0}呢?"
],
"duelstart": [
"毕竟是千夏以前的卡组,渣操是正常情况喵。"
],
"newturn": [
"总之抽牌就对了喵。"
],
"endturn": [
"这样算是正常的展开吗……"
],
"directattack": [
"总之先让{0}来一击就对了喵。",
"丢你{0}喵!"
],
"attack": [
"总之先让{0}把那个{1}干掉喵。",
"总之{0}先把{1}打倒就对了喵。"
],
"ondirectattack": [
"喵?!",
"哎呀!痛痛痛痛痛痛痛痛……"
],
"facedownmonstername": "怪兽",
"activate": [
"现在应该使用{0}的效果喵。",
"{0}的效果在这里应该管用……"
],
"summon": [
"嘛……这种情况{0}应该能应付得过来喵。",
"好像没什么可用的啊……那我出{0}喵。"
],
"setmonster": [
"总之先加强一下防御喵。",
"嘛……还是先盖个家伙喵。"
],
"chaining": [
"等一下!先让我把{0}用了喵!",
"在此之前先让我用了{0}再说喵!"
]
}
\ No newline at end of file
{
"welcome": [
"啊,刚好想找点事情做。",
"来得正好,有新出的本子吗?"
],
"deckerror": [
"啊这……谁把我{0}弄没了?"
],
"duelstart": [
"是时候该发泄一下欲望了。",
"等我几秒钟我先喝口水……"
],
"newturn": [
"到我了,抽卡。"
],
"endturn": [
"流程走完了,该摸了。",
"到你了,慢点想让我多休息会儿啊……"
],
"directattack": [
"{0},将对手砍成无籽西瓜!",
"{0}去吧,对面已经躺好了。",
"都直接给你一巴掌了你倒是假装怕一下啊!"
],
"attack": [
"{0},把{1}做成北京烤鸭!",
"{1}看起来已经躺好了,安心去吧{0}。",
"下面表演一个铁锅炖{1}。"
],
"ondirectattack": [
"啊这……",
"不就是{0}而已,也没啥……吧!",
"别弄脏我的衣服!"
],
"facedownmonstername": "怪兽",
"activate": [
"先用{0}——慢着我先看看怎么用……",
"啊……算了先打个{0}好了。"
],
"summon": [
"其实本来不想上{0}的……",
"这种情况除了{0}别无他法。",
"{0}来了!放音乐!",
"小桥流水哗啦啦,通常召唤{0}。"
],
"setmonster": [
"盖牌。",
"盖个+4——开玩笑的。"
],
"chaining": [
"啊!这情况我熟!用{0}就对了。",
"凡事总讲究先下手为强,这也不例外。",
"啧……注意下{0}啊……"
]
}
\ No newline at end of file
{
"welcome": [
"啧……你这家伙没事就不要来找我的麻烦好吗?"
],
"deckerror": [
"美羽,看到我的{0}了吗?"
],
"duelstart": [
"快点快点,弄完了我好回去吃饭。",
"注意下时间限制啊。"
],
"newturn": [
"该我了。"
],
"endturn": [
"该你了。"
],
"directattack": [
"{0}上了,要了你的命!",
"西内!"
],
"attack": [
"{0}弄死那个{1}!",
"杂鱼{1},西内!"
],
"ondirectattack": [
"呃……!",
"该死……"
],
"facedownmonstername": "怪兽",
"activate": [
"{0}简直假卡。",
"进口{0},劲贼大。"
],
"summon": [
"尝尝这个{0}!",
"可别怕了{0}啊!"
],
"setmonster": [
"(一脸问号)"
],
"chaining": [
"啊啊啊啊我要用{0}!",
"连{0}都不注意就你妈离谱。"
]
}
\ No newline at end of file
{
"welcome": [
"太慢了,不过看在今儿心情好,原谅你了。"
],
"deckerror": [
"谁把我的{0}拿走了?!"
],
"duelstart": [
"现在退出战场还来得及。",
"我是不会给你留面子的,做好觉悟吧!"
],
"newturn": [
"啊啊啊啊啊啊抽牌!",
"磨磨蹭蹭的,待会儿别再这样啊。"
],
"endturn": [
"还愣着干什么?到你啦!",
"心情好让你一下,可别太得意了。"
],
"directattack": [
"丢你{0}!",
"不堪一击!",
"不管那么多了{0}先打啊!"
],
"attack": [
"{1}给老娘爬!",
"不管那么多了{0}先打啊!",
"{1}岂是如此不便之物。"
],
"ondirectattack": [
"(非常过分的骂人的话)",
"不就是{0}嘛,算个鸟!",
"……我可没有害怕!"
],
"facedownmonstername": "怪兽",
"activate": [
"我发动{0}的效果,虽然上面没写,但就是可以这样用。",
"20SER的{0}她不香吗?"
],
"summon": [
"召唤{0},强,无敌,以下略去114514字。",
"大姐吃{0},进口{0},劲贼大。"
],
"setmonster": [
"CNM又卡手了。",
"不怕死就打过来吧!"
],
"chaining": [
"要不是有{0},我都快齁死了。",
"连{0}都不注意就你奶奶的离谱。"
]
}
\ No newline at end of file
{
"welcome": [
"吃蛋糕吗?"
],
"deckerror": [
"呃……所需的材料似乎缺了{0}。"
],
"duelstart": [
"奈绪的蛋糕课堂开始咯!",
"开心就好。"
],
"newturn": [
"到我了吗?那就抽牌。",
"总之先抽卡。"
],
"endturn": [
"先去烤个蛋糕……",
"先去做杯牛奶。"
],
"directattack": [
"丢你{0}!",
"{0},轮到你了。",
"{0},该你展示自己了。"
],
"attack": [
"{0},攻击这只{1}!",
"{0},消灭这只{1}!",
"{0},打倒{1}!"
],
"ondirectattack": [
"啊啊啊啊啊啊啊啊!",
"……我可没有害怕!",
"不过是{0}而已!"
],
"facedownmonstername": "怪兽",
"activate": [
"先用这个{0}看看。",
"嗯……{0}在这个时候应该管用。",
"总之,{0}在这种情况应该可以应付得了。"
],
"summon": [
"助手{0}来啦!",
"{0}来帮忙啦!",
"{0}也来了哦!"
],
"setmonster": [
"这小家伙似乎怕生呢。"
],
"chaining": [
"这个时候就该使出{0}!",
"没想到吧!我有{0}!我还藏了一手呢!",
"{0} YES!"
]
}
\ No newline at end of file
{
"welcome": [
"好想法,我也想试试新东西呢。"
],
"deckerror": [
"啊,忘记{0}刚进去了。"
],
"duelstart": [
"啊咧?这一脸的笑容?!难道说……?!",
"看这一脸抑郁的表情,不会刚开始就卡手了吧?"
],
"newturn": [
"终于到我了,抽卡。",
"总之抽卡。"
],
"endturn": [
"我的回合结束了。",
"回合结束。"
],
"directattack": [
"{0},上!",
"{0},上,这局赢定啦!",
"对面没怪了?好,{0},上!"
],
"attack": [
"{0},去攻击这只{1}!",
"{0},去打倒这个{1}!",
"{1},再见了。"
],
"ondirectattack": [
"有点厉害……",
"下回合你的{0}估计要没了.jpg"
],
"facedownmonstername": "怪兽",
"activate": [
"这个时候就该使用{0}的效果。",
"{0}的效果。"
],
"summon": [
"总之把{0}拉出来。",
"好像没什么可用的啊……那我出{0}。",
"啊啊{0}总之先帮帮我!"
],
"setmonster": [
"(人偶发呆中)"
],
"chaining": [
"不够快!{0}!",
"不错的战术,但我有{0}!",
"忘记了{0}了吗?"
]
}
\ No newline at end of file
{
"welcome": [
"嗯?请问有什么事情吗?"
],
"deckerror": [
"嗯?我的{0}呢?"
],
"duelstart": [
"这是了解你的最佳方式。",
"那就让我看看你的真正实力吧。"
],
"newturn": [
"……抽牌。",
"到我了吗?那就抽牌。",
"总之抽牌就对了。"
],
"endturn": [
"我要做的都已经完成了,下面就看你的了。",
"我已经没什么可做的了,换你来吧。"
],
"directattack": [
"害怕{0}了?",
"就让你看看{0}的样子吧。",
"瞧瞧你那害怕的表情……"
],
"attack": [
"{1}是不是没见识过{0}?",
"{1}是奈何不了{0}的,放弃吧。",
"总之{0}先给{1}来一刀就对了。"
],
"ondirectattack": [
"唔……",
"原来{0}是这样的……",
"不赖……"
],
"facedownmonstername": "怪兽",
"activate": [
"这里就得用{0}。",
"接下来发动{0}。"
],
"summon": [
"来吧,{0}。",
"这可是我最喜欢的卡,{0}!",
"{0},来展示你的英姿吧!"
],
"setmonster": [
"总之先加强防御。"
],
"chaining": [
"别急,先让我把{0}发动了再说。",
"此时不用{0}更待何时?",
"这是发动{0}的绝佳机会。"
]
}
\ No newline at end of file
{
"welcome": [
"啊,是你啊……"
],
"deckerror": [
"抱歉,我的卡组里的{0}似乎不知道去哪儿了。"
],
"duelstart": [
"祝你好运。"
],
"newturn": [
"我的回合,抽卡!",
"我的回合,印卡!"
],
"endturn": [
"回合结束。",
"到你了。"
],
"directattack": [
"{0}的直接攻击!",
"畏惧{0}的力量吧!",
"你已经无法阻止{0}了!"
],
"attack": [
"{0},打倒{1}!",
"Goodbye,{1}。",
"{1}还是先担心一下怎么对付{0}吧。"
],
"ondirectattack": [
"唔!",
"我可不会就此认输……"
],
"facedownmonstername": "怪兽",
"activate": [
"我发动{0}。",
"我使用{0}的效果。"
],
"summon": [
"我召唤{0}。",
"{0}的力量借我用一下。",
"{0}进入战场。"
],
"setmonster": [
"不知道怎么做,先这样吧。",
"你绝对猜不到我会放啥。"
],
"chaining": [
"太慢了,还是{0}更胜一筹。",
"看样子你忘了我的{0}!",
"小心驶得万年船,记住咯!"
]
}
\ No newline at end of file
{
"welcome": [
"又迟到了……下次注意啊。"
],
"deckerror": [
"啊,似乎忘记带{0}了……"
],
"duelstart": [
"上课咯!",
"就让我来教教你什么叫打牌。"
],
"newturn": [
"终于到我了,那就抽卡。",
"总之先抽卡。"
],
"endturn": [
"差不多了……那就先休息一下喝杯茶吧。",
"下面轮到你了哦。"
],
"directattack": [
"竟然没有任何防备?那就先让{0}打一枪。",
"总之先让{0}来一击就对了。",
"然后是……嗯,{0}的直接攻击。",
"丢你{0}!"
],
"attack": [
"总之先让{0}把那个{1}干掉。",
"{0}一定比{1}厉害",
"然后是……嗯,{0}去攻打那个{1}。"
],
"ondirectattack": [
"啊啊啊啊啊啊啊啊啊!!!",
"哎呀!痛痛痛痛痛痛痛痛……",
"停一下停一下我还没准备好啊!"
],
"facedownmonstername": "怪兽",
"activate": [
"现在应该使用{0}的效果。",
"{0}的效果在这里应该管用……",
"总之把{0}的效果用了就对了。"
],
"summon": [
"我召唤{0}。",
"出来吧,{0}!",
"出现吧,{0}!"
],
"setmonster": [
"我放置了一只怪兽。"
],
"chaining": [
"等一下!我发动{0}!",
"我连锁发动{0}!",
"没想到吧!我发动{0}!"
]
}
\ No newline at end of file
{
"welcome": [
"新主顾啊……先坐吧。"
],
"deckerror": [
"嗯……让我先去找找{0}……"
],
"duelstart": [
"好了,让我听听你的想法吧。"
],
"newturn": [
"虽然有点突然,但我听够了。",
"我的回合,抽卡。"
],
"endturn": [
"还在发呆啊?到你了!",
"换你了。"
],
"directattack": [
"{0},轮到你了。",
"{0},该你展示自己了。",
"还能站起来吗?"
],
"attack": [
"总之{0}先把那个{1}干掉。",
"我都为{1}感到悲哀了……",
"然后是……{0}去攻打那个{1}。"
],
"ondirectattack": [
"嗯?!",
"有你的……"
],
"facedownmonstername": "怪兽",
"activate": [
"现在应该使用{0}的效果。",
"{0}的效果在这里应该管用……"
],
"summon": [
"召唤{0}。",
"{0},他来了。",
"{0}{0}{0},重要的名字说三遍。"
],
"setmonster": [
"嘛……先盖个看看……"
],
"chaining": [
"留一手也是必要的,尝尝这个{0}。",
"机不可失,发动{0}。",
"这是发动{0}的最佳机会。"
]
}
\ No newline at end of file
{
"welcome": [
"哦?有何贵干?"
],
"deckerror": [
"好像是我{0}准备不对的原因啊……"
],
"duelstart": [
"天使是不会临阵脱逃的!",
"请拿出你真正的实力。"
],
"newturn": [
"到我的回合了,抽卡!",
"我的回合,抽卡!"
],
"endturn": [
"我要做的就这些了,接下来看你的了。",
"来吧,让我看看你的策略。"
],
"directattack": [
"畏惧{0}吧!",
"没有人可以逃得过{0}的手掌心。",
"可别站不稳了啊!"
],
"attack": [
"在{0}面前{1}只是待宰的羔羊。",
"{0},让{1}看看你真正的力量!",
"安息吧,{1}。"
],
"ondirectattack": [
"不赖……",
"我说过我不会就此认输!",
"不愧是{0}啊……"
],
"facedownmonstername": "怪兽",
"activate": [
"臣服在{0}的崇高力量面前!",
"总之,{0}的能力应该可以应付得了。"
],
"summon": [
"{0}降临!",
"{0}不会临阵脱逃。",
"来吧,{0},展示你自己!"
],
"setmonster": [
"准备迎接大地的力量吧。"
],
"chaining": [
"我原以为你会注意到{0},是我高估你了。",
"不错的想法,但在{0}面前还是欠缺。",
"Splash Sword!"
]
}
\ No newline at end of file
{
"welcome": [
"来来来,一起来娱乐一下啊!"
],
"deckerror": [
"没有{0}就很不娱乐。"
],
"duelstart": [
"娱乐而已,放轻松就好。"
],
"newturn": [
"接下来就是我的舞台咯。",
"该我了。"
],
"endturn": [
"OK,该你了。",
"毕竟是娱乐,这布阵应该对你来说很轻松。"
],
"directattack": [
"{0}直接攻击对手!",
"{0}冲鸭!",
"一个巴掌拍得响!"
],
"attack": [
"{0}日了那个{1}!",
"{0}去和{1}娱乐娱乐。",
"这个{1}看起来就不娱乐啊……"
],
"ondirectattack": [
"哎呀!",
"不是说好了娱乐一下就行吗?!"
],
"facedownmonstername": "怪兽",
"activate": [
"我发动{0}的效果,虽然卡图上面没写,但cdb里说了就是可以这样用。",
"所以{0}什么时候进去啊?"
],
"summon": [
"通召{0},下略。",
"{0}也快进去了吧……"
],
"setmonster": [
"日常卡手。",
"让你一把。"
],
"chaining": [
"千防万防防不住{0}。",
"简单,看我见招拆招。"
]
}
\ No newline at end of file
{
"welcome": [
"才……才不会输给你呢!"
],
"deckerror": [
"啊咧?好像{0}出了问题……"
],
"duelstart": [
"好吧……不过事先说好,不许耍赖!",
"呃……好强的气场……"
],
"newturn": [
"啊啊啊啊啊啊……抽牌!",
"到我啦?那……抽牌。"
],
"endturn": [
"差不多就这样了。",
"嘛……姑且这样吧……"
],
"directattack": [
"{0}……打过去!",
"{0}……先A一刀上去!",
"不管那么多了{0}先打啊!"
],
"attack": [
"{0}……先打这个{1}看看!",
"{0}……先A{1}一刀看看!?",
"不管那么多了……{0}先把那个{1}打掉!"
],
"ondirectattack": [
"啊咧?!",
"啊……这个{0}也没怎么可怕啦!",
"啊啊啊啊啊放过我吧!"
],
"facedownmonstername": "怪兽",
"activate": [
"接下来应该先用{0}……",
"然后是{0}……再然后呢?",
"嗯……总之先用{0}看看……"
],
"summon": [
"嘛……要不先出{0}?",
"啊……{0},拜托你啦!",
"啊啊……{0}总之先帮帮我!"
],
"setmonster": [
"要不先随便盖个东西……?"
],
"chaining": [
"等一下等一下先让我用{0}!",
"总之趁没什么防备先把{0}用了……",
"趁现在先把{0}用了再说吧……"
]
}
\ No newline at end of file
{
"welcome": [
"刚好,大赛前的特训,要不要来作陪练?"
],
"deckerror": [
"好像是我准备不足的原因啊……"
],
"duelstart": [
"就当作是正式比赛就好。",
"虽然是特训,但也要认真对待。"
],
"newturn": [
"我的回合,抽卡!"
],
"endturn": [
"我的回合结束。",
"回合结束。"
],
"directattack": [
"{0},将对手斩成两段!",
"{0},直接攻击!",
"上吧,{0}!"
],
"attack": [
"{0},将{1}斩成两段!",
"{0},把{1}斩成两半!",
"上吧,{0},把{1}斩成两半!",
"上吧,{0},把{1}斩成两段!"
],
"ondirectattack": [
"啊……是哪里出了问题……",
"……难免的……",
"不过是{0}而已!"
],
"facedownmonstername": "怪兽",
"activate": [
"我使用{0}的效果。",
"我发动{0}的效果。"
],
"summon": [
"我召唤{0}加入战斗。",
"出来吧,我的灵魂,{0}!",
"还好准备了{0}。"
],
"setmonster": [
"盖一个怪兽。"
],
"chaining": [
"这个时候就该使用{0}的效果。",
"这时候,我使用{0}的效果。",
"我连锁发动{0}的效果。"
]
}
\ No newline at end of file
{
"welcome": [
"请多多指教咯,小屁孩。"
],
"deckerror": [
"啊咧?我的{0}呢?"
],
"duelstart": [
"好了小屁孩,开始了,别偷窥那边的美少女了。"
],
"newturn": [
"到我的回合了,抽卡!",
"我的回合,抽卡。",
"我抽了一张卡。"
],
"endturn": [
"回合结束。",
"我的回合结束了。",
"但愿能再一回合……"
],
"directattack": [
"{0},直接攻击!",
"{0},直接攻击对手!",
"这样就对了!"
],
"attack": [
"{0}……先打这个{1}看看!",
"{0}……先A{1}一刀看看!?",
"不管那么多了……{0}先把那个{1}打掉!"
],
"ondirectattack": [
"啊咧?!",
"不过是{0}而已!",
"啊啊啊啊啊啊啊啊啊——"
],
"facedownmonstername": "怪兽",
"activate": [
"接下来应该先用{0}……",
"然后是{0}……再然后呢?",
"嗯……总之先用{0}看看……"
],
"summon": [
"我召唤{0}。",
"我把{0}放下来看看。",
"放下来{0}可不可以呢?"
],
"setmonster": [
"对面好厉害,我就盖一只怪兽看看……"
],
"chaining": [
"这时候我使用{0}的效果。",
"我连锁发动{0}的效果。"
]
}
{
"welcome": [
"天气好好啊,最适合摸鱼了。"
],
"deckerror": [
"我的卡组需要{0}才能玩。"
],
"duelstart": [
"那么,要上啦!",
"我可是没那么容易被打败的,做好觉悟吧!"
],
"newturn": [
"我的回合,抽卡!",
"我抽了一张卡。"
],
"endturn": [
"我的回合结束了。",
"轮到你了。"
],
"directattack": [
"{0},直接攻击!",
"{0},给我上!",
"这局赢定啦!"
],
"attack": [
"{0},打倒{1}!",
"{0},冲向那只{1}!",
"{0},把你的力量释放到{1}上!"
],
"ondirectattack": [
"啊啊啊……",
"{0}好可怕啊……"
],
"facedownmonstername": "怪兽",
"activate": [
"{0}的效果发动!"
],
"summon": [
"出来吧,{0}!",
"{0},来帮我一下。"
],
"setmonster": [
"放个过吧……"
],
"chaining": [
"等一下,我发动{0}。",
"送给你一个大惊喜。发动{0}!",
"没留意吧!我要使用{0}了!"
]
}
{
"welcome": [
"小姐不在,有事请讲。"
],
"deckerror": [
"为什么我的{0}……?"
],
"duelstart": [
"嗯?不是来找小姐是来找我的?"
],
"newturn": [
"……抽牌。",
"到我了?那就抽牌。",
"总之抽牌。"
],
"endturn": [
"我已经没什么可做的了,换你来吧。",
"……我觉得你还是请回吧。"
],
"directattack": [
"丢你{0}!",
"总之先让{0}来一击就对了。",
"总之{0}直接一拳就对了。"
],
"attack": [
"总之先让{0}把那个{1}干掉。",
"{0}快去弄死那个{1}!",
"然后是……嗯,{0}去攻打那个{1}。"
],
"ondirectattack": [
"哎呀!痛痛痛痛痛痛痛痛……",
"……我可没有害怕!",
"停一下停一下停一下停一下!"
],
"facedownmonstername": "怪兽",
"activate": [
"现在应该用{0}的效果。",
"{0}的效果在这里应该管用……",
"总之先用{0}的效果。"
],
"summon": [
"是个人都知道要出{0}。",
"总之先把{0}拉出来。",
"好像没什么可用的啊……那就出{0}。"
],
"setmonster": [
"总之先盖一个。"
],
"chaining": [
"居然对{0}一点防备都没有……",
"等一下!先让{0}亮个相!",
"在此之前先让我把{0}用了!"
]
}
\ No newline at end of file
{
"welcome": [
"我们开始吧。"
],
"deckerror": [
"为什么我的{0}不能用了?"
],
"duelstart": [
"你打不过我的。",
"你还是趁早放弃吧。"
],
"newturn": [
"到我的回合了,抽卡!",
"我的回合,抽卡!"
],
"endturn": [
"点到为止。",
"回合结束。"
],
"directattack": [
"{0},直接攻击对手!",
"上吧,{0}!",
"怎么样!"
],
"attack": [
"{0},给我打倒{1}!",
"{0},打倒{1}!",
"{0},冲向那只{1}!"
],
"ondirectattack": [
"这么可怕的吗……",
"我不会输的!",
"这次让你一回。"
],
"facedownmonstername": "怪兽",
"activate": [
"发动{0}。",
"使用{0}。"
],
"summon": [
"出来吧,{0}!",
"出来吧,我的灵魂,{0}!",
"出来吧,我的分身,{0}!"
],
"setmonster": [
"我放置了一只怪兽。"
],
"chaining": [
"等一下!我发动{0}!",
"我连锁发动{0}!",
"没想到吧!我发动{0}!"
]
}
{
"welcome": [
"CDD-144启动,工作正常。"
],
"deckerror": [
"警报,警报,未检测到{0},程序正在关闭。"
],
"duelstart": [
"打牌模式启动完成。"
],
"newturn": [
"正在补牌。"
],
"endturn": [
"回合程序运行完成。"
],
"directattack": [
"启动指令:{0}直接攻击。",
"直接攻击请求已发出,正在等待{0}回复。",
"直接攻击程序启动。"
],
"attack": [
"启动指令:{0}攻击{1}。",
"攻击{1}请求已发出,正在等待{0}回复。",
"攻击程序启动。"
],
"ondirectattack": [
"警报,系统遭到攻击,等待启动修复程序。",
"检测到来自{0}的直接攻击,正在收集数据。",
"机身遭到损毁,正在执行修复程序。"
],
"facedownmonstername": "怪兽",
"activate": [
"启动指令:发动{0}的效果。",
"发动效果请求已发出,正在等待{0}回复。"
],
"summon": [
"启动指令:召唤{0}。",
"召唤请求已发出,正在等待{0}回复。",
"召唤程序启动。"
],
"setmonster": [
"启动指令:盖放TNT。"
],
"chaining": [
"启动指令:连锁发动{0}的效果。",
"连锁发动效果请求已发出,正在等待{0}回复。",
"连锁发动效果程序启动。"
]
}
{
"welcome": [
"找我?你确定你没找错人?"
],
"deckerror": [
"嗯?我把{0}放哪儿去了来着……"
],
"duelstart": [
"呀呀呀……该干活了。",
"我对自己还是很有自信的。"
],
"newturn": [
"抽卡!",
"先抽一张卡。"
],
"endturn": [
"回合结束。",
"我的回合结束了。"
],
"directattack": [
"{0},享受盛宴吧!",
"还忍耐的了吗~?"
],
"attack": [
"{0},享受盛宴吧!",
"还忍耐的了吗~?"
],
"ondirectattack": [
"啊……啊……",
"区区{0}而已!",
"这样就能打倒我?才怪!"
],
"facedownmonstername": "怪兽",
"activate": [
"我发动{0}。",
"我使用{0}的效果。",
"我使用{0}的力量。"
],
"summon": [
"我召唤了强大的{0}!",
"我呼唤{0}参加战斗!",
"我呼唤出{0}。"
],
"setmonster": [
"我里侧表示放置了一只怪兽。"
],
"chaining": [
"看这里!我发动{0}!",
"我不认同。{0},发动!",
"看样子你忘了我的{0}!"
]
}
\ No newline at end of file
{
"welcome": [
"啊,是新的挑战者呢。"
],
"deckerror": [
"好像是我准备不足的原因啊……"
],
"duelstart": [
"堂堂正正决一胜负!",
"我是不会让你的,你也不要放水哦!"
],
"newturn": [
"到我的回合了,抽卡!",
"我的回合,抽卡!"
],
"endturn": [
"这样算是成功的展开吗……",
"总觉得这波有点亏……"
],
"directattack": [
"上吧,{0}!",
"Are You Ready?",
"怎么样,还喘得过气吗?"
],
"attack": [
"{0},攻击这只{1}!",
"{0},消灭这只{1}!",
"{0},打倒{1}!"
],
"ondirectattack": [
"啊啊啊啊啊啊啊啊!",
"……我可没有害怕!",
"不过是{0}而已!"
],
"facedownmonstername": "怪兽",
"activate": [
"现在应该使用{0}的效果。",
"总之把{0}的效果用了就对了。"
],
"summon": [
"现在应该先出这个,{0}。",
"好像没什么可用的啊……那我出{0}。"
],
"setmonster": [
"总之先加强一下防御。",
"不怕死就打过来吧!"
],
"chaining": [
"畏惧我的{0}吧!",
"等一下!先让我把{0}用了!",
"在此之前先让我用了{0}再说!"
]
}
\ No newline at end of file
{
"welcome": [
"哈啊……谁啊这个点来找我……"
],
"deckerror": [
"我的卡组里{0}没了,我溜了。"
],
"duelstart": [
"对面看上去好像刚从情侣酒店出来的样子……",
"虽然这里的草有一米多高,不过也无所谓。"
],
"newturn": [
"Power Recover!",
"魔力恢复!"
],
"endturn": [
"容我先去拿点吃的……",
"醒醒,该你了。"
],
"directattack": [
"{0},安心去吧!",
"去去去去去去{0}别挡路!",
"Star Lock Explosion!"
],
"attack": [
"我觉得可以让{0}踢{1}一脚。",
"{0}去吃了那个{1}!",
"反正{1}该爬了。"
],
"ondirectattack": [
"啊啊……",
"嘶……{0}到底是个啥啊……",
"早知道平常该练习疗伤术的……"
],
"facedownmonstername": "怪兽",
"activate": [
"{0}是解决问题的方法之一。",
"{0}的效果发动!"
],
"summon": [
"你看这{0},白白净净的。",
"啊……{0},来帮我一下。"
],
"setmonster": [
"啧……",
"关键时刻卡手……"
],
"chaining": [
"来点{0}不好吗?",
"到底是有多不小心才会忘了{0}……",
"Nova Bombs!"
]
}
\ No newline at end of file
{
"welcome": [
"今天是摸鱼的好日子啊~"
],
"deckerror": [
"嗯?{0}库存不够了?"
],
"duelstart": [
"你准备好挨揍了吗?",
"只要上班摸鱼不被店长发现就算成功……"
],
"newturn": [
"啊……该我了吗……",
"手坑来一张好吗?秋梨膏!"
],
"endturn": [
"鸽了,爽。",
"来来来,有本事你全拆完了我看看。"
],
"directattack": [
"限时特惠!{0}不要钱白送!",
"体验下{0}的特别服务吧!",
"啊咧?站不稳了?"
],
"attack": [
"{0},把这个{1}灭了!",
"不堪一击的{1}!",
"经验告诉我们有{0}就没{1}。"
],
"ondirectattack": [
"草!!!!!!",
"我就不信你今天能把我秒了?!",
"我都能没倒!!"
],
"facedownmonstername": "怪兽",
"activate": [
"无内鬼,来点{0}。",
"接住这个{0}!"
],
"summon": [
"砰的一声响,{0}闪亮登场!",
"{0}进货咯!",
"新到货的{0}哦!"
],
"setmonster": [
"盖一张纸币。"
],
"chaining": [
"{0}降价啦!",
"盖亚!!!!!!!!!!!",
"像你这种情况如果不用{0}我会有多伤心……"
]
}
\ No newline at end of file
{
"welcome": [
"啊,来的这么早啊,刚好我也没事情做。"
],
"deckerror": [
"啊,我先去找找看{0}……"
],
"duelstart": [
"最近学了很多新的网络用语呢。",
"检验网络用语学习成果的时候到了。"
],
"newturn": [
"洗牌,码牌,抓牌,看牌。",
"duang~"
],
"endturn": [
"意思意思得了。",
"点到即止。"
],
"directattack": [
"小小{0},很少烦恼~",
"肥料掺了金坷垃,{0}攻击力一万八。",
"圣诞老人{0}到啦!"
],
"attack": [
"{0}速速去和{1}击剑!",
"{0}去和{1}贴贴!",
"{0}和{1}别打架,金坷垃好处都有啥,谁说对了就给他。"
],
"ondirectattack": [
"来偷袭我一个弱女子,这好吗?这不好!!!!",
"我劝这个{0}好自为之!",
"这个{0}不讲武德!"
],
"facedownmonstername": "怪兽",
"activate": [
"{0}!",
"我就是死也不会用{0}!哎呀真香~"
],
"summon": [
"关关雎鸠,在河之洲,窈窕{0},君子好逑。",
"有{0}自远方来,不亦乐乎?",
"{0}大爆诞!"
],
"setmonster": [
"挖个坑埋个地雷~"
],
"chaining": [
"小心{0}驶得万年船!",
"就这点程度?连{0}都不如。",
"秘技:{0}!"
]
}
\ No newline at end of file
{
"welcome": [
"……",
"诶?!"
],
"deckerror": [
"……{0}……忘带了……"
],
"duelstart": [
"……"
],
"newturn": [
"……"
],
"endturn": [
"……"
],
"directattack": [
"{0}……"
],
"attack": [
"{0}……{1}……"
],
"ondirectattack": [
"……"
],
"facedownmonstername": "怪兽",
"activate": [
"……{0}……"
],
"summon": [
"……{0}。"
],
"setmonster": [
"……"
],
"chaining": [
"……{0}!"
]
}
\ No newline at end of file
{
"welcome": [
"比起这个我更好奇你是怎么跑到海底的……"
],
"deckerror": [
"哎呦我去……我什么时候把{0}忘在了岸上来着……"
],
"duelstart": [
"要不要先放点音乐?",
"你别因为海底的环境先憋不住就行。"
],
"newturn": [
"啊……到我了吗……",
"吃口鱼再抽个牌~"
],
"endturn": [
"我歇了,你来吧。",
"我先憋不住了我去个洗手间……"
],
"directattack": [
"希望你没先被{0}弄死。",
"{0}浮游炮!",
"喂,你裤子好像湿了。"
],
"attack": [
"{0}先1}打了。",
"{0}一拳一个{1}。",
"事实证明{1}在{0}前面还是蛮弱的。"
],
"ondirectattack": [
"哇啊!!",
"这{0}……该死……",
"还好,不疼。"
],
"facedownmonstername": "怪兽",
"activate": [
"发动{0}的效果。",
"新买的{0}看看需不需要退。"
],
"summon": [
"只是给你看一眼{0}而已。",
"经验告诉我们人类的实力应该以{0}为准。",
"什么叫小东西,我们有名字!我们叫{0}!"
],
"setmonster": [
"无话可说。"
],
"chaining": [
"{0}来咯~",
"大哥吃{0}。",
"和!{0},1番110符3600点!"
]
}
\ No newline at end of file
{
"welcome": [
"所为何事,速速道来。"
],
"deckerror": [
"啊,{0}又用不出来了。"
],
"duelstart": [
"我是不会手下留情的,请拿出你最佳的状态和实力。"
],
"newturn": [
"……抽牌。",
"到我了吗?那就抽牌。"
],
"endturn": [
"我要做的都已经完成了,下面就看你的了。",
"我已经没什么可做的了,换你来吧。"
],
"directattack": [
"还能站起来吗?",
"不知道能挨得住{0}这一下吗?",
"总之{0}直接一拳就对了。"
],
"attack": [
"{0},先给这个{1}一点颜色看看吧。",
"这个{1}在{0}面前实际上十分脆弱啊……",
"嗯……总之先让这个{1}消失。"
],
"ondirectattack": [
"这点小伤,不算什么。",
"只是{0}而已,还不足以置我于死地。",
"……我还能站起来!"
],
"facedownmonstername": "怪兽",
"activate": [
"先用这个{0}的能力看看。",
"嗯……{0}的能力应该管用。",
"总之,{0}的能力应该可以应付得了。"
],
"summon": [
"嗯……现在应该先出这个,{0}。",
"嘛……这种情况{0}应该能应付得过来。",
"{0}也许会迟到,但绝不会缺席。"
],
"setmonster": [
"先随便盖个东西看看……",
"总之先加强防御。"
],
"chaining": [
"别急,先让我把{0}发动了再说。",
"对{0}这么毫无防备的吗?",
"这是发动{0}的绝佳机会。"
]
}
\ No newline at end of file
{
"welcome": [
"欢迎来到我的演唱会!"
],
"deckerror": [
"嗯?后台的{0}没准备好吗?"
],
"duelstart": [
"三倍ice cream!!!",
"都为我加油哦!"
],
"newturn": [
"到我了吗?那就抽牌。",
"总之先抽卡。"
],
"endturn": [
"总觉得这波有点亏……",
"嘛……姑且这样吧……"
],
"directattack": [
"丢你{0}!",
"It's Show Time!",
"不管那么多了{0}先打!"
],
"attack": [
"总之先让{0}把那个{1}干掉。",
"不管那么多了{0}先打!",
"不管那么多了{0}先把那个{1}打掉!"
],
"ondirectattack": [
"不就是{0}嘛,没什么大不了!",
"我可是不会认输的!"
],
"facedownmonstername": "怪兽",
"activate": [
"我发动{0}。",
"我使用{0}的效果。",
"我的{0}是最强的!"
],
"summon": [
"总之把{0}拉出来。",
"好像没什么可用的啊……那我出{0}。",
"啊啊……{0}总之先帮帮我!"
],
"setmonster": [
"要不先随便盖个东西……?"
],
"chaining": [
"别急,先让我把{0}发动了再说。",
"在此之前先让我用了{0}再说!",
"这是发动{0}的绝佳机会。"
]
}
\ No newline at end of file
...@@ -11,7 +11,9 @@ namespace WindBot.Game.AI ...@@ -11,7 +11,9 @@ namespace WindBot.Game.AI
/// </summary> /// </summary>
public static bool IsMonsterInvincible(this ClientCard card) public static bool IsMonsterInvincible(this ClientCard card)
{ {
return !card.IsDisabled() && Enum.IsDefined(typeof(InvincibleMonster), card.Id); return !card.IsDisabled() &&
(card.Controller == 0 && Enum.IsDefined(typeof(InvincibleBotMonster), card.Id) ||
card.Controller == 1 && Enum.IsDefined(typeof(InvincibleEnemyMonster), card.Id));
} }
/// <summary> /// <summary>
......
...@@ -2742,8 +2742,6 @@ namespace WindBot.Game.AI.Decks ...@@ -2742,8 +2742,6 @@ namespace WindBot.Game.AI.Decks
public override IList<ClientCard> OnSelectCard(IList<ClientCard> cards, int min, int max, int hint, bool cancelable) public override IList<ClientCard> OnSelectCard(IList<ClientCard> cards, int min, int max, int hint, bool cancelable)
{ {
int HIINT_TOGRAVE = 504;
if (max == 1 && cards[0].Location == CardLocation.Deck if (max == 1 && cards[0].Location == CardLocation.Deck
&& Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(23002292) && Bot.GetRemainingCount(CardId.WakingtheDragon,1) > 0) && Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(23002292) && Bot.GetRemainingCount(CardId.WakingtheDragon,1) > 0)
{ {
...@@ -2764,7 +2762,7 @@ namespace WindBot.Game.AI.Decks ...@@ -2764,7 +2762,7 @@ namespace WindBot.Game.AI.Decks
Logger.DebugWriteLine("EvenlyMatched: min=" + min.ToString() + ", max=" + max.ToString()); Logger.DebugWriteLine("EvenlyMatched: min=" + min.ToString() + ", max=" + max.ToString());
} }
else if (cards[0].Location == CardLocation.Hand && cards[cards.Count - 1].Location == CardLocation.Hand else if (cards[0].Location == CardLocation.Hand && cards[cards.Count - 1].Location == CardLocation.Hand
&& (hint == 501 || hint == HIINT_TOGRAVE) && min == max) && (hint == HintMsg.Discard || hint == HintMsg.ToGrave) && min == max)
{ {
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.OneForOne)) return null; if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.OneForOne)) return null;
Logger.DebugWriteLine("Hand drop except OneForOne"); Logger.DebugWriteLine("Hand drop except OneForOne");
......
...@@ -20,7 +20,7 @@ namespace WindBot.Game.AI.Decks ...@@ -20,7 +20,7 @@ namespace WindBot.Game.AI.Decks
{ {
AddExecutor(ExecutorType.SpSummon); AddExecutor(ExecutorType.SpSummon);
AddExecutor(ExecutorType.Activate, DefaultDontChainMyself); AddExecutor(ExecutorType.Activate, DefaultDontChainMyself);
AddExecutor(ExecutorType.SummonOrSet); AddExecutor(ExecutorType.SummonOrSet, DefaultMonsterSummon);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.SpellSet); AddExecutor(ExecutorType.SpellSet);
} }
......
using YGOSharp.OCGWrapper;
using YGOSharp.OCGWrapper.Enums;
using System.Collections.Generic;
using WindBot;
using WindBot.Game;
using WindBot.Game.AI;
using System.Linq;
namespace WindBot.Game.AI.Decks
{
[Deck("FamiliarPossessed", "AI_FamiliarPossessed")]
public class FamiliarPossessedExecutor : DefaultExecutor
{
public class CardId
{
public const int MetalSnake = 71197066;
public const int InspectBoarder = 15397015;
public const int AshBlossomAndJoyousSpring = 14558127;
public const int GrenMajuDaEizo = 36584821;
public const int MaxxC = 23434538;
public const int Aussa = 31887906;
public const int Eria = 68881650;
public const int Wynn = 31764354;
public const int Hiita = 4376659;
public const int Lyna = 40542825;
public const int Awakening = 62256492;
public const int Unpossessed = 25704359;
public const int NaturalExterio = 99916754;
public const int NaturalBeast = 33198837;
public const int SwordsmanLV7 = 37267041;
public const int RoyalDecreel = 51452091;
public const int HarpieFeatherDuster = 18144506;
public const int PotOfDesires = 35261759;
public const int PotofExtravagance = 49238328;
public const int Scapegoat = 73915051;
public const int MacroCosmos = 30241314;
public const int Crackdown = 36975314;
public const int ImperialOrder = 61740673;
public const int SolemnWarning = 84749824;
public const int SolemStrike = 40605147;
public const int SolemnJudgment = 41420027;
public const int SkillDrain = 82732705;
public const int Mistake = 59305593;
public const int BorreloadDragon = 31833038;
public const int BirrelswordDragon = 85289965;
public const int KnightmareGryphon = 65330383;
public const int KnightmareUnicorn = 38342335;
public const int KnightmarePhoenix = 2857636;
public const int KnightmareCerberus = 75452921;
public const int LinkSpider = 98978921;
public const int Linkuriboh = 41999284;
public const int GagagaCowboy = 12014404;
public const int AussaP = 97661969;
public const int EriaP = 73309655;
public const int WynnP = 30674956;
public const int HiitaP = 48815792;
public const int LynaP = 9839945;
// side
public const int Raigeki = 12580477;
public const int lightningStorm = 14532163;
public const int CosmicCyclone = 8267140;
public const int CalledByTheGrave = 24224830;
public const int CrossoutDesignator = 65681983;
public const int InfiniteImpermanence = 10045474;
}
public FamiliarPossessedExecutor(GameAI ai, Duel duel)
: base(ai, duel)
{
// do first
AddExecutor(ExecutorType.Activate, CardId.PotofExtravagance, PotofExtravaganceActivate);
// burn if enemy's LP is below 800
AddExecutor(ExecutorType.SpSummon, CardId.GagagaCowboy, GagagaCowboySummon);
AddExecutor(ExecutorType.Activate, CardId.GagagaCowboy);
//Sticker
AddExecutor(ExecutorType.Activate, CardId.MacroCosmos, MacroCosmoseff);
//counter
AddExecutor(ExecutorType.Activate, CardId.CalledByTheGrave, DefaultCalledByTheGrave);
// AddExecutor(ExecutorType.Activate, CardId.CrossoutDesignator, DefaultCalledByTheGrave);
AddExecutor(ExecutorType.Activate, CardId.InfiniteImpermanence, DefaultInfiniteImpermanence);
AddExecutor(ExecutorType.Activate, CardId.AshBlossomAndJoyousSpring, DefaultAshBlossomAndJoyousSpring);
AddExecutor(ExecutorType.Activate, CardId.MaxxC, DefaultMaxxC);
AddExecutor(ExecutorType.Activate, CardId.SolemnWarning, DefaultSolemnWarning);
AddExecutor(ExecutorType.Activate, CardId.SolemStrike, DefaultSolemnStrike);
AddExecutor(ExecutorType.Activate, CardId.ImperialOrder, ImperialOrderfirst);
AddExecutor(ExecutorType.Activate, CardId.ImperialOrder, ImperialOrdereff);
AddExecutor(ExecutorType.Activate, CardId.SolemnJudgment, DefaultSolemnJudgment);
AddExecutor(ExecutorType.Activate, CardId.SkillDrain, SkillDrainEffect);
AddExecutor(ExecutorType.Activate, CardId.Mistake, DefaultUniqueTrap);
AddExecutor(ExecutorType.Activate, CardId.Awakening);
AddExecutor(ExecutorType.Activate, CardId.Unpossessed, UnpossessedEffect);
//first do
AddExecutor(ExecutorType.Activate, CardId.lightningStorm, DefaultLightingStorm);
AddExecutor(ExecutorType.Activate, CardId.HarpieFeatherDuster, DefaultHarpiesFeatherDusterFirst);
AddExecutor(ExecutorType.Activate, CardId.CosmicCyclone, DefaultMysticalSpaceTyphoon);
AddExecutor(ExecutorType.Activate, CardId.Raigeki, DefaultRaigeki);
AddExecutor(ExecutorType.Activate, CardId.PotOfDesires, PotOfDesireseff);
//sp
AddExecutor(ExecutorType.Activate, CardId.Linkuriboh, Linkuriboheff);
AddExecutor(ExecutorType.SpSummon, CardId.Linkuriboh, Linkuribohsp);
AddExecutor(ExecutorType.SpSummon, CardId.KnightmareCerberus, Knightmaresp);
AddExecutor(ExecutorType.SpSummon, CardId.KnightmarePhoenix, Knightmaresp);
AddExecutor(ExecutorType.SpSummon, CardId.AussaP, AussaPsp);
AddExecutor(ExecutorType.Activate, CardId.AussaP, AussaPeff);
AddExecutor(ExecutorType.SpSummon, CardId.EriaP, EriaPsp);
AddExecutor(ExecutorType.Activate, CardId.EriaP, EriaPeff);
AddExecutor(ExecutorType.SpSummon, CardId.WynnP, WynnPsp);
AddExecutor(ExecutorType.Activate, CardId.WynnP, WynnPeff);
AddExecutor(ExecutorType.SpSummon, CardId.HiitaP, HiitaPsp);
AddExecutor(ExecutorType.Activate, CardId.HiitaP, HiitaPeff);
AddExecutor(ExecutorType.SpSummon, CardId.LynaP, LynaPsp);
AddExecutor(ExecutorType.Activate, CardId.LynaP, LynaPeff);
AddExecutor(ExecutorType.SpSummon, CardId.Linkuriboh, Linkuribohsp);
AddExecutor(ExecutorType.SpSummon, CardId.LinkSpider);
AddExecutor(ExecutorType.SpSummon, CardId.BorreloadDragon, BorreloadDragonsp);
AddExecutor(ExecutorType.Activate, CardId.BorreloadDragon, BorreloadDragoneff);
AddExecutor(ExecutorType.SpSummon, CardId.BirrelswordDragon, BirrelswordDragonsp);
AddExecutor(ExecutorType.Activate, CardId.BirrelswordDragon, BirrelswordDragoneff);
// normal summon
AddExecutor(ExecutorType.Summon, CardId.InspectBoarder, InspectBoardersummon);
AddExecutor(ExecutorType.Summon, CardId.GrenMajuDaEizo, GrenMajuDaEizosummon);
AddExecutor(ExecutorType.SpSummon, CardId.BorreloadDragon, BorreloadDragonspsecond);
AddExecutor(ExecutorType.Summon, CardId.Aussa, FamiliarPossessedsummon);
AddExecutor(ExecutorType.Summon, CardId.Eria, FamiliarPossessedsummon);
AddExecutor(ExecutorType.Summon, CardId.Wynn, FamiliarPossessedsummon);
AddExecutor(ExecutorType.Summon, CardId.Hiita, FamiliarPossessedsummon);
AddExecutor(ExecutorType.Summon, CardId.Lyna, FamiliarPossessedsummon);
AddExecutor(ExecutorType.Activate, CardId.MetalSnake, MetalSnakesp);
AddExecutor(ExecutorType.Activate, CardId.MetalSnake, MetalSnakeeff);
//spell
AddExecutor(ExecutorType.Activate, CardId.Crackdown, Crackdowneff);
AddExecutor(ExecutorType.Activate, CardId.Scapegoat, DefaultScapegoat);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
//set
AddExecutor(ExecutorType.SpellSet, SpellSet);
}
public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false, List<int> avoid_list = null)
{
List<int> list = new List<int> { 0, 1, 2, 3, 4 };
int n = list.Count;
while (n-- > 1)
{
int index = Program.Rand.Next(n + 1);
int temp = list[index];
list[index] = list[n];
list[n] = temp;
}
foreach (int seq in list)
{
int zone = (int)System.Math.Pow(2, seq);
if (Bot.SpellZone[seq] == null)
{
if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence) continue;
if (avoid_list != null && avoid_list.Contains(seq)) continue;
AI.SelectPlace(zone);
return;
};
}
AI.SelectPlace(0);
}
public bool SpellNegatable(bool isCounter = false, ClientCard target = null)
{
// target default set
if (target == null) target = Card;
// won't negate if not on field
if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false;
// negate judge
if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true;
if (target.IsSpell())
{
if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true;
if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true;
if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true;
}
if (target.IsTrap())
{
if (Enemy.HasInSpellZone(CardId.RoyalDecreel, true) || Bot.HasInSpellZone(CardId.RoyalDecreel, true)) return true;
}
// how to get here?
return false;
}
private bool MacroCosmoseff()
{
return (Duel.LastChainPlayer == 1 || Duel.LastSummonPlayer == 1 || Duel.Player == 0) && UniqueFaceupSpell();
}
private bool ImperialOrderfirst()
{
if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.PotOfDesires))
return false;
return DefaultOnBecomeTarget() && Util.GetLastChainCard().HasType(CardType.Spell);
}
private bool ImperialOrdereff()
{
if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.PotOfDesires))
return false;
if (Duel.LastChainPlayer == 1)
{
foreach (ClientCard check in Enemy.GetSpells())
{
if (Util.GetLastChainCard() == check)
return true;
}
}
return false;
}
private bool PotOfDesireseff()
{
return Bot.Deck.Count > 14 && !DefaultSpellWillBeNegated();
}
// activate of PotofExtravagance
public bool PotofExtravaganceActivate()
{
// won't activate if it'll be negate
if (SpellNegatable()) return false;
SelectSTPlace(Card, true);
AI.SelectOption(1);
return true;
}
private bool Crackdowneff()
{
if (Util.GetOneEnemyBetterThanMyBest(true, true) != null && Bot.UnderAttack)
AI.SelectCard(Util.GetOneEnemyBetterThanMyBest(true, true));
return Util.GetOneEnemyBetterThanMyBest(true, true) != null && Bot.UnderAttack;
}
private bool SkillDrainEffect()
{
return (Bot.LifePoints > 1000) && DefaultUniqueTrap();
}
private bool UnpossessedEffect()
{
AI.SelectCard(new List<int>() {
CardId.Lyna,
CardId.Hiita,
CardId.Wynn,
CardId.Eria,
CardId.Aussa
});
return true;
}
private bool InspectBoardersummon()
{
if (Bot.MonsterZone[0] == null)
AI.SelectPlace(Zones.z0);
else
AI.SelectPlace(Zones.z4);
return true;
}
private bool GrenMajuDaEizosummon()
{
if (Duel.Turn == 1) return false;
if (Bot.HasInSpellZone(CardId.SkillDrain) || Enemy.HasInSpellZone(CardId.SkillDrain)) return false;
if (Bot.MonsterZone[0] == null)
AI.SelectPlace(Zones.z0);
else
AI.SelectPlace(Zones.z4);
return Bot.Banished.Count >= 6;
}
private bool FamiliarPossessedsummon()
{
if (Bot.MonsterZone[0] == null)
AI.SelectPlace(Zones.z0);
else
AI.SelectPlace(Zones.z4);
return true;
}
private bool BorreloadDragonsp()
{
if (!(Bot.HasInMonstersZone(new[] { CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP }))) return false;
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.IsCode(CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LinkSpider, CardId.Linkuriboh))
material_list.Add(monster);
if (material_list.Count == 3) break;
}
if (material_list.Count >= 3)
{
AI.SelectMaterials(material_list);
return true;
}
return false;
}
private bool BorreloadDragonspsecond()
{
if (!(Bot.HasInMonstersZone(new[] { CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP }))) return false;
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.IsCode(CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LinkSpider, CardId.Linkuriboh))
material_list.Add(monster);
if (material_list.Count == 3) break;
}
if (material_list.Count >= 3)
{
AI.SelectMaterials(material_list);
return true;
}
return false;
}
public bool BorreloadDragoneff()
{
if (ActivateDescription == -1 && (Duel.Phase == DuelPhase.BattleStart || Duel.Phase == DuelPhase.End))
{
ClientCard enemy_monster = Enemy.BattlingMonster;
if (enemy_monster != null && enemy_monster.HasPosition(CardPosition.Attack))
{
return (Card.Attack - enemy_monster.Attack < Enemy.LifePoints);
}
return true;
};
ClientCard BestEnemy = Util.GetBestEnemyMonster(true);
ClientCard WorstBot = Bot.GetMonsters().GetLowestAttackMonster();
if (BestEnemy == null || BestEnemy.HasPosition(CardPosition.FaceDown)) return false;
if (WorstBot == null || WorstBot.HasPosition(CardPosition.FaceDown)) return false;
if (BestEnemy.Attack >= WorstBot.RealPower)
{
AI.SelectCard(BestEnemy);
return true;
}
return false;
}
private bool BirrelswordDragonsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard m in Bot.GetMonsters())
{
if (m.IsCode(CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP))
{
material_list.Add(m);
break;
}
}
foreach (ClientCard m in Bot.GetMonsters())
{
if (m.IsCode(CardId.Linkuriboh) || m.Level == 1)
{
material_list.Add(m);
if (material_list.Count == 3)
break;
}
}
if (material_list.Count == 3)
{
AI.SelectMaterials(material_list);
return true;
}
return false;
}
private bool BirrelswordDragoneff()
{
if (ActivateDescription == Util.GetStringId(CardId.BirrelswordDragon, 0))
{
if (Util.IsChainTarget(Card) && Util.GetBestEnemyMonster(true, true) != null)
{
AI.SelectCard(Util.GetBestEnemyMonster(true, true));
return true;
}
if (Duel.Player == 1 && Bot.BattlingMonster == Card)
{
AI.SelectCard(Enemy.BattlingMonster);
return true;
}
if (Duel.Player == 1 && Bot.BattlingMonster != null &&
(Enemy.BattlingMonster.Attack - Bot.BattlingMonster.Attack) >= Bot.LifePoints)
{
AI.SelectCard(Enemy.BattlingMonster);
return true;
}
if (Duel.Player == 0 && Duel.Phase == DuelPhase.BattleStart)
{
foreach (ClientCard check in Enemy.GetMonsters())
{
if (check.IsAttack())
{
AI.SelectCard(check);
return true;
}
}
}
return false;
}
return true;
}
private bool MetalSnakesp()
{
if (ActivateDescription == Util.GetStringId(CardId.MetalSnake, 0) && !Bot.HasInMonstersZone(CardId.MetalSnake))
{
if (Duel.Player == 1 && Duel.Phase >= DuelPhase.BattleStart)
return Bot.Deck.Count >= 12;
if (Duel.Player == 0 && Duel.Phase >= DuelPhase.Main1)
return Bot.Deck.Count >= 12;
}
return false;
}
private bool MetalSnakeeff()
{
ClientCard target = Util.GetOneEnemyBetterThanMyBest(true, true);
if (ActivateDescription == Util.GetStringId(CardId.MetalSnake, 1) && target != null)
{
AI.SelectCard(new[]
{
CardId.LynaP,
CardId.HiitaP,
CardId.WynnP,
CardId.EriaP,
CardId.KnightmareGryphon
});
AI.SelectNextCard(target);
return true;
}
return false;
}
private bool AussaPsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.HasAttribute(CardAttribute.Earth) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
material_list.Add(monster);
if (material_list.Count == 2) break;
}
if (material_list.Count < 2) return false;
if (Bot.HasInMonstersZone(CardId.AussaP)) return false;
AI.SelectMaterials(material_list);
if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5);
else
AI.SelectPlace(Zones.z6);
return true;
}
private bool AussaPeff()
{
AI.SelectCard(CardId.MaxxC, CardId.Aussa);
return true;
}
private bool EriaPsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.HasAttribute(CardAttribute.Water) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
material_list.Add(monster);
if (material_list.Count == 2) break;
}
if (material_list.Count < 2) return false;
if (Bot.HasInMonstersZone(CardId.EriaP)) return false;
AI.SelectMaterials(material_list);
if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5);
else
AI.SelectPlace(Zones.z6);
return true;
}
private bool EriaPeff()
{
AI.SelectCard(CardId.Eria);
return true;
}
private bool WynnPsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.HasAttribute(CardAttribute.Wind) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
material_list.Add(monster);
if (material_list.Count == 2) break;
}
if (material_list.Count < 2) return false;
if (Bot.HasInMonstersZone(CardId.WynnP)) return false;
AI.SelectMaterials(material_list);
if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5);
else
AI.SelectPlace(Zones.z6);
return true;
}
private bool WynnPeff()
{
AI.SelectCard(CardId.Wynn);
return true;
}
private bool HiitaPsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.HasAttribute(CardAttribute.Fire) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
material_list.Add(monster);
if (material_list.Count == 2) break;
}
if (material_list.Count < 2) return false;
if (Bot.HasInMonstersZone(CardId.HiitaP)) return false;
AI.SelectMaterials(material_list);
if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5);
else
AI.SelectPlace(Zones.z6);
return true;
}
private bool HiitaPeff()
{
AI.SelectCard(CardId.Hiita);
return true;
}
private bool LynaPsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.HasAttribute(CardAttribute.Light) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
material_list.Add(monster);
if (material_list.Count == 2) break;
}
if (material_list.Count < 2) return false;
if (Bot.HasInMonstersZone(CardId.LynaP)) return false;
AI.SelectMaterials(material_list);
if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5);
else
AI.SelectPlace(Zones.z6);
return true;
}
private bool LynaPeff()
{
AI.SelectCard(CardId.Lyna);
return true;
}
private bool Linkuribohsp()
{
foreach (ClientCard c in Bot.GetMonsters())
{
if (c.Level == 1)
{
AI.SelectMaterials(c);
return true;
}
}
return false;
}
private bool Knightmaresp()
{
int[] firstMats = new[] {
CardId.KnightmareCerberus,
CardId.KnightmarePhoenix
};
if (Bot.MonsterZone.GetMatchingCardsCount(card => card.IsCode(firstMats)) >= 1) return false;
foreach (ClientCard c in Bot.GetMonsters())
{
if (c.Level == 1)
{
AI.SelectMaterials(c);
return true;
}
}
return false;
}
private bool Linkuriboheff()
{
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false;
return true;
}
private bool GagagaCowboySummon()
{
if (Enemy.LifePoints <= 800 || (Bot.GetMonsterCount() >= 4 && Enemy.LifePoints <= 1600))
{
AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
}
return false;
}
private bool SpellSet()
{
if (Card.IsCode(CardId.MacroCosmos) && Bot.HasInSpellZone(CardId.MacroCosmos)) return false;
if (Card.IsCode(CardId.Unpossessed) && Bot.HasInSpellZone(CardId.Unpossessed)) return false;
if (Card.IsCode(CardId.Crackdown) && Bot.HasInSpellZone(CardId.Crackdown)) return false;
if (Card.IsCode(CardId.SkillDrain) && Bot.HasInSpellZone(CardId.SkillDrain)) return false;
if (Card.IsCode(CardId.Mistake) && Bot.HasInSpellZone(CardId.Mistake)) return false;
if (Card.IsCode(CardId.Scapegoat))
return true;
if (Card.HasType(CardType.Trap))
return Bot.GetSpellCountWithoutField() < 4;
return false;
}
public override ClientCard OnSelectAttacker(IList<ClientCard> attackers, IList<ClientCard> defenders)
{
for (int i = 0; i < attackers.Count; ++i)
{
ClientCard attacker = attackers[i];
if (attacker.IsCode(CardId.BirrelswordDragon, CardId.BorreloadDragon)) return attacker;
}
return null;
}
public override bool OnSelectHand()
{
return true;
}
}
}
...@@ -83,18 +83,10 @@ namespace WindBot.Game.AI.Decks ...@@ -83,18 +83,10 @@ namespace WindBot.Game.AI.Decks
private int m_swapFrogSummoned; private int m_swapFrogSummoned;
private int m_flipFlopFrogSummoned; private int m_flipFlopFrogSummoned;
private int m_treebornFrogCount = 0;
public override void OnNewTurn()
{
m_treebornFrogCount = 0;
base.OnNewTurn();
}
private bool TreebornFrog() private bool TreebornFrog()
{ {
m_treebornFrogCount++; return true;
return m_treebornFrogCount <= 5;
} }
private bool SwapFrogSummon() private bool SwapFrogSummon()
......
...@@ -56,7 +56,7 @@ namespace WindBot.Game.AI.Decks ...@@ -56,7 +56,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, CardId.MonsterReborn, MonsterReborn); AddExecutor(ExecutorType.Activate, CardId.MonsterReborn, MonsterReborn);
AddExecutor(ExecutorType.Summon, CardId.WhiteNightDragon, WhiteNightDragon); AddExecutor(ExecutorType.Summon, CardId.WhiteNightDragon, WhiteNightDragon);
AddExecutor(ExecutorType.Summon, CardId.HorusTheBlackFlameDragonLv6, DefaultTributeSummon); AddExecutor(ExecutorType.Summon, CardId.HorusTheBlackFlameDragonLv6, DefaultMonsterSummon);
AddExecutor(ExecutorType.Summon, CardId.AlexandriteDragon); AddExecutor(ExecutorType.Summon, CardId.AlexandriteDragon);
AddExecutor(ExecutorType.SummonOrSet, CardId.AxeDragonute); AddExecutor(ExecutorType.SummonOrSet, CardId.AxeDragonute);
AddExecutor(ExecutorType.SummonOrSet, CardId.DodgerDragon); AddExecutor(ExecutorType.SummonOrSet, CardId.DodgerDragon);
...@@ -157,7 +157,7 @@ namespace WindBot.Game.AI.Decks ...@@ -157,7 +157,7 @@ namespace WindBot.Game.AI.Decks
if (card.IsCode(11224103)) if (card.IsCode(11224103))
return false; return false;
return DefaultTributeSummon(); return DefaultMonsterSummon();
} }
private bool HorusTheBlackFlameDragonLv8() private bool HorusTheBlackFlameDragonLv8()
......
...@@ -184,7 +184,6 @@ namespace WindBot.Game.AI.Decks ...@@ -184,7 +184,6 @@ namespace WindBot.Game.AI.Decks
private bool JetSynchronUsed = false; private bool JetSynchronUsed = false;
private bool ScrapWyvernUsed = false; private bool ScrapWyvernUsed = false;
private bool MaskedChameleonUsed = false; private bool MaskedChameleonUsed = false;
private int ShootingRiserDragonCount = 0;
private int[] HandCosts = new[] private int[] HandCosts = new[]
{ {
...@@ -218,7 +217,6 @@ namespace WindBot.Game.AI.Decks ...@@ -218,7 +217,6 @@ namespace WindBot.Game.AI.Decks
JetSynchronUsed = false; JetSynchronUsed = false;
ScrapWyvernUsed = false; ScrapWyvernUsed = false;
MaskedChameleonUsed = false; MaskedChameleonUsed = false;
ShootingRiserDragonCount = 0;
} }
public override void OnChainEnd() public override void OnChainEnd()
...@@ -845,9 +843,8 @@ namespace WindBot.Game.AI.Decks ...@@ -845,9 +843,8 @@ namespace WindBot.Game.AI.Decks
} }
else else
{ {
if (Duel.LastChainPlayer == 0 || ShootingRiserDragonCount >= 10) if (Duel.LastChainPlayer == 0)
return false; return false;
ShootingRiserDragonCount++;
AI.SelectCard(new[] { AI.SelectCard(new[] {
CardId.BlackRoseMoonlightDragon, CardId.BlackRoseMoonlightDragon,
CardId.ScrapDragon, CardId.ScrapDragon,
......
using YGOSharp.OCGWrapper.Enums; using YGOSharp.OCGWrapper.Enums;
using System.Collections.Generic; using System.Collections.Generic;
using WindBot; using WindBot;
using WindBot.Game; using WindBot.Game;
using WindBot.Game.AI; using WindBot.Game.AI;
namespace WindBot.Game.AI.Decks namespace WindBot.Game.AI.Decks
{ {
[Deck("LightswornShaddoldinosour", "AI_LightswornShaddoldinosour")] [Deck("LightswornShaddoldinosour", "AI_LightswornShaddoldinosour")]
public class LightswornShaddoldinosour : DefaultExecutor public class LightswornShaddoldinosour : DefaultExecutor
{ {
public class CardId public class CardId
{ {
//monster //monster
public const int UltimateConductorTytanno = 18940556; public const int UltimateConductorTytanno = 18940556;
public const int DogorantheMadFlameKaiju = 93332803; public const int DogorantheMadFlameKaiju = 93332803;
public const int GamecieltheSeaTurtleKaiju = 55063751; public const int GamecieltheSeaTurtleKaiju = 55063751;
public const int RadiantheMultidimensionalKaiju = 28674152; public const int RadiantheMultidimensionalKaiju = 28674152;
public const int OvertexCoatls = 41782653; public const int OvertexCoatls = 41782653;
public const int ShaddollBeast = 3717252; public const int ShaddollBeast = 3717252;
public const int GiantRex = 80280944; public const int GiantRex = 80280944;
public const int ShaddollDragon = 77723643; public const int ShaddollDragon = 77723643;
public const int FairyTailSnow = 55623480; public const int FairyTailSnow = 55623480;
public const int KeeperOfDragonicMagic = 48048590; public const int KeeperOfDragonicMagic = 48048590;
public const int ShaddollSquamata = 30328508; public const int ShaddollSquamata = 30328508;
public const int SouleatingOviraptor = 44335251; public const int SouleatingOviraptor = 44335251;
public const int Raiden = 77558536; public const int Raiden = 77558536;
public const int Lumina = 95503687; public const int Lumina = 95503687;
public const int ShaddollHedgehog = 4939890; public const int ShaddollHedgehog = 4939890;
public const int AshBlossom = 14558127; public const int AshBlossom = 14558127;
public const int GhostOgre = 59438930; public const int GhostOgre = 59438930;
public const int ShaddollFalco = 37445295; public const int ShaddollFalco = 37445295;
public const int MaxxC = 23434538; public const int MaxxC = 23434538;
public const int PlaguespreaderZombie = 33420078; public const int PlaguespreaderZombie = 33420078;
public const int GlowUpBulb = 67441435; public const int GlowUpBulb = 67441435;
//spell //spell
public const int AllureofDarkness = 1475311; public const int AllureofDarkness = 1475311;
public const int ThatGrassLooksgreener = 11110587; public const int ThatGrassLooksgreener = 11110587;
public const int HarpiesFeatherDuster = 18144506; public const int HarpiesFeatherDuster = 18144506;
public const int DoubleEvolutionPill = 38179121; public const int DoubleEvolutionPill = 38179121;
public const int ShaddollFusion = 44394295; public const int ShaddollFusion = 44394295;
public const int PotOfAvarice = 67169062; public const int PotOfAvarice = 67169062;
public const int FoolishBurial = 81439173; public const int FoolishBurial = 81439173;
public const int MonsterReborn = 83764718; public const int MonsterReborn = 83764718;
public const int ChargeOfTheLightBrigade = 94886282; public const int ChargeOfTheLightBrigade = 94886282;
public const int InterruptedKaijuSlumber = 99330325; public const int InterruptedKaijuSlumber = 99330325;
//public const int ElShaddollFusion = 6417578; //public const int ElShaddollFusion = 6417578;
//trap //trap
public const int infiniteTransience = 10045474; public const int infiniteTransience = 10045474;
public const int LostWind = 74003290; public const int LostWind = 74003290;
public const int SinisterShadowGames = 77505534; public const int SinisterShadowGames = 77505534;
public const int ShaddollCore = 4904633; public const int ShaddollCore = 4904633;
//extra //extra
public const int ElShaddollShekhinaga = 74822425; public const int ElShaddollShekhinaga = 74822425;
public const int ElShaddollConstruct = 20366274; public const int ElShaddollConstruct = 20366274;
public const int ElShaddollGrysra = 48424886; public const int ElShaddollGrysra = 48424886;
public const int ElShaddollWinda = 94977269; public const int ElShaddollWinda = 94977269;
public const int CrystalWingSynchroDragon = 50954680; public const int CrystalWingSynchroDragon = 50954680;
public const int ScarlightRedDragon = 80666118; public const int ScarlightRedDragon = 80666118;
public const int Michael = 4779823; public const int Michael = 4779823;
public const int BlackRoseMoonlightDragon = 33698022; public const int BlackRoseMoonlightDragon = 33698022;
public const int RedWyvern = 76547525; public const int RedWyvern = 76547525;
public const int CoralDragon = 42566602; public const int CoralDragon = 42566602;
public const int TG_WonderMagician = 98558751; public const int TG_WonderMagician = 98558751;
public const int MinervaTheExalte = 30100551; public const int MinervaTheExalte = 30100551;
public const int Sdulldeat = 74997493; public const int Sdulldeat = 74997493;
public const int CrystronNeedlefiber = 50588353; public const int CrystronNeedlefiber = 50588353;
} }
public LightswornShaddoldinosour(GameAI ai, Duel duel) public LightswornShaddoldinosour(GameAI ai, Duel duel)
: base(ai, duel) : base(ai, duel)
{ {
//counter //counter
AddExecutor(ExecutorType.Activate, CardId.GhostOgre, Hand_act_eff); AddExecutor(ExecutorType.Activate, CardId.GhostOgre, Hand_act_eff);
AddExecutor(ExecutorType.Activate, CardId.AshBlossom, Hand_act_eff); AddExecutor(ExecutorType.Activate, CardId.AshBlossom, Hand_act_eff);
AddExecutor(ExecutorType.Activate, CardId.MaxxC,MaxxC); AddExecutor(ExecutorType.Activate, CardId.MaxxC,MaxxC);
//first do //first do
AddExecutor(ExecutorType.Activate, CardId.HarpiesFeatherDuster, DefaultHarpiesFeatherDusterFirst); AddExecutor(ExecutorType.Activate, CardId.HarpiesFeatherDuster, DefaultHarpiesFeatherDusterFirst);
AddExecutor(ExecutorType.Activate, CardId.infiniteTransience, DefaultBreakthroughSkill); AddExecutor(ExecutorType.Activate, CardId.infiniteTransience, DefaultBreakthroughSkill);
AddExecutor(ExecutorType.Activate, CardId.ThatGrassLooksgreener); AddExecutor(ExecutorType.Activate, CardId.ThatGrassLooksgreener);
AddExecutor(ExecutorType.Summon, CardId.SouleatingOviraptor); AddExecutor(ExecutorType.Summon, CardId.SouleatingOviraptor);
AddExecutor(ExecutorType.Activate, CardId.SouleatingOviraptor, SouleatingOviraptoreff); AddExecutor(ExecutorType.Activate, CardId.SouleatingOviraptor, SouleatingOviraptoreff);
AddExecutor(ExecutorType.Activate, CardId.AllureofDarkness, DefaultAllureofDarkness); AddExecutor(ExecutorType.Activate, CardId.AllureofDarkness, DefaultAllureofDarkness);
AddExecutor(ExecutorType.Activate, CardId.PotOfAvarice, PotofAvariceeff); AddExecutor(ExecutorType.Activate, CardId.PotOfAvarice, PotofAvariceeff);
AddExecutor(ExecutorType.Activate, CardId.ChargeOfTheLightBrigade, ChargeOfTheLightBrigadeEffect); AddExecutor(ExecutorType.Activate, CardId.ChargeOfTheLightBrigade, ChargeOfTheLightBrigadeEffect);
AddExecutor(ExecutorType.Activate, CardId.FoolishBurial, FoolishBurialEffect); AddExecutor(ExecutorType.Activate, CardId.FoolishBurial, FoolishBurialEffect);
AddExecutor(ExecutorType.Activate, CardId.InterruptedKaijuSlumber, InterruptedKaijuSlumbereff); AddExecutor(ExecutorType.Activate, CardId.InterruptedKaijuSlumber, InterruptedKaijuSlumbereff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollFusion, ShaddollFusioneff); AddExecutor(ExecutorType.Activate, CardId.ShaddollFusion, ShaddollFusioneff);
//Normal Summon //Normal Summon
AddExecutor(ExecutorType.Summon, CardId.Raiden); AddExecutor(ExecutorType.Summon, CardId.Raiden);
AddExecutor(ExecutorType.Activate, CardId.Raiden); AddExecutor(ExecutorType.Activate, CardId.Raiden);
AddExecutor(ExecutorType.Summon , CardId.KeeperOfDragonicMagic); AddExecutor(ExecutorType.Summon , CardId.KeeperOfDragonicMagic);
AddExecutor(ExecutorType.Activate, CardId.KeeperOfDragonicMagic, KeeperOfDragonicMagiceff); AddExecutor(ExecutorType.Activate, CardId.KeeperOfDragonicMagic, KeeperOfDragonicMagiceff);
AddExecutor(ExecutorType.MonsterSet, CardId.ShaddollSquamata); AddExecutor(ExecutorType.MonsterSet, CardId.ShaddollSquamata);
AddExecutor(ExecutorType.MonsterSet, CardId.GlowUpBulb); AddExecutor(ExecutorType.MonsterSet, CardId.GlowUpBulb);
AddExecutor(ExecutorType.Summon, CardId.Lumina, Luminasummon); AddExecutor(ExecutorType.Summon, CardId.Lumina, Luminasummon);
AddExecutor(ExecutorType.MonsterSet, CardId.ShaddollHedgehog); AddExecutor(ExecutorType.MonsterSet, CardId.ShaddollHedgehog);
AddExecutor(ExecutorType.MonsterSet, CardId.ShaddollDragon); AddExecutor(ExecutorType.MonsterSet, CardId.ShaddollDragon);
AddExecutor(ExecutorType.Summon, CardId.FairyTailSnow,FairyTailSnowsummon); AddExecutor(ExecutorType.Summon, CardId.FairyTailSnow,FairyTailSnowsummon);
AddExecutor(ExecutorType.Activate, CardId.FairyTailSnow, FairyTailSnoweff); AddExecutor(ExecutorType.Activate, CardId.FairyTailSnow, FairyTailSnoweff);
AddExecutor(ExecutorType.Activate, CardId.Lumina, Luminaeff); AddExecutor(ExecutorType.Activate, CardId.Lumina, Luminaeff);
//activate //activate
AddExecutor(ExecutorType.Activate, CardId.GlowUpBulb, GlowUpBulbeff); AddExecutor(ExecutorType.Activate, CardId.GlowUpBulb, GlowUpBulbeff);
AddExecutor(ExecutorType.Activate, CardId.TG_WonderMagician, TG_WonderMagicianeff); AddExecutor(ExecutorType.Activate, CardId.TG_WonderMagician, TG_WonderMagicianeff);
AddExecutor(ExecutorType.Activate, CardId.CoralDragon, CoralDragoneff); AddExecutor(ExecutorType.Activate, CardId.CoralDragon, CoralDragoneff);
AddExecutor(ExecutorType.Activate, CardId.RedWyvern, RedWyverneff); AddExecutor(ExecutorType.Activate, CardId.RedWyvern, RedWyverneff);
AddExecutor(ExecutorType.Activate, CardId.CrystalWingSynchroDragon, CrystalWingSynchroDragoneff); AddExecutor(ExecutorType.Activate, CardId.CrystalWingSynchroDragon, CrystalWingSynchroDragoneff);
AddExecutor(ExecutorType.Activate, CardId.BlackRoseMoonlightDragon, BlackRoseMoonlightDragoneff); AddExecutor(ExecutorType.Activate, CardId.BlackRoseMoonlightDragon, BlackRoseMoonlightDragoneff);
AddExecutor(ExecutorType.Activate, CardId.Sdulldeat, Sdulldeateff); AddExecutor(ExecutorType.Activate, CardId.Sdulldeat, Sdulldeateff);
AddExecutor(ExecutorType.Activate, CardId.Michael, Michaeleff); AddExecutor(ExecutorType.Activate, CardId.Michael, Michaeleff);
AddExecutor(ExecutorType.Activate, CardId.ScarlightRedDragon, ScarlightRedDragoneff); AddExecutor(ExecutorType.Activate, CardId.ScarlightRedDragon, ScarlightRedDragoneff);
//Sp Summon //Sp Summon
AddExecutor(ExecutorType.Activate, CardId.CrystronNeedlefiber, CrystronNeedlefibereff); AddExecutor(ExecutorType.Activate, CardId.CrystronNeedlefiber, CrystronNeedlefibereff);
AddExecutor(ExecutorType.SpSummon, CardId.UltimateConductorTytanno, UltimateConductorTytannosp); AddExecutor(ExecutorType.SpSummon, CardId.UltimateConductorTytanno, UltimateConductorTytannosp);
AddExecutor(ExecutorType.Activate, CardId.UltimateConductorTytanno, UltimateConductorTytannoeff); AddExecutor(ExecutorType.Activate, CardId.UltimateConductorTytanno, UltimateConductorTytannoeff);
AddExecutor(ExecutorType.Activate, CardId.DoubleEvolutionPill, DoubleEvolutionPilleff); AddExecutor(ExecutorType.Activate, CardId.DoubleEvolutionPill, DoubleEvolutionPilleff);
//extra //extra
AddExecutor(ExecutorType.SpSummon, CardId.CrystalWingSynchroDragon); AddExecutor(ExecutorType.SpSummon, CardId.CrystalWingSynchroDragon);
AddExecutor(ExecutorType.Activate, CardId.CrystalWingSynchroDragon, CrystalWingSynchroDragoneff); AddExecutor(ExecutorType.Activate, CardId.CrystalWingSynchroDragon, CrystalWingSynchroDragoneff);
AddExecutor(ExecutorType.SpSummon, CardId.ScarlightRedDragon, ScarlightRedDragonsp); AddExecutor(ExecutorType.SpSummon, CardId.ScarlightRedDragon, ScarlightRedDragonsp);
AddExecutor(ExecutorType.Activate, CardId.ScarlightRedDragon, ScarlightRedDragoneff); AddExecutor(ExecutorType.Activate, CardId.ScarlightRedDragon, ScarlightRedDragoneff);
AddExecutor(ExecutorType.SpSummon, CardId.Michael, Michaelsp); AddExecutor(ExecutorType.SpSummon, CardId.Michael, Michaelsp);
AddExecutor(ExecutorType.Activate, CardId.Michael, Michaeleff); AddExecutor(ExecutorType.Activate, CardId.Michael, Michaeleff);
AddExecutor(ExecutorType.SpSummon, CardId.RedWyvern, RedWyvernsp); AddExecutor(ExecutorType.SpSummon, CardId.RedWyvern, RedWyvernsp);
AddExecutor(ExecutorType.Activate, CardId.RedWyvern, RedWyverneff); AddExecutor(ExecutorType.Activate, CardId.RedWyvern, RedWyverneff);
AddExecutor(ExecutorType.SpSummon, CardId.MinervaTheExalte); AddExecutor(ExecutorType.SpSummon, CardId.MinervaTheExalte);
AddExecutor(ExecutorType.Activate, CardId.MinervaTheExalte, MinervaTheExaltedEffect); AddExecutor(ExecutorType.Activate, CardId.MinervaTheExalte, MinervaTheExaltedEffect);
AddExecutor(ExecutorType.SpSummon, CardId.CrystronNeedlefiber, CrystronNeedlefibersp); AddExecutor(ExecutorType.SpSummon, CardId.CrystronNeedlefiber, CrystronNeedlefibersp);
//Kaiju //Kaiju
AddExecutor(ExecutorType.SpSummon, CardId.GamecieltheSeaTurtleKaiju, GamecieltheSeaTurtleKaijusp); AddExecutor(ExecutorType.SpSummon, CardId.GamecieltheSeaTurtleKaiju, GamecieltheSeaTurtleKaijusp);
AddExecutor(ExecutorType.SpSummon, CardId.RadiantheMultidimensionalKaiju, RadiantheMultidimensionalKaijusp); AddExecutor(ExecutorType.SpSummon, CardId.RadiantheMultidimensionalKaiju, RadiantheMultidimensionalKaijusp);
AddExecutor(ExecutorType.SpSummon, CardId.DogorantheMadFlameKaiju, DogorantheMadFlameKaijusp); AddExecutor(ExecutorType.SpSummon, CardId.DogorantheMadFlameKaiju, DogorantheMadFlameKaijusp);
//Reborn //Reborn
AddExecutor(ExecutorType.Activate, CardId.MonsterReborn, Reborneff); AddExecutor(ExecutorType.Activate, CardId.MonsterReborn, Reborneff);
//activate chain //activate chain
AddExecutor(ExecutorType.Activate, CardId.OvertexCoatls, OvertexCoatlseff); AddExecutor(ExecutorType.Activate, CardId.OvertexCoatls, OvertexCoatlseff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollCore, ShaddollCoreeff); AddExecutor(ExecutorType.Activate, CardId.ShaddollCore, ShaddollCoreeff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollBeast, ShaddollBeasteff); AddExecutor(ExecutorType.Activate, CardId.ShaddollBeast, ShaddollBeasteff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollFalco, ShaddollFalcoeff); AddExecutor(ExecutorType.Activate, CardId.ShaddollFalco, ShaddollFalcoeff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollDragon, ShaddollDragoneff); AddExecutor(ExecutorType.Activate, CardId.ShaddollDragon, ShaddollDragoneff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollHedgehog, ShaddollHedgehogeff); AddExecutor(ExecutorType.Activate, CardId.ShaddollHedgehog, ShaddollHedgehogeff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollSquamata, ShaddollSquamataeff); AddExecutor(ExecutorType.Activate, CardId.ShaddollSquamata, ShaddollSquamataeff);
AddExecutor(ExecutorType.Activate, CardId.GiantRex); AddExecutor(ExecutorType.Activate, CardId.GiantRex);
AddExecutor(ExecutorType.Activate, CardId.ElShaddollConstruct, ElShaddollConstructeff); AddExecutor(ExecutorType.Activate, CardId.ElShaddollConstruct, ElShaddollConstructeff);
AddExecutor(ExecutorType.Activate, CardId.ElShaddollGrysra, ElShaddollGrysraeff); AddExecutor(ExecutorType.Activate, CardId.ElShaddollGrysra, ElShaddollGrysraeff);
AddExecutor(ExecutorType.Activate, CardId.ElShaddollShekhinaga, ElShaddollShekhinagaeff); AddExecutor(ExecutorType.Activate, CardId.ElShaddollShekhinaga, ElShaddollShekhinagaeff);
AddExecutor(ExecutorType.Activate, CardId.ElShaddollWinda); AddExecutor(ExecutorType.Activate, CardId.ElShaddollWinda);
//spellset //spellset
AddExecutor(ExecutorType.SpellSet, CardId.ThatGrassLooksgreener, SpellSetZone); AddExecutor(ExecutorType.SpellSet, CardId.ThatGrassLooksgreener, SpellSetZone);
AddExecutor(ExecutorType.SpellSet, SpellSetZone); AddExecutor(ExecutorType.SpellSet, SpellSetZone);
//trapset //trapset
AddExecutor(ExecutorType.SpellSet, CardId.LostWind); AddExecutor(ExecutorType.SpellSet, CardId.LostWind);
AddExecutor(ExecutorType.SpellSet, CardId.SinisterShadowGames); AddExecutor(ExecutorType.SpellSet, CardId.SinisterShadowGames);
AddExecutor(ExecutorType.SpellSet, CardId.ShaddollCore); AddExecutor(ExecutorType.SpellSet, CardId.ShaddollCore);
AddExecutor(ExecutorType.SpellSet, CardId.infiniteTransience, SetIsFieldEmpty); AddExecutor(ExecutorType.SpellSet, CardId.infiniteTransience, SetIsFieldEmpty);
//trap activate //trap activate
AddExecutor(ExecutorType.Activate, CardId.LostWind, LostWindeff); AddExecutor(ExecutorType.Activate, CardId.LostWind, LostWindeff);
AddExecutor(ExecutorType.Activate, CardId.SinisterShadowGames, SinisterShadowGameseff); AddExecutor(ExecutorType.Activate, CardId.SinisterShadowGames, SinisterShadowGameseff);
AddExecutor(ExecutorType.Repos, MonsterRepos); AddExecutor(ExecutorType.Repos, MonsterRepos);
} }
public int[] all_List() public int[] all_List()
{ {
return new[] return new[]
{ {
CardId.UltimateConductorTytanno, CardId.UltimateConductorTytanno,
CardId.DogorantheMadFlameKaiju, CardId.DogorantheMadFlameKaiju,
CardId.GamecieltheSeaTurtleKaiju, CardId.GamecieltheSeaTurtleKaiju,
CardId.RadiantheMultidimensionalKaiju, CardId.RadiantheMultidimensionalKaiju,
CardId.OvertexCoatls, CardId.OvertexCoatls,
CardId.ShaddollBeast, CardId.ShaddollBeast,
CardId.GiantRex, CardId.GiantRex,
CardId.ShaddollDragon, CardId.ShaddollDragon,
CardId.FairyTailSnow, CardId.FairyTailSnow,
CardId.KeeperOfDragonicMagic, CardId.KeeperOfDragonicMagic,
CardId.ShaddollSquamata, CardId.ShaddollSquamata,
CardId.SouleatingOviraptor, CardId.SouleatingOviraptor,
CardId.Raiden, CardId.Raiden,
CardId.Lumina, CardId.Lumina,
CardId.ShaddollHedgehog, CardId.ShaddollHedgehog,
CardId.AshBlossom, CardId.AshBlossom,
CardId.GhostOgre, CardId.GhostOgre,
CardId.ShaddollFalco, CardId.ShaddollFalco,
CardId.MaxxC, CardId.MaxxC,
CardId.PlaguespreaderZombie, CardId.PlaguespreaderZombie,
CardId.GlowUpBulb, CardId.GlowUpBulb,
CardId.AllureofDarkness, CardId.AllureofDarkness,
CardId.ThatGrassLooksgreener, CardId.ThatGrassLooksgreener,
CardId.HarpiesFeatherDuster, CardId.HarpiesFeatherDuster,
CardId.DoubleEvolutionPill, CardId.DoubleEvolutionPill,
CardId.ShaddollFusion, CardId.ShaddollFusion,
CardId.PotOfAvarice, CardId.PotOfAvarice,
CardId.FoolishBurial, CardId.FoolishBurial,
CardId.MonsterReborn, CardId.MonsterReborn,
CardId.ChargeOfTheLightBrigade, CardId.ChargeOfTheLightBrigade,
CardId.InterruptedKaijuSlumber, CardId.InterruptedKaijuSlumber,
//CardId.ElShaddollFusion, //CardId.ElShaddollFusion,
CardId.infiniteTransience, CardId.infiniteTransience,
CardId.LostWind, CardId.LostWind,
CardId.SinisterShadowGames, CardId.SinisterShadowGames,
CardId.ShaddollCore, CardId.ShaddollCore,
}; };
} }
public int[] Useless_List() public int[] Useless_List()
{ {
return new[] return new[]
{ {
CardId.GlowUpBulb, CardId.GlowUpBulb,
CardId.PlaguespreaderZombie, CardId.PlaguespreaderZombie,
CardId.ChargeOfTheLightBrigade, CardId.ChargeOfTheLightBrigade,
CardId.ThatGrassLooksgreener, CardId.ThatGrassLooksgreener,
CardId.HarpiesFeatherDuster, CardId.HarpiesFeatherDuster,
CardId.FairyTailSnow, CardId.FairyTailSnow,
CardId.GiantRex, CardId.GiantRex,
CardId.Lumina, CardId.Lumina,
CardId.OvertexCoatls, CardId.OvertexCoatls,
CardId.InterruptedKaijuSlumber, CardId.InterruptedKaijuSlumber,
CardId.FoolishBurial, CardId.FoolishBurial,
}; };
} }
int Ultimate_ss = 0; int Ultimate_ss = 0;
int Enemy_atk = 0; int Enemy_atk = 0;
int TG_WonderMagician_count = 0; bool Pillused = false;
bool Pillused = false; bool CrystronNeedlefibereff_used = false;
bool CrystronNeedlefibereff_used = false; bool OvertexCoatlseff_used = false;
bool OvertexCoatlseff_used = false; bool ShaddollBeast_used = false;
bool ShaddollBeast_used = false; bool ShaddollFalco_used = false;
bool ShaddollFalco_used = false; bool ShaddollSquamata_used = false;
bool ShaddollSquamata_used = false; bool ShaddollDragon_used = false;
bool ShaddollDragon_used = false; bool ShaddollHedgehog_used = false;
bool ShaddollHedgehog_used = false;
public int GetTotalATK(IList<ClientCard> list)
public int GetTotalATK(IList<ClientCard> list) {
{
int atk = 0;
int atk = 0; foreach (ClientCard c in list)
foreach (ClientCard c in list) {
{ if (c == null) continue;
if (c == null) continue; atk += c.Attack;
atk += c.Attack; }
} return atk;
return atk; }
}
public override void OnNewPhase()
public override void OnNewPhase() {
{ Enemy_atk = 0;
Enemy_atk = 0; IList<ClientCard> list = new List<ClientCard>();
IList<ClientCard> list = new List<ClientCard>(); foreach (ClientCard monster in Enemy.GetMonsters())
foreach (ClientCard monster in Enemy.GetMonsters()) {
{ if(monster.IsAttack())
if(monster.IsAttack()) list.Add(monster);
list.Add(monster); }
} //if (GetTotalATK(list) / 2 >= Bot.LifePoints) return false;
//if (GetTotalATK(list) / 2 >= Bot.LifePoints) return false; Enemy_atk = GetTotalATK(list);
Enemy_atk = GetTotalATK(list); //SLogger.DebugWriteLine("++++++++++++++++++" + Enemy_atk + "++++++++++++");
//SLogger.DebugWriteLine("++++++++++++++++++" + Enemy_atk + "++++++++++++"); }
} public override void OnNewTurn()
public override void OnNewTurn() {
{ Pillused = false;
Pillused = false; OvertexCoatlseff_used = false;
OvertexCoatlseff_used = false; CrystronNeedlefibereff_used = false;
CrystronNeedlefibereff_used = false; ShaddollBeast_used = false;
ShaddollBeast_used = false; ShaddollFalco_used = false;
ShaddollFalco_used = false; ShaddollSquamata_used = false;
ShaddollSquamata_used = false; ShaddollDragon_used = false;
ShaddollDragon_used = false; ShaddollHedgehog_used = false;
ShaddollHedgehog_used = false; }
TG_WonderMagician_count = 0;
} private bool Luminasummon()
{
private bool Luminasummon() if (Bot.Deck.Count >= 20) return true;
{ IList<ClientCard> extra = Bot.GetMonstersInExtraZone();
if (Bot.Deck.Count >= 20) return true; if (extra != null)
IList<ClientCard> extra = Bot.GetMonstersInExtraZone(); foreach (ClientCard monster in extra)
if (extra != null) if (!monster.HasType(CardType.Link))
foreach (ClientCard monster in extra) return false;
if (!monster.HasType(CardType.Link)) if (Bot.LifePoints <= 3000) return true;
return false; if (Bot.HasInGraveyard(CardId.Raiden)) return true;
if (Bot.LifePoints <= 3000) return true; return false;
if (Bot.HasInGraveyard(CardId.Raiden)) return true; }
return false; private bool Luminaeff()
} {
private bool Luminaeff() if (Bot.HasInGraveyard(CardId.Raiden))
{ {
if (Bot.HasInGraveyard(CardId.Raiden)) AI.SelectCard(Useless_List());
{ AI.SelectNextCard(CardId.Raiden);
AI.SelectCard(Useless_List()); return true;
AI.SelectNextCard(CardId.Raiden); }
return true; return false;
} }
return false;
}
private bool UltimateConductorTytannoeff()
{
private bool UltimateConductorTytannoeff() IList<int> targets = new[] {
{ CardId.OvertexCoatls,
IList<int> targets = new[] { CardId.ShaddollBeast,
CardId.OvertexCoatls, CardId.ShaddollSquamata,
CardId.ShaddollBeast, CardId.ShaddollHedgehog,
CardId.ShaddollSquamata, CardId.ShaddollDragon,
CardId.ShaddollHedgehog, CardId.ShaddollFalco,
CardId.ShaddollDragon, CardId.GlowUpBulb,
CardId.ShaddollFalco, CardId.PlaguespreaderZombie,
CardId.GlowUpBulb, CardId.FairyTailSnow,
CardId.PlaguespreaderZombie, CardId.KeeperOfDragonicMagic,
CardId.FairyTailSnow, CardId.DogorantheMadFlameKaiju,
CardId.KeeperOfDragonicMagic, CardId.GamecieltheSeaTurtleKaiju,
CardId.DogorantheMadFlameKaiju, CardId.RadiantheMultidimensionalKaiju,
CardId.GamecieltheSeaTurtleKaiju, CardId.GiantRex,
CardId.RadiantheMultidimensionalKaiju, CardId.ShaddollCore,
CardId.GiantRex, CardId.SouleatingOviraptor,
CardId.ShaddollCore, CardId.Raiden,
CardId.SouleatingOviraptor, CardId.Lumina,
CardId.Raiden, CardId.AshBlossom,
CardId.Lumina, CardId.GhostOgre,
CardId.AshBlossom, CardId.MaxxC,
CardId.GhostOgre, };
CardId.MaxxC,
}; if (Duel.Phase == DuelPhase.Main1)
{
if (Duel.Phase == DuelPhase.Main1) if(Duel.Player==0)
{ {
if(Duel.Player==0) int count = 0;
{ IList<ClientCard> check = Enemy.GetMonsters();
int count = 0; foreach (ClientCard monster in check)
IList<ClientCard> check = Enemy.GetMonsters(); if (monster.Attack > 2500 || monster == Enemy.MonsterZone.GetDangerousMonster())
foreach (ClientCard monster in check) count++;
if (monster.Attack > 2500 || monster == Enemy.MonsterZone.GetDangerousMonster()) if(count==0)return false;
count++; }
if(count==0)return false; if (!Bot.HasInHand(targets))
} {
if (!Bot.HasInHand(targets)) if(!Bot.HasInMonstersZone(targets))
{ return false;
if(!Bot.HasInMonstersZone(targets)) }
return false; AI.SelectCard(targets);
} return true;
AI.SelectCard(targets); }
return true; if (Duel.Phase == DuelPhase.BattleStart)
} {
if (Duel.Phase == DuelPhase.BattleStart) AI.SelectYesNo(true);
{ return true;
AI.SelectYesNo(true); }
return true; return false;
}
return false; }
} private bool GamecieltheSeaTurtleKaijusp()
{
private bool GamecieltheSeaTurtleKaijusp() if (!Bot.HasInMonstersZone(CardId.UltimateConductorTytanno))
{ return DefaultKaijuSpsummon();
if (!Bot.HasInMonstersZone(CardId.UltimateConductorTytanno)) return false;
return DefaultKaijuSpsummon(); }
return false;
} private bool RadiantheMultidimensionalKaijusp()
{
private bool RadiantheMultidimensionalKaijusp() if (Enemy.HasInMonstersZone(CardId.GamecieltheSeaTurtleKaiju)) return true;
{ if (Bot.HasInHand(CardId.DogorantheMadFlameKaiju) && !Bot.HasInMonstersZone(CardId.UltimateConductorTytanno)) return DefaultKaijuSpsummon();
if (Enemy.HasInMonstersZone(CardId.GamecieltheSeaTurtleKaiju)) return true; return false;
if (Bot.HasInHand(CardId.DogorantheMadFlameKaiju) && !Bot.HasInMonstersZone(CardId.UltimateConductorTytanno)) return DefaultKaijuSpsummon(); }
return false;
}
private bool DogorantheMadFlameKaijusp()
{
private bool DogorantheMadFlameKaijusp() if (Enemy.HasInMonstersZone(CardId.GamecieltheSeaTurtleKaiju)) return true;
{ if (Enemy.HasInMonstersZone(CardId.RadiantheMultidimensionalKaiju)) return true;
if (Enemy.HasInMonstersZone(CardId.GamecieltheSeaTurtleKaiju)) return true; return false;
if (Enemy.HasInMonstersZone(CardId.RadiantheMultidimensionalKaiju)) return true; }
return false;
}
private bool InterruptedKaijuSlumbereff()
{
private bool InterruptedKaijuSlumbereff() if (Enemy.GetMonsterCount() - Bot.GetMonsterCount() >= 2 )
{ return DefaultInterruptedKaijuSlumber();
if (Enemy.GetMonsterCount() - Bot.GetMonsterCount() >= 2 ) return false;
return DefaultInterruptedKaijuSlumber(); }
return false; private bool UltimateConductorTytannosp()
} {
private bool UltimateConductorTytannosp()
{ Pillused = true;
foreach (ClientCard card in Bot.GetMonsters())
Pillused = true; {
foreach (ClientCard card in Bot.GetMonsters()) if (card.IsCode(CardId.UltimateConductorTytanno) && card.IsFaceup())
{ return false;
if (card.IsCode(CardId.UltimateConductorTytanno) && card.IsFaceup()) }
return false; Ultimate_ss++;
} return true;
Ultimate_ss++;
return true; }
} private bool KeeperOfDragonicMagiceff()
{
private bool KeeperOfDragonicMagiceff() if (ActivateDescription == -1)
{ {
if (ActivateDescription == -1) AI.SelectCard(Useless_List());
{ return true;
AI.SelectCard(Useless_List()); }
return true; return true;
} }
return true;
} private bool MonsterRepos()
{
private bool MonsterRepos() if (Card.IsCode(CardId.UltimateConductorTytanno) && Card.IsFacedown()) return true;
{ if (Card.IsCode(CardId.ElShaddollConstruct) && Card.IsFacedown()) return true;
if (Card.IsCode(CardId.UltimateConductorTytanno) && Card.IsFacedown()) return true; if (Card.IsCode(CardId.ElShaddollConstruct) && Card.IsAttack()) return false;
if (Card.IsCode(CardId.ElShaddollConstruct) && Card.IsFacedown()) return true; if (Card.IsCode(CardId.GlowUpBulb) && Card.IsDefense()) return false;
if (Card.IsCode(CardId.ElShaddollConstruct) && Card.IsAttack()) return false; if (Card.IsCode(CardId.ShaddollDragon) && Card.IsFacedown() && Enemy.GetMonsterCount() >= 0) return true;
if (Card.IsCode(CardId.GlowUpBulb) && Card.IsDefense()) return false; if (Card.IsCode(CardId.ShaddollSquamata) && Card.IsFacedown() && Enemy.GetMonsterCount() >= 0) return true;
if (Card.IsCode(CardId.ShaddollDragon) && Card.IsFacedown() && Enemy.GetMonsterCount() >= 0) return true; return base.DefaultMonsterRepos();
if (Card.IsCode(CardId.ShaddollSquamata) && Card.IsFacedown() && Enemy.GetMonsterCount() >= 0) return true; }
return base.DefaultMonsterRepos();
} private bool OvertexCoatlseff()
{
private bool OvertexCoatlseff() if (Card.Location == CardLocation.MonsterZone) return false;
{ OvertexCoatlseff_used = true;
if (Card.Location == CardLocation.MonsterZone) return false; return true;
OvertexCoatlseff_used = true; }
return true;
} private bool DoubleEvolutionPilleff()
{
private bool DoubleEvolutionPilleff() foreach (ClientCard card in Bot.GetMonsters())
{ {
foreach (ClientCard card in Bot.GetMonsters()) if (card.IsCode(CardId.UltimateConductorTytanno) && card.IsFaceup())
{ return false;
if (card.IsCode(CardId.UltimateConductorTytanno) && card.IsFaceup()) }
return false; if (Pillused == true) return false;
} Pillused = true;
if (Pillused == true) return false; IList<int> targets = new[] {
Pillused = true; CardId.GiantRex,
IList<int> targets = new[] { CardId.DogorantheMadFlameKaiju,
CardId.GiantRex, CardId.GamecieltheSeaTurtleKaiju,
CardId.DogorantheMadFlameKaiju, CardId.RadiantheMultidimensionalKaiju,
CardId.GamecieltheSeaTurtleKaiju, CardId.OvertexCoatls,
CardId.RadiantheMultidimensionalKaiju, CardId.SouleatingOviraptor,
CardId.OvertexCoatls, CardId.UltimateConductorTytanno,
CardId.SouleatingOviraptor, };
CardId.UltimateConductorTytanno, if (Bot.HasInGraveyard(targets))
}; {
if (Bot.HasInGraveyard(targets)) AI.SelectCard(CardId.GiantRex, CardId.DogorantheMadFlameKaiju, CardId.OvertexCoatls, CardId.GamecieltheSeaTurtleKaiju, CardId.RadiantheMultidimensionalKaiju, CardId.SouleatingOviraptor, CardId.UltimateConductorTytanno);
{ }
AI.SelectCard(CardId.GiantRex, CardId.DogorantheMadFlameKaiju, CardId.OvertexCoatls, CardId.GamecieltheSeaTurtleKaiju, CardId.RadiantheMultidimensionalKaiju, CardId.SouleatingOviraptor, CardId.UltimateConductorTytanno); else
} {
else AI.SelectCard(CardId.GiantRex, CardId.DogorantheMadFlameKaiju, CardId.GamecieltheSeaTurtleKaiju, CardId.RadiantheMultidimensionalKaiju, CardId.OvertexCoatls, CardId.SouleatingOviraptor, CardId.UltimateConductorTytanno);
{ }
AI.SelectCard(CardId.GiantRex, CardId.DogorantheMadFlameKaiju, CardId.GamecieltheSeaTurtleKaiju, CardId.RadiantheMultidimensionalKaiju, CardId.OvertexCoatls, CardId.SouleatingOviraptor, CardId.UltimateConductorTytanno); IList<int> targets2 = new[] {
} CardId.GiantRex,
IList<int> targets2 = new[] { CardId.DogorantheMadFlameKaiju,
CardId.GiantRex, CardId.GamecieltheSeaTurtleKaiju,
CardId.DogorantheMadFlameKaiju, CardId.RadiantheMultidimensionalKaiju,
CardId.GamecieltheSeaTurtleKaiju, CardId.OvertexCoatls,
CardId.RadiantheMultidimensionalKaiju, CardId.SouleatingOviraptor,
CardId.OvertexCoatls, CardId.UltimateConductorTytanno,
CardId.SouleatingOviraptor, };
CardId.UltimateConductorTytanno, if (Bot.HasInGraveyard(targets))
}; {
if (Bot.HasInGraveyard(targets)) AI.SelectNextCard(CardId.ShaddollBeast, CardId.ShaddollDragon, CardId.KeeperOfDragonicMagic, CardId.ShaddollSquamata, CardId.SouleatingOviraptor, CardId.Raiden, CardId.Lumina, CardId.ShaddollHedgehog, CardId.AshBlossom, CardId.GhostOgre, CardId.ShaddollFalco, CardId.MaxxC, CardId.PlaguespreaderZombie, CardId.GlowUpBulb, CardId.FairyTailSnow);
{ }
AI.SelectNextCard(CardId.ShaddollBeast, CardId.ShaddollDragon, CardId.KeeperOfDragonicMagic, CardId.ShaddollSquamata, CardId.SouleatingOviraptor, CardId.Raiden, CardId.Lumina, CardId.ShaddollHedgehog, CardId.AshBlossom, CardId.GhostOgre, CardId.ShaddollFalco, CardId.MaxxC, CardId.PlaguespreaderZombie, CardId.GlowUpBulb, CardId.FairyTailSnow); else
} AI.SelectNextCard(CardId.ShaddollBeast, CardId.ShaddollDragon, CardId.KeeperOfDragonicMagic, CardId.ShaddollSquamata, CardId.SouleatingOviraptor, CardId.Raiden, CardId.Lumina, CardId.ShaddollHedgehog, CardId.AshBlossom, CardId.GhostOgre, CardId.ShaddollFalco, CardId.MaxxC, CardId.PlaguespreaderZombie, CardId.GlowUpBulb, CardId.FairyTailSnow);
else
AI.SelectNextCard(CardId.ShaddollBeast, CardId.ShaddollDragon, CardId.KeeperOfDragonicMagic, CardId.ShaddollSquamata, CardId.SouleatingOviraptor, CardId.Raiden, CardId.Lumina, CardId.ShaddollHedgehog, CardId.AshBlossom, CardId.GhostOgre, CardId.ShaddollFalco, CardId.MaxxC, CardId.PlaguespreaderZombie, CardId.GlowUpBulb, CardId.FairyTailSnow); AI.SelectThirdCard(new[] {
CardId.UltimateConductorTytanno,
AI.SelectThirdCard(new[] {
CardId.UltimateConductorTytanno, });
}); return Enemy.GetMonsterCount() >= 1;
}
return Enemy.GetMonsterCount() >= 1;
}
private bool FairyTailSnowsummon()
{
private bool FairyTailSnowsummon() ClientCard target = Util.GetBestEnemyMonster(true, true);
{ if(target != null)
ClientCard target = Util.GetBestEnemyMonster(true, true); {
if(target != null) return true;
{ }
return true; return false;
} }
return false;
}
private bool FairyTailSnoweff()
{
private bool FairyTailSnoweff()
{ if (Card.Location == CardLocation.MonsterZone)
{
if (Card.Location == CardLocation.MonsterZone) AI.SelectCard(Util.GetBestEnemyMonster(true, true));
{ return true;
AI.SelectCard(Util.GetBestEnemyMonster(true, true)); }
return true; else
} {
else
{ int spell_count = 0;
IList<ClientCard> grave = Bot.Graveyard;
int spell_count = 0; IList<ClientCard> all = new List<ClientCard>();
IList<ClientCard> grave = Bot.Graveyard; foreach (ClientCard check in grave)
IList<ClientCard> all = new List<ClientCard>(); {
foreach (ClientCard check in grave) if (check.IsCode(CardId.GiantRex))
{ {
if (check.IsCode(CardId.GiantRex)) all.Add(check);
{ }
all.Add(check); }
} foreach (ClientCard check in grave)
} {
foreach (ClientCard check in grave) if(check.HasType(CardType.Spell)||check.HasType(CardType.Trap))
{ {
if(check.HasType(CardType.Spell)||check.HasType(CardType.Trap)) spell_count++;
{ all.Add(check);
spell_count++; }
all.Add(check); }
} foreach (ClientCard check in grave)
} {
foreach (ClientCard check in grave) if (check.HasType(CardType.Monster))
{ {
if (check.HasType(CardType.Monster)) all.Add(check);
{ }
all.Add(check); }
} if (Util.ChainContainsCard(CardId.FairyTailSnow)) return false;
}
if (Util.ChainContainsCard(CardId.FairyTailSnow)) return false; if ( Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Bot.BattlingMonster == null && Enemy_atk >=Bot.LifePoints ||
Duel.Player == 0 && Duel.Phase==DuelPhase.BattleStart && Enemy.BattlingMonster == null && Enemy.LifePoints<=1850
if ( Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Bot.BattlingMonster == null && Enemy_atk >=Bot.LifePoints || )
Duel.Player == 0 && Duel.Phase==DuelPhase.BattleStart && Enemy.BattlingMonster == null && Enemy.LifePoints<=1850 {
) AI.SelectCard(all);
{ AI.SelectNextCard(Util.GetBestEnemyMonster());
AI.SelectCard(all); return true;
AI.SelectNextCard(Util.GetBestEnemyMonster()); }
return true; }
} return false;
} }
return false;
}
private bool SouleatingOviraptoreff()
{
private bool SouleatingOviraptoreff() if (!OvertexCoatlseff_used && Bot.GetRemainingCount(CardId.OvertexCoatls, 3) > 0)
{ {
if (!OvertexCoatlseff_used && Bot.GetRemainingCount(CardId.OvertexCoatls, 3) > 0) AI.SelectCard(CardId.OvertexCoatls);
{ AI.SelectOption(0);
AI.SelectCard(CardId.OvertexCoatls); }
AI.SelectOption(0); else
} {
else AI.SelectCard(CardId.UltimateConductorTytanno);
{ AI.SelectOption(1);
AI.SelectCard(CardId.UltimateConductorTytanno); }
AI.SelectOption(1); return true;
} }
return true;
} private bool GlowUpBulbeff()
{
private bool GlowUpBulbeff() IList<ClientCard> check = Bot.GetMonstersInExtraZone();
{ foreach (ClientCard monster in check)
IList<ClientCard> check = Bot.GetMonstersInExtraZone(); if (monster.HasType(CardType.Fusion)) return false;
foreach (ClientCard monster in check) if (Bot.HasInMonstersZone(CardId.Lumina) ||
if (monster.HasType(CardType.Fusion)) return false; Bot.HasInMonstersZone(CardId.FairyTailSnow) ||
if (Bot.HasInMonstersZone(CardId.Lumina) || Bot.HasInMonstersZone(CardId.KeeperOfDragonicMagic) ||
Bot.HasInMonstersZone(CardId.FairyTailSnow) || Bot.HasInMonstersZone(CardId.SouleatingOviraptor) ||
Bot.HasInMonstersZone(CardId.KeeperOfDragonicMagic) || Bot.HasInMonstersZone(CardId.GiantRex) ||
Bot.HasInMonstersZone(CardId.SouleatingOviraptor) || Bot.HasInMonstersZone(CardId.Raiden)
Bot.HasInMonstersZone(CardId.GiantRex) || )
Bot.HasInMonstersZone(CardId.Raiden) {
) AI.SelectPosition(CardPosition.FaceUpDefence);
{ return true;
AI.SelectPosition(CardPosition.FaceUpDefence); }
return true; return false;
} }
return false;
}
private bool TG_WonderMagicianeff() private bool TG_WonderMagicianeff()
{ {
TG_WonderMagician_count++; return true;
return TG_WonderMagician_count <= 10; }
} private bool AllureofDarkness()
private bool AllureofDarkness() {
{ IList<ClientCard> materials = Bot.Hand;
IList<ClientCard> materials = Bot.Hand; // IList<ClientCard> check = new List<ClientCard>();
// IList<ClientCard> check = new List<ClientCard>(); ClientCard mat = null;
ClientCard mat = null; foreach (ClientCard card in materials)
foreach (ClientCard card in materials) {
{ if (card.HasAttribute(CardAttribute.Dark))
if (card.HasAttribute(CardAttribute.Dark)) {
{ mat = card;
mat = card; break;
break; }
} }
} if (mat != null)
if (mat != null) {
{ return true;
return true; }
} return false;
return false; }
}
private bool Reborneff()
private bool Reborneff() {
{ if(Bot.HasInGraveyard(CardId.UltimateConductorTytanno)&&Ultimate_ss>0)
if(Bot.HasInGraveyard(CardId.UltimateConductorTytanno)&&Ultimate_ss>0) {
{ AI.SelectCard(CardId.UltimateConductorTytanno);
AI.SelectCard(CardId.UltimateConductorTytanno); return true;
return true; }
} if (!Util.IsOneEnemyBetter(true)) return false;
if (!Util.IsOneEnemyBetter(true)) return false; IList<int> targets = new[] {
IList<int> targets = new[] { CardId.ElShaddollConstruct,
CardId.ElShaddollConstruct, CardId.DogorantheMadFlameKaiju,
CardId.DogorantheMadFlameKaiju, CardId.GamecieltheSeaTurtleKaiju,
CardId.GamecieltheSeaTurtleKaiju, CardId.SouleatingOviraptor,
CardId.SouleatingOviraptor, };
}; if (!Bot.HasInGraveyard(targets))
if (!Bot.HasInGraveyard(targets)) {
{ return false;
return false; }
} AI.SelectCard(targets);
AI.SelectCard(targets); return true;
return true; }
}
private bool PotofAvariceeff()
private bool PotofAvariceeff() {
{ return true;
return true; }
}
private bool MaxxC()
private bool MaxxC() {
{ return Duel.Player == 1;
return Duel.Player == 1; }
}
private bool SetIsFieldEmpty()
private bool SetIsFieldEmpty() {
{ return !Bot.IsFieldEmpty();
return !Bot.IsFieldEmpty(); }
}
private bool SpellSetZone()
private bool SpellSetZone() {
{ return (Bot.GetHandCount()>6 && Duel.Phase==DuelPhase.Main2);
return (Bot.GetHandCount()>6 && Duel.Phase==DuelPhase.Main2); }
}
private bool ChargeOfTheLightBrigadeEffect()
private bool ChargeOfTheLightBrigadeEffect() {
{ if (Bot.HasInGraveyard(CardId.Raiden) || Bot.HasInHand(CardId.Raiden))
if (Bot.HasInGraveyard(CardId.Raiden) || Bot.HasInHand(CardId.Raiden)) AI.SelectCard(CardId.Lumina);
AI.SelectCard(CardId.Lumina); else
else AI.SelectCard(CardId.Raiden);
AI.SelectCard(CardId.Raiden); return true;
return true; }
}
// all Shaddoll
// all Shaddoll private bool SinisterShadowGameseff()
private bool SinisterShadowGameseff() {
{ if (Bot.HasInGraveyard(CardId.ShaddollFusion))
if (Bot.HasInGraveyard(CardId.ShaddollFusion)) AI.SelectCard(CardId.ShaddollCore);
AI.SelectCard(CardId.ShaddollCore); else
else AI.SelectCard(new[]
AI.SelectCard(new[] {
{ CardId.ShaddollBeast,
CardId.ShaddollBeast, });
}); return true;
return true; }
}
private bool ShaddollCoreeff()
private bool ShaddollCoreeff() {
{ if (Card.Location == CardLocation.SpellZone)
if (Card.Location == CardLocation.SpellZone) {
{
if (Duel.Player == 1 && Bot.BattlingMonster == null && Duel.Phase==DuelPhase.BattleStart|| DefaultOnBecomeTarget())
if (Duel.Player == 1 && Bot.BattlingMonster == null && Duel.Phase==DuelPhase.BattleStart|| DefaultOnBecomeTarget()) {
{ Logger.DebugWriteLine("+++++++++++ShaddollCoreeffdododoo++++++++++");
Logger.DebugWriteLine("+++++++++++ShaddollCoreeffdododoo++++++++++"); AI.SelectPosition(CardPosition.FaceUpDefence);
AI.SelectPosition(CardPosition.FaceUpDefence); return true;
return true; }
} return false;
return false; }
} return true;
return true; }
}
private bool ShaddollFusioneff()
private bool ShaddollFusioneff() {
{ List<ClientCard> extra_zone_check = Bot.GetMonstersInExtraZone();
List<ClientCard> extra_zone_check = Bot.GetMonstersInExtraZone(); foreach (ClientCard extra_monster in extra_zone_check)
foreach (ClientCard extra_monster in extra_zone_check) if (extra_monster.HasType(CardType.Xyz) || extra_monster.HasType(CardType.Fusion) || extra_monster.HasType(CardType.Synchro)) return false;
if (extra_monster.HasType(CardType.Xyz) || extra_monster.HasType(CardType.Fusion) || extra_monster.HasType(CardType.Synchro)) return false;
bool deck_check = false;
bool deck_check = false; List<ClientCard> monsters = Enemy.GetMonsters();
List<ClientCard> monsters = Enemy.GetMonsters(); foreach (ClientCard monster in monsters)
foreach (ClientCard monster in monsters) {
{ if (monster.HasType(CardType.Synchro) || monster.HasType(CardType.Fusion) || monster.HasType(CardType.Xyz) || monster.HasType(CardType.Link))
if (monster.HasType(CardType.Synchro) || monster.HasType(CardType.Fusion) || monster.HasType(CardType.Xyz) || monster.HasType(CardType.Link)) deck_check = true;
deck_check = true; }
}
if (deck_check)
if (deck_check) {
{ AI.SelectCard(
AI.SelectCard( CardId.ElShaddollConstruct,
CardId.ElShaddollConstruct, CardId.ElShaddollShekhinaga,
CardId.ElShaddollShekhinaga, CardId.ElShaddollGrysra,
CardId.ElShaddollGrysra, CardId.ElShaddollWinda
CardId.ElShaddollWinda );
); AI.SelectNextCard(
AI.SelectNextCard( CardId.ShaddollSquamata,
CardId.ShaddollSquamata, CardId.ShaddollBeast,
CardId.ShaddollBeast, CardId.ShaddollHedgehog,
CardId.ShaddollHedgehog, CardId.ShaddollDragon,
CardId.ShaddollDragon, CardId.ShaddollFalco,
CardId.ShaddollFalco, CardId.FairyTailSnow
CardId.FairyTailSnow );
); AI.SelectPosition(CardPosition.FaceUpAttack);
AI.SelectPosition(CardPosition.FaceUpAttack); return true;
return true; }
}
if (Enemy.GetMonsterCount() == 0)
if (Enemy.GetMonsterCount() == 0) {
{ int dark_count = 0;
int dark_count = 0; IList<ClientCard> m0 = Bot.Hand;
IList<ClientCard> m0 = Bot.Hand; IList<ClientCard> m1 = Bot.MonsterZone;
IList<ClientCard> m1 = Bot.MonsterZone; IList<ClientCard> all = new List<ClientCard>();
IList<ClientCard> all = new List<ClientCard>(); foreach (ClientCard monster in m0)
foreach (ClientCard monster in m0) {
{ if (dark_count == 2) break;
if (dark_count == 2) break; if (monster.HasAttribute(CardAttribute.Dark))
if (monster.HasAttribute(CardAttribute.Dark)) {
{ dark_count++;
dark_count++; all.Add(monster);
all.Add(monster); }
} }
} foreach (ClientCard monster in m1)
foreach (ClientCard monster in m1) {
{ if (dark_count == 2) break;
if (dark_count == 2) break; if (monster != null)
if (monster != null) {
{ if (monster.HasAttribute(CardAttribute.Dark))
if (monster.HasAttribute(CardAttribute.Dark)) {
{ dark_count++;
dark_count++; all.Add(monster);
all.Add(monster); }
} }
}
}
} if (dark_count == 2)
if (dark_count == 2) {
{ AI.SelectCard(CardId.ElShaddollWinda);
AI.SelectCard(CardId.ElShaddollWinda); AI.SelectMaterials(all);
AI.SelectMaterials(all); AI.SelectPosition(CardPosition.FaceUpAttack);
AI.SelectPosition(CardPosition.FaceUpAttack); return true;
return true; }
} }
} if (!Util.IsOneEnemyBetter()) return false;
if (!Util.IsOneEnemyBetter()) return false;
foreach (ClientCard monster in Bot.Hand)
foreach (ClientCard monster in Bot.Hand) {
{ if (monster.HasAttribute(CardAttribute.Light))
if (monster.HasAttribute(CardAttribute.Light)) {
{ AI.SelectCard(CardId.ElShaddollConstruct);
AI.SelectCard(CardId.ElShaddollConstruct); AI.SelectPosition(CardPosition.FaceUpAttack);
AI.SelectPosition(CardPosition.FaceUpAttack); return true;
return true; }
}
}
} List<ClientCard> material_1 = Bot.GetMonsters();
List<ClientCard> material_1 = Bot.GetMonsters(); foreach (ClientCard monster in material_1)
foreach (ClientCard monster in material_1) {
{ if (monster == null) break;
if (monster == null) break; if (monster.HasAttribute(CardAttribute.Light))
if (monster.HasAttribute(CardAttribute.Light)) {
{ AI.SelectCard(CardId.ElShaddollConstruct);
AI.SelectCard(CardId.ElShaddollConstruct); AI.SelectPosition(CardPosition.FaceUpAttack);
AI.SelectPosition(CardPosition.FaceUpAttack); return true;
return true; }
}
}
} return false;
return false;
}
}
private bool ElShaddollShekhinagaeff()
private bool ElShaddollShekhinagaeff() {
{ if (Card.Location != CardLocation.MonsterZone)
if (Card.Location != CardLocation.MonsterZone) return true;
return true; else
else {
{ if (DefaultBreakthroughSkill())
if (DefaultBreakthroughSkill()) {
{ AI.SelectCard(
AI.SelectCard( CardId.ShaddollBeast,
CardId.ShaddollBeast, CardId.ShaddollSquamata,
CardId.ShaddollSquamata, CardId.ShaddollHedgehog,
CardId.ShaddollHedgehog, CardId.ShaddollDragon,
CardId.ShaddollDragon, CardId.ShaddollFalco
CardId.ShaddollFalco );
); }
} else
else return false;
return false; }
} return true;
return true; }
}
private bool ElShaddollGrysraeff()
private bool ElShaddollGrysraeff() {
{ if (Card.Location != CardLocation.MonsterZone)
if (Card.Location != CardLocation.MonsterZone) return true;
return true; return true;
return true; }
}
private bool ElShaddollConstructeff()
private bool ElShaddollConstructeff() {
{
if (!ShaddollBeast_used)
if (!ShaddollBeast_used) AI.SelectCard(CardId.ShaddollBeast);
AI.SelectCard(CardId.ShaddollBeast); else
else AI.SelectCard(CardId.ShaddollFalco);
AI.SelectCard(CardId.ShaddollFalco);
return true;
return true; }
}
private bool ShaddollSquamataeff()
private bool ShaddollSquamataeff() {
{ ShaddollSquamata_used = true;
ShaddollSquamata_used = true; if (Card.Location != CardLocation.MonsterZone)
if (Card.Location != CardLocation.MonsterZone) {
{ if(Util.ChainContainsCard(CardId.ElShaddollConstruct))
if(Util.ChainContainsCard(CardId.ElShaddollConstruct)) {
{ if (!Bot.HasInHand(CardId.ShaddollFusion) && Bot.HasInGraveyard(CardId.ShaddollFusion))
if (!Bot.HasInHand(CardId.ShaddollFusion) && Bot.HasInGraveyard(CardId.ShaddollFusion)) AI.SelectNextCard(CardId.ShaddollCore);
AI.SelectNextCard(CardId.ShaddollCore); if (!ShaddollBeast_used) AI.SelectNextCard(CardId.ShaddollBeast);
if (!ShaddollBeast_used) AI.SelectNextCard(CardId.ShaddollBeast); else if (!ShaddollFalco_used) AI.SelectNextCard(CardId.ShaddollFalco);
else if (!ShaddollFalco_used) AI.SelectNextCard(CardId.ShaddollFalco); else if(!ShaddollHedgehog_used) AI.SelectNextCard(CardId.ShaddollHedgehog);
else if(!ShaddollHedgehog_used) AI.SelectNextCard(CardId.ShaddollHedgehog); }
} else
else {
{ if (!Bot.HasInHand(CardId.ShaddollFusion) && Bot.HasInGraveyard(CardId.ShaddollFusion))
if (!Bot.HasInHand(CardId.ShaddollFusion) && Bot.HasInGraveyard(CardId.ShaddollFusion)) AI.SelectCard(CardId.ShaddollCore);
AI.SelectCard(CardId.ShaddollCore); if (!ShaddollBeast_used) AI.SelectCard(CardId.ShaddollBeast);
if (!ShaddollBeast_used) AI.SelectCard(CardId.ShaddollBeast); else if (!ShaddollFalco_used) AI.SelectCard(CardId.ShaddollFalco);
else if (!ShaddollFalco_used) AI.SelectCard(CardId.ShaddollFalco); else if (!ShaddollHedgehog_used) AI.SelectCard(CardId.ShaddollHedgehog);
else if (!ShaddollHedgehog_used) AI.SelectCard(CardId.ShaddollHedgehog); }
}
}
} else
else {
{ if (Enemy.GetMonsterCount() == 0) return false;
if (Enemy.GetMonsterCount() == 0) return false; ClientCard target = Util.GetBestEnemyMonster();
ClientCard target = Util.GetBestEnemyMonster(); AI.SelectCard(target);
AI.SelectCard(target); }
} return true;
return true; }
}
private bool ShaddollBeasteff()
private bool ShaddollBeasteff() {
{ ShaddollBeast_used = true;
ShaddollBeast_used = true; return true;
return true; }
}
private bool ShaddollFalcoeff()
private bool ShaddollFalcoeff() {
{ ShaddollFalco_used = true;
ShaddollFalco_used = true; if (Card.Location != CardLocation.MonsterZone)
if (Card.Location != CardLocation.MonsterZone) return true;
return true; else
else {
{ AI.SelectCard(
AI.SelectCard( CardId.ElShaddollConstruct,
CardId.ElShaddollConstruct, CardId.ElShaddollShekhinaga,
CardId.ElShaddollShekhinaga, CardId.ElShaddollGrysra,
CardId.ElShaddollGrysra, CardId.ElShaddollWinda,
CardId.ElShaddollWinda, CardId.ShaddollSquamata
CardId.ShaddollSquamata );
);
}
} return true;
return true; }
}
private bool ShaddollHedgehogeff()
private bool ShaddollHedgehogeff() {
{ ShaddollHedgehog_used = true;
ShaddollHedgehog_used = true; if (Card.Location != CardLocation.MonsterZone)
if (Card.Location != CardLocation.MonsterZone) {
{ if (Util.ChainContainsCard(CardId.ElShaddollConstruct))
if (Util.ChainContainsCard(CardId.ElShaddollConstruct)) {
{ AI.SelectNextCard(
AI.SelectNextCard( CardId.ShaddollFalco,
CardId.ShaddollFalco, CardId.ShaddollSquamata,
CardId.ShaddollSquamata, CardId.ShaddollDragon
CardId.ShaddollDragon );
);
}
} else
else {
{ AI.SelectCard(
AI.SelectCard( CardId.ShaddollSquamata,
CardId.ShaddollSquamata, CardId.ShaddollDragon
CardId.ShaddollDragon );
); }
}
}
} else
else {
{ AI.SelectCard(
AI.SelectCard( CardId.ShaddollFusion,
CardId.ShaddollFusion, CardId.SinisterShadowGames
CardId.SinisterShadowGames );
); }
} return true;
return true; }
}
private bool ShaddollDragoneff()
private bool ShaddollDragoneff() {
{ ShaddollDragon_used = true;
ShaddollDragon_used = true; if (Card.Location == CardLocation.MonsterZone)
if (Card.Location == CardLocation.MonsterZone) {
{ ClientCard target = Util.GetBestEnemyCard();
ClientCard target = Util.GetBestEnemyCard(); AI.SelectCard(target);
AI.SelectCard(target); return true;
return true; }
} else
else {
{ if (Enemy.GetSpellCount() == 0) return false;
if (Enemy.GetSpellCount() == 0) return false; ClientCard target = Util.GetBestEnemySpell();
ClientCard target = Util.GetBestEnemySpell(); AI.SelectCard(target);
AI.SelectCard(target); return true;
return true; }
} }
}
private bool LostWindeff()
private bool LostWindeff() {
{ if (Card.Location == CardLocation.Grave)
if (Card.Location == CardLocation.Grave) return true;
return true; List<ClientCard> check = Enemy.GetMonsters();
List<ClientCard> check = Enemy.GetMonsters(); foreach (ClientCard m in check)
foreach (ClientCard m in check) {
{ if (m.Attack>=2000) return DefaultBreakthroughSkill();
if (m.Attack>=2000) return DefaultBreakthroughSkill(); }
} return false;
return false; }
}
private bool FoolishBurialEffect()
private bool FoolishBurialEffect() {
{ if (Bot.GetRemainingCount(CardId.DoubleEvolutionPill, 3) > 0)
if (Bot.GetRemainingCount(CardId.DoubleEvolutionPill, 3) > 0) {
{ if (!OvertexCoatlseff_used)
if (!OvertexCoatlseff_used) {
{ AI.SelectCard(new[]
AI.SelectCard(new[] {
{ CardId.OvertexCoatls,
CardId.OvertexCoatls, });
}); return true;
return true; }
} return false;
return false; }
} else
else {
{ AI.SelectCard(CardId.ShaddollSquamata, CardId.FairyTailSnow);
AI.SelectCard(CardId.ShaddollSquamata, CardId.FairyTailSnow); }
} return true;
return true; }
}
public bool Hand_act_eff()
public bool Hand_act_eff() {
{ //if (Card.IsCode(CardId.Urara) && Bot.HasInHand(CardId.LockBird) && Bot.HasInSpellZone(CardId.Re)) return false;
//if (Card.IsCode(CardId.Urara) && Bot.HasInHand(CardId.LockBird) && Bot.HasInSpellZone(CardId.Re)) return false; if (Card.IsCode(CardId.GhostOgre) && Card.Location == CardLocation.Hand && Bot.HasInMonstersZone(CardId.GhostOgre)) return false;
if (Card.IsCode(CardId.GhostOgre) && Card.Location == CardLocation.Hand && Bot.HasInMonstersZone(CardId.GhostOgre)) return false; return (Duel.LastChainPlayer == 1);
return (Duel.LastChainPlayer == 1); }
} //other extra
//other extra
private bool Michaelsp()
private bool Michaelsp() {
{ IList<int> targets = new[] {
IList<int> targets = new[] { CardId.Raiden,
CardId.Raiden, CardId.Lumina
CardId.Lumina };
}; if (!Bot.HasInMonstersZone(targets))
if (!Bot.HasInMonstersZone(targets)) return false;
return false; AI.SelectCard(targets);
AI.SelectCard(targets); return true;
return true; }
} private bool Michaeleff()
private bool Michaeleff() {
{ if (Card.Location == CardLocation.Grave)
if (Card.Location == CardLocation.Grave) return true;
return true; if (Bot.LifePoints <= 1000) return false;
if (Bot.LifePoints <= 1000) return false; ClientCard select = Util.GetBestEnemyCard();
ClientCard select = Util.GetBestEnemyCard(); if (select == null) return false;
if (select == null) return false; if(select!=null)
if(select!=null) {
{
AI.SelectCard(select);
AI.SelectCard(select); return true;
return true; }
} return false;
return false; }
}
private bool MinervaTheExaltedEffect()
private bool MinervaTheExaltedEffect() {
{ if (Card.Location == CardLocation.MonsterZone)
if (Card.Location == CardLocation.MonsterZone) {
{ if (Bot.Deck.Count <= 10) return false;
if (Bot.Deck.Count <= 10) return false; return true;
return true; }
} else
else {
{ IList<ClientCard> targets = new List<ClientCard>();
IList<ClientCard> targets = new List<ClientCard>();
ClientCard target1 = Util.GetBestEnemyMonster();
ClientCard target1 = Util.GetBestEnemyMonster(); if (target1 != null)
if (target1 != null) targets.Add(target1);
targets.Add(target1); ClientCard target2 = Util.GetBestEnemySpell();
ClientCard target2 = Util.GetBestEnemySpell(); if (target2 != null)
if (target2 != null) targets.Add(target2);
targets.Add(target2);
foreach (ClientCard target in Enemy.GetMonsters())
foreach (ClientCard target in Enemy.GetMonsters()) {
{ if (targets.Count >= 3)
if (targets.Count >= 3) break;
break; if (!targets.Contains(target))
if (!targets.Contains(target)) targets.Add(target);
targets.Add(target); }
} foreach (ClientCard target in Enemy.GetSpells())
foreach (ClientCard target in Enemy.GetSpells()) {
{ if (targets.Count >= 3)
if (targets.Count >= 3) break;
break; if (!targets.Contains(target))
if (!targets.Contains(target)) targets.Add(target);
targets.Add(target); }
} if (targets.Count == 0)
if (targets.Count == 0) return false;
return false;
AI.SelectCard(0);
AI.SelectCard(0); AI.SelectNextCard(targets);
AI.SelectNextCard(targets); return true;
return true; }
} }
}
public bool CrystronNeedlefibersp()
public bool CrystronNeedlefibersp() {
{ if (Bot.HasInMonstersZone(CardId.ElShaddollConstruct) ||
if (Bot.HasInMonstersZone(CardId.ElShaddollConstruct) || Bot.HasInMonstersZone(CardId.ElShaddollGrysra) ||
Bot.HasInMonstersZone(CardId.ElShaddollGrysra) || Bot.HasInMonstersZone(CardId.ElShaddollShekhinaga) ||
Bot.HasInMonstersZone(CardId.ElShaddollShekhinaga) || Bot.HasInMonstersZone(CardId.ElShaddollWinda))
Bot.HasInMonstersZone(CardId.ElShaddollWinda)) return false;
return false;
if (CrystronNeedlefibereff_used) return false;
if (CrystronNeedlefibereff_used) return false; if (Bot.HasInMonstersZone(CardId.CrystronNeedlefiber)) return false;
if (Bot.HasInMonstersZone(CardId.CrystronNeedlefiber)) return false; IList<int> check = new[]
IList<int> check = new[] {
{ CardId.GlowUpBulb,
CardId.GlowUpBulb, CardId.FairyTailSnow,
CardId.FairyTailSnow, CardId.KeeperOfDragonicMagic,
CardId.KeeperOfDragonicMagic, CardId.SouleatingOviraptor,
CardId.SouleatingOviraptor, CardId.GiantRex,
CardId.GiantRex, CardId.Lumina,
CardId.Lumina, CardId.Raiden,
CardId.Raiden,
};
}; int count=0;
int count=0; foreach (ClientCard monster in Bot.GetMonsters())
foreach (ClientCard monster in Bot.GetMonsters()) if (monster.IsCode(CardId.GlowUpBulb, CardId.FairyTailSnow, CardId.KeeperOfDragonicMagic,
if (monster.IsCode(CardId.GlowUpBulb, CardId.FairyTailSnow, CardId.KeeperOfDragonicMagic, CardId.SouleatingOviraptor, CardId.GiantRex, CardId.Lumina, CardId.Raiden))
CardId.SouleatingOviraptor, CardId.GiantRex, CardId.Lumina, CardId.Raiden)) count++;
count++; if (!Bot.HasInMonstersZone(CardId.GlowUpBulb) || count<2)
if (!Bot.HasInMonstersZone(CardId.GlowUpBulb) || count<2) return false;
return false; AI.SelectCard(check);
AI.SelectCard(check); AI.SelectNextCard(check);
AI.SelectNextCard(check);
return true;
return true; }
}
public bool CrystronNeedlefibereff()
public bool CrystronNeedlefibereff() {
{ bool DarkHole = false;
bool DarkHole = false; foreach (ClientCard card in Enemy.GetSpells())
foreach (ClientCard card in Enemy.GetSpells()) {
{ if (card.IsCode(53129443) && card.IsFaceup())
if (card.IsCode(53129443) && card.IsFaceup()) {
{ DarkHole = true;
DarkHole = true; }
} }
} if (Duel.Player == 0)
if (Duel.Player == 0) {
{
CrystronNeedlefibereff_used = true;
CrystronNeedlefibereff_used = true; AI.SelectCard(
AI.SelectCard( CardId.GhostOgre,
CardId.GhostOgre, CardId.GlowUpBulb,
CardId.GlowUpBulb, CardId.PlaguespreaderZombie,
CardId.PlaguespreaderZombie, CardId.ShaddollFalco
CardId.ShaddollFalco );
); return true;
return true; }
}
else if (DarkHole || Util.IsChainTarget(Card) || Util.GetProblematicEnemySpell() != null)
else if (DarkHole || Util.IsChainTarget(Card) || Util.GetProblematicEnemySpell() != null) {
{ AI.SelectCard(CardId.TG_WonderMagician);
AI.SelectCard(CardId.TG_WonderMagician); return true;
return true; }
}
else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Util.IsOneEnemyBetterThanValue(1500, true))
else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Util.IsOneEnemyBetterThanValue(1500, true)) {
{ AI.SelectCard(CardId.TG_WonderMagician);
AI.SelectCard(CardId.TG_WonderMagician); if (Util.IsOneEnemyBetterThanValue(1900, true))
if (Util.IsOneEnemyBetterThanValue(1900, true)) {
{ AI.SelectPosition(CardPosition.FaceUpDefence);
AI.SelectPosition(CardPosition.FaceUpDefence); }
} else
else {
{ AI.SelectPosition(CardPosition.FaceUpAttack);
AI.SelectPosition(CardPosition.FaceUpAttack); }
} return true;
return true; }
} return false;
return false; }
}
private bool ScarlightRedDragonsp()
private bool ScarlightRedDragonsp() {
{ return false;
return false; }
}
private bool ScarlightRedDragoneff()
private bool ScarlightRedDragoneff() {
{ IList<ClientCard> targets = new List<ClientCard>();
IList<ClientCard> targets = new List<ClientCard>(); ClientCard target1 = Util.GetBestEnemyMonster();
ClientCard target1 = Util.GetBestEnemyMonster(); if (target1 != null)
if (target1 != null) {
{ targets.Add(target1);
targets.Add(target1); AI.SelectCard(targets);
AI.SelectCard(targets); return true;
return true; }
} return false;
return false; }
}
private bool CrystalWingSynchroDragoneff()
private bool CrystalWingSynchroDragoneff() {
{ return Duel.LastChainPlayer != 0;
return Duel.LastChainPlayer != 0; }
}
private bool Sdulldeateff()
private bool Sdulldeateff() {
{ /* if (snake_four_s)
/* if (snake_four_s) {
{ snake_four_s = false;
snake_four_s = false; AI.SelectCard(Useless_List());
AI.SelectCard(Useless_List()); return true;
return true; }
} //if (ActivateDescription == Util.GetStringId(CardId.snake, 2)) return true;
//if (ActivateDescription == Util.GetStringId(CardId.snake, 2)) return true; if (ActivateDescription == Util.GetStringId(CardId.snake, 1))
if (ActivateDescription == Util.GetStringId(CardId.snake, 1)) {
{ foreach (ClientCard hand in Bot.Hand)
foreach (ClientCard hand in Bot.Hand) {
{ if (hand.IsCode(CardId.Red, CardId.Pink))
if (hand.IsCode(CardId.Red, CardId.Pink)) {
{ AI.SelectCard(hand);
AI.SelectCard(hand); return true;
return true; }
} if (hand.IsCode(CardId.Urara, CardId.Ghost))
if (hand.IsCode(CardId.Urara, CardId.Ghost)) {
{ if (Tuner_ss())
if (Tuner_ss()) {
{ AI.SelectCard(hand);
AI.SelectCard(hand); return true;
return true; }
} }
} }
} }*/
}*/ return false;
return false; }
}
private bool BlackRoseMoonlightDragoneff()
private bool BlackRoseMoonlightDragoneff() {
{ IList<ClientCard> targets = new List<ClientCard>();
IList<ClientCard> targets = new List<ClientCard>(); ClientCard target1 = Util.GetBestEnemyMonster();
ClientCard target1 = Util.GetBestEnemyMonster(); if (target1 != null)
if (target1 != null) {
{ targets.Add(target1);
targets.Add(target1); AI.SelectCard(targets);
AI.SelectCard(targets); return true;
return true; }
} return false;
return false;
}
}
private bool RedWyvernsp()
private bool RedWyvernsp() {
{ return false;
return false; }
}
private bool RedWyverneff()
private bool RedWyverneff() {
{ IList<ClientCard> check = Enemy.GetMonsters();
IList<ClientCard> check = Enemy.GetMonsters(); ClientCard best = null;
ClientCard best = null; foreach (ClientCard monster in check)
foreach (ClientCard monster in check) {
{ if (monster.Attack >= 2400) best = monster;
if (monster.Attack >= 2400) best = monster; }
} if (best != null)
if (best != null) {
{ AI.SelectCard(best);
AI.SelectCard(best); return true;
return true; }
} return false;
return false; }
}
private bool CoralDragoneff()
private bool CoralDragoneff() {
{ if (Card.Location != CardLocation.MonsterZone)
if (Card.Location != CardLocation.MonsterZone) return true;
return true; IList<ClientCard> targets = new List<ClientCard>();
IList<ClientCard> targets = new List<ClientCard>();
ClientCard target1 = Util.GetBestEnemyMonster();
ClientCard target1 = Util.GetBestEnemyMonster(); if (target1 != null)
if (target1 != null) targets.Add(target1);
targets.Add(target1); ClientCard target2 = Util.GetBestEnemySpell();
ClientCard target2 = Util.GetBestEnemySpell(); if (target2 != null)
if (target2 != null) targets.Add(target2);
targets.Add(target2); else if (Util.IsChainTarget(Card) || Util.GetProblematicEnemySpell() != null)
else if (Util.IsChainTarget(Card) || Util.GetProblematicEnemySpell() != null) {
{ AI.SelectCard(targets);
AI.SelectCard(targets); return true;
return true; }
} else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Util.IsOneEnemyBetterThanValue(2400, true))
else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Util.IsOneEnemyBetterThanValue(2400, true)) {
{ AI.SelectCard(targets);
AI.SelectCard(targets); return true;
return true; }
} return false;
return false; }
}
public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender)
public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) {
{ if (!defender.IsMonsterHasPreventActivationEffectInBattle())
if (!defender.IsMonsterHasPreventActivationEffectInBattle()) {
{ if (attacker.IsCode(CardId.ElShaddollConstruct) && !attacker.IsDisabled()) // TODO: && defender.IsSpecialSummoned
if (attacker.IsCode(CardId.ElShaddollConstruct) && !attacker.IsDisabled()) // TODO: && defender.IsSpecialSummoned attacker.RealPower = 9999;
attacker.RealPower = 9999; if (attacker.IsCode(CardId.UltimateConductorTytanno) && !attacker.IsDisabled() && defender.IsDefense())
if (attacker.IsCode(CardId.UltimateConductorTytanno) && !attacker.IsDisabled() && defender.IsDefense()) attacker.RealPower = 9999;
attacker.RealPower = 9999; }
} return base.OnPreBattleBetween(attacker, defender);
return base.OnPreBattleBetween(attacker, defender); }
}
public override bool OnSelectHand()
public override bool OnSelectHand() {
{ return true;
return true; }
} /*
/* private bool GoblindberghSummon()
private bool GoblindberghSummon() {
{ foreach (ClientCard card in Bot.Hand.GetMonsters())
foreach (ClientCard card in Bot.Hand.GetMonsters()) {
{ if (!card.Equals(Card) && card.Level == 4)
if (!card.Equals(Card) && card.Level == 4) return true;
return true; }
} return false;
return false; }*/
}*/
}
}
} }
\ No newline at end of file
using YGOSharp.OCGWrapper.Enums;
using System.Collections.Generic;
using System.Linq;
using WindBot;
using WindBot.Game;
using WindBot.Game.AI;
namespace WindBot.Game.AI.Decks
{
[Deck("Lucky", "AI_Test", "Test")]
public class LuckyExecutor : DefaultExecutor
{
public LuckyExecutor(GameAI ai, Duel duel)
: base(ai, duel)
{
AddExecutor(ExecutorType.Activate, ImFeelingLucky);
AddExecutor(ExecutorType.SpSummon, ImFeelingLucky);
AddExecutor(ExecutorType.SpSummon, ImFeelingUnlucky);
AddExecutor(ExecutorType.Activate, ImFeelingUnlucky);
AddExecutor(ExecutorType.SummonOrSet, ImFeelingLazy);
AddExecutor(ExecutorType.SpellSet, DefaultSpellSet);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.Activate, _CardId.MysticalSpaceTyphoon, DefaultMysticalSpaceTyphoon);
AddExecutor(ExecutorType.Activate, _CardId.CosmicCyclone, DefaultCosmicCyclone);
AddExecutor(ExecutorType.Activate, _CardId.GalaxyCyclone, DefaultGalaxyCyclone);
AddExecutor(ExecutorType.Activate, _CardId.BookOfMoon, DefaultBookOfMoon);
AddExecutor(ExecutorType.Activate, _CardId.CompulsoryEvacuationDevice, DefaultCompulsoryEvacuationDevice);
AddExecutor(ExecutorType.Activate, _CardId.CallOfTheHaunted, DefaultCallOfTheHaunted);
AddExecutor(ExecutorType.Activate, _CardId.Scapegoat, DefaultScapegoat);
AddExecutor(ExecutorType.Activate, _CardId.MaxxC, DefaultMaxxC);
AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, DefaultAshBlossomAndJoyousSpring);
AddExecutor(ExecutorType.Activate, _CardId.GhostOgreAndSnowRabbit, DefaultGhostOgreAndSnowRabbit);
AddExecutor(ExecutorType.Activate, _CardId.GhostBelle, DefaultGhostBelleAndHauntedMansion);
AddExecutor(ExecutorType.Activate, _CardId.EffectVeiler, DefaultEffectVeiler);
AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, DefaultCalledByTheGrave);
AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, DefaultInfiniteImpermanence);
AddExecutor(ExecutorType.Activate, _CardId.BreakthroughSkill, DefaultBreakthroughSkill);
AddExecutor(ExecutorType.Activate, _CardId.SolemnJudgment, DefaultSolemnJudgment);
AddExecutor(ExecutorType.Activate, _CardId.SolemnWarning, DefaultSolemnWarning);
AddExecutor(ExecutorType.Activate, _CardId.SolemnStrike, DefaultSolemnStrike);
AddExecutor(ExecutorType.Activate, _CardId.TorrentialTribute, DefaultTorrentialTribute);
AddExecutor(ExecutorType.Activate, _CardId.HeavyStorm, DefaultHeavyStorm);
AddExecutor(ExecutorType.Activate, _CardId.HarpiesFeatherDuster, DefaultHarpiesFeatherDusterFirst);
AddExecutor(ExecutorType.Activate, _CardId.HammerShot, DefaultHammerShot);
AddExecutor(ExecutorType.Activate, _CardId.DarkHole, DefaultDarkHole);
AddExecutor(ExecutorType.Activate, _CardId.Raigeki, DefaultRaigeki);
AddExecutor(ExecutorType.Activate, _CardId.SmashingGround, DefaultSmashingGround);
AddExecutor(ExecutorType.Activate, _CardId.PotOfDesires, DefaultPotOfDesires);
AddExecutor(ExecutorType.Activate, _CardId.AllureofDarkness, DefaultAllureofDarkness);
AddExecutor(ExecutorType.Activate, _CardId.DimensionalBarrier, DefaultDimensionalBarrier);
AddExecutor(ExecutorType.Activate, _CardId.InterruptedKaijuSlumber, DefaultInterruptedKaijuSlumber);
AddExecutor(ExecutorType.SpSummon, _CardId.JizukirutheStarDestroyingKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.GadarlatheMysteryDustKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.GamecieltheSeaTurtleKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.RadiantheMultidimensionalKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.KumongoustheStickyStringKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.ThunderKingtheLightningstrikeKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.DogorantheMadFlameKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.SuperAntiKaijuWarMachineMechaDogoran, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightSummon);
AddExecutor(ExecutorType.Activate, _CardId.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightEffect);
AddExecutor(ExecutorType.Summon, _CardId.SandaionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.GabrionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.MichionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.ZaphionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.HailonTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.RaphionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.SadionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.MetaionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.KamionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.LazionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.LeftArmofTheForbiddenOne, JustDontIt);
AddExecutor(ExecutorType.Summon, _CardId.RightLegofTheForbiddenOne, JustDontIt);
AddExecutor(ExecutorType.Summon, _CardId.LeftLegofTheForbiddenOne, JustDontIt);
AddExecutor(ExecutorType.Summon, _CardId.RightArmofTheForbiddenOne, JustDontIt);
AddExecutor(ExecutorType.Summon, _CardId.ExodiaTheForbiddenOne, JustDontIt);
}
private List<int> HintMsgForEnemy = new List<int>
{
HintMsg.Release, HintMsg.Destroy, HintMsg.Remove, HintMsg.ToGrave, HintMsg.ReturnToHand, HintMsg.ToDeck,
HintMsg.FusionMaterial, HintMsg.SynchroMaterial, HintMsg.XyzMaterial, HintMsg.LinkMaterial, HintMsg.Disable
};
private List<int> HintMsgForDeck = new List<int>
{
HintMsg.SpSummon, HintMsg.ToGrave, HintMsg.Remove, HintMsg.AddToHand, HintMsg.FusionMaterial
};
private List<int> HintMsgForSelf = new List<int>
{
HintMsg.Equip
};
private List<int> HintMsgForMaterial = new List<int>
{
HintMsg.FusionMaterial, HintMsg.SynchroMaterial, HintMsg.XyzMaterial, HintMsg.LinkMaterial, HintMsg.Release
};
private List<int> HintMsgForMaxSelect = new List<int>
{
HintMsg.SpSummon, HintMsg.ToGrave, HintMsg.AddToHand, HintMsg.FusionMaterial, HintMsg.Destroy
};
public override IList<ClientCard> OnSelectCard(IList<ClientCard> _cards, int min, int max, int hint, bool cancelable)
{
if (Duel.Phase == DuelPhase.BattleStart)
return null;
if (AI.HaveSelectedCards())
return null;
IList<ClientCard> selected = new List<ClientCard>();
IList<ClientCard> cards = new List<ClientCard>(_cards);
if (max > cards.Count)
max = cards.Count;
if (HintMsgForEnemy.Contains(hint))
{
IList<ClientCard> enemyCards = cards.Where(card => card.Controller == 1).ToList();
// select enemy's card first
while (enemyCards.Count > 0 && selected.Count < max)
{
ClientCard card = enemyCards[Program.Rand.Next(enemyCards.Count)];
selected.Add(card);
enemyCards.Remove(card);
cards.Remove(card);
}
}
if (HintMsgForDeck.Contains(hint))
{
IList<ClientCard> deckCards = cards.Where(card => card.Location == CardLocation.Deck).ToList();
// select deck's card first
while (deckCards.Count > 0 && selected.Count < max)
{
ClientCard card = deckCards[Program.Rand.Next(deckCards.Count)];
selected.Add(card);
deckCards.Remove(card);
cards.Remove(card);
}
}
if (HintMsgForSelf.Contains(hint))
{
IList<ClientCard> botCards = cards.Where(card => card.Controller == 0).ToList();
// select bot's card first
while (botCards.Count > 0 && selected.Count < max)
{
ClientCard card = botCards[Program.Rand.Next(botCards.Count)];
selected.Add(card);
botCards.Remove(card);
cards.Remove(card);
}
}
if (HintMsgForMaterial.Contains(hint))
{
IList<ClientCard> materials = cards.OrderBy(card => card.Attack).ToList();
// select low attack first
while (materials.Count > 0 && selected.Count < min)
{
ClientCard card = materials[0];
selected.Add(card);
materials.Remove(card);
cards.Remove(card);
}
}
// select random cards
while (selected.Count < min)
{
ClientCard card = cards[Program.Rand.Next(cards.Count)];
selected.Add(card);
cards.Remove(card);
}
if (HintMsgForMaxSelect.Contains(hint))
{
// select max cards
while (selected.Count < max)
{
ClientCard card = cards[Program.Rand.Next(cards.Count)];
selected.Add(card);
cards.Remove(card);
}
}
return selected;
}
public override int OnSelectOption(IList<int> options)
{
return Program.Rand.Next(options.Count);
}
public override CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions)
{
YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId);
if (cardData != null)
{
if (cardData.Attack < 0)
return CardPosition.FaceUpAttack;
if (cardData.Attack <= 1000)
return CardPosition.FaceUpDefence;
}
return 0;
}
private bool ImFeelingLucky()
{
return Program.Rand.Next(10) >= 5 && DefaultDontChainMyself();
}
private bool ImFeelingUnlucky()
{
return DefaultDontChainMyself();
}
private bool ImFeelingLazy()
{
if (Executors.Any(exec => (exec.Type == ExecutorType.SummonOrSet || exec.Type == ExecutorType.Summon || exec.Type == ExecutorType.MonsterSet) && exec.CardId == Card.Id))
return false;
return DefaultMonsterSummon();
}
private bool JustDontIt()
{
return false;
}
}
}
\ No newline at end of file
...@@ -46,8 +46,8 @@ namespace WindBot.Game.AI.Decks ...@@ -46,8 +46,8 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, CardId.SwordsOfRevealingLight, SwordsOfRevealingLight); AddExecutor(ExecutorType.Activate, CardId.SwordsOfRevealingLight, SwordsOfRevealingLight);
AddExecutor(ExecutorType.Activate, CardId.DoubleSummon, DoubleSummon); AddExecutor(ExecutorType.Activate, CardId.DoubleSummon, DoubleSummon);
AddExecutor(ExecutorType.Summon, CardId.AncientGearGolem, DefaultTributeSummon); AddExecutor(ExecutorType.Summon, CardId.AncientGearGolem, DefaultMonsterSummon);
AddExecutor(ExecutorType.Summon, CardId.Frostosaurus, DefaultTributeSummon); AddExecutor(ExecutorType.Summon, CardId.Frostosaurus, DefaultMonsterSummon);
AddExecutor(ExecutorType.SummonOrSet, CardId.AlexandriteDragon); AddExecutor(ExecutorType.SummonOrSet, CardId.AlexandriteDragon);
AddExecutor(ExecutorType.SummonOrSet, CardId.GeneWarpedWarwolf); AddExecutor(ExecutorType.SummonOrSet, CardId.GeneWarpedWarwolf);
AddExecutor(ExecutorType.MonsterSet, CardId.GearGolemTheMovingFortress); AddExecutor(ExecutorType.MonsterSet, CardId.GearGolemTheMovingFortress);
......
...@@ -181,7 +181,6 @@ namespace WindBot.Game.AI.Decks ...@@ -181,7 +181,6 @@ namespace WindBot.Game.AI.Decks
private bool CymbalSkeletonUsed = false; private bool CymbalSkeletonUsed = false;
private bool BorrelswordDragonUsed = false; private bool BorrelswordDragonUsed = false;
private ClientCard RustyBardicheTarget = null; private ClientCard RustyBardicheTarget = null;
private int ShootingRiserDragonCount = 0;
private int[] HandCosts = new[] private int[] HandCosts = new[]
{ {
...@@ -215,7 +214,6 @@ namespace WindBot.Game.AI.Decks ...@@ -215,7 +214,6 @@ namespace WindBot.Game.AI.Decks
CymbalSkeletonUsed = false; CymbalSkeletonUsed = false;
BorrelswordDragonUsed = false; BorrelswordDragonUsed = false;
RustyBardicheTarget = null; RustyBardicheTarget = null;
ShootingRiserDragonCount = 0;
} }
public override void OnChainEnd() public override void OnChainEnd()
...@@ -611,10 +609,7 @@ namespace WindBot.Game.AI.Decks ...@@ -611,10 +609,7 @@ namespace WindBot.Game.AI.Decks
} }
else else
{ {
if (Duel.LastChainPlayer == 0) return Duel.LastChainPlayer != 0;
return false;
ShootingRiserDragonCount++;
return ShootingRiserDragonCount <= 10;
} }
} }
...@@ -825,8 +820,8 @@ namespace WindBot.Game.AI.Decks ...@@ -825,8 +820,8 @@ namespace WindBot.Game.AI.Decks
if (ActivateDescription == 96) if (ActivateDescription == 96)
{ {
// TODO: more FogBlade lost target // TODO: more FogBlade lost target
if ((Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) && Duel.CurrentChain.Count == 0) if ((Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) && Duel.CurrentChain.Count == 0)
return false; return false;
AI.SelectCard(CardId.OrcustCymbalSkeleton); AI.SelectCard(CardId.OrcustCymbalSkeleton);
return true; return true;
} }
...@@ -1130,22 +1125,22 @@ namespace WindBot.Game.AI.Decks ...@@ -1130,22 +1125,22 @@ namespace WindBot.Game.AI.Decks
{ {
return Duel.LastChainPlayer == 1; return Duel.LastChainPlayer == 1;
} }
else if (Duel.Phase == DuelPhase.End) else if (Duel.Phase == DuelPhase.End)
{ {
ClientCard target = null; ClientCard target = null;
target = Bot.Banished.GetFirstMatchingFaceupCard(card=>card.IsCode(CardId.OrcustCymbalSkeleton)); target = Bot.Banished.GetFirstMatchingFaceupCard(card=>card.IsCode(CardId.OrcustCymbalSkeleton));
if (target == null) if (target == null)
target = Bot.Banished.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.OrcustHarpHorror)); target = Bot.Banished.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.OrcustHarpHorror));
if (target != null) if (target != null)
{ {
AI.SelectCard(target); AI.SelectCard(target);
return true; return true;
} }
if(!Bot.HasInHand(CardId.OrcustHarpHorror) && Bot.GetRemainingCount(CardId.OrcustHarpHorror, 2) > 1) if(!Bot.HasInHand(CardId.OrcustHarpHorror) && Bot.GetRemainingCount(CardId.OrcustHarpHorror, 2) > 1)
{ {
AI.SelectCard(CardId.OrcustHarpHorror); AI.SelectCard(CardId.OrcustHarpHorror);
return true; return true;
} }
} }
return false; return false;
} }
......
...@@ -117,13 +117,11 @@ namespace WindBot.Game.AI.Decks ...@@ -117,13 +117,11 @@ namespace WindBot.Game.AI.Decks
bool summon_used = false; bool summon_used = false;
bool CardOfDemiseeff_used = false; bool CardOfDemiseeff_used = false;
bool SeaStealthAttackeff_used = false; bool SeaStealthAttackeff_used = false;
int City_count = 0;
public override void OnNewTurn() public override void OnNewTurn()
{ {
summon_used = false; summon_used = false;
CardOfDemiseeff_used = false; CardOfDemiseeff_used = false;
SeaStealthAttackeff_used = false; SeaStealthAttackeff_used = false;
City_count = 0;
base.OnNewTurn(); base.OnNewTurn();
} }
private bool PreventFeatherDustereff() private bool PreventFeatherDustereff()
...@@ -356,9 +354,6 @@ namespace WindBot.Game.AI.Decks ...@@ -356,9 +354,6 @@ namespace WindBot.Game.AI.Decks
} }
else else
{ {
if (City_count > 10)
return false;
ClientCard target = null; ClientCard target = null;
foreach(ClientCard s in Bot.GetSpells()) foreach(ClientCard s in Bot.GetSpells())
{ {
...@@ -380,7 +375,6 @@ namespace WindBot.Game.AI.Decks ...@@ -380,7 +375,6 @@ namespace WindBot.Game.AI.Decks
break; break;
} }
} }
City_count++;
AI.SelectPlace(Zones.z1 | Zones.z3); AI.SelectPlace(Zones.z1 | Zones.z3);
AI.SelectCard(CardId.PhantasmSprialBattle); AI.SelectCard(CardId.PhantasmSprialBattle);
return true; return true;
......
...@@ -215,8 +215,7 @@ namespace WindBot.Game.AI.Decks ...@@ -215,8 +215,7 @@ namespace WindBot.Game.AI.Decks
private bool Summon_used; private bool Summon_used;
private bool Pilica_eff; private bool Pilica_eff;
private bool plan_A; private bool plan_A;
private int SnowBell_count = 0;
//TODO: reset the flags when they should reset ( public override void OnNewTurn() )
public PureWindsExecutor(GameAI ai, Duel duel) public PureWindsExecutor(GameAI ai, Duel duel)
: base(ai, duel) : base(ai, duel)
{ {
...@@ -302,7 +301,6 @@ namespace WindBot.Game.AI.Decks ...@@ -302,7 +301,6 @@ namespace WindBot.Game.AI.Decks
Summon_used = false; Summon_used = false;
Pilica_eff = false; Pilica_eff = false;
plan_A = false; plan_A = false;
SnowBell_count = 0;
base.OnNewTurn(); base.OnNewTurn();
} }
private bool windaset() private bool windaset()
...@@ -770,7 +768,6 @@ namespace WindBot.Game.AI.Decks ...@@ -770,7 +768,6 @@ namespace WindBot.Game.AI.Decks
private bool WindwitchSnowBellsp() private bool WindwitchSnowBellsp()
{ {
if (SnowBell_count >= 5) return false;
if ((Bot.HasInMonstersZone(CardId.CrystalWingSynchroDragon) || if ((Bot.HasInMonstersZone(CardId.CrystalWingSynchroDragon) ||
Bot.HasInMonstersZone(CardId.DaigustoSphreez) || Bot.HasInMonstersZone(CardId.DaigustoSphreez) ||
Bot.HasInMonstersZone(CardId.MistWurm)) && Bot.HasInMonstersZone(CardId.MistWurm)) &&
...@@ -786,7 +783,6 @@ namespace WindBot.Game.AI.Decks ...@@ -786,7 +783,6 @@ namespace WindBot.Game.AI.Decks
(Util.GetBotAvailZonesFromExtraDeck() == 0)) (Util.GetBotAvailZonesFromExtraDeck() == 0))
return false; return false;
AI.SelectPosition(CardPosition.FaceUpDefence); AI.SelectPosition(CardPosition.FaceUpDefence);
SnowBell_count++;
return true; return true;
} }
private bool DaigustoSphreezsp() private bool DaigustoSphreezsp()
......
using System; using YGOSharp.OCGWrapper;
using YGOSharp.OCGWrapper.Enums; using YGOSharp.OCGWrapper.Enums;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using WindBot;
using WindBot; using WindBot.Game;
using WindBot.Game; using WindBot.Game.AI;
using WindBot.Game.AI; using System.Linq;
using System.Linq;
using System.Reflection; namespace WindBot.Game.AI.Decks
{
namespace WindBot.Game.AI.Decks [Deck("TimeThief", "AI_Timethief")]
{ public class TimeThiefExecutor : DefaultExecutor
[Deck("TimeThief", "AI_Timethief")] {
public class TimeThiefExecutor : DefaultExecutor public class Monsters
{ {
public class Monsters //monsters
{ public const int TimeThiefWinder = 56308388;
//monsters public const int TimeThiefBezelShip = 82496079;
public const int TimeThiefWinder = 56308388; public const int TimeThiefCronocorder = 74578720;
public const int TimeThiefBezelShip = 82496079; public const int TimeThiefRegulator = 19891131;
public const int TimeThiefCronocorder = 74578720; public const int PhotonTrasher = 65367484;
public const int TimeThiefRegulator = 19891131; public const int PerformTrickClown = 67696066;
public const int PhotonTrasher = 65367484; public const int ThunderKingRaiOh = 71564252;
public const int PerformTrickClown = 67696066; public const int MaxxC = 23434538;
} public const int AshBlossomAndJoyousSpring = 14558127;
}
public class Spells
{ public class CardId
// spells {
public const int UpstartGoblin = 70368879; public const int ImperialOrder = 61740673;
public const int Raigeki = 12580477; public const int NaturalExterio = 99916754;
public const int FoolishBurial = 81439173; public const int NaturalBeast = 33198837;
public const int TimeThiefStartup = 10877309; public const int SwordsmanLV7 = 37267041;
public const int TimeThiefHack = 81670445; public const int RoyalDecreel = 51452091;
} }
public class Traps
{ public class Spells
//traps {
public const int XyzReborn = 26708437; // spells
public const int XyzExtreme = 57319935; public const int Raigeki = 12580477;
public const int TimeThiefRetrograte = 76587747; public const int FoolishBurial = 81439173;
public const int PhantomKnightsShade = 98827725; public const int TimeThiefStartup = 10877309;
public const int TimeThiefFlyBack = 18678554; public const int TimeThiefHack = 81670445;
} public const int HarpieFeatherDuster = 18144506;
public class XYZs public const int PotOfDesires = 35261759;
{ public const int PotofExtravagance = 49238328;
//xyz }
public const int TimeThiefRedoer = 55285840; public class Traps
public const int TimeThiefPerpetua = 59208943; {
public const int CrazyBox = 42421606; //traps
} public const int SolemnWarning = 84749824;
public const int SolemStrike = 40605147;
public const int SolemnJudgment = 41420027;
public const int TimeThiefRetrograte = 76587747;
public TimeThiefExecutor(GameAI ai, Duel duel) public const int PhantomKnightsShade = 98827725;
: base(ai, duel) public const int TimeThiefFlyBack = 18678554;
{ public const int Crackdown = 36975314;
// executors }
//Spell activate public class XYZs
AddExecutor(ExecutorType.Activate,Spells.UpstartGoblin); {
AddExecutor(ExecutorType.Activate,Spells.FoolishBurial,FoolishBurialTarget); //xyz
AddExecutor(ExecutorType.Activate,Spells.TimeThiefStartup,TimeThiefStartupEffect); public const int TimeThiefRedoer = 55285840;
AddExecutor(ExecutorType.Activate,Spells.TimeThiefHack); public const int TimeThiefPerpetua = 59208943;
public const int CrazyBox = 42421606;
// trap executors set public const int GagagaCowboy = 12014404;
AddExecutor(ExecutorType.SpellSet,Traps.XyzExtreme); public const int Number39Utopia = 84013237;
AddExecutor(ExecutorType.SpellSet,Traps.XyzReborn); public const int NumberS39UtopiatheLightning = 56832966;
AddExecutor(ExecutorType.SpellSet,Traps.PhantomKnightsShade); public const int NumberS39UtopiaOne = 86532744;
AddExecutor(ExecutorType.SpellSet,Traps.TimeThiefRetrograte); public const int DarkRebellionXyzDragon = 16195942;
AddExecutor(ExecutorType.SpellSet,Traps.TimeThiefFlyBack); public const int EvilswarmExcitonKnight = 46772449;
}
//normal summons
AddExecutor(ExecutorType.Summon,Monsters.TimeThiefRegulator );
AddExecutor(ExecutorType.SpSummon, Monsters.PhotonTrasher, SummonToDef );
AddExecutor(ExecutorType.Summon,Monsters.TimeThiefWinder ); public TimeThiefExecutor(GameAI ai, Duel duel)
AddExecutor(ExecutorType.Summon,Monsters.TimeThiefBezelShip ); : base(ai, duel)
AddExecutor(ExecutorType.Summon,Monsters.PerformTrickClown ); {
AddExecutor(ExecutorType.Summon,Monsters.TimeThiefCronocorder ); // executors
//xyz summons //Spell activate
AddExecutor(ExecutorType.SpSummon,XYZs.TimeThiefRedoer); AddExecutor(ExecutorType.Activate, Spells.Raigeki, DefaultDarkHole);
AddExecutor(ExecutorType.SpSummon,XYZs.TimeThiefPerpetua); AddExecutor(ExecutorType.Activate, Spells.FoolishBurial, FoolishBurialTarget);
// activate trap AddExecutor(ExecutorType.Activate, Spells.TimeThiefStartup, TimeThiefStartupEffect);
AddExecutor(ExecutorType.Activate,Traps.PhantomKnightsShade); AddExecutor(ExecutorType.Activate, Spells.TimeThiefHack);
AddExecutor(ExecutorType.Activate,Traps.XyzExtreme , XyzExtremeEffect); AddExecutor(ExecutorType.Activate, Spells.PotofExtravagance, PotofExtravaganceActivate);
AddExecutor(ExecutorType.Activate,Traps.XyzReborn , XyzRebornEffect); AddExecutor(ExecutorType.Activate, Spells.HarpieFeatherDuster, DefaultHarpiesFeatherDusterFirst);
AddExecutor(ExecutorType.Activate,Traps.TimeThiefRetrograte , RetrograteEffect); AddExecutor(ExecutorType.Activate, Spells.PotOfDesires, PotOfDesireseff);
AddExecutor(ExecutorType.Activate,Traps.TimeThiefFlyBack ); // trap executors set
AddExecutor(ExecutorType.SpellSet, Traps.PhantomKnightsShade);
//xyz effects AddExecutor(ExecutorType.SpellSet, Traps.TimeThiefRetrograte);
AddExecutor(ExecutorType.Activate,XYZs.TimeThiefRedoer,RedoerEffect); AddExecutor(ExecutorType.SpellSet, Traps.TimeThiefFlyBack);
AddExecutor(ExecutorType.Activate,XYZs.TimeThiefPerpetua , PerpertuaEffect); AddExecutor(ExecutorType.SpellSet, Traps.SolemnWarning);
AddExecutor(ExecutorType.SpellSet, Traps.SolemStrike);
//monster effects AddExecutor(ExecutorType.SpellSet, Traps.SolemnJudgment);
AddExecutor(ExecutorType.Activate,Monsters.TimeThiefRegulator , RegulatorEffect); AddExecutor(ExecutorType.SpellSet, Traps.Crackdown);
AddExecutor(ExecutorType.Activate,Monsters.TimeThiefWinder); //normal summons
AddExecutor(ExecutorType.Activate,Monsters.TimeThiefCronocorder); AddExecutor(ExecutorType.Summon, Monsters.TimeThiefRegulator);
AddExecutor(ExecutorType.Activate,Monsters.PerformTrickClown, TrickClownEffect); AddExecutor(ExecutorType.SpSummon, Monsters.PhotonTrasher, SummonToDef);
AddExecutor(ExecutorType.Activate,Monsters.TimeThiefBezelShip); AddExecutor(ExecutorType.Summon, Monsters.TimeThiefWinder);
} AddExecutor(ExecutorType.Summon, Monsters.TimeThiefBezelShip);
AddExecutor(ExecutorType.Summon, Monsters.PerformTrickClown);
private bool SummonToDef() AddExecutor(ExecutorType.Summon, Monsters.TimeThiefCronocorder);
{ AddExecutor(ExecutorType.Summon, Monsters.ThunderKingRaiOh, ThunderKingRaiOhsummon);
AI.SelectPosition(CardPosition.Defence); //xyz summons
return true; AddExecutor(ExecutorType.SpSummon, XYZs.TimeThiefRedoer);
} AddExecutor(ExecutorType.SpSummon, XYZs.TimeThiefPerpetua);
AddExecutor(ExecutorType.SpSummon, XYZs.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightSummon);
AddExecutor(ExecutorType.SpSummon, XYZs.GagagaCowboy, GagagaCowboySummon);
private bool RegulatorEffect() AddExecutor(ExecutorType.SpSummon, XYZs.Number39Utopia, DefaultNumberS39UtopiaTheLightningSummon);
{ AddExecutor(ExecutorType.SpSummon, XYZs.NumberS39UtopiaOne);
if (Card.Location == CardLocation.MonsterZone) AddExecutor(ExecutorType.SpSummon, XYZs.NumberS39UtopiatheLightning);
{ AddExecutor(ExecutorType.SpSummon, XYZs.DarkRebellionXyzDragon, DarkRebellionXyzDragonSummon);
AI.SelectCard(Monsters.TimeThiefCronocorder); //activate trap
AI.SelectCard(Monsters.TimeThiefWinder); AddExecutor(ExecutorType.Activate, Traps.PhantomKnightsShade);
return true; AddExecutor(ExecutorType.Activate, Traps.TimeThiefRetrograte, RetrograteEffect);
} AddExecutor(ExecutorType.Activate, Traps.TimeThiefFlyBack);
AddExecutor(ExecutorType.Activate, Traps.SolemnWarning, DefaultSolemnWarning);
if (Card.Location == CardLocation.Grave) AddExecutor(ExecutorType.Activate, Traps.SolemStrike, DefaultSolemnStrike);
{ AddExecutor(ExecutorType.Activate, Traps.SolemnJudgment, DefaultSolemnJudgment);
return true; AddExecutor(ExecutorType.Activate, Traps.Crackdown, Crackdowneff);
} //xyz effects
AddExecutor(ExecutorType.Activate, XYZs.TimeThiefRedoer, RedoerEffect);
return false; AddExecutor(ExecutorType.Activate, XYZs.TimeThiefPerpetua, PerpertuaEffect);
} AddExecutor(ExecutorType.Activate, XYZs.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightEffect);
AddExecutor(ExecutorType.Activate, XYZs.GagagaCowboy);
private bool PerpertuaEffect() AddExecutor(ExecutorType.Activate, XYZs.NumberS39UtopiatheLightning, DefaultNumberS39UtopiaTheLightningEffect);
{ AddExecutor(ExecutorType.Activate, XYZs.DarkRebellionXyzDragon, DarkRebellionXyzDragonEffect);
if (Bot.HasInGraveyard(XYZs.TimeThiefRedoer))
{ //monster effects
AI.SelectCard(XYZs.TimeThiefRedoer); AddExecutor(ExecutorType.Activate, Monsters.TimeThiefRegulator, RegulatorEffect);
return true; AddExecutor(ExecutorType.Activate, Monsters.TimeThiefWinder);
} AddExecutor(ExecutorType.Activate, Monsters.TimeThiefCronocorder);
AddExecutor(ExecutorType.Activate, Monsters.PerformTrickClown, TrickClownEffect);
if (Bot.HasInMonstersZone(XYZs.TimeThiefRedoer)) AddExecutor(ExecutorType.Activate, Monsters.TimeThiefBezelShip);
{ AddExecutor(ExecutorType.Activate, Monsters.ThunderKingRaiOh, ThunderKingRaiOheff);
AI.SelectCard(Monsters.TimeThiefBezelShip); AddExecutor(ExecutorType.Activate, Monsters.AshBlossomAndJoyousSpring, DefaultAshBlossomAndJoyousSpring);
AI.SelectNextCard(XYZs.TimeThiefRedoer); AddExecutor(ExecutorType.Activate, Monsters.MaxxC, DefaultMaxxC);
return true; }
}
public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false, List<int> avoid_list = null)
return false; {
} List<int> list = new List<int> { 0, 1, 2, 3, 4 };
int n = list.Count;
private int _totalAttack; while (n-- > 1)
private int _totalBotAttack; {
private bool RedoerEffect() int index = Program.Rand.Next(n + 1);
{ int temp = list[index];
list[index] = list[n];
List<ClientCard> enemy = Enemy.GetMonstersInMainZone(); list[n] = temp;
List<int> units = Card.Overlays; }
if (Duel.Phase == DuelPhase.Standby && (AI.Executor.Util.GetStringId(XYZs.TimeThiefRedoer,0) == foreach (int seq in list)
ActivateDescription)) {
{ int zone = (int)System.Math.Pow(2, seq);
if (Bot.SpellZone[seq] == null)
return true; {
} if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence) continue;
if (avoid_list != null && avoid_list.Contains(seq)) continue;
try AI.SelectPlace(zone);
{ return;
if (Bot.HasInSpellZone(Traps.XyzReborn)) };
{ }
return false; AI.SelectPlace(0);
} }
if (Bot.HasInSpellZone(Traps.XyzExtreme)) public bool SpellNegatable(bool isCounter = false, ClientCard target = null)
{ {
return false; // target default set
} if (target == null) target = Card;
// won't negate if not on field
for (int i = 0; i < enemy.Count; i++) if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false;
{
_totalAttack += enemy[i].Attack; // negate judge
} if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true;
if (target.IsSpell())
foreach (var t in Bot.GetMonsters()) {
{ if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true;
_totalBotAttack += t.Attack; if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true;
} if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true;
}
if (_totalAttack > Bot.LifePoints + _totalBotAttack) if (target.IsTrap())
{ {
return false; if (Enemy.HasInSpellZone(CardId.RoyalDecreel, true) || Bot.HasInSpellZone(CardId.RoyalDecreel, true)) return true;
} }
// how to get here?
return false;
}
foreach (var t in enemy) private bool SummonToDef()
{ {
if (t.Attack < 2400 || !t.IsAttack()) continue; AI.SelectPosition(CardPosition.Defence);
try return true;
{ }
AI.SelectCard(t.Id); private bool RegulatorEffect()
AI.SelectCard(t.Id); {
} if (Card.Location == CardLocation.MonsterZone)
catch{} {
AI.SelectCard(Monsters.TimeThiefCronocorder);
return true; AI.SelectCard(Monsters.TimeThiefWinder);
} return true;
} }
catch{}
if (Card.Location == CardLocation.Grave)
if (Bot.UnderAttack) {
{ return true;
//AI.SelectCard(Util.GetBestEnemyMonster()); }
return true;
} return false;
}
return false;
private bool PerpertuaEffect()
} {
if (Bot.HasInGraveyard(XYZs.TimeThiefRedoer))
private bool RetrograteEffect() {
{ AI.SelectCard(XYZs.TimeThiefRedoer);
if (Card.Owner== 1) return true;
{ }
return true;
} if (Bot.HasInMonstersZone(XYZs.TimeThiefRedoer))
return false; {
AI.SelectCard(Monsters.TimeThiefBezelShip);
} AI.SelectNextCard(XYZs.TimeThiefRedoer);
return true;
private bool XyzRebornEffect() }
{
if (Bot.HasInGraveyard(XYZs.TimeThiefRedoer)) return false;
{ }
AI.SelectCard(XYZs.TimeThiefRedoer);
return true; private int _totalAttack;
} private int _totalBotAttack;
return true; private bool RedoerEffect()
{
}
//function List<ClientCard> enemy = Enemy.GetMonstersInMainZone();
private bool XyzExtremeEffect() List<int> units = Card.Overlays;
{ if (Duel.Phase == DuelPhase.Standby && (AI.Executor.Util.GetStringId(XYZs.TimeThiefRedoer, 0) ==
AI.SelectCard(XYZs.CrazyBox); ActivateDescription))
return true; {
}
private bool TimeThiefStartupEffect() return true;
{ }
if (Card.Location == CardLocation.Hand)
{ try
if (Bot.HasInHand(Monsters.TimeThiefRegulator) && !(Bot.GetMonsterCount() > 0)) {
{ for (int i = 0; i < enemy.Count; i++)
AI.SelectCard(Monsters.TimeThiefRegulator); {
return true; _totalAttack += enemy[i].Attack;
} }
if(Bot.HasInHand(Monsters.TimeThiefWinder) && Bot.GetMonsterCount()>1)
{ foreach (var t in Bot.GetMonsters())
AI.SelectCard(Monsters.TimeThiefWinder); {
return true; _totalBotAttack += t.Attack;
} }
return true;
if (_totalAttack > Bot.LifePoints + _totalBotAttack)
} {
if (Card.Location == CardLocation.Grave) return false;
{ }
AI.SelectCard(Monsters.TimeThiefCronocorder);
AI.SelectCard(Spells.TimeThiefHack);
AI.SelectCard(Traps.TimeThiefFlyBack);
return true; foreach (var t in enemy)
} {
if (t.Attack < 2400 || !t.IsAttack()) continue;
return false; try
{
} AI.SelectCard(t.Id);
private bool FoolishBurialTarget() AI.SelectCard(t.Id);
{ }
AI.SelectCard(Monsters.PerformTrickClown); catch { }
return true;
} return true;
}
private bool TrickClownEffect() }
{ catch { }
if (Bot.LifePoints <= 1000)
{ if (Bot.UnderAttack)
return false; {
} //AI.SelectCard(Util.GetBestEnemyMonster());
AI.SelectPosition(CardPosition.FaceUpDefence); return true;
return true; }
}
return false;
}
} private bool RetrograteEffect()
{
} if (Card.Owner == 1)
{
return true;
}
return false;
}
private bool TimeThiefStartupEffect()
{
if (Card.Location == CardLocation.Hand)
{
if (Bot.HasInHand(Monsters.TimeThiefRegulator) && !(Bot.GetMonsterCount() > 0))
{
AI.SelectCard(Monsters.TimeThiefRegulator);
return true;
}
if (Bot.HasInHand(Monsters.TimeThiefWinder) && Bot.GetMonsterCount() > 1)
{
AI.SelectCard(Monsters.TimeThiefWinder);
return true;
}
return true;
}
if (Card.Location == CardLocation.Grave)
{
AI.SelectCard(Monsters.TimeThiefCronocorder);
AI.SelectCard(Spells.TimeThiefHack);
AI.SelectCard(Traps.TimeThiefFlyBack);
return true;
}
return false;
}
private bool FoolishBurialTarget()
{
AI.SelectCard(Monsters.PerformTrickClown);
return true;
}
private bool TrickClownEffect()
{
if (Bot.LifePoints <= 1000)
{
return false;
}
AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
}
private bool GagagaCowboySummon()
{
if (Enemy.LifePoints <= 800 || (Bot.GetMonsterCount() >= 4 && Enemy.LifePoints <= 1600))
{
AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
}
return false;
}
private bool DarkRebellionXyzDragonSummon()
{
int selfBestAttack = Util.GetBestAttack(Bot);
int oppoBestAttack = Util.GetBestAttack(Enemy);
return selfBestAttack <= oppoBestAttack;
}
private bool DarkRebellionXyzDragonEffect()
{
int oppoBestAttack = Util.GetBestAttack(Enemy);
ClientCard target = Util.GetOneEnemyBetterThanValue(oppoBestAttack, true);
if (target != null)
{
AI.SelectCard(0);
AI.SelectNextCard(target);
}
return true;
}
private bool ThunderKingRaiOhsummon()
{
if (Bot.MonsterZone[0] == null)
AI.SelectPlace(Zones.z0);
else
AI.SelectPlace(Zones.z4);
return true;
}
private bool ThunderKingRaiOheff()
{
if (Duel.SummoningCards.Count > 0)
{
foreach (ClientCard m in Duel.SummoningCards)
{
if (m.Attack >= 1900)
return true;
}
}
return false;
}
private bool Crackdowneff()
{
if (Util.GetOneEnemyBetterThanMyBest(true, true) != null && Bot.UnderAttack)
AI.SelectCard(Util.GetOneEnemyBetterThanMyBest(true, true));
return Util.GetOneEnemyBetterThanMyBest(true, true) != null && Bot.UnderAttack;
}
private bool PotOfDesireseff()
{
return Bot.Deck.Count > 14 && !DefaultSpellWillBeNegated();
}
// activate of PotofExtravagance
public bool PotofExtravaganceActivate()
{
// won't activate if it'll be negate
if (SpellNegatable()) return false;
SelectSTPlace(Card, true);
AI.SelectOption(1);
return true;
}
}
}
...@@ -73,7 +73,6 @@ namespace WindBot.Game.AI.Decks ...@@ -73,7 +73,6 @@ namespace WindBot.Game.AI.Decks
bool snake_four_s = false; bool snake_four_s = false;
bool tuner_eff_used = false; bool tuner_eff_used = false;
bool crystal_eff_used = false; bool crystal_eff_used = false;
int red_ss_count = 0;
bool white_eff_used = false; bool white_eff_used = false;
bool lockbird_useful = false; bool lockbird_useful = false;
bool lockbird_used = false; bool lockbird_used = false;
...@@ -758,7 +757,6 @@ namespace WindBot.Game.AI.Decks ...@@ -758,7 +757,6 @@ namespace WindBot.Game.AI.Decks
public bool Red_ss() public bool Red_ss()
{ {
if (red_ss_count >= 6) return false;
if ((Util.ChainContainsCard(CardId.DarkHole) || Util.ChainContainsCard(99330325) || Util.ChainContainsCard(53582587)) && Util.ChainContainsCard(CardId.Red)) return false; if ((Util.ChainContainsCard(CardId.DarkHole) || Util.ChainContainsCard(99330325) || Util.ChainContainsCard(53582587)) && Util.ChainContainsCard(CardId.Red)) return false;
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Red)) if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Red))
{ {
...@@ -766,7 +764,6 @@ namespace WindBot.Game.AI.Decks ...@@ -766,7 +764,6 @@ namespace WindBot.Game.AI.Decks
{ {
if (Util.IsChainTarget(m) && IsTrickstar(m.Id)) if (Util.IsChainTarget(m) && IsTrickstar(m.Id))
{ {
red_ss_count += 1;
AI.SelectCard(m); AI.SelectCard(m);
Red_SelectPos(); Red_SelectPos();
return true; return true;
...@@ -789,7 +786,6 @@ namespace WindBot.Game.AI.Decks ...@@ -789,7 +786,6 @@ namespace WindBot.Game.AI.Decks
{ {
AI.SelectCard(c); AI.SelectCard(c);
Red_SelectPos(c); Red_SelectPos(c);
red_ss_count += 1;
return true; return true;
} }
if (c.IsCode(CardId.Pink)) return false; if (c.IsCode(CardId.Pink)) return false;
...@@ -800,14 +796,12 @@ namespace WindBot.Game.AI.Decks ...@@ -800,14 +796,12 @@ namespace WindBot.Game.AI.Decks
if (tosolve_enemy.Attack > 3200) AI.SelectPosition(CardPosition.FaceUpDefence); if (tosolve_enemy.Attack > 3200) AI.SelectPosition(CardPosition.FaceUpDefence);
AI.SelectCard(c); AI.SelectCard(c);
Red_SelectPos(c); Red_SelectPos(c);
red_ss_count += 1;
return true; return true;
} }
if (!Bot.HasInHand(CardId.White) && tosolve_enemy.Attack <= 3200 && c.IsCode(CardId.White)) if (!Bot.HasInHand(CardId.White) && tosolve_enemy.Attack <= 3200 && c.IsCode(CardId.White))
{ {
AI.SelectCard(c); AI.SelectCard(c);
Red_SelectPos(c); Red_SelectPos(c);
red_ss_count += 1;
return true; return true;
} }
if (!Bot.HasInHand(CardId.White) && c.Attack < tosolve_enemy.Attack) if (!Bot.HasInHand(CardId.White) && c.Attack < tosolve_enemy.Attack)
...@@ -824,7 +818,6 @@ namespace WindBot.Game.AI.Decks ...@@ -824,7 +818,6 @@ namespace WindBot.Game.AI.Decks
if (tosolve_enemy.Attack > 1600) AI.SelectPosition(CardPosition.FaceUpDefence); if (tosolve_enemy.Attack > 1600) AI.SelectPosition(CardPosition.FaceUpDefence);
AI.SelectCard(c); AI.SelectCard(c);
Red_SelectPos(c); Red_SelectPos(c);
red_ss_count += 1;
return true; return true;
} }
} }
...@@ -845,7 +838,6 @@ namespace WindBot.Game.AI.Decks ...@@ -845,7 +838,6 @@ namespace WindBot.Game.AI.Decks
{ {
AI.SelectCard(card); AI.SelectCard(card);
Red_SelectPos(card); Red_SelectPos(card);
red_ss_count += 1;
return true; return true;
} }
} }
...@@ -1710,7 +1702,6 @@ namespace WindBot.Game.AI.Decks ...@@ -1710,7 +1702,6 @@ namespace WindBot.Game.AI.Decks
pink_ss = false; pink_ss = false;
snake_four_s = false; snake_four_s = false;
crystal_eff_used = false; crystal_eff_used = false;
red_ss_count = 0;
white_eff_used = false; white_eff_used = false;
lockbird_useful = false; lockbird_useful = false;
lockbird_used = false; lockbird_used = false;
......
...@@ -197,7 +197,6 @@ namespace WindBot.Game.AI.Decks ...@@ -197,7 +197,6 @@ namespace WindBot.Game.AI.Decks
bool MagicianRightHand_used = false; bool MagicianRightHand_used = false;
ClientCard MagiciansLeftHand_negate = null; ClientCard MagiciansLeftHand_negate = null;
ClientCard MagicianRightHand_negate = null; ClientCard MagicianRightHand_negate = null;
int PSYOmega_count = 0;
// go first // go first
public override bool OnSelectHand() public override bool OnSelectHand()
...@@ -283,8 +282,7 @@ namespace WindBot.Game.AI.Decks ...@@ -283,8 +282,7 @@ namespace WindBot.Game.AI.Decks
FirstCheckSS.Clear(); FirstCheckSS.Clear();
UseSSEffect.Clear(); UseSSEffect.Clear();
ActivatedCards.Clear(); ActivatedCards.Clear();
int PSYOmega_count = 0; // CalledbytheGrave refresh
// CalledbytheGrave refrest
List<int> key_list = CalledbytheGraveCount.Keys.ToList(); List<int> key_list = CalledbytheGraveCount.Keys.ToList();
foreach (int dic in key_list) foreach (int dic in key_list)
{ {
...@@ -311,8 +309,8 @@ namespace WindBot.Game.AI.Decks ...@@ -311,8 +309,8 @@ namespace WindBot.Game.AI.Decks
// overwrite OnSelectCard to act normally in SelectUnselect // overwrite OnSelectCard to act normally in SelectUnselect
public override IList<ClientCard> OnSelectCard(IList<ClientCard> cards, int min, int max, int hint, bool cancelable) public override IList<ClientCard> OnSelectCard(IList<ClientCard> cards, int min, int max, int hint, bool cancelable)
{ {
// Patronus HINTMSG_ATOHAND // Patronus
if (hint == 506) if (hint == HintMsg.AddToHand)
{ {
bool flag = true; bool flag = true;
foreach(ClientCard card in cards) foreach(ClientCard card in cards)
...@@ -336,8 +334,8 @@ namespace WindBot.Game.AI.Decks ...@@ -336,8 +334,8 @@ namespace WindBot.Game.AI.Decks
return selected; return selected;
} }
} }
// MaxxC HINTMSG_SPSUMMON // MaxxC solution
if (hint == 509 && enemy_activate_MaxxC) if (hint == HintMsg.SpSummon && enemy_activate_MaxxC)
{ {
// check whether SS from deck while using effect // check whether SS from deck while using effect
bool flag = true; bool flag = true;
...@@ -394,8 +392,8 @@ namespace WindBot.Game.AI.Decks ...@@ -394,8 +392,8 @@ namespace WindBot.Game.AI.Decks
} }
} }
} }
// MadameVerre HINTMSG_CONFIRM // MadameVerre
if (hint == 526) if (hint == HintMsg.Confirm)
{ {
Logger.DebugWriteLine("** min-max: " + min.ToString() + " / " + max.ToString()); Logger.DebugWriteLine("** min-max: " + min.ToString() + " / " + max.ToString());
foreach (ClientCard card in cards) foreach (ClientCard card in cards)
...@@ -976,8 +974,6 @@ namespace WindBot.Game.AI.Decks ...@@ -976,8 +974,6 @@ namespace WindBot.Game.AI.Decks
// check // check
bool have_FiveRainbow = false; bool have_FiveRainbow = false;
List<ClientCard> list = new List<ClientCard>(); List<ClientCard> list = new List<ClientCard>();
ClientCard l = null;
ClientCard r = null;
if (Duel.IsNewRule || Duel.IsNewRule2020) if (Duel.IsNewRule || Duel.IsNewRule2020)
{ {
list.Add(Enemy.SpellZone[0]); list.Add(Enemy.SpellZone[0]);
...@@ -2503,20 +2499,15 @@ namespace WindBot.Game.AI.Decks ...@@ -2503,20 +2499,15 @@ namespace WindBot.Game.AI.Decks
// recycle from grave // recycle from grave
if (Card.Location == CardLocation.Grave) if (Card.Location == CardLocation.Grave)
{ {
if (PSYOmega_count >= 5){
return false;
}
List<ClientCard> enemy_danger = CheckDangerousCardinEnemyGrave(); List<ClientCard> enemy_danger = CheckDangerousCardinEnemyGrave();
if (enemy_danger.Count > 0) if (enemy_danger.Count > 0)
{ {
AI.SelectCard(enemy_danger); AI.SelectCard(enemy_danger);
PSYOmega_count ++;
return true; return true;
} }
if (!Bot.HasInHandOrInSpellZoneOrInGraveyard(CardId.Holiday) && Bot.HasInGraveyard(important_witchcraft)) if (!Bot.HasInHandOrInSpellZoneOrInGraveyard(CardId.Holiday) && Bot.HasInGraveyard(important_witchcraft))
{ {
AI.SelectCard(important_witchcraft); AI.SelectCard(important_witchcraft);
PSYOmega_count ++;
return true; return true;
} }
if (CheckProblematicCards() == null) if (CheckProblematicCards() == null)
...@@ -2525,7 +2516,6 @@ namespace WindBot.Game.AI.Decks ...@@ -2525,7 +2516,6 @@ namespace WindBot.Game.AI.Decks
CardId.MaxxC, CardId.AshBlossom_JoyousSpring, CardId.MaxxC, CardId.AshBlossom_JoyousSpring,
CardId.MagicianRightHand, CardId.MagiciansLeftHand, CardId.MagiciansRestage, CardId.Patronus, CardId.MagicianRightHand, CardId.MagiciansLeftHand, CardId.MagiciansRestage, CardId.Patronus,
CardId.LightningStorm, CardId.Reasoning); CardId.LightningStorm, CardId.Reasoning);
PSYOmega_count ++;
return true; return true;
} }
} }
......
...@@ -100,6 +100,7 @@ namespace WindBot.Game.AI.Decks ...@@ -100,6 +100,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Summon, CardId.Goblindbergh); AddExecutor(ExecutorType.Summon, CardId.Goblindbergh);
AddExecutor(ExecutorType.Summon, CardId.TinGoldfish); AddExecutor(ExecutorType.Summon, CardId.TinGoldfish);
AddExecutor(ExecutorType.Summon, CardId.SummonerMonk); AddExecutor(ExecutorType.Summon, CardId.SummonerMonk);
AddExecutor(ExecutorType.Summon, CardId.Honest);
// Summons: Effects // Summons: Effects
AddExecutor(ExecutorType.Activate, CardId.Goblindbergh, GoblindberghEffect); AddExecutor(ExecutorType.Activate, CardId.Goblindbergh, GoblindberghEffect);
...@@ -122,13 +123,6 @@ namespace WindBot.Game.AI.Decks ...@@ -122,13 +123,6 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, CardId.SolemnStrike, DefaultSolemnStrike); AddExecutor(ExecutorType.Activate, CardId.SolemnStrike, DefaultSolemnStrike);
} }
private int ZwCount = 0;
public override void OnNewTurn()
{
ZwCount = 0;
}
public override bool OnSelectHand() public override bool OnSelectHand()
{ {
return false; return false;
...@@ -177,8 +171,7 @@ namespace WindBot.Game.AI.Decks ...@@ -177,8 +171,7 @@ namespace WindBot.Game.AI.Decks
private bool ZwWeapon() private bool ZwWeapon()
{ {
ZwCount++; return true;
return ZwCount < 10;
} }
private bool ReinforcementOfTheArmy() private bool ReinforcementOfTheArmy()
......
...@@ -47,7 +47,6 @@ namespace WindBot.Game.AI.Decks ...@@ -47,7 +47,6 @@ namespace WindBot.Game.AI.Decks
bool TigermortarSpsummoned = false; bool TigermortarSpsummoned = false;
bool ChakanineSpsummoned = false; bool ChakanineSpsummoned = false;
bool BroadbullSpsummoned = false; bool BroadbullSpsummoned = false;
int WhiptailEffectCount = 0;
public ZoodiacExecutor(GameAI ai, Duel duel) public ZoodiacExecutor(GameAI ai, Duel duel)
: base(ai, duel) : base(ai, duel)
...@@ -128,7 +127,6 @@ namespace WindBot.Game.AI.Decks ...@@ -128,7 +127,6 @@ namespace WindBot.Game.AI.Decks
TigermortarSpsummoned = false; TigermortarSpsummoned = false;
ChakanineSpsummoned = false; ChakanineSpsummoned = false;
BroadbullSpsummoned = false; BroadbullSpsummoned = false;
WhiptailEffectCount = 0;
} }
public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender)
...@@ -431,7 +429,7 @@ namespace WindBot.Game.AI.Decks ...@@ -431,7 +429,7 @@ namespace WindBot.Game.AI.Decks
{ {
if (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) if (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2)
return false; return false;
if (Card.IsDisabled() || WhiptailEffectCount >= 3) if (Card.IsDisabled())
return false; return false;
ClientCard target = null; ClientCard target = null;
List<ClientCard> monsters = Bot.GetMonsters(); List<ClientCard> monsters = Bot.GetMonsters();
...@@ -461,7 +459,6 @@ namespace WindBot.Game.AI.Decks ...@@ -461,7 +459,6 @@ namespace WindBot.Game.AI.Decks
CardId.Drident CardId.Drident
}); });
} }
WhiptailEffectCount++;
return true; return true;
} }
......
...@@ -21,6 +21,23 @@ namespace WindBot.Game.AI ...@@ -21,6 +21,23 @@ namespace WindBot.Game.AI
public const int GamecieltheSeaTurtleKaiju = 55063751; public const int GamecieltheSeaTurtleKaiju = 55063751;
public const int SuperAntiKaijuWarMachineMechaDogoran = 84769941; public const int SuperAntiKaijuWarMachineMechaDogoran = 84769941;
public const int SandaionTheTimelord = 33015627;
public const int GabrionTheTimelord = 6616912;
public const int MichionTheTimelord = 7733560;
public const int ZaphionTheTimelord = 28929131;
public const int HailonTheTimelord = 34137269;
public const int RaphionTheTimelord = 60222213;
public const int SadionTheTimelord = 65314286;
public const int MetaionTheTimelord = 74530899;
public const int KamionTheTimelord = 91712985;
public const int LazionTheTimelord = 92435533;
public const int LeftArmofTheForbiddenOne = 7902349;
public const int RightLegofTheForbiddenOne = 8124921;
public const int LeftLegofTheForbiddenOne = 44519536;
public const int RightArmofTheForbiddenOne = 70903634;
public const int ExodiaTheForbiddenOne = 33396948;
public const int UltimateConductorTytanno = 18940556; public const int UltimateConductorTytanno = 18940556;
public const int ElShaddollConstruct = 20366274; public const int ElShaddollConstruct = 20366274;
public const int AllyOfJusticeCatastor = 26593852; public const int AllyOfJusticeCatastor = 26593852;
...@@ -36,8 +53,27 @@ namespace WindBot.Game.AI ...@@ -36,8 +53,27 @@ namespace WindBot.Game.AI
public const int DarkMagicAttack = 2314238; public const int DarkMagicAttack = 2314238;
public const int MysticalSpaceTyphoon = 5318639; public const int MysticalSpaceTyphoon = 5318639;
public const int CosmicCyclone = 8267140; public const int CosmicCyclone = 8267140;
public const int ChickenGame = 67616300; public const int GalaxyCyclone = 5133471;
public const int BookOfMoon = 14087893;
public const int CompulsoryEvacuationDevice = 94192409;
public const int CallOfTheHaunted = 97077563;
public const int Scapegoat = 73915051;
public const int BreakthroughSkill = 78474168;
public const int SolemnJudgment = 41420027;
public const int SolemnWarning = 84749824;
public const int SolemnStrike = 40605147;
public const int TorrentialTribute = 53582587;
public const int HeavyStorm = 19613556;
public const int HammerShot = 26412047;
public const int DarkHole = 53129443;
public const int Raigeki = 12580477;
public const int SmashingGround = 97169186;
public const int PotOfDesires = 35261759;
public const int AllureofDarkness = 1475311;
public const int DimensionalBarrier = 83326048;
public const int InterruptedKaijuSlumber = 99330325;
public const int ChickenGame = 67616300;
public const int SantaClaws = 46565218; public const int SantaClaws = 46565218;
public const int CastelTheSkyblasterMusketeer = 82633039; public const int CastelTheSkyblasterMusketeer = 82633039;
...@@ -61,7 +97,7 @@ namespace WindBot.Game.AI ...@@ -61,7 +97,7 @@ namespace WindBot.Game.AI
public const int LockBird = 94145021; public const int LockBird = 94145021;
public const int GhostOgreAndSnowRabbit = 59438930; public const int GhostOgreAndSnowRabbit = 59438930;
public const int GhostBelle = 73642296; public const int GhostBelle = 73642296;
public const int EffectVeiler = 63845230; public const int EffectVeiler = 97268402;
public const int ArtifactLancea = 34267821; public const int ArtifactLancea = 34267821;
public const int CalledByTheGrave = 24224830; public const int CalledByTheGrave = 24224830;
...@@ -80,11 +116,12 @@ namespace WindBot.Game.AI ...@@ -80,11 +116,12 @@ namespace WindBot.Game.AI
public const int RedDragonArchfiend = 70902743; public const int RedDragonArchfiend = 70902743;
public const int ImperialOrder = 61740673; public const int ImperialOrder = 61740673;
public const int RoyalDecreel = 51452091;
public const int NaturiaBeast = 33198837; public const int NaturiaBeast = 33198837;
public const int AntiSpellFragrance = 58921041; public const int AntiSpellFragrance = 58921041;
}
int HonestEffectCount = 0; public const int lightningStorm = 14532163;
}
protected DefaultExecutor(GameAI ai, Duel duel) protected DefaultExecutor(GameAI ai, Duel duel)
: base(ai, duel) : base(ai, duel)
...@@ -127,9 +164,6 @@ namespace WindBot.Game.AI ...@@ -127,9 +164,6 @@ namespace WindBot.Game.AI
/// <returns>false if the attack shouldn't be done.</returns> /// <returns>false if the attack shouldn't be done.</returns>
public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender)
{ {
if (attacker.RealPower <= 0)
return false;
if (!attacker.IsMonsterHasPreventActivationEffectInBattle()) if (!attacker.IsMonsterHasPreventActivationEffectInBattle())
{ {
if (defender.IsMonsterInvincible() && defender.IsDefense()) if (defender.IsMonsterInvincible() && defender.IsDefense())
...@@ -180,6 +214,12 @@ namespace WindBot.Game.AI ...@@ -180,6 +214,12 @@ namespace WindBot.Game.AI
if (attacker.IsCode(_CardId.NumberS39UtopiaTheLightning) && !attacker.IsDisabled() && attacker.HasXyzMaterial(2, _CardId.Number39Utopia)) if (attacker.IsCode(_CardId.NumberS39UtopiaTheLightning) && !attacker.IsDisabled() && attacker.HasXyzMaterial(2, _CardId.Number39Utopia))
attacker.RealPower = 5000; attacker.RealPower = 5000;
if (attacker.IsCode(_CardId.EaterOfMillions) && !attacker.IsDisabled())
attacker.RealPower = 9999;
if (attacker.IsMonsterInvincible())
attacker.RealPower = 9999;
foreach (ClientCard equip in attacker.EquipCards) foreach (ClientCard equip in attacker.EquipCards)
{ {
if (equip.IsCode(_CardId.MoonMirrorShield) && !equip.IsDisabled()) if (equip.IsCode(_CardId.MoonMirrorShield) && !equip.IsDisabled())
...@@ -210,6 +250,29 @@ namespace WindBot.Game.AI ...@@ -210,6 +250,29 @@ namespace WindBot.Game.AI
return true; return true;
} }
public override bool OnPreActivate(ClientCard card)
{
ClientCard LastChainCard = Util.GetLastChainCard();
if (LastChainCard != null && Duel.Phase == DuelPhase.Standby &&
LastChainCard.IsCode(
_CardId.SandaionTheTimelord,
_CardId.GabrionTheTimelord,
_CardId.MichionTheTimelord,
_CardId.ZaphionTheTimelord,
_CardId.HailonTheTimelord,
_CardId.RaphionTheTimelord,
_CardId.SadionTheTimelord,
_CardId.MetaionTheTimelord,
_CardId.KamionTheTimelord,
_CardId.LazionTheTimelord
))
return false;
if ((card.Location == CardLocation.Hand || card.Location == CardLocation.SpellZone && card.IsFacedown()) &&
(card.IsSpell() && DefaultSpellWillBeNegated() || card.IsTrap() && DefaultTrapWillBeNegated()))
return false;
return true;
}
/// <summary> /// <summary>
/// Called when the AI has to select a card position. /// Called when the AI has to select a card position.
/// </summary> /// </summary>
...@@ -242,9 +305,12 @@ namespace WindBot.Game.AI ...@@ -242,9 +305,12 @@ namespace WindBot.Game.AI
return false; return false;
} }
public override void OnNewTurn() /// <summary>
/// Set when this card can't beat the enemies
/// </summary>
public override bool OnSelectMonsterSummonOrSet(ClientCard card)
{ {
HonestEffectCount = 0; return card.Level <= 4 && Bot.GetMonsters().Count(m => m.IsFaceup()) == 0 && Util.IsAllEnemyBetterThanValue(card.Attack, true);
} }
/// <summary> /// <summary>
...@@ -622,14 +688,17 @@ namespace WindBot.Game.AI ...@@ -622,14 +688,17 @@ namespace WindBot.Game.AI
/// </summary> /// </summary>
protected bool DefaultSpellSet() protected bool DefaultSpellSet()
{ {
return (Card.IsTrap() || Card.HasType(CardType.QuickPlay)) && Bot.GetSpellCountWithoutField() < 4; return (Card.IsTrap() || Card.HasType(CardType.QuickPlay) || DefaultSpellMustSetFirst()) && Bot.GetSpellCountWithoutField() < 4;
} }
/// <summary> /// <summary>
/// Summon with tributes ATK lower. /// Summon with no tribute, or with tributes ATK lower.
/// </summary> /// </summary>
protected bool DefaultTributeSummon() protected bool DefaultMonsterSummon()
{ {
if (Card.Level <= 4)
return true;
if (!UniqueFaceupMonster()) if (!UniqueFaceupMonster())
return false; return false;
int tributecount = (int)Math.Ceiling((Card.Level - 4.0d) / 2.0d); int tributecount = (int)Math.Ceiling((Card.Level - 4.0d) / 2.0d);
...@@ -656,8 +725,13 @@ namespace WindBot.Game.AI ...@@ -656,8 +725,13 @@ namespace WindBot.Game.AI
/// </summary> /// </summary>
protected bool DefaultMonsterRepos() protected bool DefaultMonsterRepos()
{ {
if (Card.IsFaceup() && Card.IsDefense() && Card.Attack == 0) if (Card.Attack == 0)
return false; {
if (Card.IsFaceup() && Card.IsAttack())
return true;
if (Card.IsFaceup() && Card.IsDefense())
return false;
}
if (Enemy.HasInMonstersZone(_CardId.BlueEyesChaosMAXDragon, true) && if (Enemy.HasInMonstersZone(_CardId.BlueEyesChaosMAXDragon, true) &&
Card.IsAttack() && (4000 - Card.Defense) * 2 > (4000 - Card.Attack)) Card.IsAttack() && (4000 - Card.Defense) * 2 > (4000 - Card.Attack))
...@@ -667,10 +741,10 @@ namespace WindBot.Game.AI ...@@ -667,10 +741,10 @@ namespace WindBot.Game.AI
(4000 - Card.Defense) * 2 > (4000 - Card.Attack)) (4000 - Card.Defense) * 2 > (4000 - Card.Attack))
return true; return true;
bool enemyBetter = Util.IsAllEnemyBetter(true); bool enemyBetter = Util.IsAllEnemyBetter();
if (Card.IsAttack() && enemyBetter) if (Card.IsAttack() && enemyBetter)
return true; return true;
if (Card.IsDefense() && !enemyBetter && Card.Attack >= Card.Defense) if (Card.IsDefense() && !enemyBetter && (Card.Attack >= Card.Defense || Card.Attack >= Util.GetBestPower(Enemy)))
return true; return true;
return false; return false;
...@@ -681,7 +755,15 @@ namespace WindBot.Game.AI ...@@ -681,7 +755,15 @@ namespace WindBot.Game.AI
/// </summary> /// </summary>
protected bool DefaultSpellWillBeNegated() protected bool DefaultSpellWillBeNegated()
{ {
return Bot.HasInSpellZone(_CardId.ImperialOrder, true, true) || Enemy.HasInSpellZone(_CardId.ImperialOrder, true) || Enemy.HasInMonstersZone(_CardId.NaturiaBeast, true); return (Bot.HasInSpellZone(_CardId.ImperialOrder, true, true) || Enemy.HasInSpellZone(_CardId.ImperialOrder, true)) && !Util.ChainContainsCard(_CardId.ImperialOrder);
}
/// <summary>
/// If trap will be negated
/// </summary>
protected bool DefaultTrapWillBeNegated()
{
return (Bot.HasInSpellZone(_CardId.RoyalDecreel, true, true) || Enemy.HasInSpellZone(_CardId.RoyalDecreel, true)) && !Util.ChainContainsCard(_CardId.RoyalDecreel);
} }
/// <summary> /// <summary>
...@@ -689,15 +771,7 @@ namespace WindBot.Game.AI ...@@ -689,15 +771,7 @@ namespace WindBot.Game.AI
/// </summary> /// </summary>
protected bool DefaultSpellMustSetFirst() protected bool DefaultSpellMustSetFirst()
{ {
ClientCard card = null; return Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true, true) || Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true);
foreach (ClientCard check in Bot.GetSpells())
{
if (check.IsCode(_CardId.AntiSpellFragrance) && !check.IsDisabled())
card = check;
}
if (card != null && card.IsFaceup())
return true;
return Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true, true) || Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true);
} }
/// <summary> /// <summary>
...@@ -764,6 +838,8 @@ namespace WindBot.Game.AI ...@@ -764,6 +838,8 @@ namespace WindBot.Game.AI
/// </summary> /// </summary>
protected bool DefaultDontChainMyself() protected bool DefaultDontChainMyself()
{ {
if (Type != ExecutorType.Activate)
return true;
if (Executors.Any(exec => exec.Type == Type && exec.CardId == Card.Id)) if (Executors.Any(exec => exec.Type == Type && exec.CardId == Card.Id))
return false; return false;
return Duel.LastChainPlayer != 0; return Duel.LastChainPlayer != 0;
...@@ -776,6 +852,8 @@ namespace WindBot.Game.AI ...@@ -776,6 +852,8 @@ namespace WindBot.Game.AI
{ {
if (Executors.Count(exec => exec.Type == Type && exec.CardId == Card.Id) > 1) if (Executors.Count(exec => exec.Type == Type && exec.CardId == Card.Id) > 1)
return false; return false;
if (Card.IsFacedown())
return true;
if (Bot.LifePoints <= 1000) if (Bot.LifePoints <= 1000)
return false; return false;
if (Bot.LifePoints <= Enemy.LifePoints && ActivateDescription == Util.GetStringId(_CardId.ChickenGame, 0)) if (Bot.LifePoints <= Enemy.LifePoints && ActivateDescription == Util.GetStringId(_CardId.ChickenGame, 0))
...@@ -1067,6 +1145,11 @@ namespace WindBot.Game.AI ...@@ -1067,6 +1145,11 @@ namespace WindBot.Game.AI
return (selfBestAttack <= oppoBestAttack && oppoBestAttack <= 3000) || DefaultScarlightRedDragonArchfiendEffect(); return (selfBestAttack <= oppoBestAttack && oppoBestAttack <= 3000) || DefaultScarlightRedDragonArchfiendEffect();
} }
protected bool DefaultTimelordSummon()
{
return Bot.GetMonsterCount() == 0;
}
/// <summary> /// <summary>
/// Activate when we have less monsters than enemy, or when enemy have more than 3 monsters. /// Activate when we have less monsters than enemy, or when enemy have more than 3 monsters.
/// </summary> /// </summary>
...@@ -1089,13 +1172,22 @@ namespace WindBot.Game.AI ...@@ -1089,13 +1172,22 @@ namespace WindBot.Game.AI
|| ((Bot.BattlingMonster.Attack < Enemy.BattlingMonster.Defense) && (Bot.BattlingMonster.Attack + Enemy.BattlingMonster.Attack > Enemy.BattlingMonster.Defense))); || ((Bot.BattlingMonster.Attack < Enemy.BattlingMonster.Defense) && (Bot.BattlingMonster.Attack + Enemy.BattlingMonster.Attack > Enemy.BattlingMonster.Defense)));
} }
if (Util.IsTurn1OrMain2() && HonestEffectCount <= 5) return Util.IsTurn1OrMain2();
}
protected bool DefaultLightingStorm()
{
if ((Enemy.MonsterZone.ToList().Count > Enemy.SpellZone.ToList().Count ) && Enemy.MonsterZone.ToList().Count>3)
{ {
HonestEffectCount++; AI.SelectPlace(Zones.MonsterZones);
return true;
}
else
{
AI.SelectPlace(Zones.SpellZones);
return true; return true;
} }
return false;
} }
} }
} }
...@@ -59,7 +59,7 @@ namespace WindBot.Game.AI ...@@ -59,7 +59,7 @@ namespace WindBot.Game.AI
_game = game; _game = game;
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DialogsData)); DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DialogsData));
string dialogfilename = game.Dialog; string dialogfilename = game.Dialog;
using (FileStream fs = File.OpenRead("Dialogs/" + dialogfilename + ".json")) using (FileStream fs = Program.ReadFile("Dialogs", dialogfilename, "json"))
{ {
DialogsData data = (DialogsData)serializer.ReadObject(fs); DialogsData data = (DialogsData)serializer.ReadObject(fs);
_welcome = data.welcome; _welcome = data.welcome;
......
namespace WindBot.Game.AI.Enums namespace WindBot.Game.AI.Enums
{ {
/// <summary>
/// Cards that are invincible to battle and should always attack to use effect.
/// </summary>
public enum InvincibleBotMonster
{
YubelTheUltimateNightmare = 31764700,
YubelTerrorIncarnate = 4779091,
SandaionTheTimelord = 33015627,
GabrionTheTimelord = 6616912,
MichionTheTimelord = 7733560,
ZaphionTheTimelord = 28929131,
HailonTheTimelord = 34137269,
RaphionTheTimelord = 60222213,
SadionTheTimelord = 65314286,
MetaionTheTimelord = 74530899,
KamionTheTimelord = 91712985,
LazionTheTimelord = 92435533,
TimelordProgenitorVorpgate = 67508932,
RocketWarrior = 30860696,
GoDDDDivineZeroKingRage = 40227329,
BloomDivaTheMelodiousChoir = 84988419,
BlackwingArmorMaster = 69031175,
DaigustoSphreez = 29552709,
Number92HearteartHDragon = 97403510,
NumberC96DarkStorm = 77205367,
Number54LionHeart = 54366836
}
/// <summary> /// <summary>
/// Cards that are invincible to battle. /// Cards that are invincible to battle.
/// </summary> /// </summary>
public enum InvincibleMonster public enum InvincibleEnemyMonster
{ {
SpiritReaper = 23205979, SpiritReaper = 23205979,
YubelTheUltimateNightmare = 31764700, YubelTheUltimateNightmare = 31764700,
......
...@@ -73,13 +73,19 @@ namespace WindBot.Game.AI ...@@ -73,13 +73,19 @@ namespace WindBot.Game.AI
public virtual BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList<ClientCard> defenders) public virtual BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList<ClientCard> defenders)
{ {
// Overrided in DefalultExecutor // Overrided in DefaultExecutor
return null; return null;
} }
public virtual bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) public virtual bool OnPreBattleBetween(ClientCard attacker, ClientCard defender)
{ {
// Overrided in DefalultExecutor // Overrided in DefaultExecutor
return true;
}
public virtual bool OnPreActivate(ClientCard card)
{
// Overrided in DefaultExecutor
return true; return true;
} }
...@@ -178,16 +184,37 @@ namespace WindBot.Game.AI ...@@ -178,16 +184,37 @@ namespace WindBot.Game.AI
public virtual CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions) public virtual CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions)
{ {
// Overrided in DefalultExecutor // Overrided in DefaultExecutor
return 0; return 0;
} }
public virtual bool OnSelectBattleReplay() public virtual bool OnSelectBattleReplay()
{ {
// Overrided in DefalultExecutor // Overrided in DefaultExecutor
return false; return false;
} }
/// <summary>
/// Called when the executor type is SummonOrSet
/// </summary>
/// <returns>True if select to set the monster.</returns>
public virtual bool OnSelectMonsterSummonOrSet(ClientCard card)
{
// Overrided in DefaultExecutor
return false;
}
/// <summary>
/// Called when bot is going to annouce a card
/// </summary>
/// <param name="avail">Available card's ids.</param>
/// <returns>Card's id to annouce.</returns>
public virtual int OnAnnounceCard(IList<int> avail)
{
// For overriding
return 0;
}
public void SetMain(MainPhase main) public void SetMain(MainPhase main)
{ {
Main = main; Main = main;
......
namespace WindBot.Game.AI
{
public static class HintMsg
{
public const int Release = 500,
Discard = 501,
Destroy = 502,
Remove = 503,
ToGrave = 504,
ReturnToHand = 505,
AddToHand = 506,
ToDeck = 507,
Summon = 508,
SpSummon = 509,
Set = 510,
FusionMaterial = 511,
SynchroMaterial = 512,
XyzMaterial = 513,
Faceup = 514,
Facedown = 515,
Attack = 516,
Defense = 517,
Equip = 518,
RemoveXyz = 519,
Control = 520,
DestroyReplace = 521,
FaceupAttack = 522,
FaceupDefense = 523,
FacedownAttack = 524,
FacedownDefense = 525,
Confirm = 526,
ToField = 527,
PosChange = 528,
Self = 529,
Oppo = 530,
Tribute = 531,
DeattachFrom = 532,
LinkMaterial = 533,
AttackTarget = 549,
Effect = 550,
Target = 551,
Coin = 552,
Dice = 553,
CardType = 554,
Option = 555,
ResolveEffect = 556,
Select = 560,
Position = 561,
Attribute = 562,
Race = 563,
Code = 564,
Number = 565,
LvRank = 567,
ResolveCard = 568,
Zone = 569,
DisableZone = 570,
ToZone = 571,
Counter = 572,
Disable = 573,
OperateCard = 574;
}
}
\ No newline at end of file
namespace WindBot.Game.AI
{
public static class Opcodes
{
public const int OPCODE_ADD = 0x40000000,
OPCODE_SUB = 0x40000001,
OPCODE_MUL = 0x40000002,
OPCODE_DIV = 0x40000003,
OPCODE_AND = 0x40000004,
OPCODE_OR = 0x40000005,
OPCODE_NEG = 0x40000006,
OPCODE_NOT = 0x40000007,
OPCODE_ISCODE = 0x40000100,
OPCODE_ISSETCARD = 0x40000101,
OPCODE_ISTYPE = 0x40000102,
OPCODE_ISRACE = 0x40000103,
OPCODE_ISATTRIBUTE = 0x40000104;
}
}
\ No newline at end of file
...@@ -32,7 +32,7 @@ namespace WindBot.Game ...@@ -32,7 +32,7 @@ namespace WindBot.Game
public int RealPower { get; set; } public int RealPower { get; set; }
public List<int> Overlays { get; private set; } public List<int> Overlays { get; private set; }
public int Owner { get; private set; } public int Owner { get; private set; }
public int Controller { get; private set; } public int Controller { get; set; }
public int Disabled { get; private set; } public int Disabled { get; private set; }
public int ProcCompleted { get; private set; } public int ProcCompleted { get; private set; }
public int SelectSeq { get; set; } public int SelectSeq { get; set; }
......
...@@ -43,7 +43,7 @@ namespace WindBot.Game ...@@ -43,7 +43,7 @@ namespace WindBot.Game
StreamReader reader = null; StreamReader reader = null;
try try
{ {
reader = new StreamReader(new FileStream("Decks/" + name + ".ydk", FileMode.Open, FileAccess.Read)); reader = new StreamReader(Program.ReadFile("Decks", name, "ydk"));
Deck deck = new Deck(); Deck deck = new Deck();
bool side = false; bool side = false;
......
...@@ -96,30 +96,8 @@ namespace WindBot.Game ...@@ -96,30 +96,8 @@ namespace WindBot.Game
public void AddCard(CardLocation loc, int cardId, int player, int seq, int pos) public void AddCard(CardLocation loc, int cardId, int player, int seq, int pos)
{ {
switch (loc) ClientCard card = new ClientCard(cardId, loc, seq, pos);
{ AddCard(loc, card, player, seq, pos, cardId);
case CardLocation.Hand:
Fields[player].Hand.Add(new ClientCard(cardId, loc, -1, pos));
break;
case CardLocation.Grave:
Fields[player].Graveyard.Add(new ClientCard(cardId, loc,-1, pos));
break;
case CardLocation.Removed:
Fields[player].Banished.Add(new ClientCard(cardId, loc, -1, pos));
break;
case CardLocation.MonsterZone:
Fields[player].MonsterZone[seq] = new ClientCard(cardId, loc, seq, pos);
break;
case CardLocation.SpellZone:
Fields[player].SpellZone[seq] = new ClientCard(cardId, loc, seq, pos);
break;
case CardLocation.Deck:
Fields[player].Deck.Add(new ClientCard(cardId, loc, -1, pos));
break;
case CardLocation.Extra:
Fields[player].ExtraDeck.Add(new ClientCard(cardId, loc, -1, pos));
break;
}
} }
public void AddCard(CardLocation loc, ClientCard card, int player, int seq, int pos, int id) public void AddCard(CardLocation loc, ClientCard card, int player, int seq, int pos, int id)
...@@ -127,6 +105,7 @@ namespace WindBot.Game ...@@ -127,6 +105,7 @@ namespace WindBot.Game
card.Location = loc; card.Location = loc;
card.Sequence = seq; card.Sequence = seq;
card.Position = pos; card.Position = pos;
card.Controller = player;
card.SetId(id); card.SetId(id);
switch (loc) switch (loc)
{ {
......
...@@ -13,12 +13,16 @@ namespace WindBot.Game ...@@ -13,12 +13,16 @@ namespace WindBot.Game
private Dialogs _dialogs; private Dialogs _dialogs;
// record activated count to prevent infinite actions
private Dictionary<int, int> _activatedCards;
public GameAI(GameClient game, Duel duel) public GameAI(GameClient game, Duel duel)
{ {
Game = game; Game = game;
Duel = duel; Duel = duel;
_dialogs = new Dialogs(game); _dialogs = new Dialogs(game);
_activatedCards = new Dictionary<int, int>();
} }
/// <summary> /// <summary>
...@@ -81,6 +85,7 @@ namespace WindBot.Game ...@@ -81,6 +85,7 @@ namespace WindBot.Game
/// </summary> /// </summary>
public void OnNewTurn() public void OnNewTurn()
{ {
_activatedCards.Clear();
Executor.OnNewTurn(); Executor.OnNewTurn();
} }
...@@ -95,6 +100,7 @@ namespace WindBot.Game ...@@ -95,6 +100,7 @@ namespace WindBot.Game
m_materialSelector = null; m_materialSelector = null;
m_option = -1; m_option = -1;
m_yesno = -1; m_yesno = -1;
m_announce = 0;
m_place = 0; m_place = 0;
if (Duel.Player == 0 && Duel.Phase == DuelPhase.Draw) if (Duel.Player == 0 && Duel.Phase == DuelPhase.Draw)
...@@ -189,12 +195,8 @@ namespace WindBot.Game ...@@ -189,12 +195,8 @@ namespace WindBot.Game
if (defenders.Count == 0) if (defenders.Count == 0)
{ {
// Attack with the monster with the lowest attack first // Attack with the monster with the lowest attack first
for (int i = attackers.Count - 1; i >= 0; --i) ClientCard attacker = attackers[attackers.Count - 1];
{ return Attack(attacker, null);
ClientCard attacker = attackers[i];
if (attacker.Attack > 0)
return Attack(attacker, null);
}
} }
else else
{ {
...@@ -225,18 +227,12 @@ namespace WindBot.Game ...@@ -225,18 +227,12 @@ namespace WindBot.Game
/// <returns>A new list containing the selected cards.</returns> /// <returns>A new list containing the selected cards.</returns>
public IList<ClientCard> OnSelectCard(IList<ClientCard> cards, int min, int max, int hint, bool cancelable) public IList<ClientCard> OnSelectCard(IList<ClientCard> cards, int min, int max, int hint, bool cancelable)
{ {
const int HINTMSG_FMATERIAL = 511;
const int HINTMSG_SMATERIAL = 512;
const int HINTMSG_XMATERIAL = 513;
const int HINTMSG_LMATERIAL = 533;
const int HINTMSG_SPSUMMON = 509;
// Check for the executor. // Check for the executor.
IList<ClientCard> result = Executor.OnSelectCard(cards, min, max, hint, cancelable); IList<ClientCard> result = Executor.OnSelectCard(cards, min, max, hint, cancelable);
if (result != null) if (result != null)
return result; return result;
if (hint == HINTMSG_SPSUMMON && min == 1 && max > min) // pendulum summon if (hint == HintMsg.SpSummon && min == 1 && max > min) // pendulum summon
{ {
result = Executor.OnSelectPendulumSummon(cards, max); result = Executor.OnSelectPendulumSummon(cards, max);
if (result != null) if (result != null)
...@@ -244,7 +240,7 @@ namespace WindBot.Game ...@@ -244,7 +240,7 @@ namespace WindBot.Game
} }
CardSelector selector = null; CardSelector selector = null;
if (hint == HINTMSG_FMATERIAL || hint == HINTMSG_SMATERIAL || hint == HINTMSG_XMATERIAL || hint == HINTMSG_LMATERIAL) if (hint == HintMsg.FusionMaterial || hint == HintMsg.SynchroMaterial || hint == HintMsg.XyzMaterial || hint == HintMsg.LinkMaterial)
{ {
if (m_materialSelector != null) if (m_materialSelector != null)
{ {
...@@ -253,13 +249,13 @@ namespace WindBot.Game ...@@ -253,13 +249,13 @@ namespace WindBot.Game
} }
else else
{ {
if (hint == HINTMSG_FMATERIAL) if (hint == HintMsg.FusionMaterial)
result = Executor.OnSelectFusionMaterial(cards, min, max); result = Executor.OnSelectFusionMaterial(cards, min, max);
if (hint == HINTMSG_SMATERIAL) if (hint == HintMsg.SynchroMaterial)
result = Executor.OnSelectSynchroMaterial(cards, 0, min, max); result = Executor.OnSelectSynchroMaterial(cards, 0, min, max);
if (hint == HINTMSG_XMATERIAL) if (hint == HintMsg.XyzMaterial)
result = Executor.OnSelectXyzMaterial(cards, min, max); result = Executor.OnSelectXyzMaterial(cards, min, max);
if (hint == HINTMSG_LMATERIAL) if (hint == HintMsg.LinkMaterial)
result = Executor.OnSelectLinkMaterial(cards, min, max); result = Executor.OnSelectLinkMaterial(cards, min, max);
if (result != null) if (result != null)
...@@ -438,8 +434,7 @@ namespace WindBot.Game ...@@ -438,8 +434,7 @@ namespace WindBot.Game
} }
if (ShouldExecute(exec, card, ExecutorType.SummonOrSet)) if (ShouldExecute(exec, card, ExecutorType.SummonOrSet))
{ {
if (Executor.Util.IsAllEnemyBetter(true) && Executor.Util.IsAllEnemyBetterThanValue(card.Attack + 300, false) && if (main.MonsterSetableCards.Contains(card) && Executor.OnSelectMonsterSummonOrSet(card))
main.MonsterSetableCards.Contains(card))
{ {
_dialogs.SendSetMonster(); _dialogs.SendSetMonster();
return new MainPhaseAction(MainPhaseAction.MainAction.SetMonster, card.ActionIndex); return new MainPhaseAction(MainPhaseAction.MainAction.SetMonster, card.ActionIndex);
...@@ -447,7 +442,7 @@ namespace WindBot.Game ...@@ -447,7 +442,7 @@ namespace WindBot.Game
_dialogs.SendSummon(card.Name); _dialogs.SendSummon(card.Name);
return new MainPhaseAction(MainPhaseAction.MainAction.Summon, card.ActionIndex); return new MainPhaseAction(MainPhaseAction.MainAction.Summon, card.ActionIndex);
} }
} }
foreach (ClientCard card in main.SpellSetableCards) foreach (ClientCard card in main.SpellSetableCards)
{ {
if (ShouldExecute(exec, card, ExecutorType.SpellSet)) if (ShouldExecute(exec, card, ExecutorType.SpellSet))
...@@ -528,16 +523,13 @@ namespace WindBot.Game ...@@ -528,16 +523,13 @@ namespace WindBot.Game
/// <returns></returns> /// <returns></returns>
public IList<ClientCard> OnSelectSum(IList<ClientCard> cards, int sum, int min, int max, int hint, bool mode) public IList<ClientCard> OnSelectSum(IList<ClientCard> cards, int sum, int min, int max, int hint, bool mode)
{ {
const int HINTMSG_RELEASE = 500;
const int HINTMSG_SMATERIAL = 512;
IList<ClientCard> selected = Executor.OnSelectSum(cards, sum, min, max, hint, mode); IList<ClientCard> selected = Executor.OnSelectSum(cards, sum, min, max, hint, mode);
if (selected != null) if (selected != null)
{ {
return selected; return selected;
} }
if (hint == HINTMSG_RELEASE || hint == HINTMSG_SMATERIAL) if (hint == HintMsg.Release || hint == HintMsg.SynchroMaterial)
{ {
if (m_materialSelector != null) if (m_materialSelector != null)
{ {
...@@ -547,10 +539,10 @@ namespace WindBot.Game ...@@ -547,10 +539,10 @@ namespace WindBot.Game
{ {
switch (hint) switch (hint)
{ {
case HINTMSG_SMATERIAL: case HintMsg.SynchroMaterial:
selected = Executor.OnSelectSynchroMaterial(cards, sum, min, max); selected = Executor.OnSelectSynchroMaterial(cards, sum, min, max);
break; break;
case HINTMSG_RELEASE: case HintMsg.Release:
selected = Executor.OnSelectRitualTribute(cards, sum, min, max); selected = Executor.OnSelectRitualTribute(cards, sum, min, max);
break; break;
} }
...@@ -734,12 +726,18 @@ namespace WindBot.Game ...@@ -734,12 +726,18 @@ namespace WindBot.Game
/// <summary> /// <summary>
/// Called when the AI has to declare a card. /// Called when the AI has to declare a card.
/// </summary> /// </summary>
/// <param name="avail">Available card's ids.</param>
/// <returns>Id of the selected card.</returns> /// <returns>Id of the selected card.</returns>
public int OnAnnounceCard() public int OnAnnounceCard(IList<int> avail)
{ {
if (m_announce == 0) int selected = Executor.OnAnnounceCard(avail);
return 89631139; // Blue-eyes white dragon if (avail.Contains(selected))
return m_announce; return selected;
if (avail.Contains(m_announce))
return m_announce;
else if (m_announce > 0)
Logger.WriteErrorLine("Pre-announced card cant be used: " + m_announce);
return avail[0];
} }
// _ Others functions _ // _ Others functions _
...@@ -944,6 +942,11 @@ namespace WindBot.Game ...@@ -944,6 +942,11 @@ namespace WindBot.Game
m_materialSelector = null; m_materialSelector = null;
} }
public bool HaveSelectedCards()
{
return m_selector.Count > 0 || m_materialSelector != null;
}
public CardSelector GetSelectedCards() public CardSelector GetSelectedCards()
{ {
CardSelector selected = null; CardSelector selected = null;
...@@ -1095,11 +1098,30 @@ namespace WindBot.Game ...@@ -1095,11 +1098,30 @@ namespace WindBot.Game
private bool ShouldExecute(CardExecutor exec, ClientCard card, ExecutorType type, int desc = -1) private bool ShouldExecute(CardExecutor exec, ClientCard card, ExecutorType type, int desc = -1)
{ {
if (card.Id != 0 && type == ExecutorType.Activate)
{
if (_activatedCards.ContainsKey(card.Id) && _activatedCards[card.Id] >= 9)
return false;
if (!Executor.OnPreActivate(card))
return false;
}
Executor.SetCard(type, card, desc); Executor.SetCard(type, card, desc);
return card != null && bool result = card != null && exec.Type == type &&
exec.Type == type && (exec.CardId == -1 || exec.CardId == card.Id) &&
(exec.CardId == -1 || exec.CardId == card.Id) && (exec.Func == null || exec.Func());
(exec.Func == null || exec.Func()); if (card.Id != 0 && type == ExecutorType.Activate && result)
{
int count = card.IsDisabled() ? 3 : 1;
if (!_activatedCards.ContainsKey(card.Id))
{
_activatedCards.Add(card.Id, count);
}
else
{
_activatedCards[card.Id] += count;
}
}
return result;
} }
} }
} }
...@@ -16,6 +16,9 @@ namespace WindBot.Game ...@@ -16,6 +16,9 @@ namespace WindBot.Game
public GameClient Game { get; private set; } public GameClient Game { get; private set; }
public YGOClient Connection { get; private set; } public YGOClient Connection { get; private set; }
public Deck Deck { get; private set; } public Deck Deck { get; private set; }
public Deck DeckForWin { get; private set; }
public Deck DeckForLose { get; private set; }
public string DeckCode { get; private set; }
private GameAI _ai; private GameAI _ai;
...@@ -28,6 +31,7 @@ namespace WindBot.Game ...@@ -28,6 +31,7 @@ namespace WindBot.Game
private bool _debug; private bool _debug;
private int _select_hint; private int _select_hint;
private GameMessage _lastMessage; private GameMessage _lastMessage;
private int lastDuelResult;
public GameBehavior(GameClient game) public GameBehavior(GameClient game)
{ {
...@@ -44,9 +48,17 @@ namespace WindBot.Game ...@@ -44,9 +48,17 @@ namespace WindBot.Game
_ai = new GameAI(Game, _duel); _ai = new GameAI(Game, _duel);
_ai.Executor = DecksManager.Instantiate(_ai, _duel); _ai.Executor = DecksManager.Instantiate(_ai, _duel);
Deck = Deck.Load(_ai.Executor.Deck); if(Game.DeckCode != null) {
DeckCode = Game.DeckCode;
} else {
DeckCode = null;
string deckName = Game.DeckFile ?? _ai.Executor.Deck;
Deck = Deck.Load(deckName);
DeckForWin = Deck.Load("Win/" + deckName);
DeckForLose = Deck.Load("Lose/" + deckName);
}
_select_hint = 0; _select_hint = 0;
lastDuelResult = 2;
} }
public int GetLocalPlayer(int player) public int GetLocalPlayer(int player)
...@@ -144,6 +156,30 @@ namespace WindBot.Game ...@@ -144,6 +156,30 @@ namespace WindBot.Game
_messages.Add(GameMessage.FlipSummoned, OnSummoned); _messages.Add(GameMessage.FlipSummoned, OnSummoned);
} }
private BinaryWriter buildUpdateDeck(Deck targetDeck) {
BinaryWriter deck = GamePacketFactory.Create(CtosMessage.UpdateDeck);
if(DeckCode != null) {
try {
byte[] deckContent = Convert.FromBase64String(DeckCode);
deck.Write(deckContent);
} catch {
_ai.OnDeckError("base64 decode");
}
return deck;
}
deck.Write(targetDeck.Cards.Count + targetDeck.ExtraCards.Count);
//Logger.WriteLine("Main + Extra: " + targetDeck.Cards.Count + targetDeck.ExtraCards.Count);
deck.Write(targetDeck.SideCards.Count);
//Logger.WriteLine("Side: " + targetDeck.SideCards.Count);
foreach (NamedCard card in targetDeck.Cards)
deck.Write(card.Id);
foreach (NamedCard card in targetDeck.ExtraCards)
deck.Write(card.Id);
foreach (NamedCard card in targetDeck.SideCards)
deck.Write(card.Id);
return deck;
}
private void OnJoinGame(BinaryReader packet) private void OnJoinGame(BinaryReader packet)
{ {
/*int lflist = (int)*/ packet.ReadUInt32(); /*int lflist = (int)*/ packet.ReadUInt32();
...@@ -152,30 +188,30 @@ namespace WindBot.Game ...@@ -152,30 +188,30 @@ namespace WindBot.Game
int duel_rule = packet.ReadByte(); int duel_rule = packet.ReadByte();
_ai.Duel.IsNewRule = (duel_rule >= 4); _ai.Duel.IsNewRule = (duel_rule >= 4);
_ai.Duel.IsNewRule2020 = (duel_rule >= 5); _ai.Duel.IsNewRule2020 = (duel_rule >= 5);
BinaryWriter deck = GamePacketFactory.Create(CtosMessage.UpdateDeck); BinaryWriter deck = buildUpdateDeck(pickDeckOnResult());
deck.Write(Deck.Cards.Count + Deck.ExtraCards.Count);
deck.Write(Deck.SideCards.Count);
foreach (NamedCard card in Deck.Cards)
deck.Write(card.Id);
foreach (NamedCard card in Deck.ExtraCards)
deck.Write(card.Id);
foreach (NamedCard card in Deck.SideCards)
deck.Write(card.Id);
Connection.Send(deck); Connection.Send(deck);
_ai.OnJoinGame(); _ai.OnJoinGame();
} }
private Deck pickDeckOnResult() {
if(DeckCode != null) {
return null;
}
if(lastDuelResult == 0 && DeckForWin != null) {
//Logger.WriteLine("Using deck for win: " + DeckForWin.SideCards[2].Name);
return DeckForWin;
}
if(lastDuelResult == 1 && DeckForLose != null) {
//Logger.WriteLine("Using deck for lose: " + DeckForLose.SideCards[2].Name);
return DeckForLose;
}
//Logger.WriteLine("Using default deck.");
return Deck;
}
private void OnChangeSide(BinaryReader packet) private void OnChangeSide(BinaryReader packet)
{ {
BinaryWriter deck = GamePacketFactory.Create(CtosMessage.UpdateDeck); BinaryWriter deck = buildUpdateDeck(pickDeckOnResult());
deck.Write(Deck.Cards.Count + Deck.ExtraCards.Count);
deck.Write(Deck.SideCards.Count);
foreach (NamedCard card in Deck.Cards)
deck.Write(card.Id);
foreach (NamedCard card in Deck.ExtraCards)
deck.Write(card.Id);
foreach (NamedCard card in Deck.SideCards)
deck.Write(card.Id);
Connection.Send(deck); Connection.Send(deck);
_ai.OnJoinGame(); _ai.OnJoinGame();
} }
...@@ -301,6 +337,7 @@ namespace WindBot.Game ...@@ -301,6 +337,7 @@ namespace WindBot.Game
private void OnErrorMsg(BinaryReader packet) private void OnErrorMsg(BinaryReader packet)
{ {
int msg = packet.ReadByte(); int msg = packet.ReadByte();
Logger.WriteLine("Got error: " + msg);
// align // align
packet.ReadByte(); packet.ReadByte();
packet.ReadByte(); packet.ReadByte();
...@@ -367,7 +404,7 @@ namespace WindBot.Game ...@@ -367,7 +404,7 @@ namespace WindBot.Game
extra = packet.ReadInt16(); extra = packet.ReadInt16();
_duel.Fields[GetLocalPlayer(1)].Init(deck, extra); _duel.Fields[GetLocalPlayer(1)].Init(deck, extra);
Logger.DebugWriteLine("Duel started: " + _room.Names[0] + " versus " + _room.Names[1]); Logger.WriteLine("Duel started: " + _room.Names[0] + " versus " + _room.Names[1]);
_ai.OnStart(); _ai.OnStart();
} }
...@@ -375,9 +412,11 @@ namespace WindBot.Game ...@@ -375,9 +412,11 @@ namespace WindBot.Game
{ {
int result = GetLocalPlayer(packet.ReadByte()); int result = GetLocalPlayer(packet.ReadByte());
lastDuelResult = result;
string otherName = _room.Position == 0 ? _room.Names[1] : _room.Names[0]; string otherName = _room.Position == 0 ? _room.Names[1] : _room.Names[0];
string textResult = (result == 2 ? "Draw" : result == 0 ? "Win" : "Lose"); string textResult = (result == 2 ? "Draw" : result == 0 ? "Win" : "Lose");
Logger.DebugWriteLine("Duel finished against " + otherName + ", result: " + textResult); Logger.WriteLine("Duel finished against " + otherName + ", result: " + textResult);
} }
private void OnDraw(BinaryReader packet) private void OnDraw(BinaryReader packet)
...@@ -1056,7 +1095,7 @@ namespace WindBot.Game ...@@ -1056,7 +1095,7 @@ namespace WindBot.Game
for (int i = 0; i < count; ++i) for (int i = 0; i < count; ++i)
{ {
packet.ReadByte(); // flag packet.ReadByte(); // flag
packet.ReadInt32(); // card id int id = packet.ReadInt32();
int con = GetLocalPlayer(packet.ReadByte()); int con = GetLocalPlayer(packet.ReadByte());
int loc = packet.ReadByte(); int loc = packet.ReadByte();
int seq = packet.ReadByte(); int seq = packet.ReadByte();
...@@ -1067,7 +1106,12 @@ namespace WindBot.Game ...@@ -1067,7 +1106,12 @@ namespace WindBot.Game
{ {
desc = 0; desc = 0;
} }
cards.Add(_duel.GetCard(con, loc, seq, sseq));
ClientCard card = _duel.GetCard(con, loc, seq, sseq);
if (card.Id == 0)
card.SetId(id);
cards.Add(card);
descs.Add(desc); descs.Add(desc);
} }
...@@ -1449,8 +1493,156 @@ namespace WindBot.Game ...@@ -1449,8 +1493,156 @@ namespace WindBot.Game
private void OnAnnounceCard(BinaryReader packet) private void OnAnnounceCard(BinaryReader packet)
{ {
// not fully implemented IList<int> opcodes = new List<int>();
Connection.Send(CtosMessage.Response, _ai.OnAnnounceCard()); packet.ReadByte(); // player
int count = packet.ReadByte();
for (int i = 0; i < count; ++i)
opcodes.Add(packet.ReadInt32());
IList<int> avail = new List<int>();
IList<NamedCard> all = NamedCardsManager.GetAllCards();
foreach (NamedCard card in all)
{
if (card.HasType(CardType.Token) || (card.Alias > 0 && card.Id - card.Alias < 10)) continue;
Stack<int> stack = new Stack<int>();
for (int i = 0; i < opcodes.Count; i++)
{
switch (opcodes[i])
{
case Opcodes.OPCODE_ADD:
if (stack.Count >= 2)
{
int rhs = stack.Pop();
int lhs = stack.Pop();
stack.Push(lhs + rhs);
}
break;
case Opcodes.OPCODE_SUB:
if (stack.Count >= 2)
{
int rhs = stack.Pop();
int lhs = stack.Pop();
stack.Push(lhs - rhs);
}
break;
case Opcodes.OPCODE_MUL:
if (stack.Count >= 2)
{
int rhs = stack.Pop();
int lhs = stack.Pop();
stack.Push(lhs * rhs);
}
break;
case Opcodes.OPCODE_DIV:
if (stack.Count >= 2)
{
int rhs = stack.Pop();
int lhs = stack.Pop();
stack.Push(lhs / rhs);
}
break;
case Opcodes.OPCODE_AND:
if (stack.Count >= 2)
{
int rhs = stack.Pop();
int lhs = stack.Pop();
bool b0 = rhs != 0;
bool b1 = lhs != 0;
if (b0 && b1)
stack.Push(1);
else
stack.Push(0);
}
break;
case Opcodes.OPCODE_OR:
if (stack.Count >= 2)
{
int rhs = stack.Pop();
int lhs = stack.Pop();
bool b0 = rhs != 0;
bool b1 = lhs != 0;
if (b0 || b1)
stack.Push(1);
else
stack.Push(0);
}
break;
case Opcodes.OPCODE_NEG:
if (stack.Count >= 1)
{
int rhs = stack.Pop();
stack.Push(-rhs);
}
break;
case Opcodes.OPCODE_NOT:
if (stack.Count >= 1)
{
int rhs = stack.Pop();
bool b0 = rhs != 0;
if (b0)
stack.Push(0);
else
stack.Push(1);
}
break;
case Opcodes.OPCODE_ISCODE:
if (stack.Count >= 1)
{
int code = stack.Pop();
bool b0 = code == card.Id;
if (b0)
stack.Push(1);
else
stack.Push(0);
}
break;
case Opcodes.OPCODE_ISSETCARD:
if (stack.Count >= 1)
{
if (card.HasSetcode(stack.Pop()))
stack.Push(1);
else
stack.Push(0);
}
break;
case Opcodes.OPCODE_ISTYPE:
if (stack.Count >= 1)
{
if ((stack.Pop() & card.Type) > 0)
stack.Push(1);
else
stack.Push(0);
}
break;
case Opcodes.OPCODE_ISRACE:
if (stack.Count >= 1)
{
if ((stack.Pop() & card.Race) > 0)
stack.Push(1);
else
stack.Push(0);
}
break;
case Opcodes.OPCODE_ISATTRIBUTE:
if (stack.Count >= 1)
{
if ((stack.Pop() & card.Attribute) > 0)
stack.Push(1);
else
stack.Push(0);
}
break;
default:
stack.Push(opcodes[i]);
break;
}
}
if (stack.Count == 1 && stack.Pop() != 0)
avail.Add(card.Id);
}
if (avail.Count == 0)
throw new Exception("No avail card found for announce!");
Connection.Send(CtosMessage.Response, _ai.OnAnnounceCard(avail));
} }
private void OnAnnounceNumber(BinaryReader packet) private void OnAnnounceNumber(BinaryReader packet)
......
using System.IO; using System.IO;
using System.Linq;
using System.Net; using System.Net;
using System.Text; using System.Text;
using YGOSharp.Network; using YGOSharp.Network;
...@@ -12,6 +13,8 @@ namespace WindBot.Game ...@@ -12,6 +13,8 @@ namespace WindBot.Game
public YGOClient Connection { get; private set; } public YGOClient Connection { get; private set; }
public string Username; public string Username;
public string Deck; public string Deck;
public string DeckFile;
public string DeckCode;
public string Dialog; public string Dialog;
public int Hand; public int Hand;
public bool Debug; public bool Debug;
...@@ -28,6 +31,8 @@ namespace WindBot.Game ...@@ -28,6 +31,8 @@ namespace WindBot.Game
{ {
Username = Info.Name; Username = Info.Name;
Deck = Info.Deck; Deck = Info.Deck;
DeckFile = Info.DeckFile;
DeckCode = Info.DeckCode;
Dialog = Info.Dialog; Dialog = Info.Dialog;
Hand = Info.Hand; Hand = Info.Hand;
Debug = Info.Debug; Debug = Info.Debug;
...@@ -45,13 +50,18 @@ namespace WindBot.Game ...@@ -45,13 +50,18 @@ namespace WindBot.Game
Connection.Connected += OnConnected; Connection.Connected += OnConnected;
Connection.PacketReceived += OnPacketReceived; Connection.PacketReceived += OnPacketReceived;
IPAddress target_address; IPAddress target_address;
try { try
{
target_address = IPAddress.Parse(_serverHost); target_address = IPAddress.Parse(_serverHost);
} catch (System.Exception e) { }
catch (System.Exception)
{
IPHostEntry _hostEntry = Dns.GetHostEntry(_serverHost); IPHostEntry _hostEntry = Dns.GetHostEntry(_serverHost);
target_address = _hostEntry.AddressList[0]; target_address = _hostEntry.AddressList.FirstOrDefault(findIPv4 => findIPv4.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);
} }
Connection.Connect(target_address, _serverPort); Connection.Connect(target_address, _serverPort);
} }
......
...@@ -68,6 +68,8 @@ namespace WindBot ...@@ -68,6 +68,8 @@ namespace WindBot
WindBotInfo Info = new WindBotInfo(); WindBotInfo Info = new WindBotInfo();
Info.Name = Config.GetString("Name", Info.Name); Info.Name = Config.GetString("Name", Info.Name);
Info.Deck = Config.GetString("Deck", Info.Deck); Info.Deck = Config.GetString("Deck", Info.Deck);
Info.DeckFile = Config.GetString("DeckFile", Info.DeckFile);
Info.DeckCode = Config.GetString("DeckCode", Info.DeckCode);
Info.Dialog = Config.GetString("Dialog", Info.Dialog); Info.Dialog = Config.GetString("Dialog", Info.Dialog);
Info.Host = Config.GetString("Host", Info.Host); Info.Host = Config.GetString("Host", Info.Host);
Info.Port = Config.GetInt("Port", Info.Port); Info.Port = Config.GetInt("Port", Info.Port);
...@@ -104,6 +106,12 @@ namespace WindBot ...@@ -104,6 +106,12 @@ namespace WindBot
string port = HttpUtility.ParseQueryString(RawUrl).Get("port"); string port = HttpUtility.ParseQueryString(RawUrl).Get("port");
if (port != null) if (port != null)
Info.Port = Int32.Parse(port); Info.Port = Int32.Parse(port);
string deckfile = HttpUtility.ParseQueryString(RawUrl).Get("deckfile");
if (deckfile != null)
Info.DeckFile = deckfile;
string deckcode = HttpUtility.ParseQueryString(RawUrl).Get("deckcode");
if (deckcode != null)
Info.DeckCode = deckcode;
string dialog = HttpUtility.ParseQueryString(RawUrl).Get("dialog"); string dialog = HttpUtility.ParseQueryString(RawUrl).Get("dialog");
if (dialog != null) if (dialog != null)
Info.Dialog = dialog; Info.Dialog = dialog;
...@@ -193,5 +201,22 @@ namespace WindBot ...@@ -193,5 +201,22 @@ namespace WindBot
} }
#endif #endif
} }
public static FileStream ReadFile(string directory, string filename, string extension)
{
string tryfilename = filename + "." + extension;
string fullpath = Path.Combine(directory, tryfilename);
if (!File.Exists(fullpath))
fullpath = filename;
if (!File.Exists(fullpath))
fullpath = Path.Combine("../", filename);
if (!File.Exists(fullpath))
fullpath = Path.Combine("../deck/", filename);
if (!File.Exists(fullpath))
fullpath = Path.Combine("../", tryfilename);
if (!File.Exists(fullpath))
fullpath = Path.Combine("../deck/", tryfilename);
return new FileStream(fullpath, FileMode.Open, FileAccess.Read);
}
} }
} }
...@@ -20,6 +20,11 @@ The nickname for the bot. ...@@ -20,6 +20,11 @@ The nickname for the bot.
`Deck` `Deck`
The deck to be used by the bot. Available decks are listed below. Keep empty to use random deck. The deck to be used by the bot. Available decks are listed below. Keep empty to use random deck.
`DeckFile`
The deck file (.ydk) to be used by the bot. Will be set by `Deck` automatically, but you can override it.
Note: Most cards not in the original deck are unknown to the bot, and won't be summoned or activated in the duel.
`Dialog` `Dialog`
The dialog texts to be used by the bot. See Dialogs folder for list. The dialog texts to be used by the bot. See Dialogs folder for list.
......
...@@ -37,6 +37,9 @@ ...@@ -37,6 +37,9 @@
<PropertyGroup> <PropertyGroup>
<ApplicationIcon>WindBot.ico</ApplicationIcon> <ApplicationIcon>WindBot.ico</ApplicationIcon>
</PropertyGroup> </PropertyGroup>
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Mono.Data.Sqlite"> <Reference Include="Mono.Data.Sqlite">
<HintPath>.\Mono.Data.Sqlite.dll</HintPath> <HintPath>.\Mono.Data.Sqlite.dll</HintPath>
...@@ -67,7 +70,9 @@ ...@@ -67,7 +70,9 @@
<Compile Include="Game\AI\DeckAttribute.cs" /> <Compile Include="Game\AI\DeckAttribute.cs" />
<Compile Include="Game\AI\DecksManager.cs" /> <Compile Include="Game\AI\DecksManager.cs" />
<Compile Include="Game\AI\Decks\AltergeistExecutor.cs" /> <Compile Include="Game\AI\Decks\AltergeistExecutor.cs" />
<Compile Include="Game\AI\Decks\FamiliarPossessedExecutor.cs" />
<Compile Include="Game\AI\Decks\BlackwingExecutor.cs" /> <Compile Include="Game\AI\Decks\BlackwingExecutor.cs" />
<Compile Include="Game\AI\Decks\LuckyExecutor.cs" />
<Compile Include="Game\AI\Decks\MathMechExecutor.cs" /> <Compile Include="Game\AI\Decks\MathMechExecutor.cs" />
<Compile Include="Game\AI\Decks\PureWindsExecutor.cs" /> <Compile Include="Game\AI\Decks\PureWindsExecutor.cs" />
<Compile Include="Game\AI\Decks\DragunExecutor.cs" /> <Compile Include="Game\AI\Decks\DragunExecutor.cs" />
...@@ -120,6 +125,8 @@ ...@@ -120,6 +125,8 @@
<Compile Include="Game\AI\Enums\InvincibleMonster.cs" /> <Compile Include="Game\AI\Enums\InvincibleMonster.cs" />
<Compile Include="Game\AI\Enums\Floodgate.cs" /> <Compile Include="Game\AI\Enums\Floodgate.cs" />
<Compile Include="Game\AI\Executor.cs" /> <Compile Include="Game\AI\Executor.cs" />
<Compile Include="Game\AI\HintMsg.cs" />
<Compile Include="Game\AI\Opcodes.cs" />
<Compile Include="Game\AI\Zones.cs" /> <Compile Include="Game\AI\Zones.cs" />
<Compile Include="Game\AI\ExecutorType.cs" /> <Compile Include="Game\AI\ExecutorType.cs" />
<Compile Include="Game\BattlePhase.cs" /> <Compile Include="Game\BattlePhase.cs" />
...@@ -153,6 +160,12 @@ ...@@ -153,6 +160,12 @@
<None Include="Decks\*.ydk"> <None Include="Decks\*.ydk">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
<None Include="Decks\Win\*.ydk">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Decks\Lose\*.ydk">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Dialogs\*.json"> <None Include="Dialogs\*.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
...@@ -168,4 +181,4 @@ ...@@ -168,4 +181,4 @@
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>
\ No newline at end of file
...@@ -6,6 +6,8 @@ namespace WindBot ...@@ -6,6 +6,8 @@ namespace WindBot
{ {
public string Name { get; set; } public string Name { get; set; }
public string Deck { get; set; } public string Deck { get; set; }
public string DeckFile { get; set; }
public string DeckCode { get; set; }
public string Dialog { get; set; } public string Dialog { get; set; }
public string Host { get; set; } public string Host { get; set; }
public int Port { get; set; } public int Port { get; set; }
...@@ -18,6 +20,8 @@ namespace WindBot ...@@ -18,6 +20,8 @@ namespace WindBot
{ {
Name = "WindBot"; Name = "WindBot";
Deck = null; Deck = null;
DeckFile = null;
DeckCode = null;
Dialog = "default"; Dialog = "default";
Host = "127.0.0.1"; Host = "127.0.0.1";
Port = 7911; Port = 7911;
......
No preview for this file type
{
"windbots": [
{
"name": "伊芙·墨菲",
"deck": "Toadally Awesome",
"dialog": "wof-Eve-Murphy"
},
{
"name": "梦前菜菜",
"deck": "Rainbow",
"dialog": "wof-Yumesaki-Nana"
},
{
"name": "石砂原奈绪",
"deck": "Dragunity",
"dialog": "wof-Isagohara-Nao"
},
{
"name": "鸣野凪子",
"deck": "Rank V",
"dialog": "wof-Shigino-Nagiko"
},
{
"name": "绫濑亚梦",
"deck": "Zexal Weapons",
"dialog": "wof-Ayase-Amu"
},
{
"name": "淡野晴",
"deck": "Level VIII",
"dialog": "wof-Awaya-Haru"
},
{
"name": "城崎千夏",
"deck": "Zoodiac",
"dialog": "wof-Jougasaki-Chinatsu"
},
{
"name": "下垣鸣海凛央奈",
"deck": "Blue-Eyes",
"dialog": "wof-Shimogakinarumi-Riona"
},
{
"name": "鹭泽由依",
"deck": "Yosenju",
"dialog": "wof-Sagisawa-Yui"
},
{
"name": "有栖川亚里沙",
"deck": "Qliphort",
"dialog": "wof-Arisugawa-Arisa"
},
{
"name": "七草一花",
"deck": "Trickstar",
"dialog": "wof-Nanakusa-Ichika"
},
{
"name": "凯瑟琳·罗森塔尔",
"deck": "Altergeist",
"dialog": "wof-Catherine-Rosenthal"
},
{
"name": "白石唯",
"deck": "Nekroz",
"dialog": "wof-Shiraishi-Yui"
},
{
"name": "水晶艾蕾娜",
"deck": "ST1732",
"dialog": "wof-Suisho-Erena"
},
{
"name": "音羽真寻",
"deck": "Lightsworn",
"dialog": "wof-Otoha-Mahiro"
},
{
"name": "神崎春瑚",
"deck": "Blackwing",
"dialog": "wof-Kanzaki-Haruko"
},
{
"name": "樱庭小梅",
"deck": "CyberDragon",
"dialog": "wof-Sakuraba-Koume"
},
{
"name": "淡野美妙子",
"deck": "Evilswarm",
"dialog": "wof-Awaya-Mieko"
},
{
"name": "璃池樱空",
"deck": "Gravekeeper",
"dialog": "wof-Akiike-Sara"
},
{
"name": "月白五十铃",
"deck": "Graydle",
"dialog": "wof-Tsukishiro-Isuzu"
},
{
"name": "糖歌",
"deck": "OldSchool",
"dialog": "wof-Ameuta"
},
{
"name": "濑名歌铃",
"deck": "SkyStriker",
"dialog": "wof-Sena-Karin"
},
{
"name": "椎名咪玉",
"deck": "DarkMagician",
"dialog": "wof-Shiina-Miu"
},
{
"name": "薇薇安·伊文捷琳",
"deck": "Orcust",
"dialog": "wof-Vivian-Evangeline"
},
{
"name": "海伦·薇萨拉兹",
"deck": "Salamangreat",
"dialog": "wof-Helen-Virsaladze"
},
{
"name": "二宫爱丽丝",
"deck": "Dragun",
"dialog": "wof-Ninomiya-Arisu"
},
{
"name": "木村有容",
"deck": "MathMech",
"dialog": "wof-Kimura-Yuro"
},
{
"name": "砂冢明音",
"deck": "TimeThief",
"dialog": "wof-Sunazuka-Akane"
},
{
"name": "梦野",
"deck": "PureWinds",
"dialog": "wof-Yumeno"
},
{
"name": "白雪安娜",
"deck": "Witchcraft",
"dialog": "wof-Shirayuki-Anna"
},
{
"name": "星希花音",
"deck": "Burn",
"dialog": "wof-Hoshiki-Kanon"
},
{
"name": "浅见空子",
"deck": "Frog",
"dialog": "wof-Asami-Sorako"
},
{
"name": "黑野紫",
"deck": "Horus",
"dialog": "wof-Kurono-Yukari"
},
{
"name": "克里斯汀·罗森塔尔",
"deck": "BlueEyesMaxDragon",
"dialog": "wof-Christine-Rosenthal"
},
{
"name": "白鸟芽衣",
"deck": "Phantasm",
"dialog": "wof-Shiratori-Mei"
},
{
"name": "八宫一月",
"deck": "GrenMajuThunderBoarder",
"dialog": "wof-Hachimiya-Kaduki"
},
{
"name": "浅仓纱花",
"deck": "ChainBurn",
"dialog": "wof-Asukura-Sayaka"
},
{
"name": "黑崎智秋",
"deck": "FamiliarPossessed",
"dialog": "wof-Kurosaki-Chiaki"
}
]
}
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"windbots": [ "windbots": [
{ {
"name": "羽柔子", "name": "羽柔子",
"deck": "Test", "deck": "Lucky",
"dialog": "rd" "dialog": "rd"
} }
] ]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment