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
alstroemeria-silentlove
windbot
Commits
09b9678c
Commit
09b9678c
authored
Jul 27, 2016
by
mercury233
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update 4 ways to run WindBot
parent
ad74a5cc
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
286 additions
and
159 deletions
+286
-159
Game/AI/Decks/BlueEyesExecutor.cs
Game/AI/Decks/BlueEyesExecutor.cs
+86
-86
Game/GameAI.cs
Game/GameAI.cs
+4
-4
Game/GameBehavior.cs
Game/GameBehavior.cs
+2
-1
Game/GameClient.cs
Game/GameClient.cs
+14
-12
Logger.cs
Logger.cs
+5
-0
Program.cs
Program.cs
+148
-56
WindBot.csproj
WindBot.csproj
+1
-0
WindBotInfo.cs
WindBotInfo.cs
+26
-0
No files found.
Game/AI/Decks/BlueEyesExecutor.cs
View file @
09b9678c
...
...
@@ -130,27 +130,27 @@ namespace MycardBot.Game.AI.Decks
public
override
IList
<
ClientCard
>
OnSelectCard
(
IList
<
ClientCard
>
cards
,
int
min
,
int
max
,
bool
cancelable
)
{
//Logger.
WriteLine("OnSelectCard.");
Logger
.
Debug
WriteLine
(
"OnSelectCard."
);
if
(
max
==
2
)
{
//Logger.
WriteLine("龙觉醒检索.");
Logger
.
Debug
WriteLine
(
"龙觉醒检索."
);
IList
<
ClientCard
>
result
=
new
List
<
ClientCard
>();
if
(!
Duel
.
Fields
[
0
].
HasInHand
((
int
)
CardId
.
青眼白龙
))
{
//Logger.
WriteLine("手里没有本体,拿一张.");
Logger
.
Debug
WriteLine
(
"手里没有本体,拿一张."
);
foreach
(
ClientCard
card
in
cards
)
{
if
(
card
.
Id
==
(
int
)
CardId
.
青眼白龙
)
{
result
.
Add
(
card
);
//Logger.
WriteLine("拿到了.");
Logger
.
Debug
WriteLine
(
"拿到了."
);
break
;
}
}
}
foreach
(
ClientCard
card
in
cards
)
{
//Logger.
WriteLine("拿亚白龙.");
Logger
.
Debug
WriteLine
(
"拿亚白龙."
);
if
(
card
.
Id
==
(
int
)
CardId
.
青眼亚白龙
)
{
result
.
Add
(
card
);
...
...
@@ -160,7 +160,7 @@ namespace MycardBot.Game.AI.Decks
{
foreach
(
ClientCard
card
in
cards
)
{
//Logger.
WriteLine("亚白龙不够了.");
Logger
.
Debug
WriteLine
(
"亚白龙不够了."
);
if
(!
result
.
Contains
(
card
))
result
.
Add
(
card
);
if
(
result
.
Count
>=
min
)
...
...
@@ -169,23 +169,23 @@ namespace MycardBot.Game.AI.Decks
}
while
(
result
.
Count
>
max
)
{
//Logger.
WriteLine("拿多了.");
Logger
.
Debug
WriteLine
(
"拿多了."
);
result
.
RemoveAt
(
result
.
Count
-
1
);
}
return
result
;
}
//Logger.
WriteLine("Use default.");
Logger
.
Debug
WriteLine
(
"Use default."
);
return
null
;
}
public
override
IList
<
ClientCard
>
OnSelectSum
(
IList
<
ClientCard
>
cards
,
int
sum
,
int
min
,
int
max
)
{
Logger
.
WriteLine
(
cards
.
Count
+
" sync "
+
sum
);
Logger
.
Debug
WriteLine
(
cards
.
Count
+
" sync "
+
sum
);
IList
<
ClientCard
>
selected
=
new
List
<
ClientCard
>();
int
trysum
=
0
;
if
(
使用过的青眼亚白龙
.
Count
>
0
&&
cards
.
IndexOf
(
使用过的青眼亚白龙
[
0
])>
0
)
{
Logger
.
WriteLine
(
"优先用使用过的亚白龙同调."
);
Logger
.
Debug
WriteLine
(
"优先用使用过的亚白龙同调."
);
ClientCard
card
=
使用过的青眼亚白龙
[
0
];
使用过的青眼亚白龙
.
Remove
(
card
);
cards
.
Remove
(
card
);
...
...
@@ -193,14 +193,14 @@ namespace MycardBot.Game.AI.Decks
trysum
=
card
.
Level
;
if
(
trysum
==
sum
)
{
Logger
.
WriteLine
(
trysum
+
" dselected "
+
sum
);
Logger
.
Debug
WriteLine
(
trysum
+
" dselected "
+
sum
);
return
selected
;
}
}
foreach
(
ClientCard
card
in
cards
)
{
// try level equal
Logger
.
WriteLine
(
"同调素材可以选择: "
+
card
.
Name
);
Logger
.
Debug
WriteLine
(
"同调素材可以选择: "
+
card
.
Name
);
if
(
card
.
Level
==
sum
)
{
return
new
[]
{
card
};
...
...
@@ -212,7 +212,7 @@ namespace MycardBot.Game.AI.Decks
}
selected
.
Add
(
card
);
trysum
+=
card
.
Level
;
Logger
.
WriteLine
(
trysum
+
" selected "
+
sum
);
Logger
.
Debug
WriteLine
(
trysum
+
" selected "
+
sum
);
if
(
trysum
==
sum
)
{
return
selected
;
...
...
@@ -229,8 +229,8 @@ namespace MycardBot.Game.AI.Decks
// try level sub
selected2
.
Remove
(
card
);
trysum
-=
card
.
Level
;
//Logger.
WriteLine(card.Id + "");
Logger
.
WriteLine
(
trysum
+
" selected2 "
+
sum
);
Logger
.
Debug
WriteLine
(
card
.
Id
+
""
);
Logger
.
Debug
WriteLine
(
trysum
+
" selected2 "
+
sum
);
if
(
trysum
==
sum
)
{
return
selected2
;
...
...
@@ -252,7 +252,7 @@ namespace MycardBot.Game.AI.Decks
private
bool
龙之灵庙效果
()
{
Logger
.
WriteLine
(
"龙之灵庙."
);
Logger
.
Debug
WriteLine
(
"龙之灵庙."
);
AI
.
SelectCard
(
new
[]
{
(
int
)
CardId
.
白色灵龙
,
...
...
@@ -262,12 +262,12 @@ namespace MycardBot.Game.AI.Decks
});
if
(!
Duel
.
Fields
[
0
].
HasInHand
((
int
)
CardId
.
青眼白龙
))
{
Logger
.
WriteLine
(
"手里没有本体,堆白石."
);
Logger
.
Debug
WriteLine
(
"手里没有本体,堆白石."
);
AI
.
SelectNextCard
((
int
)
CardId
.
传说的白石
);
}
else
{
Logger
.
WriteLine
(
"堆太古或灵龙或白石."
);
Logger
.
Debug
WriteLine
(
"堆太古或灵龙或白石."
);
AI
.
SelectNextCard
(
new
[]
{
(
int
)
CardId
.
太古的白石
,
...
...
@@ -280,7 +280,7 @@ namespace MycardBot.Game.AI.Decks
private
bool
龙觉醒旋律效果
()
{
Logger
.
WriteLine
(
"龙觉醒选要丢的卡."
);
Logger
.
Debug
WriteLine
(
"龙觉醒选要丢的卡."
);
AI
.
SelectCard
(
new
[]
{
(
int
)
CardId
.
太古的白石
,
...
...
@@ -296,20 +296,20 @@ namespace MycardBot.Game.AI.Decks
private
bool
调和的宝札效果
()
{
Logger
.
WriteLine
(
"调和选要丢的卡."
);
Logger
.
Debug
WriteLine
(
"调和选要丢的卡."
);
if
(!
Duel
.
Fields
[
0
].
HasInHand
((
int
)
CardId
.
青眼白龙
))
{
Logger
.
WriteLine
(
"手里没有本体,丢白石."
);
Logger
.
Debug
WriteLine
(
"手里没有本体,丢白石."
);
AI
.
SelectCard
((
int
)
CardId
.
传说的白石
);
}
else
if
(
Duel
.
Fields
[
0
].
HasInHand
((
int
)
CardId
.
抵价购物
))
{
Logger
.
WriteLine
(
"手里有本体,再拿一个喂八抽."
);
Logger
.
Debug
WriteLine
(
"手里有本体,再拿一个喂八抽."
);
AI
.
SelectCard
((
int
)
CardId
.
传说的白石
);
}
else
{
Logger
.
WriteLine
(
"手里有本体,优先丢太古."
);
Logger
.
Debug
WriteLine
(
"手里有本体,优先丢太古."
);
AI
.
SelectCard
((
int
)
CardId
.
太古的白石
);
}
return
true
;
...
...
@@ -317,28 +317,28 @@ namespace MycardBot.Game.AI.Decks
private
bool
抵价购物效果
()
{
Logger
.
WriteLine
(
"抵价购物发动."
);
Logger
.
Debug
WriteLine
(
"抵价购物发动."
);
if
(
Duel
.
Fields
[
0
].
HasInHand
((
int
)
CardId
.
白色灵龙
))
{
Logger
.
WriteLine
(
"手里有白灵龙,优先丢掉."
);
Logger
.
Debug
WriteLine
(
"手里有白灵龙,优先丢掉."
);
AI
.
SelectCard
((
int
)
CardId
.
白色灵龙
);
return
true
;
}
else
if
(
手里有
2
个
((
int
)
CardId
.
青眼白龙
))
{
Logger
.
WriteLine
(
"手里有2个青眼白龙,丢1个."
);
Logger
.
Debug
WriteLine
(
"手里有2个青眼白龙,丢1个."
);
AI
.
SelectCard
((
int
)
CardId
.
青眼白龙
);
return
true
;
}
else
if
(
手里有
2
个
((
int
)
CardId
.
青眼亚白龙
))
{
Logger
.
WriteLine
(
"手里有2个青眼亚白龙,丢1个."
);
Logger
.
Debug
WriteLine
(
"手里有2个青眼亚白龙,丢1个."
);
AI
.
SelectCard
((
int
)
CardId
.
青眼亚白龙
);
return
true
;
}
else
if
(!
Duel
.
Fields
[
0
].
HasInHand
((
int
)
CardId
.
青眼白龙
)
||
!
Duel
.
Fields
[
0
].
HasInHand
((
int
)
CardId
.
青眼亚白龙
))
{
Logger
.
WriteLine
(
"手里没有成对的青眼和亚白,丢1个."
);
Logger
.
Debug
WriteLine
(
"手里没有成对的青眼和亚白,丢1个."
);
AI
.
SelectCard
(
new
[]
{
(
int
)
CardId
.
青眼白龙
,
...
...
@@ -348,18 +348,18 @@ namespace MycardBot.Game.AI.Decks
}
else
{
Logger
.
WriteLine
(
"手里只有一对,不能乱丢."
);
Logger
.
Debug
WriteLine
(
"手里只有一对,不能乱丢."
);
return
false
;
}
}
private
bool
青眼亚白龙效果
()
{
Logger
.
WriteLine
(
"亚白龙效果."
);
Logger
.
Debug
WriteLine
(
"亚白龙效果."
);
ClientCard
card
=
Duel
.
Fields
[
1
].
MonsterZone
.
GetInvincibleMonster
();
if
(
card
!=
null
)
{
Logger
.
WriteLine
(
"炸打不死的怪."
);
Logger
.
Debug
WriteLine
(
"炸打不死的怪."
);
AI
.
SelectCard
(
card
);
使用过的青眼亚白龙
.
Add
(
Card
);
return
true
;
...
...
@@ -367,7 +367,7 @@ namespace MycardBot.Game.AI.Decks
card
=
Duel
.
Fields
[
1
].
MonsterZone
.
GetDangerousMonster
();
if
(
card
!=
null
)
{
Logger
.
WriteLine
(
"炸厉害的怪."
);
Logger
.
Debug
WriteLine
(
"炸厉害的怪."
);
AI
.
SelectCard
(
card
);
使用过的青眼亚白龙
.
Add
(
Card
);
return
true
;
...
...
@@ -375,7 +375,7 @@ namespace MycardBot.Game.AI.Decks
card
=
AI
.
Utils
.
GetOneEnnemyBetterThanValue
(
Card
.
GetDefensePower
(),
false
);
if
(
card
!=
null
)
{
Logger
.
WriteLine
(
"炸比自己强的怪."
);
Logger
.
Debug
WriteLine
(
"炸比自己强的怪."
);
AI
.
SelectCard
(
card
);
使用过的青眼亚白龙
.
Add
(
Card
);
return
true
;
...
...
@@ -386,7 +386,7 @@ namespace MycardBot.Game.AI.Decks
使用过的青眼亚白龙
.
Add
(
Card
);
return
true
;
}
Logger
.
WriteLine
(
"不炸."
);
Logger
.
Debug
WriteLine
(
"不炸."
);
return
false
;
}
...
...
@@ -394,7 +394,7 @@ namespace MycardBot.Game.AI.Decks
{
if
(
Card
.
Location
==
CardLocation
.
Hand
&&
CurrentChain
.
Count
>
0
)
{
Logger
.
WriteLine
(
"轰咆避免卡时点."
);
Logger
.
Debug
WriteLine
(
"轰咆避免卡时点."
);
return
false
;
}
List
<
int
>
targets
=
new
List
<
int
>
{
...
...
@@ -438,7 +438,7 @@ namespace MycardBot.Game.AI.Decks
private
bool
苍眼银龙效果
()
{
Logger
.
WriteLine
(
"苍眼银龙效果."
);
Logger
.
Debug
WriteLine
(
"苍眼银龙效果."
);
if
(
Duel
.
Fields
[
1
].
GetSpellCount
()>
0
)
{
AI
.
SelectCard
((
int
)
CardId
.
白色灵龙
);
...
...
@@ -454,7 +454,7 @@ namespace MycardBot.Game.AI.Decks
{
if
(
Card
.
Location
==
CardLocation
.
Hand
)
{
Logger
.
WriteLine
(
"贤士手卡效果."
);
Logger
.
Debug
WriteLine
(
"贤士手卡效果."
);
return
false
;
}
AI
.
SelectCard
(
new
[]
...
...
@@ -468,26 +468,26 @@ namespace MycardBot.Game.AI.Decks
private
bool
白色灵龙效果
()
{
//Logger.
WriteLine("白色灵龙"+ActivateDescription);
Logger
.
Debug
WriteLine
(
"白色灵龙"
+
ActivateDescription
);
if
(
ActivateDescription
==
-
1
)
// AI.Utils.GetStringId((int)CardId.白色灵龙, 0))
{
Logger
.
WriteLine
(
"白色灵龙拆后场."
);
Logger
.
Debug
WriteLine
(
"白色灵龙拆后场."
);
return
true
;
}
/*else if(Duel.Phase==DuelPhase.BattleStart)
{
Logger.WriteLine("白色灵龙战阶变身.");
Logger.
Debug
WriteLine("白色灵龙战阶变身.");
return true;
}*/
else
{
//Logger.
WriteLine("白色灵龙特招手卡. 对象数量"+Duel.ChainTargets.Count);
Logger
.
Debug
WriteLine
(
"白色灵龙特招手卡. 对象数量"
+
Duel
.
ChainTargets
.
Count
);
foreach
(
ClientCard
card
in
Duel
.
ChainTargets
)
{
// Logger.WriteLine("对象" + card.Id);
// Logger.
Debug
WriteLine("对象" + card.Id);
if
(
Card
.
Equals
(
card
))
{
Logger
.
WriteLine
(
"白色灵龙被取对象,是否变身."
);
Logger
.
Debug
WriteLine
(
"白色灵龙被取对象,是否变身."
);
return
手里有
2
个
((
int
)
CardId
.
青眼白龙
)
||
(
Duel
.
Fields
[
0
].
HasInGraveyard
((
int
)
CardId
.
青眼白龙
)
&&
Duel
.
Fields
[
0
].
HasInGraveyard
((
int
)
CardId
.
太古的白石
)
...
...
@@ -500,28 +500,28 @@ namespace MycardBot.Game.AI.Decks
private
bool
青眼精灵龙效果
()
{
//Logger.
WriteLine("青眼精灵龙" + ActivateDescription);
Logger
.
Debug
WriteLine
(
"青眼精灵龙"
+
ActivateDescription
);
if
(
ActivateDescription
==
-
1
)
// AI.Utils.GetStringId((int)CardId.白色灵龙, 0))
{
Logger
.
WriteLine
(
"青眼精灵龙无效墓地."
);
Logger
.
Debug
WriteLine
(
"青眼精灵龙无效墓地."
);
return
LastChainPlayer
==
1
;
}
else
if
(
Duel
.
Player
==
1
&&
(
Duel
.
Phase
==
DuelPhase
.
BattleStart
||
Duel
.
Phase
==
DuelPhase
.
End
))
{
Logger
.
WriteLine
(
"青眼精灵龙主动变身."
);
Logger
.
Debug
WriteLine
(
"青眼精灵龙主动变身."
);
AI
.
SelectCard
((
int
)
CardId
.
苍眼银龙
);
AI
.
SelectPosition
(
CardPosition
.
FaceUpDefence
);
return
true
;
}
else
{
//Logger.
WriteLine("青眼精灵龙变身. 对象数量" + Duel.ChainTargets.Count);
Logger
.
Debug
WriteLine
(
"青眼精灵龙变身. 对象数量"
+
Duel
.
ChainTargets
.
Count
);
foreach
(
ClientCard
card
in
Duel
.
ChainTargets
)
{
// Logger.WriteLine("对象" + card.Id);
// Logger.
Debug
WriteLine("对象" + card.Id);
if
(
Card
.
Equals
(
card
))
{
Logger
.
WriteLine
(
"青眼精灵龙被取对象,变身."
);
Logger
.
Debug
WriteLine
(
"青眼精灵龙被取对象,变身."
);
AI
.
SelectCard
((
int
)
CardId
.
苍眼银龙
);
return
true
;
}
...
...
@@ -532,10 +532,10 @@ namespace MycardBot.Game.AI.Decks
private
bool
希望魁龙银河巨神效果
()
{
Logger
.
WriteLine
(
"希望魁龙银河巨神"
+
ActivateDescription
);
Logger
.
Debug
WriteLine
(
"希望魁龙银河巨神"
+
ActivateDescription
);
if
(
ActivateDescription
==
-
1
)
// AI.Utils.GetStringId((int)CardId.白色灵龙, 0))
{
Logger
.
WriteLine
(
"希望魁龙银河巨神无效魔法."
);
Logger
.
Debug
WriteLine
(
"希望魁龙银河巨神无效魔法."
);
return
LastChainPlayer
==
1
;
}
return
LastChainPlayer
==
1
;
...
...
@@ -545,25 +545,25 @@ namespace MycardBot.Game.AI.Decks
{
if
(
ActivateDescription
==
AI
.
Utils
.
GetStringId
((
int
)
CardId
.
太古的白石
,
0
))
{
Logger
.
WriteLine
(
"太古白石回收效果."
);
Logger
.
Debug
WriteLine
(
"太古白石回收效果."
);
if
(
Duel
.
Fields
[
0
].
HasInHand
((
int
)
CardId
.
抵价购物
)
&&
!
Duel
.
Fields
[
0
].
HasInHand
((
int
)
CardId
.
青眼白龙
)
&&
!
Duel
.
Fields
[
0
].
HasInHand
((
int
)
CardId
.
青眼亚白龙
))
{
Logger
.
WriteLine
(
"回收喂八抽."
);
Logger
.
Debug
WriteLine
(
"回收喂八抽."
);
AI
.
SelectCard
((
int
)
CardId
.
青眼白龙
);
return
true
;
}
if
(
已特殊召唤青眼亚白龙
)
{
Logger
.
WriteLine
(
"已经跳过亚白龙,下回合再回收."
);
Logger
.
Debug
WriteLine
(
"已经跳过亚白龙,下回合再回收."
);
return
false
;
}
if
(
Duel
.
Fields
[
0
].
HasInHand
((
int
)
CardId
.
青眼白龙
)
&&
!
Duel
.
Fields
[
0
].
HasInHand
((
int
)
CardId
.
青眼亚白龙
)
&&
Duel
.
Fields
[
0
].
HasInGraveyard
((
int
)
CardId
.
青眼亚白龙
))
{
Logger
.
WriteLine
(
"缺亚白龙,回收."
);
Logger
.
Debug
WriteLine
(
"缺亚白龙,回收."
);
AI
.
SelectCard
((
int
)
CardId
.
青眼亚白龙
);
return
true
;
}
...
...
@@ -571,26 +571,26 @@ namespace MycardBot.Game.AI.Decks
&&
!
Duel
.
Fields
[
0
].
HasInHand
((
int
)
CardId
.
青眼白龙
)
&&
Duel
.
Fields
[
0
].
HasInGraveyard
((
int
)
CardId
.
青眼白龙
))
{
Logger
.
WriteLine
(
"有亚白龙缺本体,回收."
);
Logger
.
Debug
WriteLine
(
"有亚白龙缺本体,回收."
);
AI
.
SelectCard
((
int
)
CardId
.
青眼白龙
);
return
true
;
}
Logger
.
WriteLine
(
"并没有应该回收的."
);
Logger
.
Debug
WriteLine
(
"并没有应该回收的."
);
return
false
;
}
else
{
Logger
.
WriteLine
(
"太古白石特招效果."
);
Logger
.
Debug
WriteLine
(
"太古白石特招效果."
);
List
<
ClientCard
>
spells
=
Duel
.
Fields
[
1
].
GetSpells
();
if
(
spells
.
Count
==
0
)
{
Logger
.
WriteLine
(
"对面没坑,跳个本体."
);
Logger
.
Debug
WriteLine
(
"对面没坑,跳个本体."
);
AI
.
SelectCard
((
int
)
CardId
.
青眼白龙
);
//AI.SelectCard((int)CardId.白色灵龙);
}
else
{
Logger
.
WriteLine
(
"对面有坑,拆."
);
Logger
.
Debug
WriteLine
(
"对面有坑,拆."
);
AI
.
SelectCard
((
int
)
CardId
.
白色灵龙
);
}
return
true
;
...
...
@@ -605,7 +605,7 @@ namespace MycardBot.Game.AI.Decks
private
bool
太古的白石通常召唤
()
{
Logger
.
WriteLine
(
"白石通常召唤."
);
Logger
.
Debug
WriteLine
(
"白石通常召唤."
);
return
Duel
.
Fields
[
0
].
HasInMonstersZone
(
new
List
<
int
>
{
(
int
)
CardId
.
青色眼睛的贤士
,
...
...
@@ -619,16 +619,16 @@ namespace MycardBot.Game.AI.Decks
private
bool
银河眼光波龙超量召唤
()
{
Logger
.
WriteLine
(
"银河眼光波龙超量召唤."
);
Logger
.
Debug
WriteLine
(
"银河眼光波龙超量召唤."
);
if
(
Duel
.
Turn
==
1
)
{
Logger
.
WriteLine
(
"先攻不叠银河眼,叠银河巨神."
);
Logger
.
Debug
WriteLine
(
"先攻不叠银河眼,叠银河巨神."
);
return
false
;
}
List
<
ClientCard
>
monsters
=
Duel
.
Fields
[
1
].
GetMonsters
();
if
(
monsters
.
Count
==
1
&&
!
monsters
[
0
].
IsFacedown
()
&&
((
monsters
[
0
].
IsDefense
()
&&
monsters
[
0
].
GetDefensePower
()
>=
3000
)
&&
monsters
[
0
].
HasType
(
CardType
.
Xyz
)))
{
Logger
.
WriteLine
(
"只有一个大怪兽,光波龙抢之."
);
Logger
.
Debug
WriteLine
(
"只有一个大怪兽,光波龙抢之."
);
return
true
;
}
if
(
monsters
.
Count
>=
3
)
...
...
@@ -637,7 +637,7 @@ namespace MycardBot.Game.AI.Decks
{
if
(!
monster
.
IsFacedown
()
&&
((
monster
.
IsDefense
()
&&
monster
.
GetDefensePower
()
>=
3000
)
||
monster
.
HasType
(
CardType
.
Xyz
)))
{
Logger
.
WriteLine
(
"貌似打不死,出个光波龙看看."
);
Logger
.
Debug
WriteLine
(
"貌似打不死,出个光波龙看看."
);
return
true
;
}
}
...
...
@@ -647,15 +647,15 @@ namespace MycardBot.Game.AI.Decks
private
bool
银河眼光子龙皇超量召唤
()
{
Logger
.
WriteLine
(
"银河眼光子龙皇超量召唤."
);
Logger
.
Debug
WriteLine
(
"银河眼光子龙皇超量召唤."
);
if
(
Duel
.
Turn
==
1
)
{
Logger
.
WriteLine
(
"先攻不叠银河眼,叠银河巨神."
);
Logger
.
Debug
WriteLine
(
"先攻不叠银河眼,叠银河巨神."
);
return
false
;
}
if
(
AI
.
Utils
.
IsOneEnnemyBetterThanValue
(
2999
,
false
))
{
Logger
.
WriteLine
(
"有高攻怪兽,出银河眼."
);
Logger
.
Debug
WriteLine
(
"有高攻怪兽,出银河眼."
);
return
true
;
}
return
false
;
...
...
@@ -663,7 +663,7 @@ namespace MycardBot.Game.AI.Decks
private
bool
银河眼重铠光子龙超量召唤
()
{
Logger
.
WriteLine
(
"银河眼重铠光子龙超量召唤."
);
Logger
.
Debug
WriteLine
(
"银河眼重铠光子龙超量召唤."
);
if
(
Duel
.
Fields
[
0
].
HasInMonstersZone
((
int
)
CardId
.
银河眼光波龙
))
{
List
<
ClientCard
>
monsters
=
Duel
.
Fields
[
0
].
GetMonsters
();
...
...
@@ -681,7 +681,7 @@ namespace MycardBot.Game.AI.Decks
{
if
(!
AI
.
Utils
.
IsOneEnnemyBetterThanValue
(
4000
,
false
))
{
Logger
.
WriteLine
(
"没有高攻怪兽,出重铠."
);
Logger
.
Debug
WriteLine
(
"没有高攻怪兽,出重铠."
);
AI
.
SelectCard
((
int
)
CardId
.
银河眼光子龙皇
);
return
true
;
}
...
...
@@ -691,7 +691,7 @@ namespace MycardBot.Game.AI.Decks
private
bool
银河眼暗物质龙超量召唤
()
{
Logger
.
WriteLine
(
"银河眼重铠光子龙超量召唤."
);
Logger
.
Debug
WriteLine
(
"银河眼重铠光子龙超量召唤."
);
if
(
Duel
.
Fields
[
0
].
HasInMonstersZone
((
int
)
CardId
.
银河眼重铠光子龙
))
{
AI
.
SelectCard
((
int
)
CardId
.
银河眼重铠光子龙
);
...
...
@@ -707,7 +707,7 @@ namespace MycardBot.Game.AI.Decks
private
bool
银河眼光波龙效果
()
{
Logger
.
WriteLine
(
"银河眼光波龙效果."
);
Logger
.
Debug
WriteLine
(
"银河眼光波龙效果."
);
List
<
ClientCard
>
monsters
=
Duel
.
Fields
[
1
].
GetMonsters
();
foreach
(
ClientCard
monster
in
monsters
)
{
...
...
@@ -733,7 +733,7 @@ namespace MycardBot.Game.AI.Decks
private
bool
银河眼重铠光子龙效果
()
{
Logger
.
WriteLine
(
"重铠优先炸后场."
);
Logger
.
Debug
WriteLine
(
"重铠优先炸后场."
);
List
<
ClientCard
>
spells
=
Duel
.
Fields
[
1
].
GetSpells
();
foreach
(
ClientCard
spell
in
spells
)
{
...
...
@@ -754,7 +754,7 @@ namespace MycardBot.Game.AI.Decks
List
<
ClientCard
>
monsters
=
Duel
.
Fields
[
1
].
GetMonsters
();
if
(
monsters
.
Count
>=
2
)
{
Logger
.
WriteLine
(
"怪多就先炸守备的."
);
Logger
.
Debug
WriteLine
(
"怪多就先炸守备的."
);
foreach
(
ClientCard
monster
in
monsters
)
{
if
(
monster
.
IsDefense
())
...
...
@@ -767,7 +767,7 @@ namespace MycardBot.Game.AI.Decks
}
if
(
monsters
.
Count
==
2
)
{
Logger
.
WriteLine
(
"2只怪只炸打不过的,剩下留给暗物质打."
);
Logger
.
Debug
WriteLine
(
"2只怪只炸打不过的,剩下留给暗物质打."
);
foreach
(
ClientCard
monster
in
monsters
)
{
if
(
monster
.
IsMonsterInvincible
()
||
monster
.
IsMonsterDangerous
()
||
monster
.
GetDefensePower
()
>
4000
)
...
...
@@ -808,22 +808,22 @@ namespace MycardBot.Game.AI.Decks
{
if
(
Duel
.
Phase
==
DuelPhase
.
Main1
)
{
Logger
.
WriteLine
(
"主阶段1同调精灵龙."
);
Logger
.
Debug
WriteLine
(
"主阶段1同调精灵龙."
);
if
(
使用过的青眼亚白龙
.
Count
>
0
)
{
Logger
.
WriteLine
(
"有用过的亚白需要同调."
);
Logger
.
Debug
WriteLine
(
"有用过的亚白需要同调."
);
return
true
;
}
if
(
Duel
.
Turn
==
1
)
{
Logger
.
WriteLine
(
"先攻同调."
);
Logger
.
Debug
WriteLine
(
"先攻同调."
);
AI
.
SelectPosition
(
CardPosition
.
FaceUpDefence
);
return
true
;
}
}
if
(
Duel
.
Phase
==
DuelPhase
.
Main2
)
{
Logger
.
WriteLine
(
"主阶段2同调精灵龙."
);
Logger
.
Debug
WriteLine
(
"主阶段2同调精灵龙."
);
AI
.
SelectPosition
(
CardPosition
.
FaceUpDefence
);
return
true
;
}
...
...
@@ -834,21 +834,21 @@ namespace MycardBot.Game.AI.Decks
{
if
(
Duel
.
Phase
==
DuelPhase
.
Main1
)
{
Logger
.
WriteLine
(
"主阶段1超量银河巨神."
);
Logger
.
Debug
WriteLine
(
"主阶段1超量银河巨神."
);
if
(
使用过的青眼亚白龙
.
Count
>
0
)
{
Logger
.
WriteLine
(
"有用过的亚白可以叠."
);
Logger
.
Debug
WriteLine
(
"有用过的亚白可以叠."
);
return
true
;
}
if
(
Duel
.
Turn
==
1
)
{
Logger
.
WriteLine
(
"先攻超量银河巨神."
);
Logger
.
Debug
WriteLine
(
"先攻超量银河巨神."
);
return
true
;
}
}
if
(
Duel
.
Phase
==
DuelPhase
.
Main2
)
{
Logger
.
WriteLine
(
"主阶段2超量银河巨神."
);
Logger
.
Debug
WriteLine
(
"主阶段2超量银河巨神."
);
return
true
;
}
return
false
;
...
...
@@ -858,7 +858,7 @@ namespace MycardBot.Game.AI.Decks
{
if
(
Duel
.
Turn
==
1
)
{
Logger
.
WriteLine
(
"先攻可以超量森罗的姬芽宫."
);
Logger
.
Debug
WriteLine
(
"先攻可以超量森罗的姬芽宫."
);
return
true
;
}
if
(
Duel
.
Phase
==
DuelPhase
.
Main1
&&
!
Duel
.
Fields
[
0
].
HasInMonstersZone
(
new
List
<
int
>
...
...
@@ -868,12 +868,12 @@ namespace MycardBot.Game.AI.Decks
(
int
)
CardId
.
白色灵龙
}))
{
Logger
.
WriteLine
(
"不能出L9,只能叠森罗的姬芽宫."
);
Logger
.
Debug
WriteLine
(
"不能出L9,只能叠森罗的姬芽宫."
);
return
true
;
}
if
(
Duel
.
Phase
==
DuelPhase
.
Main2
)
{
Logger
.
WriteLine
(
"主阶段2超量森罗的姬芽宫."
);
Logger
.
Debug
WriteLine
(
"主阶段2超量森罗的姬芽宫."
);
return
true
;
}
return
false
;
...
...
Game/GameAI.cs
View file @
09b9678c
...
...
@@ -366,8 +366,8 @@ namespace WindBot.Game
}
selected
.
Add
(
card
);
trysum
+=
card
.
Level
;
//Logger.WriteLine(card.Id + "");
//Logger.WriteLine(trysum + " selected " + sum);
//Logger.
Debug
WriteLine(card.Id + "");
//Logger.
Debug
WriteLine(trysum + " selected " + sum);
if
(
trysum
==
sum
)
{
return
selected
;
...
...
@@ -384,8 +384,8 @@ namespace WindBot.Game
// try level sub
selected2
.
Remove
(
card
);
trysum
-=
card
.
Level
;
//Logger.WriteLine(card.Id + "");
//Logger.WriteLine(trysum + " selected2 " + sum);
//Logger.
Debug
WriteLine(card.Id + "");
//Logger.
Debug
WriteLine(trysum + " selected2 " + sum);
if
(
trysum
==
sum
)
{
return
selected2
;
...
...
Game/GameBehavior.cs
View file @
09b9678c
...
...
@@ -146,7 +146,7 @@ namespace WindBot.Game
private
void
OnPlayerEnter
(
BinaryReader
packet
)
{
string
name
=
packet
.
ReadUnicode
(
Program
.
PlayerNameSize
);
string
name
=
packet
.
ReadUnicode
(
20
);
int
pos
=
packet
.
ReadByte
();
if
(
pos
<
8
)
_room
.
Names
[
pos
]
=
name
;
...
...
@@ -230,6 +230,7 @@ namespace WindBot.Game
private
void
OnRetry
(
BinaryReader
packet
)
{
Connection
.
Close
();
throw
new
Exception
(
"Got MSG_RETRY."
);
}
...
...
Game/GameClient.cs
View file @
09b9678c
...
...
@@ -16,19 +16,21 @@ namespace WindBot.Game
private
string
_serverHost
;
private
int
_serverPort
;
private
string
_roomInfos
;
private
short
_proVersion
;
private
string
_roomInfo
;
private
GameBehavior
_behavior
;
public
GameClient
(
string
username
=
"Windbot"
,
string
deck
=
"Blue-Eyes"
,
string
serverHost
=
"127.0.0.1"
,
int
serverPort
=
7911
,
string
dialog
=
"default"
,
string
roomInfos
=
""
)
public
GameClient
(
WindBotInfo
Info
)
{
Username
=
username
;
Deck
=
deck
;
Dialog
=
dialog
;
_serverHost
=
serverHost
;
_serverPort
=
serverPort
;
_roomInfos
=
roomInfos
;
Username
=
Info
.
Name
;
Deck
=
Info
.
Deck
;
Dialog
=
Info
.
Dialog
;
_serverHost
=
Info
.
Host
;
_serverPort
=
Info
.
Port
;
_roomInfo
=
Info
.
HostInfo
;
_proVersion
=
(
short
)
Info
.
Version
;
}
public
void
Start
()
...
...
@@ -45,14 +47,14 @@ namespace WindBot.Game
private
void
OnConnected
()
{
BinaryWriter
packet
=
GamePacketFactory
.
Create
(
CtosMessage
.
PlayerInfo
);
packet
.
WriteUnicode
(
Username
,
Program
.
PlayerNameSize
);
packet
.
WriteUnicode
(
Username
,
20
);
Connection
.
Send
(
packet
);
byte
[]
junk
=
{
0xCC
,
0xCC
,
0x00
,
0x00
,
0x00
,
0x00
};
packet
=
GamePacketFactory
.
Create
(
CtosMessage
.
JoinGame
);
packet
.
Write
(
Program
.
P
roVersion
);
packet
.
Write
(
_p
roVersion
);
packet
.
Write
(
junk
);
packet
.
WriteUnicode
(
_roomInfo
s
,
30
);
packet
.
WriteUnicode
(
_roomInfo
,
30
);
Connection
.
Send
(
packet
);
}
...
...
Logger.cs
View file @
09b9678c
...
...
@@ -8,6 +8,11 @@ namespace WindBot
{
Console
.
WriteLine
(
"["
+
DateTime
.
Now
.
ToString
(
"HH:mm:ss"
)
+
"] "
+
message
);
}
public
static
void
DebugWriteLine
(
string
message
)
{
if
(
Program
.
DebugMode
)
Console
.
WriteLine
(
"["
+
DateTime
.
Now
.
ToString
(
"HH:mm:ss"
)
+
"] "
+
message
);
}
public
static
void
WriteErrorLine
(
string
message
)
{
Console
.
Error
.
WriteLine
(
"["
+
DateTime
.
Now
.
ToString
(
"HH:mm:ss"
)
+
"] "
+
message
);
...
...
Program.cs
View file @
09b9678c
...
...
@@ -9,32 +9,133 @@ using System.Web;
namespace
WindBot
{
public
class
WindBotInfo
{
public
string
Name
{
get
;
set
;
}
public
string
Deck
{
get
;
set
;
}
public
string
Host
{
get
;
set
;
}
public
string
Dialog
{
get
;
set
;
}
public
int
Port
{
get
;
set
;
}
public
int
Version
{
get
;
set
;
}
}
public
class
Program
{
public
static
short
ProVersion
=
0x133A
;
public
static
int
PlayerNameSize
=
20
;
#if DEBUG
public
static
bool
DebugMode
=
true
;
#else
public
static
bool
DebugMode
=
false
;
#endif
internal
static
Random
Rand
;
internal
static
void
Main
()
internal
static
void
Main
(
string
[]
args
)
{
InitDatas
(
"cards.cdb"
);
int
argc
=
args
.
Length
;
// If the first commandline parameter is DebugMode
if
(
argc
>
0
&&
args
[
0
]
==
"DebugMode"
)
{
DebugMode
=
true
;
// Shift the args array to skip the first parameter
argc
--;
Array
.
Copy
(
args
,
1
,
args
,
0
,
argc
);
}
// Only one parameter will make Windbot run as a server, use the parameter as port
// provide a http interface to create bot.
// eg. http://127.0.0.1:2399/?name=%E2%91%A8&deck=Blue-Eyes&host=127.0.0.1&port=7911&dialog=cirno.zh-CN&version=4922
if
(
argc
==
1
)
{
RunAsServer
(
Int32
.
Parse
(
args
[
0
]));
}
// Use all five parameters to run Windbot
// The parameters should be name, deck, server ip, server port, password
// eg. WindBot.exe "My Bot" "Zexal Weapons" 127.0.0.1 7911 ""
else
if
(
argc
==
5
)
{
RunFromArgs
(
args
);
}
// Use environment variables to run Windbot
// List of variables required:
// YGOPRO_HOST
// YGOPRO_PORT
// YGOPRO_NAME
// YGOPRO_DECK
//
// List of variables optional:
// YGOPRO_VERSION
// YGOPRO_DIALOG
// YGOPRO_PASSWORD
//
// eg. (cmd)
// set YGOPRO_VERSION=4922
// set YGOPRO_HOST=127.0.0.1
// set YGOPRO_PORT=7911
// set YGOPRO_NAME=Meow
// set YGOPRO_DECK=Blue-Eyes
// set YGOPRO_DIALOG=zh-CN
// WindBot.exe
else
if
(
Environment
.
GetEnvironmentVariable
(
"YGOPRO_NAME"
)
!=
null
)
{
RunFromEnv
();
}
// Else, run from the default settings
else
{
WindBotInfo
Info
=
new
WindBotInfo
();
Run
(
Info
);
}
}
public
static
void
InitDatas
(
string
databasePath
)
{
Rand
=
new
Random
();
DecksManager
.
Init
();
string
absolutePath
=
Path
.
GetFullPath
(
databasePath
);
NamedCardsManager
.
Init
(
absolutePath
);
}
private
static
void
RunFromArgs
(
string
[]
args
)
{
WindBotInfo
Info
=
new
WindBotInfo
();
Info
.
Name
=
args
[
0
];
Info
.
Deck
=
args
[
1
];
Info
.
Host
=
args
[
2
];
Info
.
Port
=
Int32
.
Parse
(
args
[
3
]);
Info
.
HostInfo
=
args
[
4
];
Run
(
Info
);
}
private
static
void
RunFromEnv
()
{
WindBotInfo
Info
=
new
WindBotInfo
();
Info
.
Name
=
Environment
.
GetEnvironmentVariable
(
"YGOPRO_NAME"
);
Info
.
Deck
=
Environment
.
GetEnvironmentVariable
(
"YGOPRO_DECK"
);
Info
.
Host
=
Environment
.
GetEnvironmentVariable
(
"YGOPRO_HOST"
);
Info
.
Port
=
Int32
.
Parse
(
Environment
.
GetEnvironmentVariable
(
"YGOPRO_PORT"
));
string
EnvDialog
=
Environment
.
GetEnvironmentVariable
(
"YGOPRO_DIALOG"
);
if
(
EnvDialog
!=
null
)
Info
.
Dialog
=
EnvDialog
;
string
EnvVersion
=
Environment
.
GetEnvironmentVariable
(
"YGOPRO_VERSION"
);
if
(
EnvVersion
!=
null
)
Info
.
Version
=
Int16
.
Parse
(
EnvVersion
);
string
EnvPassword
=
Environment
.
GetEnvironmentVariable
(
"YGOPRO_PASSWORD"
);
if
(
EnvPassword
!=
null
)
Info
.
HostInfo
=
EnvPassword
;
GameClient
client
=
new
GameClient
(
Info
);
client
.
Start
();
while
(
client
.
Connection
.
IsConnected
)
{
client
.
Tick
();
Thread
.
Sleep
(
30
);
}
}
private
static
void
RunAsServer
(
int
ServerPort
)
{
Init
(
"cards.cdb"
);
using
(
HttpListener
MainServer
=
new
HttpListener
())
{
MainServer
.
AuthenticationSchemes
=
AuthenticationSchemes
.
Anonymous
;
MainServer
.
Prefixes
.
Add
(
"http://127.0.0.1:2399/"
);
MainServer
.
Start
();
Console
.
WriteLine
(
"Windbot Server Start Successed."
);
Logger
.
WriteLine
(
"Windbot Server Start Successed."
);
while
(
true
)
{
try
...
...
@@ -46,15 +147,20 @@ namespace WindBot
Info
.
Name
=
HttpUtility
.
ParseQueryString
(
RawUrl
).
Get
(
"name"
);
Info
.
Deck
=
HttpUtility
.
ParseQueryString
(
RawUrl
).
Get
(
"deck"
);
Info
.
Host
=
HttpUtility
.
ParseQueryString
(
RawUrl
).
Get
(
"host"
);
Info
.
Dialog
=
HttpUtility
.
ParseQueryString
(
RawUrl
).
Get
(
"dialog"
);
string
port
=
HttpUtility
.
ParseQueryString
(
RawUrl
).
Get
(
"port"
);
if
(
port
!=
null
)
Info
.
Port
=
Int32
.
Parse
(
port
);
string
dialog
=
HttpUtility
.
ParseQueryString
(
RawUrl
).
Get
(
"dialog"
);
if
(
dialog
!=
null
)
Info
.
Dialog
=
dialog
;
string
version
=
HttpUtility
.
ParseQueryString
(
RawUrl
).
Get
(
"version"
);
if
(
version
!=
null
)
Info
.
Version
=
Int16
.
Parse
(
version
);
string
password
=
HttpUtility
.
ParseQueryString
(
RawUrl
).
Get
(
"password"
);
if
(
password
!=
null
)
Info
.
HostInfo
=
password
;
if
(
Info
.
Name
==
null
||
Info
.
Deck
==
null
||
Info
.
Host
==
null
||
Info
.
Dialog
==
null
||
port
==
null
||
version
==
null
)
if
(
Info
.
Name
==
null
||
Info
.
Deck
==
null
||
Info
.
Host
==
null
||
port
==
null
)
{
ctx
.
Response
.
StatusCode
=
400
;
ctx
.
Response
.
Close
();
...
...
@@ -68,7 +174,10 @@ namespace WindBot
}
catch
(
Exception
ex
)
{
Logger
.
WriteErrorLine
(
"Start Thread Error: "
+
ex
);
if
(!
DebugMode
)
Logger
.
WriteErrorLine
(
"Start Thread Error: "
+
ex
);
else
throw
ex
;
}
ctx
.
Response
.
StatusCode
=
200
;
ctx
.
Response
.
Close
();
...
...
@@ -76,35 +185,23 @@ namespace WindBot
}
catch
(
Exception
ex
)
{
Logger
.
WriteErrorLine
(
"Parse Http Request Error: "
+
ex
);
if
(!
DebugMode
)
Logger
.
WriteErrorLine
(
"Parse Http Request Error: "
+
ex
);
else
throw
ex
;
}
}
}
}
public
static
void
Init
(
string
databasePath
)
{
Rand
=
new
Random
();
DecksManager
.
Init
();
InitCardsManager
(
databasePath
);
}
private
static
void
InitCardsManager
(
string
databasePath
)
{
string
currentPath
=
Path
.
GetFullPath
(
"."
);
string
absolutePath
=
Path
.
Combine
(
currentPath
,
databasePath
);
NamedCardsManager
.
Init
(
absolutePath
);
}
private
static
void
Run
(
object
o
)
{
#if !DEBUG
try
{
WindBotInfo
Info
=
(
WindBotInfo
)
o
;
GameClient
client
=
new
GameClient
(
Info
.
Name
,
Info
.
Deck
,
Info
.
Host
,
Info
.
Port
,
Info
.
Dialog
);
GameClient
client
=
new
GameClient
(
Info
);
client
.
Start
();
Logger
.
WriteLine
(
client
.
Username
+
" started."
);
Logger
.
Debug
WriteLine
(
client
.
Username
+
" started."
);
while
(
client
.
Connection
.
IsConnected
)
{
try
...
...
@@ -114,32 +211,27 @@ namespace WindBot
}
catch
(
Exception
ex
)
{
Logger
.
WriteErrorLine
(
"Tick Error: "
+
ex
);
if
(!
DebugMode
)
Logger
.
WriteErrorLine
(
"Tick Error: "
+
ex
);
else
throw
ex
;
}
}
Logger
.
WriteLine
(
client
.
Username
+
" end."
);
System
.
Threading
.
Thread
.
CurrentThread
.
Abort
();
}
catch
(
ThreadAbortException
ex
)
{
//Logger.WriteErrorLine("Run Error: " + ex);
Logger
.
DebugWriteLine
(
client
.
Username
+
" end."
);
//System.Threading.Thread.CurrentThread.Abort();
}
//catch (ThreadAbortException)
//{
//if (DebugMode)
// throw ex;
//}
catch
(
Exception
ex
)
{
Logger
.
WriteErrorLine
(
"Run Error: "
+
ex
);
if
(!
DebugMode
)
Logger
.
WriteErrorLine
(
"Run Error: "
+
ex
);
else
throw
ex
;
}
#else
WindBotInfo
Info
=
(
WindBotInfo
)
o
;
GameClient
client
=
new
GameClient
(
Info
.
Name
,
Info
.
Deck
,
Info
.
Host
,
Info
.
Port
,
Info
.
Dialog
);
client
.
Start
();
Logger
.
WriteLine
(
client
.
Username
+
" started."
);
while
(
client
.
Connection
.
IsConnected
)
{
client
.
Tick
();
Thread
.
Sleep
(
30
);
}
Logger
.
WriteLine
(
client
.
Username
+
" end."
);
#endif
}
}
}
WindBot.csproj
View file @
09b9678c
...
...
@@ -95,6 +95,7 @@
<Compile
Include=
"Logger.cs"
/>
<Compile
Include=
"Program.cs"
/>
<Compile
Include=
"Properties\AssemblyInfo.cs"
/>
<Compile
Include=
"WindBotInfo.cs"
/>
</ItemGroup>
<ItemGroup>
<None
Include=
"App.config"
/>
...
...
WindBotInfo.cs
0 → 100644
View file @
09b9678c
using
System
;
namespace
WindBot
{
public
class
WindBotInfo
{
public
string
Name
{
get
;
set
;
}
public
string
Deck
{
get
;
set
;
}
public
string
Dialog
{
get
;
set
;
}
public
string
Host
{
get
;
set
;
}
public
int
Port
{
get
;
set
;
}
public
string
HostInfo
{
get
;
set
;
}
public
int
Version
{
get
;
set
;
}
public
WindBotInfo
()
{
Name
=
"WindBot"
;
Deck
=
"Blue-Eyes"
;
Dialog
=
"default"
;
Host
=
"127.0.0.1"
;
Port
=
7911
;
HostInfo
=
""
;
Version
=
0x133A
;
}
}
}
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