The most-pressing criticism of the first By-election prototype was the relative imbalance of the cards. To recap - players complete campaigns to earn votes. The amount earned can be modified upwards or downwards. Votes can also be stolen from what’s earned by another player, or you can steal additional votes from an opponent. The ‘base values’ of the campaigns, i.e the unmodified vote values, were too high. Mathematically this meant that playing a card on an opponent, even if it caused them to lose some votes, or you to steal some, gave a larger advantage to the opponent, because they’d still be banking a ton of votes.

I decided that I needed something to help me to work out the balance of the game, so I wrote a simple script. This C# code takes in a series of suits of cards. For each suit it generates all permutations of cards and calculates:

  • How many votes are earned by completing a campaign (min, max, average)
  • How many votes are stolen by another player (min, max, average)
  • How many votes are stolen from another player (min, max, average)

Running the script yielded some fairly startling results, confirming the feedback from the playtesters

----
Public Hearing (base value: 25)

36 permutations, 0 are negative, 36 are positive
Votes won: min = 17, average = 25, max = 35
Stolen by others: min = 0, average = 1, max = 6
Stolen from others: min = 0, average = 2, max = 8

----
Door to door (base value: 20)

36 permutations, 0 are negative, 36 are positive
Votes won: min = 12, average = 20, max = 30
Stolen by others: min = 0, average = 2, max = 8
Stolen from others: min = 0, average = 1, max = 8

----
Interview (base value: 15)

36 permutations, 0 are negative, 36 are positive
Votes won: min = 8, average = 14, max = 23
Stolen by others: min = 0, average = 1, max = 5
Stolen from others: min = 0, average = 0, max = 3

----
Hustings (base value: 20)

36 permutations, 0 are negative, 36 are positive
Votes won: min = 12, average = 20, max = 30
Stolen by others: min = 0, average = 2, max = 7
Stolen from others: min = 0, average = 1, max = 8

The tl;dr is that on average, you’ll get the base value of a campaign, plus or minus a few votes. Stealing has little impact, as do votewinners. The “interview” suit is the most broken, as it doesn’t produce as many votes as the other suits and there’s less chance of being stolen from.

As I decided to allow the number of votes earned from a campaign to be negative, I should now be able to use this tool to very quickly be able to balance each deck in favour of that. Initially I’m looking for a setup that has the ability to score negatively (but not massively so), but also has the ability to score highly on the rare occasion. On average I’m aiming for the average campaign to be completed earning a number of votes slightly lower than the campaign base value.

Achieving a decent balance will allow me to tweak in certain directions. For example, i may want a campaign suit that produces a high amount of votes, but has a high chance of some of those being stolen. Alternatively, a low-vote campaign might be relatively safe, in that it can’t be hindered too much.

This is going to need quite a bit of head-scratching, but hopefully I can come up with a decent set of cards for the second prototype. Now that I have this tool I can iterate faster, running simulations rather than printing cards.