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
7a3fc306
Commit
7a3fc306
authored
Apr 29, 2019
by
mercury233
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
https://github.com/IceYGO/windbot
parents
13d382d4
3bb0c439
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
1339 additions
and
4 deletions
+1339
-4
Decks/AI_Salamangreat.ydk
Decks/AI_Salamangreat.ydk
+60
-0
Game/AI/CardContainer.cs
Game/AI/CardContainer.cs
+9
-0
Game/AI/Decks/SalamangreatExecutor.cs
Game/AI/Decks/SalamangreatExecutor.cs
+1264
-0
Game/AI/DefaultExecutor.cs
Game/AI/DefaultExecutor.cs
+1
-1
Game/AI/Enums/Floodgate.cs
Game/AI/Enums/Floodgate.cs
+2
-1
Game/ClientField.cs
Game/ClientField.cs
+2
-2
WindBot.csproj
WindBot.csproj
+1
-0
No files found.
Decks/AI_Salamangreat.ydk
0 → 100644
View file @
7a3fc306
#created by ygopro2
#main
97268402
97268402
97268402
94620082
94620082
94620082
26889158
26889158
26889158
89662401
14558127
14558127
20618081
56003780
52277807
52277807
52277807
23434538
23434538
23434538
16188701
16188701
16188701
52155219
52155219
52155219
24224830
24224830
24224830
81439174
18144507
1295111
14934922
51339637
51339637
10045474
10045474
10045474
41420027
41420027
#extra
6983839
87327776
87327776
87871125
87871125
87871125
31833038
14812471
14812471
14812471
41463182
41463182
48815792
2857636
85289965
!side
64178424
Game/AI/CardContainer.cs
View file @
7a3fc306
...
...
@@ -16,6 +16,15 @@ namespace WindBot.Game.AI
return
1
;
}
public
static
int
CompareCardLevel
(
ClientCard
cardA
,
ClientCard
cardB
)
{
if
(
cardA
.
Level
<
cardB
.
Level
)
return
-
1
;
if
(
cardA
.
Level
==
cardB
.
Level
)
return
0
;
return
1
;
}
public
static
int
CompareDefensePower
(
ClientCard
cardA
,
ClientCard
cardB
)
{
if
(
cardA
==
null
&&
cardB
==
null
)
...
...
Game/AI/Decks/SalamangreatExecutor.cs
0 → 100644
View file @
7a3fc306
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
using
YGOSharp.OCGWrapper.Enums
;
namespace
WindBot.Game.AI.Decks
{
[
Deck
(
"Salamangreat"
,
"AI_Salamangreat"
)]
class
SalamangreatExecutor
:
DefaultExecutor
{
bool
foxyPopEnemySpell
=
false
;
bool
wasGazelleSummonedThisTurn
=
false
;
bool
wasFieldspellUsedThisTurn
=
false
;
bool
wasWolfSummonedUsingItself
=
false
;
int
sunlightPosition
=
0
;
bool
wasVeilynxSummonedThisTurn
=
false
;
bool
falcoHitGY
=
false
;
List
<
int
>
CombosInHand
;
List
<
int
>
Impermanence_list
=
new
List
<
int
>();
public
class
CardId
{
public
const
int
JackJaguar
=
56003780
;
public
const
int
EffectVeiler
=
97268402
;
public
const
int
LadyDebug
=
16188701
;
public
const
int
Foxy
=
94620082
;
public
const
int
Gazelle
=
26889158
;
public
const
int
Fowl
=
89662401
;
public
const
int
Falco
=
20618081
;
public
const
int
Spinny
=
52277807
;
public
const
int
MaxxC
=
23434538
;
public
const
int
AshBlossom
=
14558127
;
public
const
int
FusionOfFire
=
25800447
;
public
const
int
Circle
=
52155219
;
public
const
int
HarpieFeatherDuster
=
18144507
;
public
const
int
FoolishBurial
=
81439174
;
public
const
int
Sanctuary
=
1295111
;
public
const
int
CalledByTheGrave
=
24224830
;
public
const
int
SalamangreatRage
=
14934922
;
public
const
int
SalamangreatRoar
=
51339637
;
public
const
int
Impermanence
=
10045474
;
public
const
int
SolemnJudgment
=
41420027
;
public
const
int
SolemnStrike
=
40605147
;
public
const
int
SalamangreatVioletChimera
=
37261776
;
public
const
int
ExcitionKnight
=
46772449
;
public
const
int
MirageStallio
=
87327776
;
public
const
int
SunlightWolf
=
87871125
;
public
const
int
Borrelload
=
31833038
;
public
const
int
HeatLeo
=
41463181
;
public
const
int
Veilynx
=
14812471
;
public
const
int
Charmer
=
48815792
;
public
const
int
KnightmarePheonix
=
2857636
;
public
const
int
Borrelsword
=
85289965
;
public
const
int
GO_SR
=
59438930
;
public
const
int
DarkHole
=
53129443
;
public
const
int
NaturalBeast
=
33198837
;
public
const
int
SwordsmanLV7
=
37267041
;
public
const
int
RoyalDecreel
=
51452091
;
public
const
int
Anti_Spell
=
58921041
;
public
const
int
Hayate
=
8491308
;
public
const
int
Raye
=
26077387
;
public
const
int
Drones_Token
=
52340445
;
public
const
int
Iblee
=
10158145
;
public
const
int
ImperialOrder
=
61740673
;
public
const
int
TornadoDragon
=
6983839
;
}
List
<
int
>
Combo_cards
=
new
List
<
int
>()
{
CardId
.
Spinny
,
CardId
.
JackJaguar
,
CardId
.
Fowl
,
CardId
.
Foxy
,
CardId
.
Falco
,
CardId
.
Circle
,
CardId
.
Gazelle
,
CardId
.
FoolishBurial
};
List
<
int
>
normal_counter
=
new
List
<
int
>
{
53262004
,
98338152
,
32617464
,
45041488
,
CardId
.
SolemnStrike
,
61257789
,
23440231
,
27354732
,
12408276
,
82419869
,
CardId
.
Impermanence
,
49680980
,
18621798
,
38814750
,
17266660
,
94689635
,
CardId
.
AshBlossom
,
74762582
,
75286651
,
4810828
,
44665365
,
21123811
,
_CardId
.
CrystalWingSynchroDragon
,
82044279
,
82044280
,
79606837
,
10443957
,
1621413
,
90809975
,
8165596
,
9753964
,
53347303
,
88307361
,
_CardId
.
GamecieltheSeaTurtleKaiju
,
5818294
,
2948263
,
6150044
,
26268488
,
51447164
,
_CardId
.
JizukirutheStarDestroyingKaiju
,
97268402
};
List
<
int
>
should_not_negate
=
new
List
<
int
>
{
81275020
,
28985331
};
List
<
int
>
salamangreat_links
=
new
List
<
int
>
{
CardId
.
HeatLeo
,
CardId
.
SunlightWolf
,
CardId
.
Veilynx
};
List
<
int
>
JackJaguarTargets
=
new
List
<
int
>
{
CardId
.
SunlightWolf
,
CardId
.
MirageStallio
,
CardId
.
HeatLeo
};
List
<
int
>
salamangreat_combopieces
=
new
List
<
int
>
{
CardId
.
Gazelle
,
CardId
.
Spinny
,
CardId
.
JackJaguar
,
CardId
.
Foxy
,
CardId
.
Circle
,
CardId
.
Falco
};
List
<
int
>
WolfMaterials
=
new
List
<
int
>
{
CardId
.
Veilynx
,
CardId
.
JackJaguar
,
CardId
.
Falco
,
CardId
.
Foxy
,
CardId
.
MirageStallio
,
CardId
.
Gazelle
};
List
<
int
>
salamangreat_spellTrap
=
new
List
<
int
>
{
CardId
.
SalamangreatRoar
,
CardId
.
SalamangreatRage
,
CardId
.
Circle
,
CardId
.
Sanctuary
};
private
bool
falcoUsedReturnST
;
private
bool
wasStallioActivated
;
private
bool
wasWolfActivatedThisTurn
;
bool
JackJaguarActivatedThisTurn
=
false
;
bool
FoxyActivatedThisTurn
=
false
;
public
SalamangreatExecutor
(
GameAI
ai
,
Duel
duel
)
:
base
(
ai
,
duel
)
{
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
HarpieFeatherDuster
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
MaxxC
,
G_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
CalledByTheGrave
,
Called_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
AshBlossom
,
Hand_act_eff
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
EffectVeiler
,
DefaultBreakthroughSkill
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
Impermanence
,
Impermanence_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
SalamangreatRoar
,
SolemnJudgment_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
SolemnStrike
,
SolemnStrike_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
SolemnJudgment
,
SolemnJudgment_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
Sanctuary
,
Sanctuary_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
Charmer
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
SunlightWolf
,
Wolf_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
LadyDebug
,
Fadydebug_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
Foxy
,
Foxy_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
Falco
,
Falco_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
Circle
,
Circle_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
Borrelsword
,
Borrelsword_eff
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
Gazelle
,
Gazelle_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
Spinny
,
Spinny_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
MirageStallio
,
Stallio_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
Veilynx
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
JackJaguar
,
JackJaguar_activate
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
LadyDebug
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
Foxy
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
Spinny
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
JackJaguar
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
Gazelle
);
AddExecutor
(
ExecutorType
.
Summon
,
CardId
.
Fowl
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
Spinny
,
Spinny_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
HeatLeo
,
DefaultMysticalSpaceTyphoon
);
AddExecutor
(
ExecutorType
.
SpSummon
,
CardId
.
Borrelsword
,
Borrelsword_ss
);
AddExecutor
(
ExecutorType
.
SpSummon
,
CardId
.
Veilynx
,
Veilynx_summon
);
AddExecutor
(
ExecutorType
.
SpSummon
,
CardId
.
MirageStallio
,
Stallio_summon
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
MirageStallio
,
Stallio_activate
);
AddExecutor
(
ExecutorType
.
SpSummon
,
CardId
.
Charmer
,
Charmer_summon
);
AddExecutor
(
ExecutorType
.
SpSummon
,
CardId
.
SunlightWolf
,
SunlightWolf_summon
);
AddExecutor
(
ExecutorType
.
SpSummon
,
CardId
.
HeatLeo
,
HeatLeo_summon
);
AddExecutor
(
ExecutorType
.
SpSummon
,
CardId
.
TornadoDragon
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
TornadoDragon
,
DefaultMysticalSpaceTyphoon
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
SalamangreatRage
,
Rage_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
Fowl
,
Fowl_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
SunlightWolf
,
Wolf_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
Gazelle
,
Gazelle_activate
);
AddExecutor
(
ExecutorType
.
Activate
,
CardId
.
FoolishBurial
,
FoolishBurial_activate
);
AddExecutor
(
ExecutorType
.
Repos
,
DefaultMonsterRepos
);
AddExecutor
(
ExecutorType
.
SpellSet
,
SpellSet
);
}
public
int
get_Wolf_linkzone
()
{
ClientCard
WolfInExtra
=
Bot
.
GetMonstersInExtraZone
().
Where
(
x
=>
x
.
Id
==
CardId
.
SunlightWolf
).
ToList
().
FirstOrDefault
(
x
=>
x
.
Id
==
CardId
.
SunlightWolf
);
if
(
WolfInExtra
!=
null
)
{
int
zone
=
WolfInExtra
.
Position
;
if
(
zone
==
5
)
return
1
;
if
(
zone
==
6
)
return
3
;
}
return
-
1
;
}
private
bool
Charmer_summon
()
{
if
(
Duel
.
Phase
!=
DuelPhase
.
Main1
)
return
false
;
if
(
Duel
.
Turn
==
1
)
return
false
;
if
(
Enemy
.
Graveyard
.
Where
(
x
=>
x
.
Attribute
==
(
int
)
CardAttribute
.
Fire
).
Count
()
>
0
&&
(
Bot
.
GetMonstersInExtraZone
().
Count
==
0
||
Bot
.
GetMonstersInExtraZone
().
Where
(
x
=>
(
x
.
Id
==
CardId
.
Veilynx
||
x
.
Id
==
CardId
.
MirageStallio
)
&&
x
.
Owner
==
0
).
Count
()
==
1
))
{
List
<
ClientCard
>
material_list
=
new
List
<
ClientCard
>();
List
<
ClientCard
>
bot_monster
=
Bot
.
GetMonsters
();
bot_monster
.
Sort
(
CardContainer
.
CompareCardAttack
);
//bot_monster.Reverse();
int
link_count
=
0
;
foreach
(
ClientCard
card
in
bot_monster
)
{
if
(
card
.
IsFacedown
())
continue
;
if
(!
material_list
.
Contains
(
card
)
&&
card
.
LinkCount
<
2
)
{
material_list
.
Add
(
card
);
link_count
+=
(
card
.
HasType
(
CardType
.
Link
))
?
card
.
LinkCount
:
1
;
if
(
link_count
>=
4
)
break
;
}
}
if
(
link_count
>=
3
)
{
AI
.
SelectCard
(
CardId
.
Veilynx
);
return
true
;
}
}
return
false
;
}
private
bool
HeatLeo_summon
()
{
if
(
Duel
.
Turn
==
1
)
return
false
;
if
(
Duel
.
Phase
!=
DuelPhase
.
Main1
)
return
false
;
if
(
wasWolfSummonedUsingItself
&&
Bot
.
GetMonsters
().
Count
()
<=
3
)
return
false
;
ClientCard
self_best
=
Util
.
GetBestBotMonster
(
true
);
int
self_power
=
(
self_best
!=
null
)
?
self_best
.
Attack
:
0
;
ClientCard
enemy_best
=
Util
.
GetBestEnemyMonster
(
true
);
int
enemy_power
=
(
enemy_best
!=
null
)
?
enemy_best
.
GetDefensePower
()
:
0
;
if
(
enemy_power
<
self_power
)
return
false
;
if
(
Enemy
.
GetSpells
().
Where
(
x
=>
x
.
IsFloodgate
()).
Count
()
>
0
)
{
List
<
ClientCard
>
material_list
=
new
List
<
ClientCard
>();
List
<
ClientCard
>
bot_monster
=
Bot
.
GetMonsters
();
bot_monster
.
Sort
(
CardContainer
.
CompareCardAttack
);
//bot_monster.Reverse();
int
link_count
=
0
;
foreach
(
ClientCard
card
in
bot_monster
)
{
if
(
card
.
IsFacedown
())
continue
;
if
(!
material_list
.
Contains
(
card
)
&&
card
.
LinkCount
<
2
)
{
material_list
.
Add
(
card
);
link_count
+=
(
card
.
HasType
(
CardType
.
Link
))
?
card
.
LinkCount
:
1
;
if
(
link_count
>=
3
)
break
;
}
}
if
(
link_count
>=
3
)
{
AI
.
SelectMaterials
(
material_list
);
return
true
;
}
}
return
false
;
}
private
bool
Stallio_summon
()
{
if
(!
wasStallioActivated
)
{
AI
.
SelectMaterials
(
CardId
.
Spinny
);
return
true
;
}
return
false
;
}
private
bool
SunlightWolf_summon
()
{
if
(
Bot
.
HasInMonstersZone
(
CardId
.
SunlightWolf
))
{
if
(
wasWolfSummonedUsingItself
)
{
return
false
;
}
if
(!
wasFieldspellUsedThisTurn
&&
Bot
.
HasInGraveyard
(
salamangreat_spellTrap
)
||
Bot
.
HasInHandOrInSpellZone
(
CardId
.
SalamangreatRage
))
{
AI
.
SelectOption
(
1
);
AI
.
SelectMaterials
(
new
List
<
int
>()
{
CardId
.
SunlightWolf
,
CardId
.
Veilynx
,
CardId
.
JackJaguar
,
CardId
.
Gazelle
});
wasWolfSummonedUsingItself
=
true
;
AI
.
SelectPlace
(
sunlightPosition
);
return
true
;
}
else
{
return
false
;
}
}
wasWolfSummonedUsingItself
=
false
;
if
(
Bot
.
HasInMonstersZone
(
CardId
.
Veilynx
))
{
if
(
Bot
.
HasInMonstersZone
(
CardId
.
MirageStallio
)
&&
Bot
.
HasInMonstersZone
(
CardId
.
Veilynx
)
&&
Bot
.
HasInMonstersZone
(
CardId
.
Gazelle
))
{
AI
.
SelectCard
(
CardId
.
Veilynx
);
AI
.
SelectNextCard
(
CardId
.
MirageStallio
);
}
else
{
AI
.
SelectCard
(
WolfMaterials
);
AI
.
SelectNextCard
(
WolfMaterials
);
}
sunlightPosition
=
SelectSetPlace
(
new
List
<
int
>()
{
CardId
.
Veilynx
},
true
);
AI
.
SelectPlace
(
sunlightPosition
);
}
return
true
;
}
private
bool
Wolf_activate
()
{
wasWolfActivatedThisTurn
=
true
;
AI
.
SelectCard
(
new
List
<
int
>()
{
CardId
.
Gazelle
,
CardId
.
SalamangreatRoar
,
CardId
.
SalamangreatRage
,
CardId
.
Foxy
,
CardId
.
AshBlossom
,
CardId
.
Fowl
,
CardId
.
SunlightWolf
,
CardId
.
Veilynx
,
CardId
.
HeatLeo
,
CardId
.
Spinny
});
return
true
;
}
private
bool
Stallio_activate
()
{
if
(
Card
.
Location
==
CardLocation
.
MonsterZone
)
{
wasStallioActivated
=
true
;
if
(!
wasGazelleSummonedThisTurn
)
{
AI
.
SelectCard
(
CardId
.
Gazelle
,
CardId
.
Spinny
);
AI
.
SelectNextCard
(
CardId
.
Gazelle
);
return
true
;
}
if
(!
Bot
.
HasInHandOrInMonstersZoneOrInGraveyard
(
CardId
.
JackJaguar
))
{
AI
.
SelectCard
(
CardId
.
Gazelle
);
AI
.
SelectNextCard
(
CardId
.
JackJaguar
);
return
true
;
}
if
(!
Bot
.
HasInHandOrInMonstersZoneOrInGraveyard
(
CardId
.
Falco
)
&&
FalcoToGY
(
true
))
{
AI
.
SelectCard
(
CardId
.
Gazelle
);
AI
.
SelectNextCard
(
CardId
.
Falco
);
return
true
;
}
AI
.
SelectCard
(
CardId
.
Gazelle
);
return
true
;
}
else
{
if
(
Util
.
GetBestEnemyMonster
(
canBeTarget
:
true
)
!=
null
)
{
AI
.
SelectCard
(
Util
.
GetBestEnemyMonster
(
canBeTarget
:
true
));
return
true
;
}
}
return
false
;
}
private
bool
Veilynx_summon
()
{
if
(
wasStallioActivated
&&
wasWolfActivatedThisTurn
)
{
return
false
;
}
if
((
wasStallioActivated
&&
!
wasWolfActivatedThisTurn
)
||
(!
wasStallioActivated
&&
wasWolfActivatedThisTurn
))
{
return
false
;
}
if
(
Bot
.
HasInHand
(
CardId
.
Gazelle
)
&&
!
wasGazelleSummonedThisTurn
&&
!
Bot
.
HasInGraveyard
(
CardId
.
JackJaguar
)
&&
Bot
.
GetMonstersInMainZone
().
Where
(
x
=>
x
.
Level
==
3
).
Count
()
<=
1
||
(
Bot
.
HasInMonstersZone
(
CardId
.
SunlightWolf
)
&&
!
Bot
.
HasInSpellZoneOrInGraveyard
(
CardId
.
Sanctuary
)
&&
!
wasWolfSummonedUsingItself
))
{
var
monsters
=
Bot
.
GetMonstersInMainZone
();
if
(
Bot
.
HasInMonstersZone
(
CardId
.
Veilynx
)
&&
monsters
.
Count
==
2
)
{
return
false
;
}
monsters
.
Sort
(
CardContainer
.
CompareCardLevel
);
monsters
.
Reverse
();
AI
.
SelectMaterials
(
monsters
);
return
true
;
}
if
(!
Bot
.
HasInMonstersZone
(
CardId
.
Veilynx
)
&&
Bot
.
GetMonstersInMainZone
().
Count
>=
3
&&
(
Bot
.
GetMonstersInExtraZone
().
Where
(
x
=>
x
.
Owner
==
0
).
Count
()
==
0
))
{
var
monsters
=
Bot
.
GetMonstersInMainZone
();
monsters
.
Sort
(
CardContainer
.
CompareCardLevel
);
monsters
.
Reverse
();
AI
.
SelectMaterials
(
monsters
);
return
true
;
}
if
(
CombosInHand
.
Where
(
x
=>
x
!=
CardId
.
Foxy
).
Where
(
x
=>
x
!=
CardId
.
Spinny
).
Count
()
==
0
&&
Bot
.
HasInHand
(
CardId
.
Spinny
))
{
if
(
Bot
.
HasInMonstersZone
(
CardId
.
Gazelle
)
&&
Bot
.
HasInMonstersZone
(
CardId
.
SunlightWolf
))
{
AI
.
SelectMaterials
(
CardId
.
Gazelle
);
return
true
;
}
if
(!
wasVeilynxSummonedThisTurn
)
{
wasVeilynxSummonedThisTurn
=
true
;
return
true
;
}
}
return
false
;
}
private
bool
JackJaguar_activate
()
{
if
(
Card
.
Location
==
CardLocation
.
Grave
)
{
if
(
Bot
.
HasInGraveyard
(
JackJaguarTargets
)
||
Bot
.
Graveyard
.
Where
(
x
=>
x
.
Id
==
CardId
.
Veilynx
).
Count
()
>=
2
||
(!
Bot
.
HasInGraveyard
(
salamangreat_spellTrap
)
&&
Bot
.
HasInMonstersZone
(
CardId
.
SunlightWolf
)
&&
Bot
.
HasInGraveyard
(
CardId
.
Gazelle
)
&&
!
Bot
.
HasInHand
(
CardId
.
Gazelle
)))
{
JackJaguarActivatedThisTurn
=
true
;
if
(
Bot
.
Graveyard
.
Where
(
x
=>
x
.
Id
==
CardId
.
Veilynx
).
Count
()
>=
2
&&
Bot
.
Graveyard
.
Select
(
x
=>
x
.
Id
).
Intersect
(
JackJaguarTargets
).
Count
()
==
0
)
{
AI
.
SelectCard
(
CardId
.
Veilynx
);
return
true
;
}
AI
.
SelectCard
(
JackJaguarTargets
);
return
true
;
}
}
return
false
;
}
private
bool
Fowl_activate
()
{
if
(
Card
.
Location
==
CardLocation
.
Hand
)
{
return
Bot
.
HasInMonstersZone
(
CardId
.
JackJaguar
)
&&
JackJaguarActivatedThisTurn
;
}
return
false
;
}
private
bool
Spinny_activate
()
{
if
(
Card
.
Location
==
CardLocation
.
Hand
)
{
if
(
Bot
.
HasInGraveyard
(
CardId
.
Foxy
)
&&
!
FoxyActivatedThisTurn
)
return
false
;
if
(
CombosInHand
.
Where
(
x
=>
x
!=
CardId
.
Foxy
).
Where
(
x
=>
x
!=
CardId
.
Spinny
).
Count
()
==
0
)
{
return
false
;
}
if
(!
Bot
.
HasInMonstersZoneOrInGraveyard
(
CardId
.
Spinny
)
&&
Util
.
GetBestBotMonster
(
true
)
!=
null
&&
!(
Bot
.
GetMonsters
().
Count
==
1
&&
Bot
.
HasInMonstersZone
(
CardId
.
Spinny
)))
{
AI
.
SelectCard
(
Util
.
GetBestBotMonster
(
true
));
return
true
;
}
}
return
true
;
}
private
bool
Falco_activate
()
{
if
(!
falcoUsedReturnST
&&
falcoHitGY
)
{
if
(
Bot
.
HasInGraveyard
(
salamangreat_spellTrap
))
{
falcoUsedReturnST
=
true
;
AI
.
SelectCard
(
salamangreat_spellTrap
);
return
true
;
}
}
return
false
;
}
private
bool
Gazelle_activate
()
{
wasGazelleSummonedThisTurn
=
true
;
if
(!
Bot
.
HasInHandOrInMonstersZoneOrInGraveyard
(
CardId
.
Spinny
))
{
AI
.
SelectCard
(
CardId
.
Spinny
);
return
true
;
}
if
(!
Bot
.
HasInSpellZoneOrInGraveyard
(
CardId
.
SalamangreatRoar
))
{
AI
.
SelectCard
(
CardId
.
SalamangreatRoar
);
return
true
;
}
if
(!
Bot
.
HasInSpellZoneOrInGraveyard
(
CardId
.
SalamangreatRage
))
{
AI
.
SelectCard
(
CardId
.
SalamangreatRage
);
return
true
;
}
if
(!
Bot
.
HasInHandOrInMonstersZoneOrInGraveyard
(
CardId
.
JackJaguar
))
{
AI
.
SelectCard
(
CardId
.
JackJaguar
);
return
true
;
}
if
(!
Bot
.
HasInHandOrInMonstersZoneOrInGraveyard
(
CardId
.
Foxy
))
{
AI
.
SelectCard
(
CardId
.
Foxy
);
return
true
;
}
if
(!
Bot
.
HasInHandOrInMonstersZoneOrInGraveyard
(
CardId
.
Falco
))
{
AI
.
SelectCard
(
CardId
.
Falco
);
return
true
;
}
return
true
;
}
private
bool
Foxy_activate
()
{
if
(
Card
.
Location
==
CardLocation
.
MonsterZone
)
{
if
(
CombosInHand
.
Where
(
x
=>
x
!=
CardId
.
Foxy
).
Where
(
x
=>
x
!=
CardId
.
Spinny
).
Count
()
==
0
&&
Bot
.
HasInHand
(
CardId
.
Spinny
))
{
return
false
;
}
AI
.
SelectCard
(
salamangreat_combopieces
);
FoxyActivatedThisTurn
=
true
;
return
true
;
}
else
{
if
(
Bot
.
HasInHand
(
CardId
.
Spinny
)
||
FalcoToGY
(
false
))
{
if
(
Bot
.
HasInHand
(
CardId
.
Spinny
)
&&
!
Bot
.
HasInGraveyard
(
CardId
.
Spinny
))
{
AI
.
SelectCard
(
CardId
.
Spinny
);
}
else
{
if
(
FalcoToGY
(
false
))
{
AI
.
SelectCard
(
CardId
.
Falco
);
}
else
{
return
false
;
}
}
if
(
Util
.
GetBestEnemySpell
(
true
)
!=
null
)
{
AI
.
SelectNextCard
(
Util
.
GetBestEnemySpell
(
true
));
foxyPopEnemySpell
=
true
;
}
FoxyActivatedThisTurn
=
true
;
return
true
;
}
return
false
;
}
}
private
bool
FalcoToGY
(
bool
FromDeck
)
{
if
(
FromDeck
&&
Bot
.
Deck
.
ContainsCardWithId
(
CardId
.
Falco
))
{
if
(
Bot
.
HasInGraveyard
(
salamangreat_spellTrap
))
{
return
true
;
}
return
false
;
}
else
{
if
(
Bot
.
HasInHand
(
CardId
.
Falco
)
&&
Bot
.
HasInGraveyard
(
salamangreat_spellTrap
))
{
return
true
;
}
return
false
;
}
}
private
bool
Fadydebug_activate
()
{
if
(!
Bot
.
HasInHand
(
CardId
.
Gazelle
))
{
AI
.
SelectCard
(
CardId
.
Gazelle
);
return
true
;
}
if
(!
Bot
.
HasInHandOrInGraveyard
(
CardId
.
Spinny
))
{
AI
.
SelectCard
(
CardId
.
Spinny
);
return
true
;
}
if
(!
Bot
.
HasInHand
(
CardId
.
Foxy
))
{
AI
.
SelectCard
(
CardId
.
Foxy
);
return
true
;
}
return
true
;
}
private
bool
Circle_activate
()
{
var
x
=
ActivateDescription
;
if
(
ActivateDescription
==
Util
.
GetStringId
(
CardId
.
Circle
,
0
)
||
ActivateDescription
==
0
)
{
AI
.
SelectOption
(
0
);
if
(!
Bot
.
HasInHand
(
CardId
.
Gazelle
))
{
AI
.
SelectCard
(
CardId
.
Gazelle
);
return
true
;
}
if
(!
Bot
.
HasInHandOrInGraveyard
(
CardId
.
Spinny
))
{
AI
.
SelectCard
(
CardId
.
Spinny
);
return
true
;
}
if
(!
Bot
.
HasInHand
(
CardId
.
Foxy
))
{
AI
.
SelectCard
(
CardId
.
Foxy
);
return
true
;
}
if
(!
Bot
.
HasInHand
(
CardId
.
Fowl
))
{
AI
.
SelectCard
(
CardId
.
Fowl
);
return
true
;
}
if
(!
Bot
.
HasInHand
(
CardId
.
JackJaguar
))
{
AI
.
SelectCard
(
CardId
.
JackJaguar
);
return
true
;
}
if
(!
Bot
.
HasInHand
(
CardId
.
Falco
))
{
AI
.
SelectCard
(
CardId
.
Falco
);
return
true
;
}
return
false
;
}
return
false
;
}
private
bool
FoolishBurial_activate
()
{
if
(
FalcoToGY
(
true
)
&&
Bot
.
HasInHandOrInGraveyard
(
CardId
.
Spinny
))
{
AI
.
SelectCard
(
CardId
.
Falco
);
return
true
;
}
AI
.
SelectCard
(
CardId
.
Spinny
,
CardId
.
JackJaguar
,
CardId
.
Foxy
);
return
true
;
}
private
bool
Sanctuary_activate
()
{
if
(
Card
.
Location
==
CardLocation
.
Hand
)
{
return
true
;
}
return
false
;
}
private
bool
Rage_activate
()
{
if
(
ActivateDescription
==
Util
.
GetStringId
(
CardId
.
SalamangreatRage
,
1
))
{
AI
.
SelectCard
(
salamangreat_links
);
AI
.
SelectOption
(
1
);
IList
<
ClientCard
>
targets
=
new
List
<
ClientCard
>();
ClientCard
target1
=
Util
.
GetBestEnemyMonster
(
canBeTarget
:
true
);
if
(
target1
!=
null
)
targets
.
Add
(
target1
);
ClientCard
target2
=
Util
.
GetBestEnemySpell
();
if
(
target2
!=
null
)
targets
.
Add
(
target2
);
foreach
(
ClientCard
target
in
Enemy
.
GetMonsters
())
{
if
(
targets
.
Count
>=
2
)
break
;
if
(!
targets
.
Contains
(
target
))
targets
.
Add
(
target
);
}
foreach
(
ClientCard
target
in
Enemy
.
GetSpells
())
{
if
(
targets
.
Count
>=
2
)
break
;
if
(!
targets
.
Contains
(
target
))
targets
.
Add
(
target
);
}
if
(
targets
.
Count
==
0
)
return
false
;
AI
.
SelectNextCard
(
targets
);
return
true
;
}
else
{
if
(
Util
.
GetProblematicEnemyCard
(
canBeTarget
:
true
)
!=
null
)
{
if
(
Util
.
GetBestBotMonster
(
true
)
!=
null
)
{
AI
.
SelectCard
(
Util
.
GetProblematicEnemyCard
(
Util
.
GetBestBotMonster
(
true
).
Attack
,
canBeTarget
:
true
));
}
else
{
AI
.
SelectCard
(
Util
.
GetProblematicEnemyCard
(
canBeTarget
:
true
));
}
return
true
;
}
}
return
false
;
}
public
bool
G_activate
()
{
return
(
Duel
.
Player
==
1
);
}
public
bool
Hand_act_eff
()
{
return
(
Duel
.
LastChainPlayer
==
1
);
}
public
bool
Impermanence_activate
()
{
if
(!
Should_counter
())
return
false
;
if
(!
spell_trap_activate
())
return
false
;
// negate before effect used
foreach
(
ClientCard
m
in
Enemy
.
GetMonsters
())
{
if
(
m
.
IsMonsterShouldBeDisabledBeforeItUseEffect
()
&&
!
m
.
IsDisabled
()
&&
Duel
.
LastChainPlayer
!=
0
)
{
if
(
Card
.
Location
==
CardLocation
.
SpellZone
)
{
for
(
int
i
=
0
;
i
<
5
;
++
i
)
{
if
(
Bot
.
SpellZone
[
i
]
==
Card
)
{
Impermanence_list
.
Add
(
i
);
break
;
}
}
}
if
(
Card
.
Location
==
CardLocation
.
Hand
)
{
AI
.
SelectPlace
(
SelectSTPlace
(
Card
,
true
));
}
AI
.
SelectCard
(
m
);
return
true
;
}
}
ClientCard
LastChainCard
=
Util
.
GetLastChainCard
();
// negate spells
if
(
Card
.
Location
==
CardLocation
.
SpellZone
)
{
int
this_seq
=
-
1
;
int
that_seq
=
-
1
;
for
(
int
i
=
0
;
i
<
5
;
++
i
)
{
if
(
Bot
.
SpellZone
[
i
]
==
Card
)
this_seq
=
i
;
if
(
LastChainCard
!=
null
&&
LastChainCard
.
Controller
==
1
&&
LastChainCard
.
Location
==
CardLocation
.
SpellZone
&&
Enemy
.
SpellZone
[
i
]
==
LastChainCard
)
that_seq
=
i
;
else
if
(
Duel
.
Player
==
0
&&
Util
.
GetProblematicEnemySpell
()
!=
null
&&
Enemy
.
SpellZone
[
i
]
!=
null
&&
Enemy
.
SpellZone
[
i
].
IsFloodgate
())
that_seq
=
i
;
}
if
((
this_seq
*
that_seq
>=
0
&&
this_seq
+
that_seq
==
4
)
||
(
Util
.
IsChainTarget
(
Card
))
||
(
LastChainCard
!=
null
&&
LastChainCard
.
Controller
==
1
&&
LastChainCard
.
IsCode
(
_CardId
.
HarpiesFeatherDuster
)))
{
List
<
ClientCard
>
enemy_monsters
=
Enemy
.
GetMonsters
();
enemy_monsters
.
Sort
(
CardContainer
.
CompareCardAttack
);
enemy_monsters
.
Reverse
();
foreach
(
ClientCard
card
in
enemy_monsters
)
{
if
(
card
.
IsFaceup
()
&&
!
card
.
IsShouldNotBeTarget
()
&&
!
card
.
IsShouldNotBeSpellTrapTarget
())
{
AI
.
SelectCard
(
card
);
Impermanence_list
.
Add
(
this_seq
);
return
true
;
}
}
}
}
if
((
LastChainCard
==
null
||
LastChainCard
.
Controller
!=
1
||
LastChainCard
.
Location
!=
CardLocation
.
MonsterZone
||
LastChainCard
.
IsDisabled
()
||
LastChainCard
.
IsShouldNotBeTarget
()
||
LastChainCard
.
IsShouldNotBeSpellTrapTarget
()))
return
false
;
// negate monsters
if
(
is_should_not_negate
()
&&
LastChainCard
.
Location
==
CardLocation
.
MonsterZone
)
return
false
;
if
(
Card
.
Location
==
CardLocation
.
SpellZone
)
{
for
(
int
i
=
0
;
i
<
5
;
++
i
)
{
if
(
Bot
.
SpellZone
[
i
]
==
Card
)
{
Impermanence_list
.
Add
(
i
);
break
;
}
}
}
if
(
Card
.
Location
==
CardLocation
.
Hand
)
{
AI
.
SelectPlace
(
SelectSTPlace
(
Card
,
true
));
}
if
(
LastChainCard
!=
null
)
AI
.
SelectCard
(
LastChainCard
);
else
{
List
<
ClientCard
>
enemy_monsters
=
Enemy
.
GetMonsters
();
enemy_monsters
.
Sort
(
CardContainer
.
CompareCardAttack
);
enemy_monsters
.
Reverse
();
foreach
(
ClientCard
card
in
enemy_monsters
)
{
if
(
card
.
IsFaceup
()
&&
!
card
.
IsShouldNotBeTarget
()
&&
!
card
.
IsShouldNotBeSpellTrapTarget
())
{
AI
.
SelectCard
(
card
);
return
true
;
}
}
}
return
true
;
}
public
bool
is_should_not_negate
()
{
ClientCard
last_card
=
Util
.
GetLastChainCard
();
if
(
last_card
!=
null
&&
last_card
.
Controller
==
1
&&
last_card
.
IsCode
(
should_not_negate
))
return
true
;
return
false
;
}
public
bool
SolemnStrike_activate
()
{
if
(!
Should_counter
())
return
false
;
return
(
DefaultSolemnStrike
()
&&
spell_trap_activate
(
true
));
}
public
bool
SolemnJudgment_activate
()
{
return
!
Util
.
IsChainTargetOnly
(
Card
)
&&
!(
Duel
.
Player
==
0
&&
Duel
.
LastChainPlayer
==
-
1
)
&&
DefaultTrap
()
&&
spell_trap_activate
(
true
);
}
public
bool
spell_trap_activate
(
bool
isCounter
=
false
,
ClientCard
target
=
null
)
{
if
(
target
==
null
)
target
=
Card
;
if
(
target
.
Location
!=
CardLocation
.
SpellZone
&&
target
.
Location
!=
CardLocation
.
Hand
)
return
true
;
if
(
target
.
IsSpell
())
{
if
(
Enemy
.
HasInMonstersZone
(
CardId
.
NaturalBeast
,
true
)
&&
!
Bot
.
HasInHandOrHasInMonstersZone
(
CardId
.
GO_SR
)
&&
!
isCounter
&&
!
Bot
.
HasInSpellZone
(
CardId
.
SolemnStrike
))
return
false
;
if
(
Enemy
.
HasInSpellZone
(
CardId
.
ImperialOrder
,
true
)
||
Bot
.
HasInSpellZone
(
CardId
.
ImperialOrder
,
true
))
return
false
;
if
(
Enemy
.
HasInMonstersZone
(
CardId
.
SwordsmanLV7
,
true
)
||
Bot
.
HasInMonstersZone
(
CardId
.
SwordsmanLV7
,
true
))
return
false
;
return
true
;
}
if
(
target
.
IsTrap
())
{
if
(
Enemy
.
HasInSpellZone
(
CardId
.
RoyalDecreel
,
true
)
||
Bot
.
HasInSpellZone
(
CardId
.
RoyalDecreel
,
true
))
return
false
;
return
true
;
}
// how to get here?
return
false
;
}
public
bool
Should_counter
()
{
if
(
Duel
.
CurrentChain
.
Count
<
2
)
return
true
;
ClientCard
self_card
=
Duel
.
CurrentChain
[
Duel
.
CurrentChain
.
Count
-
2
];
if
(
self_card
?.
Controller
!=
0
||
!(
self_card
.
Location
==
CardLocation
.
MonsterZone
||
self_card
.
Location
==
CardLocation
.
SpellZone
))
return
true
;
ClientCard
enemy_card
=
Duel
.
CurrentChain
[
Duel
.
CurrentChain
.
Count
-
1
];
if
(
enemy_card
?.
Controller
!=
1
||
!
enemy_card
.
IsCode
(
normal_counter
))
return
true
;
return
false
;
}
public
int
SelectSTPlace
(
ClientCard
card
=
null
,
bool
avoid_Impermanence
=
false
)
{
List
<
int
>
list
=
new
List
<
int
>();
list
.
Add
(
0
);
list
.
Add
(
1
);
list
.
Add
(
2
);
list
.
Add
(
3
);
list
.
Add
(
4
);
int
n
=
list
.
Count
;
while
(
n
--
>
1
)
{
int
index
=
Program
.
Rand
.
Next
(
n
+
1
);
int
temp
=
list
[
index
];
list
[
index
]
=
list
[
n
];
list
[
n
]
=
temp
;
}
foreach
(
int
seq
in
list
)
{
int
zone
=
(
int
)
System
.
Math
.
Pow
(
2
,
seq
);
if
(
Bot
.
SpellZone
[
seq
]
==
null
)
{
if
(
card
!=
null
&&
card
.
Location
==
CardLocation
.
Hand
&&
avoid_Impermanence
&&
Impermanence_list
.
Contains
(
seq
))
continue
;
return
zone
;
};
}
return
0
;
}
public
override
bool
OnSelectYesNo
(
int
desc
)
{
if
(
desc
==
Util
.
GetStringId
(
CardId
.
Sanctuary
,
0
))
{
wasFieldspellUsedThisTurn
=
true
;
}
if
(
desc
==
Util
.
GetStringId
(
CardId
.
Foxy
,
3
))
{
return
foxyPopEnemySpell
;
}
return
base
.
OnSelectYesNo
(
desc
);
}
public
override
void
OnNewTurn
()
{
FoxyActivatedThisTurn
=
false
;
JackJaguarActivatedThisTurn
=
false
;
wasWolfActivatedThisTurn
=
false
;
wasStallioActivated
=
false
;
falcoUsedReturnST
=
false
;
CombosInHand
=
Bot
.
Hand
.
Select
(
h
=>
h
.
Id
).
Intersect
(
Combo_cards
).
ToList
();
wasFieldspellUsedThisTurn
=
false
;
wasGazelleSummonedThisTurn
=
false
;
base
.
OnNewTurn
();
}
public
override
bool
OnSelectHand
()
{
return
true
;
}
public
bool
SpellSet
()
{
if
(
Card
.
Id
==
CardId
.
Circle
)
{
return
false
;
}
if
(
Duel
.
Phase
==
DuelPhase
.
Main1
&&
Bot
.
HasAttackingMonster
()
&&
Duel
.
Turn
>
1
)
return
false
;
if
(
Card
.
IsCode
(
CardId
.
SolemnStrike
)
&&
Bot
.
LifePoints
<=
1500
)
return
false
;
if
((
Card
.
IsTrap
()
||
Card
.
HasType
(
CardType
.
QuickPlay
)))
{
List
<
int
>
avoid_list
=
new
List
<
int
>();
int
Impermanence_set
=
0
;
for
(
int
i
=
0
;
i
<
5
;
++
i
)
{
if
(
Enemy
.
SpellZone
[
i
]
!=
null
&&
Enemy
.
SpellZone
[
i
].
IsFaceup
()
&&
Bot
.
SpellZone
[
4
-
i
]
==
null
)
{
avoid_list
.
Add
(
4
-
i
);
Impermanence_set
+=
(
int
)
System
.
Math
.
Pow
(
2
,
4
-
i
);
}
}
if
(
Bot
.
HasInHand
(
CardId
.
Impermanence
))
{
if
(
Card
.
IsCode
(
CardId
.
Impermanence
))
{
AI
.
SelectPlace
(
Impermanence_set
);
return
true
;
}
else
{
AI
.
SelectPlace
(
SelectSetPlace
(
avoid_list
));
return
true
;
}
}
else
{
AI
.
SelectPlace
(
SelectSTPlace
());
}
return
true
;
}
return
false
;
}
public
bool
Called_activate
()
{
if
(!
DefaultUniqueTrap
())
return
false
;
if
(
Duel
.
Player
==
1
)
{
ClientCard
target
=
Enemy
.
MonsterZone
.
GetShouldBeDisabledBeforeItUseEffectMonster
();
if
(
target
!=
null
&&
Enemy
.
HasInGraveyard
(
target
.
Id
))
{
AI
.
SelectCard
(
target
.
Id
);
return
true
;
}
}
ClientCard
LastChainCard
=
Util
.
GetLastChainCard
();
if
(
LastChainCard
!=
null
&&
LastChainCard
.
Controller
==
1
&&
(
LastChainCard
.
Location
==
CardLocation
.
Grave
||
LastChainCard
.
Location
==
CardLocation
.
Hand
||
LastChainCard
.
Location
==
CardLocation
.
MonsterZone
||
LastChainCard
.
Location
==
CardLocation
.
Removed
)
&&
!
LastChainCard
.
IsDisabled
()
&&
!
LastChainCard
.
IsShouldNotBeTarget
()
&&
!
LastChainCard
.
IsShouldNotBeSpellTrapTarget
()
&&
Enemy
.
HasInGraveyard
(
LastChainCard
.
Id
))
{
AI
.
SelectCard
(
LastChainCard
.
Id
);
return
true
;
}
if
(
Bot
.
BattlingMonster
!=
null
&&
Enemy
.
BattlingMonster
!=
null
)
{
if
(!
Enemy
.
BattlingMonster
.
IsDisabled
()
&&
Enemy
.
BattlingMonster
.
IsCode
(
_CardId
.
EaterOfMillions
)
&&
Enemy
.
HasInGraveyard
(
_CardId
.
EaterOfMillions
))
{
AI
.
SelectCard
(
Enemy
.
BattlingMonster
.
Id
);
return
true
;
}
}
if
(
Duel
.
Phase
==
DuelPhase
.
BattleStart
&&
Duel
.
Player
==
1
&&
Enemy
.
HasInMonstersZone
(
_CardId
.
NumberS39UtopiaTheLightning
,
true
)
&&
Enemy
.
HasInGraveyard
(
_CardId
.
NumberS39UtopiaTheLightning
))
{
AI
.
SelectCard
(
_CardId
.
NumberS39UtopiaTheLightning
);
return
true
;
}
return
false
;
}
public
bool
Borrelsword_ss
()
{
if
(
Duel
.
Phase
!=
DuelPhase
.
Main1
)
return
false
;
if
(
Duel
.
Turn
==
1
)
return
false
;
List
<
ClientCard
>
material_list
=
new
List
<
ClientCard
>();
List
<
ClientCard
>
bot_monster
=
Bot
.
GetMonsters
();
bot_monster
.
Sort
(
CardContainer
.
CompareCardAttack
);
//bot_monster.Reverse();
int
link_count
=
0
;
foreach
(
ClientCard
card
in
bot_monster
)
{
if
(
card
.
IsFacedown
())
continue
;
if
(!
material_list
.
Contains
(
card
)
&&
card
.
LinkCount
<
3
)
{
material_list
.
Add
(
card
);
link_count
+=
(
card
.
HasType
(
CardType
.
Link
))
?
card
.
LinkCount
:
1
;
}
}
if
(
link_count
>=
4
)
{
if
(
link_count
>
4
&&
material_list
.
Where
(
x
=>
x
.
Id
==
CardId
.
MirageStallio
).
Count
()
>
0
)
{
material_list
.
Remove
(
material_list
.
First
(
x
=>
x
.
Id
==
CardId
.
MirageStallio
));
}
AI
.
SelectMaterials
(
material_list
);
return
true
;
}
return
false
;
}
public
bool
Borrelsword_eff
()
{
if
(
ActivateDescription
==
-
1
)
return
true
;
else
if
((
Duel
.
Phase
>
DuelPhase
.
Main1
&&
Duel
.
Phase
<
DuelPhase
.
Main2
)
||
Util
.
IsChainTarget
(
Card
))
{
List
<
ClientCard
>
enemy_list
=
Enemy
.
GetMonsters
();
enemy_list
.
Sort
(
CardContainer
.
CompareCardAttack
);
enemy_list
.
Reverse
();
foreach
(
ClientCard
card
in
enemy_list
)
{
if
(
card
.
HasPosition
(
CardPosition
.
Attack
)
&&
!
card
.
HasType
(
CardType
.
Link
))
{
AI
.
SelectCard
(
card
);
return
true
;
}
}
List
<
ClientCard
>
bot_list
=
Bot
.
GetMonsters
();
bot_list
.
Sort
(
CardContainer
.
CompareCardAttack
);
//bot_list.Reverse();
foreach
(
ClientCard
card
in
bot_list
)
{
if
(
card
.
HasPosition
(
CardPosition
.
Attack
)
&&
!
card
.
HasType
(
CardType
.
Link
))
{
AI
.
SelectCard
(
card
);
return
true
;
}
}
}
return
false
;
}
public
override
void
OnChainEnd
()
{
if
(!
falcoHitGY
&&
!
falcoUsedReturnST
&&
Bot
.
HasInGraveyard
(
CardId
.
Falco
))
{
falcoHitGY
=
true
;
}
else
if
(!
Bot
.
HasInGraveyard
(
CardId
.
Falco
))
{
falcoHitGY
=
false
;
}
base
.
OnChainEnd
();
}
public
override
int
OnSelectPlace
(
int
cardId
,
int
player
,
CardLocation
location
,
int
available
)
{
if
(
player
==
0
)
{
if
(
location
==
CardLocation
.
MonsterZone
)
{
if
(
Bot
.
GetMonstersInExtraZone
().
Where
(
x
=>
x
.
Id
==
CardId
.
SunlightWolf
).
Count
()
>
1
)
{
for
(
int
i
=
0
;
i
<
7
;
++
i
)
{
if
(
Bot
.
MonsterZone
[
i
]
!=
null
&&
Bot
.
MonsterZone
[
i
].
IsCode
(
CardId
.
SunlightWolf
))
{
int
next_index
=
get_Wolf_linkzone
();
if
(
next_index
!=
-
1
&&
(
available
&
(
int
)(
System
.
Math
.
Pow
(
2
,
next_index
)))
>
0
)
{
return
(
int
)(
System
.
Math
.
Pow
(
2
,
next_index
));
}
}
}
}
}
}
return
base
.
OnSelectPlace
(
cardId
,
player
,
location
,
available
);
}
public
override
CardPosition
OnSelectPosition
(
int
cardId
,
IList
<
CardPosition
>
positions
)
{
if
(
Util
.
IsTurn1OrMain2
()
&&
(
cardId
==
CardId
.
Gazelle
||
cardId
==
CardId
.
Spinny
||
cardId
==
CardId
.
Foxy
))
{
return
CardPosition
.
FaceUpDefence
;
}
return
0
;
}
public
int
SelectSetPlace
(
List
<
int
>
avoid_list
=
null
,
bool
avoid
=
true
)
{
List
<
int
>
list
=
new
List
<
int
>();
list
.
Add
(
5
);
list
.
Add
(
6
);
int
n
=
list
.
Count
;
while
(
n
--
>
1
)
{
int
index
=
Program
.
Rand
.
Next
(
n
+
1
);
int
temp
=
list
[
index
];
list
[
index
]
=
list
[
n
];
list
[
n
]
=
temp
;
}
foreach
(
int
seq
in
list
)
{
int
zone
=
(
int
)
System
.
Math
.
Pow
(
2
,
seq
);
if
(
Bot
.
MonsterZone
[
seq
]
==
null
||
!
avoid
)
{
if
(
avoid
)
{
if
(
avoid_list
!=
null
&&
avoid_list
.
Contains
(
seq
))
continue
;
return
zone
;
}
else
{
if
(
avoid_list
!=
null
&&
avoid_list
.
Contains
(
seq
))
{
return
list
.
First
(
x
=>
x
==
seq
);
}
continue
;
}
};
}
return
0
;
}
public
override
BattlePhaseAction
OnSelectAttackTarget
(
ClientCard
attacker
,
IList
<
ClientCard
>
defenders
)
{
foreach
(
ClientCard
defender
in
defenders
)
{
attacker
.
RealPower
=
attacker
.
Attack
;
defender
.
RealPower
=
defender
.
GetDefensePower
();
if
(
attacker
.
IsCode
(
CardId
.
Borrelsword
)
&&
!
attacker
.
IsDisabled
())
return
AI
.
Attack
(
attacker
,
defender
);
if
(!
OnPreBattleBetween
(
attacker
,
defender
))
continue
;
if
(
attacker
.
RealPower
>
defender
.
RealPower
||
(
attacker
.
RealPower
>
defender
.
RealPower
&&
attacker
.
IsLastAttacker
&&
defender
.
IsAttack
()))
return
AI
.
Attack
(
attacker
,
defender
);
}
if
(
attacker
.
CanDirectAttack
)
return
AI
.
Attack
(
attacker
,
null
);
return
null
;
}
}
}
Game/AI/DefaultExecutor.cs
View file @
7a3fc306
...
...
@@ -261,7 +261,7 @@ namespace WindBot.Game.AI
if
(
Duel
.
Player
==
0
)
selected
=
spells
.
FirstOrDefault
(
card
=>
card
.
IsFacedown
());
if
(
Duel
.
Player
==
1
)
selected
=
spells
.
FirstOrDefault
(
card
=>
card
.
HasType
(
CardType
.
Continuous
)
||
card
.
HasType
(
CardType
.
Equip
));
selected
=
spells
.
FirstOrDefault
(
card
=>
card
.
HasType
(
CardType
.
Continuous
)
||
card
.
HasType
(
CardType
.
Equip
)
||
card
.
HasType
(
CardType
.
Field
)
);
}
if
(
selected
==
null
)
...
...
Game/AI/Enums/Floodgate.cs
View file @
7a3fc306
...
...
@@ -80,6 +80,7 @@
CyberDragonInfinity
=
10443957
,
ImperialCustom
=
9995766
,
InspectorBoarder
=
15397015
,
Mashoudou
=
76375976
Mashoudou
=
76375976
,
EternalSoul
=
48680970
}
}
Game/ClientField.cs
View file @
7a3fc306
...
...
@@ -150,12 +150,12 @@ namespace WindBot.Game
public
List
<
ClientCard
>
GetMonstersInExtraZone
()
{
return
GetMonsters
().
Where
(
(
card
,
i
)
=>
i
>=
5
).
ToList
();
return
GetMonsters
().
Where
(
card
=>
card
.
Sequence
>=
5
).
ToList
();
}
public
List
<
ClientCard
>
GetMonstersInMainZone
()
{
return
GetMonsters
().
Where
(
(
card
,
i
)
=>
i
<
5
).
ToList
();
return
GetMonsters
().
Where
(
card
=>
card
.
Sequence
<
5
).
ToList
();
}
public
ClientCard
GetFieldSpellCard
()
...
...
WindBot.csproj
View file @
7a3fc306
...
...
@@ -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\SalamangreatExecutor.cs"
/>
<Compile
Include=
"Game\AI\Decks\CyberDragonExecutor.cs"
/>
<Compile
Include=
"Game\AI\Decks\DarkMagicianExecutor.cs"
/>
<Compile
Include=
"Game\AI\Decks\OrcustExecutor.cs"
/>
...
...
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