Prototype is a SpellAbilityType, for which alternate costs are permitted. It has a continuous effect that applies on the battlefield as well as a method to modify the spell on the stack. Permanents have an isPrototyped flag that copy effects can check explicitly (same brittle method as transformed permanents use; reworking copy effects to streamline them is a separate scope).
Many test cases have been added to confirm functionality (thanks to Zerris for additional test suggestions).
---------
Co-authored-by: Susucre <34709007+Susucre@users.noreply.github.com>
Co-authored-by: Evan Kranzler <theelk801@gmail.com>
Co-authored-by: xenohedron <xenohedron@users.noreply.github.com>
* adjust ExileThenReturnTargetEffect
* initial rework ExileReturnBattlefieldNextEndStepTargetEffect
(test coverage provided by CloudshiftTest)
* refactor some more cards
* refactor more straightforward cards
* add params and more refactoring
* text fixes
* maintain order in set
* fix Lae'zel's Acrobatics and add test
* Rework AsThoughEffect
* some cleanup of MageIdentifer
* refactor ActivationStatus
* fix bolas's citadel
* fix a couple of the Alternative Cost being applied too broadly.
* fix Risen Executioneer
* allow cancellation of AsThough choice.
* fix One with the Multiverse
* cleanup cards needing their own MageIdentifier
* last couple of fixes
* apply reviews for cleaner code.
* some more cleanup
1a. Make `costs`, `manaCosts`, and `manaCostsToPay` private in `AbilityImpl` with access through getters/setters
1b. fix cost adjuster for imprinted cards affected by the above
2a. Lazy instantiation for rarely used `data` field in `TargetPointerImpl`
3a. Pre-allocate certain array sizes in `Modes` and `CostsImpl`
4a. Make `manaTemplate` private in `BasicManaEffect`, copy when passing outside the class
4b. Don't copy `manaTemplate` in copy constructor since it doesn't change
4c. Add comments explaining copy usage for `manaTemplate`
4d. Remove redundant variable assignment and make fields final
---------
Co-authored-by: xenohedron <xenohedron@users.noreply.github.com>
* apply regex to change public copy constructors to protected
* cleanup code using now protected constructors
* fix manaBuilder weird casting of Mana into ConditionalMana
- fixed miss phase changed events and logs in some use cases;
- added source info in turn modification logs;
- added game logs for take and lost control of the spell (example: Word of Command)
- added game logs for skip step;
- added game logs for extra step;
- added game logs for skip phase;
* Added Goldberry
* Slight optimizaztion
* Happy Path Test
* More unhappy tests
* Sanity check for Goldberry's counter choices
* Updated player.getMultiAmount to support individual constraints
* Some cleanup
Also modified ResourcefulDefense to use new multi amount api
* Updated logging
* Added hint for number of counters
* Fixed issue with Resourceful Defense
* Improvements to defaults
Default list will properly make sure to stay within individual maximums
If a player is asked for a choice that isn't actually a choice because each choice's min and max are equal, instead the default response is immediately returned. This helps with situations like moving a counter off of Goldberry when she only has one counter on her.
* -1/-1 Counter test
* Fixed issue with -1/-1 counters
* Adjusted dialog to properly enforce constraints
* Added Storm of Saruman card
Some classes have been added/adjusted for code reusability:
- CastSecondSpellTriggeredAbility has been modified to set a target pointer to either the caster or the spell (used here to set a target pointer to the spell for the copy effect)
- CopyTargetSpellEffect has been modified to allow specifying a copy applier (used here to apply the legenedary-stripping effect)
- RemoveTypeCopyApplier has been added as a generic copy applier for any cards which read "except it isn't <type>"
* Fixed verify failure - Remove ward hint on Storm of Saruman
* Fixed a typo - ammount -> amount
* Modified Double Major to use new CopyTargetSpellEffect
* Re-added ability text for Double Major
- fixed that copy effect doesn't restore original image after effect's end;
- removed outdated availableImageSetCodes (all images auto-selected from tokens database now, related to #10139);
- refactor command objects to use CommandObjectImpl;
- refactor planes/emblems/etc objects to use MageObjectImpl, added copyable support;
- refactor another game objects to remove some duplicated fields;
- added tokens support in test render dialog;
- improved PT drawing;
- fixed broken second side switch button (related to #10231);
- fixed miss override in TokenImpl (all override with backFace must be removed, see todo);
* Make automatic deck submissions use sensible land suggestions
* Cover edge case of no colored mana symbols among cards in deck
* Add comments
* Get minimum deck size from deck validator
- added reminder / helper tokens support (example: Copy, Morph, Day // Night, related to #10139);
- added verify checks for reminder tokens;
- added images download for reminder tokens;
* remove incubate skip
* initial implementation of DFC tokens
* separate incubator back face to separate class
* small refactor to token copy function
* token copies now have back faces as well
* effects which modify token copies now correctly apply to both faces
* add skip for exception
* tokens now enter transformed correctly
* [MOC] remove skip for incubate
* fix verify failure
* add types and subtypes
* add startingDefense attribute
* [MOM] Implement Invasion of Ravnica / Guildpact Paragon
* fix two small errors
* refactor various instances of "any target"
* fully implement defense counters
* battles can now be attacked
* [MOM] Implement Invasion of Dominaria / Serra Faithkeeper
* [MOM] Implement Invasion of Innistrad / Deluge of the Dead
* [MOM] Implement Invasion of Kaladesh / Aetherwing, Golden-Scale Flagship
* [MOM] Implement Invasion of Kamigawa / Rooftop Saboteurs
* [MOM] Implement Invasion of Karsus / Refraction Elemental
* [MOM] Implement Invasion of Tolvada / The Broken Sky
* simplify battle info ability
* fix verify failure
* some more fixes for attacking battles
* [MOM] Implement Invasion of Kaldheim / Pyre of the World Tree
* [MOM] Implement Invasion of Lorwyn / Winnowing Forces
* [MOM] Implement Invasion of Moag / Bloomwielder Dryads
* [MOM] Implement Invasion of Shandalar / Leyline Surge
* [MOM] Implement Invasion of Belenon / Belenon War Anthem
* [MOM] Implement Invasion of Pyrulea / Gargantuan Slabhorn
* [MOM] Implement Invasion of Vryn / Overloaded Mage-Ring
* [MOM] Implement Marshal of Zhalfir
* [MOM] Implement Sunfall
* implement protectors for sieges
* partially implement siege defeated trigger
* fix verify failure
* some updates to blocking
* [MOM] Implement Invasion of Mercadia / Kyren Flamewright
* [MOM] Implement Invasion of Theros / Ephara, Ever-Sheltering
* [MOM] Implement Invasion of Ulgrotha / Grandmother Ravi Sengir
* [MOM] Implement Invasion of Xerex / Vertex Paladin
* add initial battle test
* fix verify failure
* [MOM] Implement Invasion of Amonkhet / Lazotep Convert
* [MOM] update spoiler
* update how protectors are chosen
* update text
* battles can't block
* add control change test
* rename battle test for duel
* add multiplayer test
* [MOM] Implement Invasion of Alara / Awaken the Maelstrom
* [MOM] Implement Invasion of Eldraine
* [MOM] Implement Invasion of Ergamon / Truga Cliffhanger
* [MOM] Implement Invasion of Ixalan / Belligerent Regisaur
* battles now cast transformed (this is super hacky but we need to refactor TDFCs anyway)
* add TODO
* add ignore for randomly failing test
* a few small fixes
* add defense to MtgJsonCard (unused like loyalty)
* implement ProtectorIdPredicate
* small fixes
- removed outdated code;
- updated logic to choose a set code for a tokens in different use cases (related to #10150);
- added many tests for client and server token's data (related to #10139);
- prepare for tokens database (related #6955);