* Use faster stringbuilder for card token formatting instead of full-blown formatter.
* When SN/RN/PN and similar placeholders are expanded, calculate the replacement
value only if the placeholder is present in the string.
In a test with some random games:
55.4M times replaceName was called
39.2M times SN was present
2.0M times PN was present
0.2M times RN was present
0.2M times X was present
* Generate event description on demand, instead on event construction.
In a test with some random games:
71.601M times description is generated
0.258M time it is actually read or used
By postponing generating the description to a point when it is actually needed,
CPU time spent when going through possible actions is reduced to about 80%,
so in given amount of time, MMAB AI and similar
is able to examine larger part of the possible game states.
(mostly log directory, crash logs, etc ...) with default application on a system where this is not supported.
If opening fails, show a messagebox that also shows the file/directory name.
Without this change you would not have known which card is unparseable.
before:
ScriptParseException: unknown ability "Menace"
after:
InvalidDeckException: Error parsing Dimir Spybug: unknown ability "Menace"
* Add several new cards:
Balustrade Spy
Corpse Augur
Galvanoth
Gift of Growth
Living Artifact
Marchesa, the Black Rose
Phytotitan
Pyromancer's Assault
Settle the Score
* Fix indentation in Galvanoth
* Refactor Pyromancer's Assault, remove trigger condition from action text.
* Generalize milling actions to fixed amount milling and "mill until certain number of cartain cards are milled".
* Refactor cards to use new MillLibraryUntilAction
* Add parser for MillLibraryUntilAction, so it can be used without need for groovy.
* Add new parseable cards:
Mind Funeral
Consuming Aberration
Destroy the Evidence
Undercity Informer
(no groovy needed)
* Balustrade Spy now does not need groovy anymore.