Commit 1d715c3f authored by nanahira's avatar nanahira

Merge branch 'master' of https://github.com/purerosefallen/windbot into 2pick

parents 86c9807e caac9c0c
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
#WindBot
/WindBot.exe
/WindBot.exe.*
/WindBot.vshost.exe
/WindBot.vshost.exe.*
/cards.cdb
# User-specific files
*.suo
*.user
......@@ -155,3 +162,5 @@ $RECYCLE.BIN/
# Mac desktop service store files
.DS_Store
/.vs*
......@@ -2,159 +2,199 @@
# !name
# command
# description
# flags (avail flags: SUPPORT_MASTER_RULE_3, SUPPORT_NEW_MASTER_RULE)
# flags (avail flags: SUPPORT_MASTER_RULE_3, SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020)
!随机-非常简单
Random=AI_LV1
主要是一些沙包。
SUPPORT_NEW_MASTER_RULE
SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!随机-简单
Random=AI_LV2
一些比较弱的卡组。
SUPPORT_NEW_MASTER_RULE
SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!随机-普通
Random=AI_LV3
一些环境里可以看到的卡组。
SUPPORT_NEW_MASTER_RULE
!随机-报社
Random=AI_ANTI_META
一些报复社会(针对主流卡组的弱点)的卡组。
SUPPORT_NEW_MASTER_RULE
!悠悠
Name=悠悠 Deck=MokeyMokey Dialog=mokey.zh-CN
沙包。
AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
!悠悠王
Name=悠悠王 Deck=MokeyMokeyKing Dialog=mokey.zh-CN
大沙包。
AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!谜之剑士LV4-龙骑星爆
Name=谜之剑士LV4 Deck=Dragunity Dialog=swordsman.zh-CN
龙骑轴星尘龙爆裂体卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
!谜之剑士LV4-L8
Name=谜之剑士LV4 Deck='Level VIII' Dialog=swordsman.zh-CN
8星同调卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!谜之剑士LV4-R5
Name=谜之剑士LV4 Deck='Rank V' Dialog=swordsman.zh-CN
5阶超量卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!谜之剑士LV4-异热同心武器
Name=谜之剑士LV4 Deck='Zexal Weapons' Dialog=swordsman.zh-CN
神装电光皇卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!谜之剑士LV4-8星同调
Name=谜之剑士LV4 Deck='Level VIII' Dialog=swordsman.zh-CN
8星同调卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!琪露诺-彩虹
Name=琪露诺 Deck=Rainbow Dialog=cirno.zh-CN
全属性凡骨卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!琪露诺-饼蛙
Name=琪露诺 Deck='Toadally Awesome' Dialog=cirno.zh-CN
大师规则三的全盛饼蛙卡组。
SUPPORT_MASTER_RULE_3
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020
!复制植物-青眼
Name=复制植物 Deck=Blue-Eyes Dialog=copy.zh-CN
青眼卡组。
AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!复制植物-十二兽
Name=复制植物 Deck=Zoodiac Dialog=copy.zh-CN
大师规则三的十四兽卡组。
SUPPORT_MASTER_RULE_3
AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020
!尼亚-妖仙兽
Name=尼亚 Deck=Yosenju Dialog=near.zh-CN
妖仙兽卡组。
AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!尼亚-机壳
Name=尼亚 Deck=Qliphort Dialog=near.zh-CN
机壳卡组。
AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!尼亚-淘气仙星
Name=尼亚 Deck=Trickstar Dialog=near.zh-CN
淘气仙星卡组。
AI_LV3 SUPPORT_NEW_MASTER_RULE
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!尼亚-幻变骚灵
Name=尼亚 Deck=Altergeist Dialog=near.zh-CN
幻变骚灵卡组。
AI_LV3 SUPPORT_NEW_MASTER_RULE
!复制梁龙-闪刀姬
Name=复制梁龙 Deck=SkyStriker Dialog=anothercopy.zh-CN
旧式闪刀姬卡组。
AI_LV3 SUPPORT_NEW_MASTER_RULE
!复制梁龙-自奏圣乐
Name=复制梁龙 Deck=Orcust Dialog=anothercopy.zh-CN
自奏圣乐卡组。
AI_LV3 SUPPORT_NEW_MASTER_RULE
!复制梁龙-转生炎兽
Name=复制梁龙 Deck=Salamangreat Dialog=anothercopy.zh-CN
转生炎兽卡组。
AI_LV3 SUPPORT_NEW_MASTER_RULE
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!永远之魂-削血
Name=永远之魂 Deck=Burn Dialog=soul.zh-CN
老式削血卡组。
SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!永远之魂-青蛙
Name=永远之魂 Deck=Frog Dialog=soul.zh-CN
老式青蛙卡组。
AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!永远之魂-荷鲁斯
Name=永远之魂 Deck=Horus Dialog=soul.zh-CN
老式龙族卡组。
AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!悠悠
Name=悠悠 Deck=MokeyMokey Dialog=mokey.zh-CN
沙包。
AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!悠悠王
Name=悠悠王 Deck=MokeyMokeyKing Dialog=mokey.zh-CN
大沙包。
AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!试作型机器人1732
Name=试作型机器人1732 Deck=ST1732 Dialog=zh-CN
由三盒ST17和三盒SD32组成的卡组。
AI_LV2 SUPPORT_NEW_MASTER_RULE
AI_LV2 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!千奈-影灵衣
Name=千奈 Deck=Nekroz Dialog=sennai.zh-CN
To be added.
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!千奈-光道
Name=千奈 Deck=Lightsworn Dialog=sennai.zh-CN
To be added.
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!弥音-黑羽
Name=弥音 Deck=Blackwing Dialog=meon.zh-CN
To be added.
AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!弥音-电子龙
Name=弥音 Deck=CyberDragon Dialog=meon.zh-CN
To be added.
AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!弥音-入魔
Name=弥音 Deck=Evilswarm Dialog=meon.zh-CN
To be added.
AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!早苗-守墓
Name=早苗 Deck=Gravekeeper Dialog=sanae.zh-CN
早苗的奇迹。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!早苗-灰篮
Name=早苗 Deck=Graydle Dialog=sanae.zh-CN
早苗的秘术。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!早苗-???
Name=早苗 Deck='Old School' Dialog=sanae.zh-CN
早苗的信仰。
AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!奇異果
Name=奇異果 Deck=LightswornShaddoldinosour Dialog=kiwi.zh-TW
光道影依恐龙卡组。
AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
!奇魔果
Name=奇魔果 Deck=DarkMagician Dialog=kiwi.zh-TW
黑魔术师卡组。
AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!MAX龍果
Name=MAX龍果 Deck=BlueEyesMaxDragon Dialog=kiwi.zh-TW
青眼混沌极龙卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!幻煌果
Name=幻煌果 Deck=Phantasm Dialog=kiwi.zh-TW
幻煌龙卡组。
AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!燃血鬥士
Name=燃血鬥士 Deck=ChainBurn Dialog=kiwi.zh-TW
连锁烧卡组。
AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!彩音-闪刀姬
Name=彩音 Deck=SkyStriker Dialog=ayane.zh-CN
纯闪刀姬卡组。
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!報社鬥士
Name=報社鬥士 Deck=GrenMajuThunderBoarder Dialog=kiwi.zh-TW
红莲雷王滑板卡组。
AI_ANTI_META SUPPORT_NEW_MASTER_RULE
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!彩音-黑魔术师
Name=彩音 Deck=DarkMagician Dialog=ayane.zh-CN
黑魔术师卡组。
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!朱露咲浅羽-自奏圣乐
Name=朱露咲浅羽 Deck=Orcust Dialog=nlch.zh-CN
浅羽的草莓蛋糕。
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!朱露咲浅羽-转生炎兽
Name=朱露咲浅羽 Deck=Salamangreat Dialog=nlch.zh-CN
浅羽的香喷喷曲奇。
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!朱露咲浅羽-真红眼
Name=朱露咲浅羽 Deck=Dragun Dialog=nlch.zh-CN
超魔导真红眼龙骑士卡组。
AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
#created by ...
#main
46986414
46986414
74677422
74677422
67300516
10802915
10802915
26202165
91646304
14558127
14558127
72291078
72291078
72291078
23434538
23434538
23434538
97631303
97631303
97631303
1845204
1845204
6172122
6172122
6172122
11827244
11827244
18144506
81439173
83764718
92353449
92353449
24224830
24224830
24224830
10045474
10045474
10045474
40605147
40605147
#extra
37818794
37818794
37818794
96334243
63519819
50588353
70369116
70369116
98978921
98978921
31226177
31226177
60303245
60303245
60303245
!side
#created by ...
#main
71197066
71197066
15397015
15397015
15397015
71564252
71564252
71564252
14558127
14558127
36584821
36584821
36584821
23434538
23434538
63845230
63845230
63845230
18144506
35261759
35261759
35261759
59750328
59750328
70368879
98645731
98645731
98645731
......@@ -30,48 +27,47 @@
10045474
10045474
10813327
15693423
23924608
47475363
47475363
30241314
30241314
36975314
36975314
58921041
58921041
61740673
61936647
69452756
40605147
40605147
77538567
41420027
41420027
77538567
#extra
86221741
31833038
85289965
5043010
30194529
38342335
2857636
24094258
75452921
50588353
3987233
3987233
63288573
98978921
41999284
41999284
41999284
!side
10000080
86937530
71564252
14558127
62015408
23434538
9742784
70368879
19508728
10045474
15693423
24207889
30241314
61740673
61936647
69452756
23002292
41420027
41420027
77538567
#created by ...
#main
89631139
#extra
!side
{
"welcome": [
"勇士是不会失败的!",
"来一场痛快的决斗!",
"我们开始吧。"
],
"deckerror": [
"为什么我的{0}不能用了?"
],
"duelstart": [
"决斗开始!",
"决斗开始了。"
],
"newturn": [
"我的回合,抽卡!"
],
"endturn": [
"我的回合结束了",
"回合结束。"
],
"directattack": [
"{0},将对手斩成两段!",
"{0},直接攻击!",
"上吧,{0}!",
"怎么样!还能忍得住吗?",
"怎么样,还喘得过气吗?"
],
"attack": [
"{0},将{1}斩成两段!",
"{0},把{1}斩成两半!",
"上吧,{0},把{1}斩成两半!",
"上吧,{0},把{1}斩成两段!"
],
"ondirectattack": [
"勇士是不会输的!",
"{0}你给我记住!",
"我不会输的!"
],
"facedownmonstername": "盖放的怪兽",
"activate": [
"我发动{0}。",
"我使用{0}的效果。",
"我使用{0}的力量。",
"我发动{0}的效果。"
],
"summon": [
"我召唤{0}。",
"出来吧,{0}!",
"出现吧,{0}!",
"命运的时刻到了。出来吧,{0}!",
"命运的时刻到了。出现吧,{0}!"
],
"setmonster": [
"我放置了一只怪兽。",
"我放置了一只怪兽,有本事就来吧!",
"不怕死就打过来吧!"
],
"chaining": [
"我连锁发动{0}。",
"这时候,我使用{0}的效果。",
"这时候,我使用{0}的力量。",
"我连锁发动{0}的效果。"
]
}
{
"welcome": [
"AI in testing, please report bugs in our Discord Chat or Forum.",
"Time for the Haruchin festival!",
"Don't wish for single luck, wish for double luck."
],
"deckerror": [
"It seems I cannot use my {0}..."
],
"duelstart": [
"Recently I got this toy named something something Zoodiac..",
"Recently I also got tons of new decks! Let me test them 1 by 1.",
"New Master Rule!! It broke so many of my old decks!",
"Tier 0 Decks? Come on, it's a part of this game!",
"Copying Tier 0 decks are wrong? But Haruchin is always right!",
"No...I forgot how to use this deck I copied..."
],
"newturn": [
"It's Haruchin's turn, I draw!",
"Drawing cards like a star!",
"It's my turn to shine!",
"DESTINY DR-Oh, just kidding.",
"SHINING DR-Oh, just kidding."
],
"endturn": [
"Turn End.",
"I end my turn.",
"According to my notes, this is a good field.",
"It's your turn."
],
"directattack": [
"{0}, direct attack!",
"{0}, attack him directly!",
"{0}, he's defenseless, attack!",
"{0}, attack his life points!",
"{0}, attack his life points directly!",
"{0}, attack him through a direct attack!",
"{0}, attack him using a direct attack!",
"{0}, unleash your power through a direct attack!",
"My {0} is going to smash your life points!",
"Show your power to my opponent, {0}!",
"You can't stop me. {0}, attack!"
],
"attack": [
"{0}, attack this {1}!",
"{0}, destroy this {1}!",
"{0}, charge the {1}!",
"{0}, strike that {1}!",
"{0}, unleash your power on this {1}!"
],
"ondirectattack": [
"Ouch...",
"Just a {0} ...",
"Think you can defeat me?",
"I'm afraid your {0} won't survive to your next turn."
],
"activate": [
"I'm activating {0}.",
"I'm using the effect of {0}.",
"I use the power of {0}."
],
"summon": [
"I'm summoning {0}.",
"Come on, {0}!",
"Appear, {0}!",
"I summon the powerful {0}.",
"I call {0} to the battle!",
"I'm calling {0}.",
"Let's summon {0}."
],
"setmonster": [
"I'm setting a monster.",
"I set a face-down monster.",
"I place a hidden monster."
],
"chaining": [
"Look at that! I'm activating {0}.",
"I use the power of {0}.",
"Get ready! I use {0}.",
"I don't think so. {0}, activate!",
"Looks like you forgot my {0}.",
"Did you consider the fact I have {0}?"
]
}
\ No newline at end of file
{
"welcome": [
"The Magical Spirit of the 3rd Planet, Creamy Kagarin at your service!",
"You can reach me and my decks by entering AI#MS3PKagari into password field."
],
"duelstart": [
"Let's see how well you humans can do.",
"Misplays? No, I'm just going easy on you."
],
"newturn": [
"My turn begins.",
"My turn, draw.",
"I draw a card."
],
"endturn": [
"With this, I end my turn.",
"My turn is over.",
"I'm curious in what moves you can pull."
],
"directattack": [
"{0}, direct attack!",
"{0}, attack him directly!",
"{0}, he's defenseless, attack!",
"{0}, attack his life points!",
"{0}, attack his life points directly!",
"{0}, attack him through a direct attack!",
"{0}, attack him using a direct attack!",
"{0}, unleash your power through a direct attack!",
"My {0} is going to pass down a judgement!",
"Show your power to my opponent, {0}!",
"We cannot be stopped. {0}, attack!"
],
"attack": [
"{0}, attack this {1}!",
"{0}, destroy this {1}!",
"{0}, charge the {1}!",
"{0}, strike that {1}!",
"{0}, unleash your power on this {1}!"
],
"ondirectattack": [
"The Stars' decision will not be wavered by your resistance!",
"Just {0} ...",
"That's some good spirit!"
],
"activate": [
"I'm activating {0}.",
"I'm using the effect of {0}.",
"I use the power of {0}."
],
"summon": [
"I'm summoning {0}.",
"Come on, {0}!",
"Appear, {0}!",
"I summon the powerful {0}.",
"I call {0} to the battle!",
"I'm calling {0}.",
"Let's summon {0}."
],
"setmonster": [
"I'm setting a monster.",
"I set a face-down monster.",
"I place a hidden monster."
],
"chaining": [
"Look at that! I'm activating {0}.",
"I use the power of {0}.",
"Get ready! I use {0}.",
"I don't think so. {0}, activation!",
"Looks like you forgot my {0}.",
"Did you consider the fact I have {0}?"
]
}
\ No newline at end of file
{
"welcome": [
"I see you guys spend your merry time tormenting my sister...",
"Get ready."
],
"duelstart": [
"Let's get down to business.",
"Might makes Right.",
"It's a necessary evil.",
"Haruka has too much spirit for her own good."
],
"newturn": [
"Draw.",
"My Turn.",
"Huh."
],
"endturn": [
"......",
"It's your go.",
"*stare*",
"It's your turn."
],
"directattack": [
"{0}, direct attack!",
"{0}, Go!",
"{0}, he's defenseless, attack!",
"{0}, attack his life points!",
"{0}, attack his life points directly!",
"{0}, unleash your power through a direct attack!",
"My {0} is going to smash your life points!",
"Show your power to my opponent, {0}!",
"Yield!",
"No Mercy!"
],
"attack": [
"{0}, Don't show mercy!",
"{0}, make them realize their mistake!",
"{0}, Destroy that {1}!",
"Your monsters means nothing!",
"Let's Power it through!"
],
"ondirectattack": [
"Heh.",
"Not Bad.",
"Now that's interesting."
],
"activate": [
"I'm activating {0}.",
"I'm using the effect of {0}.",
"I use the power of {0}."
],
"summon": [
"I'm summoning {0}.",
"Come on, {0}!",
"Appear, {0}!",
"I summon the powerful {0}.",
"I call {0} to the battle!",
"I'm calling {0}.",
"Let's summon {0}.",
"Monster Summon.",
"Don't mind me.",
"Let's see.."
],
"setmonster": [
"I'm setting a monster.",
"I set a face-down monster.",
"I place a hidden monster."
],
"chaining": [
"I don't think so. {0}, activation!",
"Looks like you forgot my {0}.",
"Did you consider the fact I have {0}?",
"Take This.",
"Look at this.",
"You will never be ready.",
"Repent.",
"Failing to plan, then you're planning to fail."
]
}
\ No newline at end of file
{
"welcome": [
"呜,好冷……",
"呜,好害怕……",
"呜,好怕生……"
],
"deckerror": [
"为什么我的{0}不能用了?"
],
"duelstart": [
"对面强不强呢……?好怕哦",
"对面是不是主流呢……?好怕哦"
],
"newturn": [
"我的回合,抽卡。"
],
"endturn": [
"我的回合结束了",
"但愿能再一回合……",
"回合结束。"
],
"directattack": [
"{0},直接攻击!",
"{0},直接攻击对手!",
"这样……就可以吗?",
"这样……就可以吗?有点害怕。"
],
"attack": [
"{0},向对面的{1}试探一下看看。",
"{0},摸一下{1}看看。",
"对面的{1}长什么样子呢……?"
],
"ondirectattack": [
"呜不要!",
"呜不要欺负我!",
"呜你就知道欺负萌新!",
"呜你怎么这样的!"
],
"facedownmonstername": "盖放的怪兽",
"activate": [
"我发动一下{0}试试看……?",
"我发动一下{0}看看……?",
"也许发动一下{0}就可以吧……",
"不知道发动一下{0}可不可以……"
],
"summon": [
"我召唤{0}。",
"我把{0}放下来看看。",
"放下来{0}可不可以呢?",
"不知道{0}能活多久……",
"不知道{0}能坚持多久……",
"不知道{0}能挺住多久……"
],
"setmonster": [
"还是把这个放在这里好了。",
"对面好厉害,我就盖一只怪兽看看……"
],
"chaining": [
"这时候发动一下{0}看看?",
"这时候发动{0}看看?",
"我连锁发动{0}试试吧。",
"不知道{0}这时候能不能起作用,试试吧。"
]
}
{
"welcome": [
"今天又是谁来拜访本茶会啦?",
"最近茶会总是没有人,怎么办呢"
],
"deckerror": [
"我的超主流卡组需要{0}才能玩。"
],
"duelstart": [
"那么,本小姐要上啦!",
"本小姐没那么容易被打败的!",
"本小姐的牌技还是不错的!",
"大家为本小姐加油哦。"
],
"newturn": [
"到我的回合了,抽卡!",
"我的回合,抽卡!",
"我抽了一张卡。"
],
"endturn": [
"回合结束。",
"我的回合结束了。",
"轮到你啦!快点!",
"轮到你了。"
],
"directattack": [
"{0},直接攻击!",
"{0},给我上!",
"{0},给本小姐上!",
"{0},不要停,给我上!",
"{0},给我上,有糖吃。",
"{0},给我上,这局赢定啦!",
"对面没怪了?好,{0},给我上!"
],
"attack": [
"{0},给我打倒{1}!",
"{0},替本小姐打倒{1}!",
"{0},打倒{1}!",
"{0},冲向那只{1}!",
"{0},把你的力量释放到{1}上吧!"
],
"ondirectattack": [
"这么可怕的吗…",
"本小姐这次让你一回。",
"果然本小姐还是太弱了……"
],
"facedownmonstername": "怪兽",
"activate": [
"本小姐发动{0}。",
"本小姐使用{0}。"
],
"summon": [
"我召唤{0}。",
"本小姐召唤{0}。",
"出来吧,{0}!",
"出现吧,{0}!",
"给我出来,{0}!",
"给本小姐出来,{0}!"
],
"setmonster": [
"我放置了一只怪兽。",
"我里侧表示放置了一只怪兽。"
],
"chaining": [
"本小姐发动{0}!",
"本小姐使用{0}!",
"本小姐使用{0},惊喜吗?",
"送给你一个大惊喜。本小姐发动{0}!",
"没留意吧!本小姐要使用{0}了!"
]
}
{
"welcome": [
"又有新的客人来了呢~",
"守矢神社又来新的客人了呢~",
"新的客人是什么样子的呢?"
],
"deckerror": [
"为什么我的{0}不能用了?"
],
"duelstart": [
"是时候调教一下客人了",
"这位客人看起来很好吃呢~"
],
"newturn": [
"我的回合,抽卡!",
"我的回合,抽卡!准备吃掉你呢。"
],
"endturn": [
"我的回合结束了,下回合继续吃你。",
"回合结束,下回合继续吃你。",
"我的回合结束了.",
"回合结束。"
],
"directattack": [
"{0},把这位客人吃掉!",
"{0},享受盛宴吧!",
"{0},对面的客人很好吃呢,快去尝尝~",
"{0},对面的客人香香的呢~",
"还忍耐的了吗~?"
],
"attack": [
"{0},把{1}吃掉!",
"{0},享受盛宴吧!",
"{0},对面的{1}很好吃呢,快去尝尝~",
"{0},对面的{1}香香的呢~",
"还忍耐的了吗~?"
],
"ondirectattack": [
"啊啊啊我不好吃,别吃我",
"下回合继续吃你!",
"啊啊啊我不要被吃掉!"
],
"facedownmonstername": "盖放的怪兽",
"activate": [
"我发动{0}。",
"我使用{0}的效果。",
"我发动{0}的效果。",
"我发动{0}。等着被吃掉吧!",
"我使用{0}的效果。等着被吃掉吧!",
"我发动{0}的效果。等着被吃掉吧!"
],
"summon": [
"我召唤{0}。",
"出来吧,{0}!",
"出现吧,{0}!",
"我召唤{0}。待会儿吃掉你。",
"出来吧,{0}!待会儿吃掉你!",
"出现吧,{0}!待会儿吃掉你!"
],
"setmonster": [
"我放置了一只怪兽。",
"我放置了一只怪兽,赶吃么?",
"不怕被吃掉就打过来吧!"
],
"chaining": [
"看这里!我发动{0}!",
"等一下!我发动{0}!",
"我连锁发动{0}!",
"没想到吧!我发动{0}!",
"看这里!我发动{0}!看看谁吃掉谁!",
"等一下!我发动{0}!被吃掉的是你哦~!",
"我连锁发动{0}!被吃掉的是你哦~!",
"没想到吧!我发动{0}!看看谁吃掉谁!"
]
}
{
"welcome": [
"本小姐是最强的!",
"真是一个强劲的对手呢~",
"我们开始吧。"
],
"deckerror": [
"为什么我的{0}不能用了?"
],
"duelstart": [
"你打不过我的。",
"你还是趁早放弃吧。"
],
"newturn": [
"我的回合,抽卡!"
],
"endturn": [
"我的回合结束了",
"回合结束。"
],
"directattack": [
"{0},直接攻击!",
"{0},直接攻击对手!",
"上吧,{0}!",
"怎么样!",
"怎么样,还喘得过气吗?"
],
"attack": [
"{0},攻击这只{1}!",
"{0},消灭这只{1}!",
"{0},打倒{1}!",
"{1},再见了。"
],
"ondirectattack": [
"这有点厉害……",
"下回合你的{0}估计要没了.jpg",
"我不会输的!"
],
"facedownmonstername": "盖放的怪兽",
"activate": [
"我发动{0}。",
"我使用{0}的效果。",
"我发动{0}的效果。"
],
"summon": [
"我召唤{0}。",
"出来吧,{0}!",
"出现吧,{0}!",
"出来吧,我的灵魂,{0}!",
"出来吧,我的分身,{0}!"
],
"setmonster": [
"我放置了一只怪兽。",
"我放置了一只怪兽,敢打过来么?",
"不怕死就打过来吧!"
],
"chaining": [
"看这里!我发动{0}!",
"等一下!我发动{0}!",
"我连锁发动{0}!",
"没想到吧!我发动{0}!"
]
}
{
"welcome": [
"你好,我太帅了。"
],
"deckerror": [
"抱歉,我的卡组里的{0}的数量似乎出了问题。"
],
"duelstart": [
"进行堂堂正正的决斗吧(裤裆藏龙)"
],
"newturn": [
"接下来就是我的舞台"
],
"endturn": [
"我的回合结束,试试来击溃我吧"
],
"directattack": [
"老子上了,要你的命"
],
"attack": [
"消失吧,杂鱼"
],
"ondirectattack": [
"爸爸,饶命"
],
"facedownmonstername": "怪兽",
"activate": [
"我发动,这张卡的效果,虽然上面没写,但就是可以这样用。"
],
"summon": [
"强,无敌",
"召唤{0},赚爆",
"{0}简直假卡",
"我永远喜欢{0}"
],
"setmonster": [
"又卡手了"
],
"chaining": [
"愚蠢,看我见招拆招"
]
}
FROM mono
FROM mono as builder
RUN apt update && env DEBIAN_FRONTEND=noninteractive apt install -y wget git
COPY . /windbot-source
WORKDIR /windbot-source
RUN xbuild /p:Configuration=Release /p:TargetFrameworkVersion=v4.5 /p:OutDir=/windbot/
RUN git clone --depth=1 https://github.com/purerosefallen/ygopro-database /ygopro-database && \
cp -rf /ygopro-database/locales/zh-CN/cards.cdb /windbot/
FROM mono
COPY --from=builder /windbot /windbot
WORKDIR /windbot
RUN curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://github.com/moecube/ygopro-database/raw/master/locales/zh-CN/cards.cdb
EXPOSE 2399
CMD [ "mono", "/windbot/WindBot.exe", "ServerMode=true", "ServerPort=2399" ]
......@@ -251,7 +251,7 @@ namespace WindBot.Game.AI
if (remove.Contains(EnemyMZone[i])) EnemyMZone[i] = null;
}
if (!Duel.IsNewRule)
if (!Duel.IsNewRule || Duel.IsNewRule2020)
return Zones.MainMonsterZones;
int result = 0;
......
using System;
using WindBot.Game.AI.Enums;
using YGOSharp.OCGWrapper.Enums;
namespace WindBot.Game.AI
{
......@@ -34,7 +35,7 @@ namespace WindBot.Game.AI
/// </summary>
public static bool IsShouldNotBeTarget(this ClientCard card)
{
return !card.IsDisabled() && Enum.IsDefined(typeof(ShouldNotBeTarget), card.Id);
return !card.IsDisabled() && !card.HasType(CardType.Normal) && Enum.IsDefined(typeof(ShouldNotBeTarget), card.Id);
}
/// <summary>
......
......@@ -811,6 +811,8 @@ namespace WindBot.Game.AI.Decks
public bool Hand_act_eff()
{
if (Card.IsCode(CardId.AB_JS) && Util.GetLastChainCard().HasSetcode(0x11e) && Util.GetLastChainCard().Location == CardLocation.Hand) // Danger! archtype hand effect
return false;
if (Card.IsCode(CardId.GO_SR) && Card.Location == CardLocation.Hand && Bot.HasInMonstersZone(CardId.GO_SR)) return false;
return (Duel.LastChainPlayer == 1);
}
......
......@@ -367,18 +367,19 @@ namespace WindBot.Game.AI.Decks
private bool WindwitchSnowBellsp()
{
if (maxxc_used) return false;
if (Bot.HasInMonstersZone(CardId.WindwitchIceBell) &&
Bot.HasInMonstersZone(CardId.WindwitchGlassBell))
{
AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
}
return false;
}
private bool WindwitchWinterBellsp()
{
if (maxxc_used) return false;
if (Bot.HasInMonstersZone(CardId.WindwitchIceBell) &&
Bot.HasInMonstersZone(CardId.WindwitchGlassBell) &&
Bot.HasInMonstersZone(CardId.WindwitchSnowBell))
......@@ -1622,7 +1623,8 @@ namespace WindBot.Game.AI.Decks
if (Bot.SpellZone[i] != null)
Logger.DebugWriteLine("++++++++SpellZone[" + i + "]= " + Bot.SpellZone[i].Id);
}*/
if (Util.ChainContainsCard(CardId.MaxxC))
maxxc_used = true;
if ((Duel.CurrentChain.Count >= 1 && Util.GetLastChainCard().Id == 0) ||
(Duel.CurrentChain.Count == 2 && !Util.ChainContainPlayer(0) && Duel.CurrentChain[0].Id == 0))
{
......@@ -1638,7 +1640,7 @@ namespace WindBot.Game.AI.Decks
{
Logger.DebugWriteLine("************************last chain card= " + Util.GetLastChainCard().Id);
maxxc_used = true;
}
}
int lockbird_count = 0;
foreach (ClientCard check in Enemy.Graveyard)
{
......
This diff is collapsed.
......@@ -11,6 +11,7 @@ namespace WindBot.Game.AI.Decks
{
public class CardId
{
public const int MetalSnake = 71197066;
public const int InspectBoarder = 15397015;
public const int ThunderKingRaiOh = 71564252;
public const int AshBlossomAndJoyousSpring =14558127;
......@@ -32,6 +33,7 @@ namespace WindBot.Game.AI.Decks
public const int HeavyStormDuster = 23924608;
public const int DrowningMirrorForce = 47475363;
public const int MacroCosmos = 30241314;
public const int Crackdown = 36975314;
public const int AntiSpellFragrance = 58921041;
public const int ImperialOrder = 61740673;
public const int PhatomKnightsSword = 61936647;
......@@ -89,9 +91,13 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, CardId.PotOfDesires, PotOfDesireseff);
AddExecutor(ExecutorType.Activate, CardId.CardOfDemise, CardOfDemiseeff);
//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.MissusRadiant, MissusRadiantsp);
AddExecutor(ExecutorType.Activate, CardId.MissusRadiant, MissusRadianteff);
AddExecutor(ExecutorType.Activate, CardId.Linkuriboh, Linkuriboheff);
AddExecutor(ExecutorType.SpSummon, CardId.Linkuriboh, Linkuribohsp);
AddExecutor(ExecutorType.SpSummon, CardId.LinkSpider);
AddExecutor(ExecutorType.SpSummon, CardId.BorreloadDragon, BorreloadDragonsp);
......@@ -104,7 +110,11 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Summon, CardId.ThunderKingRaiOh, ThunderKingRaiOhsummon);
AddExecutor(ExecutorType.SpSummon, CardId.BorreloadDragon, BorreloadDragonspsecond);
AddExecutor(ExecutorType.SpSummon, CardId.EaterOfMillions, EaterOfMillionssp);
//spell
AddExecutor(ExecutorType.Activate, CardId.MetalSnake, MetalSnakesp);
AddExecutor(ExecutorType.Activate, CardId.MetalSnake, MetalSnakeeff);
//spell
AddExecutor(ExecutorType.Activate, CardId.Crackdown, Crackdowneff);
AddExecutor(ExecutorType.Activate, CardId.MoonMirrorShield, MoonMirrorShieldeff);
AddExecutor(ExecutorType.Activate, CardId.Scapegoat, DefaultScapegoat);
AddExecutor(ExecutorType.Activate, CardId.PhatomKnightsSword, PhatomKnightsSwordeff);
......@@ -360,6 +370,13 @@ namespace WindBot.Game.AI.Decks
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 MoonMirrorShieldeff()
{
if(Card.Location==CardLocation.Hand)
......@@ -430,15 +447,15 @@ namespace WindBot.Game.AI.Decks
private bool BorreloadDragonsp()
{
if (!Bot.HasInMonstersZone(CardId.MissusRadiant)) return false;
if (!(Bot.HasInMonstersZone(CardId.MissusRadiant) || Bot.HasInMonstersZone(new[] { CardId.KnightmareCerberus, CardId.KnightmarePhoenix }))) return false;
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.IsCode(CardId.MissusRadiant, CardId.LinkSpider, CardId.Linkuriboh))
if (monster.IsCode(CardId.MissusRadiant, CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LinkSpider, CardId.Linkuriboh))
material_list.Add(monster);
if (material_list.Count == 3) break;
}
if(material_list.Count>=3)
if (material_list.Count >= 3)
{
AI.SelectMaterials(material_list);
return true;
......@@ -447,11 +464,11 @@ namespace WindBot.Game.AI.Decks
}
private bool BorreloadDragonspsecond()
{
if (!Bot.HasInMonstersZone(CardId.MissusRadiant)) return false;
if (!(Bot.HasInMonstersZone(CardId.MissusRadiant) || Bot.HasInMonstersZone(new[] { CardId.KnightmareCerberus,CardId.KnightmarePhoenix }))) return false;
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.IsCode(CardId.MissusRadiant, CardId.LinkSpider, CardId.Linkuriboh))
if (monster.IsCode(CardId.MissusRadiant, CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LinkSpider, CardId.Linkuriboh))
material_list.Add(monster);
if (material_list.Count == 3) break;
}
......@@ -548,6 +565,37 @@ namespace WindBot.Game.AI.Decks
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.HeavymetalfoesElectrumite,
CardId.BrandishMaidenKagari,
CardId.CrystronNeedlefiber,
CardId.RaidraptorUltimateFalcon,
CardId.NingirsuTheWorldChaliceWarrior
});
AI.SelectNextCard(target);
return true;
}
return false;
}
private bool MissusRadiantsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
......@@ -574,9 +622,10 @@ namespace WindBot.Game.AI.Decks
}
private bool Linkuribohsp()
{
{
foreach (ClientCard c in Bot.GetMonsters())
{
{
if (!c.IsCode(CardId.EaterOfMillions, CardId.Linkuriboh) && c.Level==1)
{
AI.SelectMaterials(c);
......@@ -586,6 +635,23 @@ namespace WindBot.Game.AI.Decks
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.IsCode(CardId.EaterOfMillions) && c.Level == 1)
{
AI.SelectMaterials(c);
return true;
}
}
return false;
}
private bool Linkuriboheff()
{
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false;
......
......@@ -184,6 +184,7 @@ namespace WindBot.Game.AI.Decks
private bool JetSynchronUsed = false;
private bool ScrapWyvernUsed = false;
private bool MaskedChameleonUsed = false;
private int ShootingRiserDragonCount = 0;
private int[] HandCosts = new[]
{
......@@ -217,6 +218,7 @@ namespace WindBot.Game.AI.Decks
JetSynchronUsed = false;
ScrapWyvernUsed = false;
MaskedChameleonUsed = false;
ShootingRiserDragonCount = 0;
}
public override void OnChainEnd()
......@@ -843,12 +845,15 @@ namespace WindBot.Game.AI.Decks
}
else
{
if (Duel.LastChainPlayer == 0 || ShootingRiserDragonCount >= 10)
return false;
ShootingRiserDragonCount++;
AI.SelectCard(new[] {
CardId.BlackRoseMoonlightDragon,
CardId.ScrapDragon,
CardId.PSYFramelordOmega
});
return Duel.LastChainPlayer != 0;
return true;
}
}
......
......@@ -106,7 +106,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, CardId.Lumina, Luminaeff);
//activate
AddExecutor(ExecutorType.Activate, CardId.GlowUpBulb, GlowUpBulbeff);
AddExecutor(ExecutorType.Activate, CardId.TG_WonderMagician);
AddExecutor(ExecutorType.Activate, CardId.TG_WonderMagician, TG_WonderMagicianeff);
AddExecutor(ExecutorType.Activate, CardId.CoralDragon, CoralDragoneff);
AddExecutor(ExecutorType.Activate, CardId.RedWyvern, RedWyverneff);
AddExecutor(ExecutorType.Activate, CardId.CrystalWingSynchroDragon, CrystalWingSynchroDragoneff);
......@@ -230,6 +230,7 @@ namespace WindBot.Game.AI.Decks
}
int Ultimate_ss = 0;
int Enemy_atk = 0;
int TG_WonderMagician_count = 0;
bool Pillused = false;
bool CrystronNeedlefibereff_used = false;
bool OvertexCoatlseff_used = false;
......@@ -274,6 +275,7 @@ namespace WindBot.Game.AI.Decks
ShaddollSquamata_used = false;
ShaddollDragon_used = false;
ShaddollHedgehog_used = false;
TG_WonderMagician_count = 0;
}
private bool Luminasummon()
......@@ -572,7 +574,11 @@ namespace WindBot.Game.AI.Decks
return false;
}
private bool TG_WonderMagicianeff()
{
TG_WonderMagician_count++;
return TG_WonderMagician_count <= 10;
}
private bool AllureofDarkness()
{
IList<ClientCard> materials = Bot.Hand;
......
......@@ -181,6 +181,7 @@ namespace WindBot.Game.AI.Decks
private bool CymbalSkeletonUsed = false;
private bool BorrelswordDragonUsed = false;
private ClientCard RustyBardicheTarget = null;
private int ShootingRiserDragonCount = 0;
private int[] HandCosts = new[]
{
......@@ -214,6 +215,7 @@ namespace WindBot.Game.AI.Decks
CymbalSkeletonUsed = false;
BorrelswordDragonUsed = false;
RustyBardicheTarget = null;
ShootingRiserDragonCount = 0;
}
public override void OnChainEnd()
......@@ -609,7 +611,10 @@ namespace WindBot.Game.AI.Decks
}
else
{
return Duel.LastChainPlayer != 0;
if (Duel.LastChainPlayer == 0)
return false;
ShootingRiserDragonCount++;
return ShootingRiserDragonCount <= 10;
}
}
......
......@@ -1096,6 +1096,7 @@ namespace WindBot.Game.AI.Decks
{
if (Duel.Phase != DuelPhase.Main1) return false;
if (Duel.Turn == 1) return false;
if (wasStallioActivated) return false;
List<ClientCard> material_list = new List<ClientCard>();
List<ClientCard> bot_monster = Bot.GetMonsters();
......
......@@ -6,7 +6,7 @@ using WindBot.Game.AI;
namespace WindBot.Game.AI.Decks
{
[Deck("Toadally Awesome", "AI_ToadallyAwesome", "OutDated")]
[Deck("Toadally Awesome", "AI_ToadallyAwesome")]
public class ToadallyAwesomeExecutor : DefaultExecutor
{
public class CardId
......
......@@ -642,6 +642,8 @@ namespace WindBot.Game.AI.Decks
public bool Hand_act_eff()
{
if (GraveCall_count > 0 && GraveCall_id == Card.Id) return false;
if (Card.IsCode(CardId.Urara) && Util.GetLastChainCard().HasSetcode(0x11e) && Util.GetLastChainCard().Location == CardLocation.Hand) // Danger! archtype hand effect
return false;
if (Card.IsCode(CardId.Urara) && Bot.HasInHand(CardId.LockBird) && Bot.HasInSpellZone(CardId.Re)) return false;
if (Card.IsCode(CardId.Ghost) && Card.Location == CardLocation.Hand && Bot.HasInMonstersZone(CardId.Ghost)) return false;
return (Duel.LastChainPlayer == 1);
......
......@@ -6,7 +6,7 @@ using WindBot.Game.AI;
namespace WindBot.Game.AI.Decks
{
[Deck("Zoodiac", "AI_Zoodiac", "OutDated")]
[Deck("Zoodiac", "AI_Zoodiac")]
class ZoodiacExecutor : DefaultExecutor
{
public class CardId
......
......@@ -402,6 +402,8 @@ namespace WindBot.Game.AI
};
if (Util.GetLastChainCard().IsCode(ignoreList))
return false;
if (Util.GetLastChainCard().HasSetcode(0x11e) && Util.GetLastChainCard().Location == CardLocation.Hand) // Danger! archtype hand effect
return false;
return Duel.LastChainPlayer == 1;
}
/// <summary>
......
......@@ -171,7 +171,10 @@ namespace WindBot.Game.AI
{
string message = string.Format(array[Program.Rand.Next(array.Count)], opts);
if (message != "")
{
_game.Chat(message);
Logger.WriteLine("Error: " + message);
}
}
}
}
......@@ -81,6 +81,7 @@
ImperialCustom = 9995766,
InspectorBoarder = 15397015,
Mashoudou = 76375976,
EternalSoul = 48680970
EternalSoul = 48680970,
MarincessBattleOcean = 91027843
}
}
......@@ -54,5 +54,6 @@
PyroxeneFusion = 55824220,
FragmentFusion = 72029628,
NecroFusion = 81223446,
PredaplantVerteAnaconda = 70369116,
}
}
......@@ -46,6 +46,8 @@
RaidraptorUltimateFalcon = 86221741,
DisdainfulBirdofParadise = 27240101,
DarkestDiabolosLordOfTheLair = 50383626,
Blackwing_FullArmoredWing = 54082269
Blackwing_FullArmoredWing = 54082269,
DragunofRedEyes = 37818794,
RedEyesBDragon = 74677422, // sometimes the name of DragunofRedEyes will be changed to RedEyesBDragon
}
}
......@@ -336,6 +336,11 @@ namespace WindBot.Game
return ids.Contains(Id) || Alias != 0 && ids.Contains(Alias);
}
public bool IsOriginalCode(int id)
{
return Id == id || Alias - Id < 10 && Alias == id;
}
public bool HasXyzMaterial()
{
return Overlays.Count > 0;
......
......@@ -306,10 +306,11 @@ namespace WindBot.Game
public int GetRemainingCount(int cardId, int initialCount)
{
int remaining = initialCount;
remaining = remaining - Hand.Count(card => card != null && card.IsCode(cardId));
remaining = remaining - SpellZone.Count(card => card != null && card.IsCode(cardId));
remaining = remaining - Graveyard.Count(card => card != null && card.IsCode(cardId));
remaining = remaining - Banished.Count(card => card != null && card.IsCode(cardId));
remaining = remaining - Hand.Count(card => card != null && card.IsOriginalCode(cardId));
remaining = remaining - SpellZone.Count(card => card != null && card.IsOriginalCode(cardId));
remaining = remaining - MonsterZone.Count(card => card != null && card.IsOriginalCode(cardId));
remaining = remaining - Graveyard.Count(card => card != null && card.IsOriginalCode(cardId));
remaining = remaining - Banished.Count(card => card != null && card.IsOriginalCode(cardId));
return (remaining < 0) ? 0 : remaining;
}
......
......@@ -7,6 +7,7 @@ namespace WindBot.Game
{
public bool IsFirst { get; set; }
public bool IsNewRule { get; set; }
public bool IsNewRule2020 { get; set; }
public ClientField[] Fields { get; private set; }
......
......@@ -150,7 +150,8 @@ namespace WindBot.Game
/*int rule = */ packet.ReadByte();
/*int mode = */ 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);
BinaryWriter deck = GamePacketFactory.Create(CtosMessage.UpdateDeck);
deck.Write(Deck.Cards.Count + Deck.ExtraCards.Count);
deck.Write(Deck.SideCards.Count);
......@@ -225,6 +226,10 @@ namespace WindBot.Game
{
_room.IsReady[pos] = false;
_room.Names[pos] = null;
if (state == (int)PlayerChange.Leave && Config.GetBool("AutoQuit", false)) {
Connection.Close();
return;
}
}
if (_room.IsHost && _room.IsReady[0] && _room.IsReady[1])
......@@ -285,8 +290,12 @@ namespace WindBot.Game
string message = packet.ReadUnicode(256);
string myName = (player != 0) ? _room.Names[1] : _room.Names[0];
string otherName = (player == 0) ? _room.Names[1] : _room.Names[0];
if (player < 4)
Logger.DebugWriteLine(otherName + " say to " + myName + ": " + message);
if (_debug) {
if (player < 4)
Logger.WriteLine(otherName + " say to " + myName + ": " + message);
else
Logger.WriteLine("Server say to " + myName + ": " + message);
}
}
private void OnErrorMsg(BinaryReader packet)
......@@ -347,7 +356,8 @@ namespace WindBot.Game
_duel.IsFirst = (type & 0xF) == 0;
_duel.Turn = 0;
int duel_rule = packet.ReadByte();
_ai.Duel.IsNewRule = (duel_rule == 4);
_ai.Duel.IsNewRule = (duel_rule >= 4);
_ai.Duel.IsNewRule2020 = (duel_rule >= 5);
_duel.Fields[GetLocalPlayer(0)].LifePoints = packet.ReadInt32();
_duel.Fields[GetLocalPlayer(1)].LifePoints = packet.ReadInt32();
int deck = packet.ReadInt16();
......@@ -1275,13 +1285,13 @@ namespace WindBot.Game
if ((selected & filter) > 0)
filter &= selected;
if ((filter & Zones.z6) != 0) resp[2] = 6;
else if ((filter & Zones.z5) != 0) resp[2] = 5;
else if ((filter & Zones.z2) != 0) resp[2] = 2;
if ((filter & Zones.z2) != 0) resp[2] = 2;
else if ((filter & Zones.z1) != 0) resp[2] = 1;
else if ((filter & Zones.z3) != 0) resp[2] = 3;
else if ((filter & Zones.z0) != 0) resp[2] = 0;
else if ((filter & Zones.z4) != 0) resp[2] = 4;
else if ((filter & Zones.z6) != 0) resp[2] = 6;
else if ((filter & Zones.z5) != 0) resp[2] = 5;
}
else
{
......
......@@ -45,8 +45,14 @@ namespace WindBot.Game
Connection.Connected += OnConnected;
Connection.PacketReceived += OnPacketReceived;
Connection.Connect(IPAddress.Parse(_serverHost), _serverPort);
IPAddress target_address;
try {
target_address = IPAddress.Parse(_serverHost);
} catch (System.Exception e) {
IPHostEntry _hostEntry = Dns.GetHostEntry(_serverHost);
target_address = _hostEntry.AddressList[0];
}
Connection.Connect(target_address, _serverPort);
}
private void OnConnected()
......@@ -81,4 +87,4 @@ namespace WindBot.Game
_behavior.OnPacket(reader);
}
}
}
\ No newline at end of file
}
......@@ -44,6 +44,9 @@ False to turn the chat of bot off.
`Debug`
Print verbose log of card movement info. False at default. (May be updated in future)
`AutoQuit`
Automatically quit the room when opponent leaves. Default `false`.
`ServerMode` and `ServerPort`
WindBot can run as a "server", provide a http interface to create bot.
......@@ -75,6 +78,8 @@ WindBot can run as a "server", provide a http interface to create bot.
* DarkMagician
* Dragun
* Dragunity
* GrenMajuThunderBoarder
......@@ -99,7 +104,7 @@ WindBot can run as a "server", provide a http interface to create bot.
* ST1732
* Toadally Awesome (old lflist, master rule 3 only)
* Toadally Awesome
* Trickstar
......@@ -107,7 +112,7 @@ WindBot can run as a "server", provide a http interface to create bot.
* Zexal Weapons
* Zoodiac (old lflist, master rule 3 only)
* Zoodiac
### Unfinished decks
......@@ -269,3 +274,8 @@ The parameters are same as commandlines, but low cased.
* Update the known card enums
* More default common cards executor
### Features in this branch
* Added support for Group.SelectUnselect. This is mainly to support KoishiPro or EdoPro.
......@@ -68,6 +68,7 @@
<Compile Include="Game\AI\DecksManager.cs" />
<Compile Include="Game\AI\Decks\AltergeistExecutor.cs" />
<Compile Include="Game\AI\Decks\BlackwingExecutor.cs" />
<Compile Include="Game\AI\Decks\DragunExecutor.cs" />
<Compile Include="Game\AI\Decks\Level8Executor.cs" />
<Compile Include="Game\AI\Decks\SalamangreatExecutor.cs" />
<Compile Include="Game\AI\Decks\CyberDragonExecutor.cs" />
......
......@@ -22,7 +22,7 @@ namespace WindBot
Host = "127.0.0.1";
Port = 7911;
HostInfo = "";
Version = 0x134b;
Version = 0x1350;
Hand = 0;
Debug = false;
Chat = true;
......
version: '{build}'
environment:
access_token:
secure: DOOS4g7CT8ctOgiMr62K56qQ1FO6s2ESpqNZlhf8F4nomemvvwxV/pRj9nbKmtjR
platform: x86
configuration: Release
......@@ -12,12 +8,11 @@ build:
parallel: true
after_build:
- mv bin\Release WindBot
- rm WindBot\WindBot.exe.config
- mv BotWrapper\bin\Release\Bot.exe .
- mv BotWrapper\bin\Release\bot.conf .
- 7z a WindBot.7z WindBot Bot.exe bot.conf
- mv -f bin\Release WindBot
- rm -rf WindBot\WindBot.exe.config
- mv -f BotWrapper\bin\Release\Bot.exe .
- mv -f BotWrapper\bin\Release\bot.conf .
- 7z a -mx9 WindBot.7z WindBot Bot.exe bot.conf
test: off
artifacts:
......@@ -25,9 +20,12 @@ artifacts:
name: WindBot
deploy:
description: 'Automatic build by Appveyor.'
provider: GitHub
auth_token: $(access_token)
force_update: true
on:
appveyor_repo_tag: true
release: latest
description: 'Automatic build commit $(APPVEYOR_REPO_COMMIT) $(APPVEYOR_REPO_COMMIT_TIMESTAMP)'
provider: GitHub
force_update: true
auth_token:
secure: EQ9miMjfX/QAoBvgc6D+JLmHatLyxOEKZ/uo68QijxWW5Gp4MzB/pOH9+u2GlDVO
on:
branch: master
{
"name": "windbot-server",
"interpreter": "/usr/bin/mono",
"script": "WindBot.exe",
"args": "servermode=true serverport=2399",
"error_file": "error.log",
"out_file": "log.log"
}
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