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
nanahira
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