Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
W
windbot
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
神之吹息
windbot
Commits
917e0372
Commit
917e0372
authored
Sep 27, 2021
by
苍蓝
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
4f4e4008
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
632 additions
and
18 deletions
+632
-18
BotWrapper/bot.conf
BotWrapper/bot.conf
+6
-1
Decks/AI_SaikyoBattleFlag.ydk
Decks/AI_SaikyoBattleFlag.ydk
+49
-0
Decks/AI_TheLegend.ydk
Decks/AI_TheLegend.ydk
+1
-1
Dialogs/rd1.json
Dialogs/rd1.json
+75
-0
Game/AI/AIUtil.cs
Game/AI/AIUtil.cs
+2
-1
Game/AI/CardContainer.cs
Game/AI/CardContainer.cs
+5
-0
Game/AI/Decks/MokeyMokeyExecutor.cs
Game/AI/Decks/MokeyMokeyExecutor.cs
+31
-5
Game/AI/Decks/MokeyMokeyKingExecutor.cs
Game/AI/Decks/MokeyMokeyKingExecutor.cs
+31
-6
Game/AI/Decks/SaikyoBattleFlagExecutor.cs
Game/AI/Decks/SaikyoBattleFlagExecutor.cs
+420
-0
Game/AI/DefaultExecutor.cs
Game/AI/DefaultExecutor.cs
+2
-1
WindBot.csproj
WindBot.csproj
+2
-0
bots.json
bots.json
+8
-3
No files found.
BotWrapper/bot.conf
View file @
917e0372
...
...
@@ -5,7 +5,7 @@
# flags (avail flags: SUPPORT_MASTER_RULE_3, SUPPORT_NEW_MASTER_RULE, SUPPORT_MASTER_RULE_2020)
!齿车戒龙
Name
=齿车戒龙
Deck
=
MokeyMokey
Dialog
=
zh
-
CN
Name
=齿车戒龙
Deck
=
MokeyMokey
Dialog
=
rd1
龙法卡组。
SUPPORT_MASTER_RULE_3
SUPPORT_NEW_MASTER_RULE
SUPPORT_MASTER_RULE_2020
...
...
@@ -19,6 +19,11 @@ Name=大恐龙驾 Deck=DinocarriageDynarmix Dialog=zh-CN
恐龙卡组。
SUPPORT_MASTER_RULE_3
SUPPORT_NEW_MASTER_RULE
SUPPORT_MASTER_RULE_2020
!最强战旗
Name
=最强战旗
Deck
=
SaikyoBattleFlag
Dialog
=
zh
-
CN
机械卡组。
SUPPORT_MASTER_RULE_3
SUPPORT_NEW_MASTER_RULE
SUPPORT_MASTER_RULE_2020
!传说子
Name
=传说子
Deck
=
TheLegend
Dialog
=
rd
大量传说卡堆成的卡组。
...
...
Decks/AI_SaikyoBattleFlag.ydk
0 → 100644
View file @
917e0372
#created by ...
#main
120183024
120183024
120183031
120183031
120183054
120183054
120181001
120181001
120181001
120155015
120155015
120155015
120193002
120193002
120193002
120183002
120183002
120183031
120183030
120183030
120183030
120151010
120181011
120181011
120181011
120193003
120193003
120193003
120130039
120130039
120183054
120151023
120155060
120155060
120183062
120183062
120183063
120183063
120183063
120183064
#extra
!side
Decks/AI_TheLegend.ydk
View file @
917e0372
...
...
@@ -2,11 +2,11 @@
#main
120120000
120120000
120120000
120170000
120170000
120110001
120110001
120110001
120183000
120194002
120194002
...
...
Dialogs/rd1.json
0 → 100644
View file @
917e0372
{
"welcome"
:
[
"你要注意,你的对手是史上最强的决斗者。"
,
"我已经预料到你下一步的行动了"
],
"deckerror"
:
[
"抱歉,我的卡组里的{0}的数量似乎出了问题。"
],
"duelstart"
:
[
"演出时间到!"
,
"我要用决斗带来笑容!"
],
"newturn"
:
[
"看好了,我华丽的抽卡!"
,
"看我的魔术抽卡!"
,
"我将手牌补满五张"
],
"endturn"
:
[
"哼,慢慢挣扎吧"
,
"完美的谢幕。"
,
"看来,演出轮到你的环节。"
],
"directattack"
:
[
"{0},让对手看看你完美的直接攻击!"
,
"{0},让对手生命的微弱烛光熄灭吧"
,
"看来你即将失去一切。{0},攻击!"
,
"熄灭吧!熄灭吧!人生不过是行走的影子。{0},直接攻击!"
,
"{0},让谢幕变得更完美些吧"
,
"{0},用你的魔术偷走对手的生命"
,
"{0},嚯嚯嚯,华丽的直接攻击"
,
"{0},让对手感受绝望!"
,
"我的搭档{0}的直接攻击表演!"
,
"来让大家看看你的绝活吧,{0}!"
,
"啊,我们破坏了对手的防御。{0},攻击!"
],
"attack"
:
[
"{0},和{1}对手戏!"
,
"{0}和{1}将要来一场骑士决斗!"
,
"{0},观众们在期待你和{1}的厮杀!"
,
"{0},用戏法把{1}变没吧"
,
"{0},让{1}看看真正强者的演出手段!"
],
"ondirectattack"
:
[
"不,我的道具!我的戏法!……"
,
"{0}这种二流竟然……啊!"
,
"我完美的把戏竟然被拆穿了?!"
],
"facedownmonstername"
:
"怪兽"
,
"activate"
:
[
"这是{0}最擅长的把戏。"
,
"去吧{0},让对手看看你的魔法。"
,
"哈哈,{0}是完美的魔术师。"
],
"summon"
:
[
"{0}的出场"
,
"来吧!来吧,{0}!"
,
"看看{0}卖力的演出!"
,
"你看到了{0}的出场吗?"
,
"我呼唤{0}参加演出!"
,
"让大家看看你的出场秀,{0}。"
,
"我给大家介绍——{0}。"
],
"setmonster"
:
[
"这只怪兽会在幕后工作。"
,
"感谢这只怪兽在台后的支持。"
],
"chaining"
:
[
"看这里!帽子戏法{0}!"
,
"嘿嘿,这可不是纸牌魔术。是{0}!"
,
"准备!大魔术{0}!"
,
"在舞台上要多多思考。{0},发动!"
,
"看样子你忘了魔术师的机关{0}!"
,
"你能看出{0}的奥秘吗?"
]
}
Game/AI/AIUtil.cs
View file @
917e0372
...
...
@@ -44,7 +44,8 @@ namespace WindBot.Game.AI
public
bool
IsOneEnemyBetterThanValue
(
int
value
,
bool
onlyATK
)
{
return
Enemy
.
MonsterZone
.
GetMonsters
()
.
Any
(
card
=>
card
.
GetDefensePower
()
>
value
&&
(!
onlyATK
||
card
.
IsAttack
()));
// .Any(card => card.GetDefensePower() > value && (!onlyATK || card.IsAttack()));
.
Any
(
card
=>
card
.
GetDefensePower
()
>
value
&&
(!
onlyATK
));
}
public
bool
IsAllEnemyBetterThanValue
(
int
value
,
bool
onlyATK
)
...
...
Game/AI/CardContainer.cs
View file @
917e0372
...
...
@@ -48,7 +48,12 @@ namespace WindBot.Game.AI
.
Where
(
card
=>
card
?.
Data
!=
null
&&
card
.
HasType
(
CardType
.
Monster
)
&&
card
.
IsFaceup
()
&&
!(
canBeTarget
&&
card
.
IsShouldNotBeTarget
()))
.
OrderBy
(
card
=>
card
.
Attack
).
FirstOrDefault
();
}
public
static
ClientCard
GetHighestLevelMonster
(
this
IEnumerable
<
ClientCard
>
cards
,
bool
canBeTarget
=
false
)
{
return
cards
.
OrderBy
(
card
=>
card
.
Level
).
FirstOrDefault
();
}
public
static
ClientCard
GetHighestDefenseMonster
(
this
IEnumerable
<
ClientCard
>
cards
,
bool
canBeTarget
=
false
)
{
return
cards
...
...
Game/AI/Decks/MokeyMokeyExecutor.cs
View file @
917e0372
...
...
@@ -39,6 +39,7 @@ namespace WindBot.Game.AI.Decks
{
AddExecutor
(
ExecutorType
.
SpSummon
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
七星道法师
,
七星道法师
Effect
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
对死者的供奉
,
死供
Eff
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
青眼白龙
,
DefaultMonsterSummon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
破坏之剑士
,
DefaultMonsterSummon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
恶魔召唤
,
DefaultMonsterSummon
);
...
...
@@ -50,7 +51,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
人造人
,
DefaultMonsterSummon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
神秘庄家
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
神秘庄家
);
AddExecutor
(
ExecutorType
.
SpellSet
,
CardId
.
暗黑释放
);
AddExecutor
(
ExecutorType
.
SpellSet
,
CardId
.
暗黑释放
,
圣防
Effect
);
AddExecutor
(
ExecutorType
.
SpellSet
,
CardId
.
落穴
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
落穴
,
落穴
Effect
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
对死者的供奉
,
死供
Effect
);
...
...
@@ -58,9 +59,9 @@ namespace WindBot.Game.AI.Decks
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
凤凰龙
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
凤凰龙
,
凤凰龙
summon
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
凤凰龙
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
火星心少女
,
m
onsterset
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
七星道法师
,
m
onsterset
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
耳语妖精
,
m
onsterset
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
火星心少女
,
M
onsterset
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
七星道法师
,
M
onsterset
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
耳语妖精
,
M
onsterset
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
七星道法师
);
...
...
@@ -134,7 +135,7 @@ namespace WindBot.Game.AI.Decks
// go first
return
true
;
}
public
bool
m
onsterset
()
public
bool
M
onsterset
()
{
if
(
Duel
.
Turn
==
1
)
{
...
...
@@ -166,6 +167,12 @@ namespace WindBot.Game.AI.Decks
return
true
;
}
private
bool
圣防
Effect
()
{
if
(
Util
.
GetTotalAttackingMonsterAttack
(
1
)
>
1900
)
return
true
;
return
false
;
}
private
bool
落穴
Effect
()
{
foreach
(
ClientCard
n
in
Duel
.
LastSummonedCards
)
...
...
@@ -197,6 +204,25 @@ namespace WindBot.Game.AI.Decks
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
7
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
5
)
AI
.
SelectNextCard
(
mon
);
return
true
;
}
return
false
;
}
private
bool
死供
Eff
()
{
if
(
Util
.
IsOneEnemyBetterThanValue
(
2500
,
false
))
{
foreach
(
ClientCard
m
in
Bot
.
Hand
)
AI
.
SelectCard
(
m
);
foreach
(
ClientCard
mon
in
Enemy
.
GetMonsters
())
if
(
mon
.
Level
>=
8
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
7
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
5
)
AI
.
SelectNextCard
(
mon
);
return
true
;
}
return
false
;
...
...
Game/AI/Decks/MokeyMokeyKingExecutor.cs
View file @
917e0372
...
...
@@ -45,6 +45,7 @@ namespace WindBot.Game.AI.Decks
{
AddExecutor
(
ExecutorType
.
SpSummon
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
七星道法师
,
七星道法师
Effect
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
对死者的供奉
,
死供
Eff
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
青眼白龙
,
DefaultMonsterSummon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
破坏之剑士
,
DefaultMonsterSummon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
恶魔召唤
,
DefaultMonsterSummon
);
...
...
@@ -56,7 +57,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
人造人
,
DefaultMonsterSummon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
神秘庄家
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
神秘庄家
);
AddExecutor
(
ExecutorType
.
SpellSet
,
CardId
.
暗黑释放
);
AddExecutor
(
ExecutorType
.
SpellSet
,
CardId
.
暗黑释放
,
圣防
Effect
);
AddExecutor
(
ExecutorType
.
SpellSet
,
CardId
.
落穴
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
落穴
,
落穴
Effect
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
对死者的供奉
,
死供
Effect
);
...
...
@@ -65,9 +66,9 @@ namespace WindBot.Game.AI.Decks
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
凤凰龙
,
凤凰龙
summon
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
凤凰龙
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
火星心少女
,
m
onsterset
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
七星道法师
,
m
onsterset
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
耳语妖精
,
m
onsterset
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
火星心少女
,
M
onsterset
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
七星道法师
,
M
onsterset
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
耳语妖精
,
M
onsterset
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
七星道法师
);
AddExecutor
(
ExecutorType
.
SummonOrSet
,
DefaultMonsterSummon
);
...
...
@@ -139,7 +140,7 @@ namespace WindBot.Game.AI.Decks
// go first
return
true
;
}
public
bool
m
onsterset
()
public
bool
M
onsterset
()
{
if
(
Duel
.
Turn
==
1
)
{
...
...
@@ -186,6 +187,12 @@ namespace WindBot.Game.AI.Decks
}
return
false
;
}
private
bool
圣防
Effect
()
{
if
(
Util
.
GetTotalAttackingMonsterAttack
(
1
)
>
1900
)
return
true
;
return
false
;
}
private
bool
死供
Effect
()
{
if
(
Util
.
IsOneEnemyBetterThanValue
(
1900
,
false
))
...
...
@@ -199,11 +206,29 @@ namespace WindBot.Game.AI.Decks
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
7
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
5
)
AI
.
SelectNextCard
(
mon
);
return
true
;
}
return
false
;
}
private
bool
死供
Eff
()
{
if
(
Util
.
IsOneEnemyBetterThanValue
(
2500
,
false
))
{
foreach
(
ClientCard
m
in
Bot
.
Hand
)
AI
.
SelectCard
(
m
);
foreach
(
ClientCard
mon
in
Enemy
.
GetMonsters
())
if
(
mon
.
Level
>=
8
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
7
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
5
)
AI
.
SelectNextCard
(
mon
);
return
true
;
}
return
false
;
}
private
bool
火星心少女
Effect
()
{
foreach
(
ClientCard
m
in
Bot
.
Hand
)
...
...
Game/AI/Decks/SaikyoBattleFlagExecutor.cs
0 → 100644
View file @
917e0372
using
YGOSharp.OCGWrapper.Enums
;
using
System.Collections.Generic
;
using
System.Linq
;
using
WindBot
;
using
WindBot.Game
;
using
WindBot.Game.AI
;
using
System
;
namespace
WindBot.Game.AI.Decks
{
[
Deck
(
"SaikyoBattleFlag"
,
"AI_SaikyoBattleFlag"
)]
public
class
SaikyoBattleFlagExecutor
:
DefaultExecutor
{
public
class
CardId
{
public
const
int
最强战旗
=
120181001
;
public
const
int
钢机神
=
120155015
;
public
const
int
连击龙
=
120110001
;
public
const
int
恶德
=
120183024
;
public
const
int
旗兽
=
120193002
;
public
const
int
社员
=
120183002
;
public
const
int
成金恐龙王
=
120151010
;
public
const
int
突击坦克
=
120183031
;
public
const
int
工匠无人机
=
120183030
;
public
const
int
双角兽
=
120181011
;
public
const
int
瞄准鹰
=
120193003
;
public
const
int
死苏
=
120194004
;
public
const
int
世纪末兽机界
=
120130039
;
public
const
int
铁之重击
=
120183054
;
public
const
int
对死者的供奉
=
120151023
;
public
const
int
兽之拳
=
120155060
;
public
const
int
减俸
=
120183062
;
public
const
int
左迁
=
120183063
;
public
const
int
冻结
=
120183064
;
}
public
SaikyoBattleFlagExecutor
(
GameAI
ai
,
Duel
duel
)
:
base
(
ai
,
duel
)
{
AddExecutor
(
ExecutorType
.
SpSummon
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
铁之重击
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
成金恐龙王
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
恶德
,
恶德
Effect
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
对死者的供奉
,
死供
Eff
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
最强战旗
,
最强战旗
Eff
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
钢机神
,
钢机神
Effect
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
突击坦克
,
突击坦克
Effect
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
瞄准鹰
,
瞄准鹰
Effect
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
最强战旗
,
DefaultDoubleSummon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
钢机神
,
DefaultDoubleSummon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
恶德
,
DefaultDoubleSummon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
最强战旗
,
DefaultMonsterSummon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
钢机神
,
DefaultMonsterSummon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
恶德
,
DefaultMonsterSummon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
成金恐龙王
,
成金恐龙王
Summon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
瞄准鹰
,
瞄准鹰
summon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
瞄准鹰
,
瞄准鹰
summon2
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
瞄准鹰
,
瞄准鹰
summon3
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
双角兽
,
瞄准鹰双角兽
summon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
成金恐龙王
,
瞄准鹰成金恐龙王
summon
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
突击坦克
,
瞄准鹰坦克
summon
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
双角兽
,
双角兽
Effect
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
双角兽
,
双角兽
summon
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
最强战旗
,
最强战旗
Effect
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
对死者的供奉
,
死供
Effect
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
成金恐龙王
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
工匠无人机
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
工匠无人机
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
突击坦克
,
突击坦克
summon
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
死苏
,
死苏
effect
);
AddExecutor
(
ExecutorType
.
SummonOrSet
,
CardId
.
旗兽
,
DefaultMonsterSummon
);
AddExecutor
(
ExecutorType
.
SummonOrSet
,
CardId
.
社员
,
DefaultMonsterSummon
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
工匠无人机
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
突击坦克
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
瞄准鹰
);
AddExecutor
(
ExecutorType
.
MonsterSet
,
CardId
.
双角兽
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
世纪末兽机界
,
DefaultField
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
兽之拳
,
兽之拳
Effect
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
左迁
,
左迁
1
Effect
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
减俸
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
左迁
,
左迁
2
Effect
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
冻结
,
冻结
Effect
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
兽之拳
);
AddExecutor
(
ExecutorType
.
Activate
,
DefaultDontChainMyself
);
AddExecutor
(
ExecutorType
.
SummonOrSet
,
DefaultMonsterSummon
);
AddExecutor
(
ExecutorType
.
Repos
,
DefaultMonsterRepos
);
AddExecutor
(
ExecutorType
.
SpellSet
,
DefaultSpellSet
);
AddExecutor
(
ExecutorType
.
SpellSet
,
CardId
.
铁之重击
);
AddExecutor
(
ExecutorType
.
SpellSet
,
CardId
.
死苏
);
AddExecutor
(
ExecutorType
.
SpellSet
,
CardId
.
对死者的供奉
);
}
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
>
HintMsgForMaxSelect
=
new
List
<
int
>
{
HintMsg
.
SpSummon
,
HintMsg
.
ToGrave
,
HintMsg
.
AddToHand
,
HintMsg
.
ToDeck
,
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
(
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
bool
OnSelectHand
()
{
// go first
return
true
;
}
bool
DoubleTribute
=
false
;
public
override
void
OnNewTurn
()
{
DoubleTribute
=
false
;
}
private
bool
DefaultDoubleSummon
()
{
if
(!
DoubleTribute
&&
Bot
.
HasInMonstersZone
(
CardId
.
双角兽
))
AI
.
SelectCard
(
CardId
.
双角兽
);
return
true
;
}
private
bool
左迁
1
Effect
()
{
if
(
Enemy
.
BattlingMonster
.
Attack
>
2000
)
{
AI
.
SelectCard
(
Enemy
.
BattlingMonster
);
return
true
;
}
return
false
;
}
private
bool
左迁
2
Effect
()
{
AI
.
SelectCard
(
Enemy
.
BattlingMonster
);
return
true
;
}
private
bool
冻结
Effect
()
{
foreach
(
ClientCard
monster
in
Bot
.
GetMonsters
())
{
if
(
monster
.
IsFacedown
())
{
AI
.
SelectCard
(
monster
);
return
true
;
}
else
if
(
monster
.
IsDefense
())
{
AI
.
SelectCard
(
monster
);
return
true
;
}
}
AI
.
SelectCard
(
Bot
.
MonsterZone
.
GetLowestAttackMonster
());
return
true
;
}
private
bool
钢机神
Effect
()
{
if
(
Duel
.
Turn
==
1
)
{
return
false
;
}
else
if
(
Enemy
.
HasAttackingMonster
()
||
Enemy
.
GetMonsterCount
()
<
1
)
AI
.
SelectCard
(
CardId
.
最强战旗
,
CardId
.
钢机神
,
CardId
.
恶德
,
CardId
.
旗兽
,
CardId
.
突击坦克
,
CardId
.
工匠无人机
,
CardId
.
社员
,
CardId
.
双角兽
,
CardId
.
瞄准鹰
);
else
//AI.SelectCard(Bot.Graveyard.GetHighestAttackMonster());
AI
.
SelectCard
(
Bot
.
Graveyard
.
GetHighestLevelMonster
());
return
true
;
}
private
bool
恶德
Effect
()
{
foreach
(
ClientCard
m
in
Bot
.
Hand
)
AI
.
SelectCard
(
m
);
AI
.
SelectNextCard
(
CardId
.
左迁
,
CardId
.
减俸
);
AI
.
SelectNextCard
(
CardId
.
左迁
,
CardId
.
减俸
);
return
true
;
}
private
bool
兽之拳
Effect
()
{
if
(
Enemy
.
BattlingMonster
.
Race
==
(
int
)
CardRace
.
Dragon
)
return
true
;
if
(
Enemy
.
BattlingMonster
.
Race
==
(
int
)
CardRace
.
Fairy
)
return
true
;
if
(
Enemy
.
BattlingMonster
.
Race
==
(
int
)
CardRace
.
SpellCaster
)
return
true
;
return
false
;
}
private
bool
死苏
effect
()
{
if
(!
Util
.
IsAllEnemyBetter
(
true
))
return
false
;
ClientCard
selected
=
Enemy
.
Graveyard
.
GetMatchingCards
(
card
=>
card
.
IsCanRevive
()).
OrderByDescending
(
card
=>
card
.
Attack
).
FirstOrDefault
();
if
(
selected
.
Attack
>=
2400
)
{
AI
.
SelectCard
(
selected
);
return
true
;
}
return
false
;
}
private
bool
成金恐龙王
Summon
()
{
if
(
Enemy
.
GetHandCount
()
<
1
)
return
true
;
return
false
;
}
private
bool
死供
Effect
()
{
if
(
Util
.
IsOneEnemyBetterThanValue
(
1900
,
false
))
{
foreach
(
ClientCard
m
in
Bot
.
Hand
)
AI
.
SelectCard
(
m
);
foreach
(
ClientCard
mon
in
Enemy
.
GetMonsters
())
if
(
mon
.
Level
>=
9
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
8
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
7
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
5
)
AI
.
SelectNextCard
(
mon
);
return
true
;
}
return
false
;
}
private
bool
死供
Eff
()
{
if
(
Util
.
IsOneEnemyBetterThanValue
(
2500
,
false
))
{
foreach
(
ClientCard
m
in
Bot
.
Hand
)
AI
.
SelectCard
(
m
);
foreach
(
ClientCard
mon
in
Enemy
.
GetMonsters
())
if
(
mon
.
Level
>=
8
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
7
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
5
)
AI
.
SelectNextCard
(
mon
);
return
true
;
}
return
false
;
}
private
bool
突击坦克
Effect
()
{
//AI.SelectCard(GetBestEnemyCard_random());
AI
.
SelectCard
(
Enemy
.
MonsterZone
.
GetHighestLevelMonster
());;
return
true
;
}
private
bool
突击坦克
summon
()
{
if
(
Bot
.
MonsterZone
.
GetMatchingCardsCount
(
card
=>
(
card
.
Race
&
(
int
)
CardRace
.
Machine
)
>
0
)
==
2
)
return
true
;
return
false
;
}
private
bool
双角兽
summon
()
{
if
(
Bot
.
Graveyard
.
GetMatchingCardsCount
(
card
=>
(
card
.
Race
&
(
int
)
CardRace
.
Machine
)
>
0
)
>=
3
&&
Bot
.
HasInHand
(
new
[]
{
CardId
.
最强战旗
,
CardId
.
钢机神
,
CardId
.
恶德
}))
return
true
;
return
false
;
}
private
bool
双角兽
Effect
()
{
if
(
Bot
.
HasInHand
(
new
[]
{
CardId
.
最强战旗
,
CardId
.
钢机神
,
CardId
.
恶德
}))
{
AI
.
SelectCard
(
CardId
.
瞄准鹰
,
CardId
.
双角兽
,
CardId
.
工匠无人机
,
CardId
.
突击坦克
,
CardId
.
社员
,
CardId
.
旗兽
,
CardId
.
恶德
,
CardId
.
钢机神
,
CardId
.
最强战旗
);
DoubleTribute
=
true
;
return
true
;
}
return
false
;
}
private
bool
瞄准鹰双角兽
summon
()
{
if
(
Bot
.
HasInMonstersZone
(
CardId
.
瞄准鹰
)
&&
Bot
.
HasInHand
(
new
[]
{
CardId
.
最强战旗
,
CardId
.
钢机神
,
CardId
.
恶德
}))
return
true
;
return
false
;
}
private
bool
瞄准鹰坦克
summon
()
{
if
(
Bot
.
HasInMonstersZone
(
CardId
.
瞄准鹰
)
&&
Bot
.
HasInHand
(
new
[]
{
CardId
.
最强战旗
,
CardId
.
钢机神
,
CardId
.
恶德
}))
return
true
;
return
false
;
}
private
bool
瞄准鹰成金恐龙王
summon
()
{
if
(
Bot
.
HasInMonstersZone
(
CardId
.
瞄准鹰
)
&&
Bot
.
HasInHand
(
new
[]
{
CardId
.
最强战旗
,
CardId
.
钢机神
,
CardId
.
恶德
}))
return
true
;
return
false
;
}
private
bool
瞄准鹰
summon
()
{
foreach
(
ClientCard
m
in
Bot
.
GetMonsters
())
if
(
m
.
HasAttribute
(
CardAttribute
.
Light
)
&&
m
.
Level
<=
4
)
if
(
Bot
.
HasInHand
(
new
[]
{
CardId
.
最强战旗
,
CardId
.
钢机神
,
CardId
.
恶德
}))
if
(
Enemy
.
MonsterZone
.
GetMatchingCardsCount
(
card
=>
card
.
Level
>=
7
)
>
0
)
return
true
;
return
false
;
}
private
bool
瞄准鹰
summon2
()
{
if
(
Bot
.
GetCountCardInZone
(
Bot
.
Hand
,
CardId
.
瞄准鹰
)
>=
2
)
if
(
Bot
.
HasInHand
(
new
[]
{
CardId
.
最强战旗
,
CardId
.
钢机神
,
CardId
.
恶德
}))
if
(
Enemy
.
MonsterZone
.
GetMatchingCardsCount
(
card
=>
card
.
Level
>=
7
)
>
0
)
return
true
;
return
false
;
}
private
bool
瞄准鹰
summon3
()
{
if
(
Bot
.
HasInHand
(
CardId
.
双角兽
)
||
Bot
.
HasInHand
(
CardId
.
突击坦克
)
||
Bot
.
HasInHand
(
CardId
.
成金恐龙王
))
if
(
Bot
.
HasInHand
(
new
[]
{
CardId
.
最强战旗
,
CardId
.
钢机神
,
CardId
.
恶德
}))
if
(
Enemy
.
MonsterZone
.
GetMatchingCardsCount
(
card
=>
card
.
Level
>=
7
)
>
0
)
return
true
;
return
false
;
}
private
bool
瞄准鹰
Effect
()
{
//ClientCard target = Util.GetWorstBotMonster();
//if (target != null) AI.SelectCard(target);
if
(
Bot
.
MonsterZone
.
GetMatchingCardsCount
(
card
=>
card
.
Level
>=
7
)
<=
1
)
{
AI
.
SelectCard
(
CardId
.
瞄准鹰
,
CardId
.
突击坦克
,
CardId
.
成金恐龙王
,
CardId
.
社员
,
CardId
.
旗兽
);
AI
.
SelectNextCard
(
CardId
.
瞄准鹰
,
CardId
.
突击坦克
,
CardId
.
成金恐龙王
,
CardId
.
社员
,
CardId
.
旗兽
);
AI
.
SelectThirdCard
(
CardId
.
最强战旗
,
CardId
.
钢机神
,
CardId
.
恶德
,
CardId
.
旗兽
,
CardId
.
社员
);
return
true
;
}
return
false
;
}
private
bool
最强战旗
Effect
()
{
if
(
Util
.
IsOneEnemyBetterThanValue
(
1900
,
false
))
{
foreach
(
ClientCard
m
in
Bot
.
Hand
)
AI
.
SelectCard
(
m
)
;
foreach
(
ClientCard
mon
in
Enemy
.
GetMonsters
())
if
(
mon
.
Level
>=
9
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
8
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
7
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
5
)
AI
.
SelectNextCard
(
mon
);
return
true
;
}
return
false
;
}
private
bool
最强战旗
Eff
()
{
if
(
Util
.
IsOneEnemyBetterThanValue
(
2500
,
false
))
{
foreach
(
ClientCard
m
in
Bot
.
Hand
)
AI
.
SelectCard
(
m
);
foreach
(
ClientCard
mon
in
Enemy
.
GetMonsters
())
if
(
mon
.
Level
>=
9
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
8
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
7
)
AI
.
SelectNextCard
(
mon
);
else
if
(
mon
.
Level
>=
5
)
AI
.
SelectNextCard
(
mon
);
return
true
;
}
return
false
;
}
}
}
Game/AI/DefaultExecutor.cs
View file @
917e0372
...
...
@@ -704,7 +704,8 @@ namespace WindBot.Game.AI
{
ClientCard
tributeCard
=
Bot
.
MonsterZone
[
j
];
if
(
tributeCard
==
null
)
continue
;
if
(
tributeCard
.
GetDefensePower
()
<
Card
.
Attack
-
400
)
// if (tributeCard.GetDefensePower() +400 < Card.Attack)
if
(
tributeCard
.
Level
+
1
<
Card
.
Level
)
tributecount
--;
}
return
tributecount
<=
0
;
...
...
WindBot.csproj
View file @
917e0372
...
...
@@ -78,6 +78,7 @@
<Compile
Include=
"Game\AI\Decks\PureWindsExecutor.cs"
/>
<Compile
Include=
"Game\AI\Decks\DragunExecutor.cs"
/>
<Compile
Include=
"Game\AI\Decks\Level8Executor.cs"
/>
<Compile
Include=
"Game\AI\Decks\SaikyoBattleFlagExecutor.cs"
/>
<Compile
Include=
"Game\AI\Decks\SalamangreatExecutor.cs"
/>
<Compile
Include=
"Game\AI\Decks\CyberDragonExecutor.cs"
/>
<Compile
Include=
"Game\AI\Decks\DarkMagicianExecutor.cs"
/>
...
...
@@ -151,6 +152,7 @@
</ItemGroup>
<ItemGroup>
<None
Include=
"App.config"
/>
<None
Include=
"Dialogs\rd1.json"
/>
<None
Include=
"sqlite3.dll"
>
<CopyToOutputDirectory>
PreserveNewest
</CopyToOutputDirectory>
</None>
...
...
bots.json
View file @
917e0372
{
{
"windbots"
:
[
{
"name"
:
"齿车戒龙"
,
"deck"
:
"MokeyMokey"
,
"dialog"
:
"
zh-CN
"
"dialog"
:
"
rd1
"
},
{
"name"
:
"破坏剑士"
,
...
...
@@ -12,10 +12,15 @@
"dialog"
:
"zh-CN"
},
{
"name"
:
"大恐龙
架
"
,
"name"
:
"大恐龙
驾
"
,
"deck"
:
"DinocarriageDynarmix"
,
"dialog"
:
"zh-CN"
},
{
"name"
:
"最强战旗"
,
"deck"
:
"SaikyoBattleFlag"
,
"dialog"
:
"zh-CN"
},
{
"name"
:
"传说子"
,
"deck"
:
"TheLegend"
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment