I have no way to test this, since Dominate only takes 2 players, but here's 3 strategies.
A: Standard Pin, without Quarry
B: Bishop Silver. It's a simple strategy: buy Bishop, buy Silver, trash cards for points.
C: Chapel Saboteur. Yes, that's right, I wrote a strategy built around Saboteur. And, somehow, it beats Big Money 60% of the time, which is enough for me. Basically, Chapel down to a hand of KC/KC/Saboteur/Chapel/Remodel. Saboteur their deck until it has nothing but Coppers and Estates. Then, Remodel the KC's into Provinces and the Chapel into Remodel into Gold into Province, then Remodel Province into Province until the game ends.
Wins ~60% of the time against Big Money. Big Money wins if it can deplete 7 Provinces before getting Saboteured to death, or if it depletes 3 piles(Silver, Duchy, Estate) before Chapel Saboteur can Remodel.
Again, can't test, but it's clear that C always beats A, since the Saboteur breaks the pin early and it never gets established, and B also beats C head to head, since it gets more than 18 points before it gets Saboteured. So, in a game between the three, A never gets the pin and B wins by earning more points than C.
But, A beats B head to head, since it trashes B's entire deck(which is thin to start with) and goes through and trashes Big Money's deck after that, then wins by earning all the points with Goons.
Code:
A: #Ruthlessly executes unsuspecting bots with the KC/Goons/Masquerade pin
{
name: 'GoldPin' # slowed down the QuarryPin so ChapelSaboteur can match it. Could probably give ChapelSaboteur Quarry, but I was worried Bishop Silver wouldn't have time to gain points
author: 'ephesos'
requires: ["Monument", "King's Court", "Masquerade", "Goons"]
gainPriority: (state, my) -> [
"King's Court" if my.countInDeck("King's Court") < 2
"Goons" if my.countInDeck("Goons") == 0
"Masquerade" if my.countInDeck("Masquerade") == 0
"Gold" if my.countInDeck("King's Court") < 2 && my.countInDeck("Quarry") < 4
"Gold" if my.turnsTaken >= 50 #MAKE IT STOP
"Duchy" if my.turnsTaken >= 70
"Estate" if my.turnsTaken >= 90
"Copper" if my.numCardsInDeck() == 6
"Monument" if my.countInPlay("King's Court") == 2 and my.countInPlay("Goons") == 1 and my.countInPlay("Masquerade") == 1 and my.numCardsInDeck() == 4
]
trashPriority: (state, my) -> [
"Curse"
"Estate"
"Copper" if my.countInHand("Goons") == 0 or my.countInHand("Copper") > 1
"Silver" if my.countInDeck("King's Court") == 2 and my.countInDeck('Goons') == 1
#kill anything once the pin starts
"Gold" if my.countInDeck("King's Court") == 2 and my.countInDeck('Goons') == 1
"Province"
"Duchy"
"King's Court" if my.countInDeck("King's Court") > 2 and my.countInDeck('Goons') == 1
"Goons" if my.countInDeck("King's Court") == 2 and my.countInDeck('Goons') > 1
"Masquerade" if my.countInDeck("King's Court") == 2 and my.countInDeck('Goons') == 1 and my.countInDeck("Masquerade") > 1
"Beggar"
"Gardens"
"Quarry" if my.countInDeck("King's Court") == 2 and my.countInDeck("Goons") == 1 and (my.countInHand("Goons") == 0 or my.countInHand("Copper") > 1)
"Mountebank"
]
wantsToRebuild: (state, my) ->
return 0
wantsToJM: (state, my) ->
false
multipliedPriority: (state, my) -> [
"King's Court"
"Masquerade" if my.countInPlay("King's Court") == 1
"Goons"
"Monument"
"Masquerade"
"Chapel"
]
}
B: {
name: 'Bishop Silver'
author: 'ephesos'
requires: ["Bishop"]
gainPriority: (state, my) -> [
"Bishop"
"Silver"
#sometimes it's good to keep things simple
]
}
C:
{
name: 'ChapelSaboteur'
author: 'Ephesos'
requires: ["Chapel", "Saboteur", "King's Court", "Remodel"]
gainPriority: (state, my) -> [
"King's Court" if my.countInDeck("King's Court") < 2 and my.turnsTaken < 45
"Gold" if my.countInDeck("King's Court") < 2
"Remodel" if my.countInDeck("Remodel") < 1
"Chapel" if my.countInDeck("Chapel") < 1 and my.countInDeck("Copper") > 0
"Saboteur" if my.countInDeck("Saboteur") < 1
"Silver" if my.countInDeck("Silver") < 3 and my.countInDeck("Gold") < 1 and my.countInDeck("King's Court") < 2
]
trashPriority: (state, my) -> [
"Estate"
"Copper" if my.countInDeck("Silver") > 1 or my.countInDeck("King's Court") > 1
"Silver" if my.countInDeck("King's Court") > 1
"Gold" if my.countInDeck("King's Court") > 1 and my.countInDeck("Saboteur") > 0
null
]
playPriority: (state, my) -> [
"Remodel" if my.turnsTaken >= 45
"Remodel" if my.countInHand("Estate") == 1
"King's Court"
"Chapel"
"Saboteur"
"Remodel" if my.countInHand("Estate") > 0
"Silver"
"Gold"
"Copper"
null if my.countInHand("Silver") > 0
]
multipliedPriority: (state, my) -> [
"King's Court"
"Saboteur"
"Chapel"
null
]
upgradePriority: (state,my) -> [
["Estate", "Silver"]
["Chapel", "Remodel"] if my.turnsTaken >= 45
["Remodel", "Gold"] if my.turnsTaken >= 46
["Gold", "Province"] if my.turnsTaken >= 47
["King's Court", "Province"] if my.turnsTaken >= 48 #WIN THE GAME
["Province", "Province"] if my.turnsTaken >= 49 #MAKE IT STOP PLEASE
["Copper", "Estate"]
]
}