V122.0SE released.
Added more cards to random effects db.
Made logged action lists more readable.
Massively rewritten mulligan code with more control and support for HB format mulligans (may behave different than HB though). See spoiler for more info.
Allow user to set concede board value "concedeonboardvalue=-900" option to the settings.txt
Improved playing around doomsayer.
Improved flame juggler penalty/bonus.
Lower bonus for early threats.
Removed the outdated faeriedragon bonus.
Don't penalize card draw until 8 cards in hand.
Nudge rend blackhand if battlecry conditions are met.
Don't poly/hex after actions that targeted the same thing/aoe/random effects.
Prettier formatting of the spoiler:
https://raw.githubuserco...h/master/ai/Mulligan.cs
SE Style Mulligans
Format:
type;self;enemy;card:[count]:[required cards];[coin];[mana border]
type = "hold" or "discard"
self = a class name like "shaman" or "all" for all classes
enemy = a class name like "shaman" or "all" for all classes
card = a card id like "OG_024" or its English name without any spaces or special characters like "cthunschosen" - search _carddb.txt for the name of your card to find the id
count = up to how many copies of the card to keep or discard (default 2)
required cards = card,[count],[req #][operator][card,[count],[req #]]...
card = another card that must be present
count = how many copies (0-2) of this card to keep/discard (keep default 1, discard default 0)
req # = how many copies (1-2) of this card are required (default 1)
operator = "+" or "/"
"+" = each card joined by "+" is also required ie. card1 AND card2
"/" = separates required cards and groups of cards that are joined by "+" ie. card1 OR card2 OR (card3 AND card4)
coin = "coin" or "nocoin" (default both)
mana border = also hold any cards under/equal cost to this value or discard higher/equal cost cards
Examples:
hold;shaman;all;OG_024:1;coin;2 \\hold 1 copy of OG_024 if you are shaman vs any class with coin and hold any cards that cost 2 or less
hold;shaman;all;OG_024:1:CS2_106,0,0+CS2_222,0,2 \\hold 1 copy of OG_024 if you are shaman vs any class and have 1x CS2_106 and 2x CS2_222 but don't hold any CS2_106 or CS2_222 (other rules may hold them before/after this rule)
hold;shaman;all;OG_024:2:CS2_106,2,2+CS2_222 \\hold up to 2 copies of OG_024 if you are shaman vs any class and have 2x CS2_106 and 1x CS2_222 and hold the 2x CS2_106 and 1x CS2_222
discard;mage;mage;OG_024:2:EX1_019/CS2_106+CS2_222 \\discard up to 2 copies of OG_024 if you are mage vs mage and have EX1_019 (don't discard any EX1_019), or if you have both CS2_106 and CS2_222 (don't discard any CS2_106 or CS2_222)
hold;shaman;all;OG_024:2:OG_024,2,2 \\hold exactly 2x OG_024 if you are shaman vs any class
Priority:
Rules are prioritized in the order they are read with the first being lowest priority and the last being highest.
If your first rule holds a card and your next rule discards it then it will be discarded and vice versa.
If you have a rule that holds 2 copies and then a rule that holds 1 copy, 2 copies will be held.
If hold count=1 then the 2nd copy is discarded, if discard count=1 then the 2nd copy is held.
If any of the "/" requirements (starting with the first set) are matched then the rule is executed using that set of requirements only, thus your most complex requirements should be first if count > 0 for the requirement
Incompatibilities With Old Rules:
type;self;enemy;card,card is no longer supported, write rules for each card instead!
"/" requirements hold 1x of each card from the first valid set of requirements but it used to save 1x from every match
HB Style Mulligans
Format:
card;self;enemy;type:[count];requirements
card = a card id like "OG_024" - search _carddb.txt for the name of your card to find the id
self = a class name like "shaman"
enemy = a class name like "shaman"
type = "Hold" or "Discard"
count = up to how many copies of the card to keep or discard (default 2)
requirements = "/" - no addition rules, or "0-20" - manarule, or card:card:card:... - more cards required
mulltest.txt
Format:
card,card,card[,card];self;enemy;coin
card = a cardid
self = your class name like "mage"
enemy = enemy class name like "mage"
coin = "coin" if you have the coin, anything else = no coin
Examples:
OG_114,EX1_319,EX1_162,EX1_310;warlock;mage;coin
OG_114,EX1_319,EX1_162;warlock;mage;
Explanation:
Create a text file in your Silverfish folder and name it mulltest(.txt) and then put a list of hypothetical cards in it and save.
Then run Silver.exe and it will tell you what cards would be discarded with hints about why.