Notes to programmers:
1. This feature uses an awful lot of copy-pasta, using "protetcion from()" as a base. While I'm learning the architecture, it's easier for me to have a dedicated single-purpose piece of code to work with, than trying to create multi-purpose code. I'm aware that this isn't a very elegant approach though, and I hope to be able to refactor additions like this into multi-purpose code once I have a better understanding of the architecture as a whole.
2. Please check the questions I'll add in my next code comments, specifically about AI integration and activated abilities / instants / sorceries.
3. I did have a crash (with the debugger complaining about stack corruption around the cd variable) during testing. I wasn't able to reproduce it though. I did have to clean the solution in-between when I updated to the primitives system, so perhaps there was this cleaning solved whatever corruption was in my files. I'm mentioning the issue in case someone has an idea on where my code might be risky (I'm still probne to making beginners mistakes).
Thanks to TheDark for the bug report on Urza's lands.
Note that the lands still don't work entirely correct, they give you the option to tap them for one mana even when they shouldn't anymore. This can be fixed when aslongas(cards) <1 is working.
Limitations:
- Operators for "greater than", "less than", "unequal" have not been implemented, but if a card actually needs them, you can use a preceding minus sign to negate a comparison. Example: -power=3 means "power not equal to 3", -toughness<=3 means "toughness>3".
- You can't use spaces when specifying such restrictions. Write "power<=3" instead of "power <= 3"
- You now need to use a space before the "<" and ">" commands that count the matches for lord(), foreach(), all() and aslongas(). So far we always did use spaces in front of them without actually needing to, now we need to.
- manacost restrictions don't take "X" costs into account. Example: Mistmeadow Skulkin (FUT) has protection from manacost>=3. Blaze has a converted manacost of 1, but when you cast it with an X of 2, then it actually has a converted manacost of 3 while on the stack, and Mistmeadow Skulkin would be protected from it, but currently it isn't.
Please review the code, I'll add a few remarks/questions of my own.
Now: auto=@movedTo(this|graveyard,library,hand,exile) from(battlefield) ...
Alternatives:
auto=@movedFrom(this|battlefield) ...
auto=@movedTo(this|*) from(battlefield) ...
auto=@movedTo(this|-battlefield) from(battlefield) ...
Suggestions? How many cards would benefit from such an addition?
-fix issue 161 (brass man can untap outside of upkeep). Use "myUpkeepOnly" keyword. Other keywords such as "myDrawOnly" of course work. Haven't implemented "opponent" yet, is it needed ?
- fix issue 168 (kudzu)
- Fix issue 162 (copy VS shroud). This fix introduces a new keyword: NotATarget() instead of Target(). (Which was the best way for me to keep some kind of backward compatibility/ not alter the code too much / fix the bug)
- fixed divergent growth (issue 243). Unfortunately the underlying issue is quite complex, and Wagic doesn't handle it very well. Basically, all "until end of turn" effects run the risk of being partially deleted before the end of the turn, leading to segfaults or memory leaks. This is because some abilities' "clone" method doesn't actually clone them entirely... The fix for divergent growth is a hack that works only for lords+mana producer combination, but I need a more "generic fix" in the long run...
- fix a memory leak with "Prevent All combat damages" ability
- Fix issue 242 (Equip can be used outside of the main phases)
- introducing "attach" keyword. Same as equip but can be used anytime. Untested
- introducing "asSorcery" keyword. Can be used the same way as "myTurnOnly" on activated abilities to restrict their usage. Untested. Other similar keywords will follow, please let me know which ones would be useful
- added Warren Instigator (ZEN) and test script. Thanks to Niegen for finding it.
- temporarily removed angry_mob6.txt from the test suite and added it to the "bugs" section, since the script occasionally fails and we haven't found the reason yet. See issue 240.
- added test script for Fog Bank
- added recently uploaded equipment scripts to test suite (not sure why the weren't added upon uploading them, looks like an oversight)
- fixed another bug in recently uploaded MRD file, it contained Vulshok Morningstar (a DST card with a wrong 9ED id and was inserted at the wrong position in the alphabetical order).
- Adding cycling. Check Akroma's vengeance in ONS for an example. Note that this uses autohand instead of auto, this is important! You can also use autograveyard.
- All "auto" activated abilities should work with autohand, so this is not only for cycling, but could be used for other abilities as well. For example autohand={3}:cycling can also be written autohand={3}{S}:Draw:1
- Adding equipments. They work like auras, except you have to add an "auto={cost}:equip" line. See Behemoth sledge in ARB for an example. Please test a lot before committing, thanks :)
Additions:
- Added Avarice Totem. Code works, but uses a trick to circumvent a parser limitation. Feedback welcome.
- Added Fangren Pathcutter. Code works, but will fail if Fangren Pathcutter gets removed during the combatattackers phase (currently unlikely though). Feedback welcome.
- Added Goblin Cannon (spectacularly useless card, but codeable)
- Added Silent Arbiter (code works pretty well imho)
- Added Skullcage (doesn't work correctly yet due to bug; issue will be opened shortly)
- Added Thought Courier (has wrong sequence of actions, but is acceptable imho)
Bugfixes:
- Arachnoid didn't have Reach
- Battered Golem was missing a "may"
- softcoded Beacon of Creation
- Beacon of Destruction was missing an alias
- Beacon of Immortality was missing an alias
- Cackling Imp couldn't use its ability
- removed Crucible of Worlds (didn't work on several accounts)
- Krark-Clan Ironworks had an incorrect {T} cost
- Krark-Clan Ogre had an incorrect cost
- Screaming Fury was missing a target
- Skyhunter Skirmisher had double strike spelled wrong
Other:
- experimented with several more cards but couldn't implement them correctly, check the comments in todo.dat for details.
Question: I also tried to code Root Sliver (LGN) with the line "auto=lord(sliver|stack) nofizzle", but this didn't work, Slivers could still be countered. Did I choose a wrong approach, or is there a limitation of the lord ability with regard to spells on thee stack?