Page 1 of 1

[confirmed]cascade mechanic + Rakdos, Lord of Riots = bad

PostPosted: 09 May 2016, 06:31
by BAgate
Describe the Bug:
You may cast Rakdos, Lord of Riots via cascade even if opponent has not lost life this turn.

Which card did behave improperly ?
cascade and/or Rakdos, Lord of Riots

Which update are you using?(date,name)Which type(Duel,Gauntlet,Sealed Deck)
Manalink 2016/01/15: Battle For Zendikar v2,duel

What exactly should be the correct behavior/interaction ?
Can't effects take precedence over can effects (101.2).

Are any other cards possibly affected by this bug ?
-

Re: cascade mechanic + Rakdos, Lord of Riots = bad

PostPosted: 09 May 2016, 10:56
by Korath
(Bloodbraid Elf, for handy reminder text in the autocard.)

This is a side effect of the way we implement "can't cast this card" effects for creatures, artifacts, and (only in theory? are there any?) lands. The engine only sends EVENT_CAN_CAST to cards if they're part sorcery, instant, or enchantment (and only to the card itself, see here), so we make the card say it has an effectively-infinite casting cost (100 of each color mana plus 100 generic) instead to make it uncastable.

I've been experimenting in Shandalar with using a flag to indicate a card needs EVENT_CAN_CAST sent to it despite being only a creature (initially for Serra Avenger), but not quite all the places that check it have been rewritten yet, so I think it still uses something analogous to Manalink's infinite_casting_cost() hack in one place.

Two alternate solutions, neither of which I think is scalable in the long term but both of which are better than starting to add individual hacks for each individual card into the backend of cascade and similar effects:
  • Flag these cards as sorceries so they get EVENT_CAN_CAST normally. Make sure all the checks for TYPE_SORCERY go through is_what(), never just a card_data_t::type & TYPE_SORCERY check, like for the flash-as-TYPE_INSTANT hack.
  • Add an EVENT_CANT_BE_PLAYED that gets sent by can_legally_play_iid(), and make each of these cards respond to that in addition to their EVENT_MODIFY_COST handlers. (CANT_BE_PLAYED instead of CAN_BE_PLAYED so that the default return value of 0 is right for everything that doesn't handle the event.)