I got it working. Basically the main problem is the card kept going back & forth with its activation legacy when it was headed to the GY. I added a marker to targets[9] to stop this, but I feel there's a better way. Checking kill_code didn't break the loop. Marking this bug fixed, but maybe someone can improve on the code before I commit:
- Code: Select all
int deadly_designs_legacy(int player, int card, event_t event){
card_instance_t *instance = get_card_instance(player, card);
if( other_leaves_play(player, card, instance->targets[0].player, instance->targets[0].card, event) ){
int illegal = instance->targets[1].player;
instance->number_of_targets = 0;
target_definition_t td;
default_target_definition(player, card, &td, TYPE_CREATURE);
td.allow_cancel = 2; // "Done" button
td.illegal_abilities = illegal > -1 ? illegal : KEYWORD_PROT_BLACK;
pick_up_to_n_targets(&td, "TARGET_CREATURE", 2);
int i;
for(i=0; i<instance->number_of_targets; i++){
if( validate_target(player, card, &td, i) ){
kill_card(instance->targets[i].player, instance->targets[i].card, KILL_DESTROY);
}
}
kill_card(player, card, KILL_EXILE);
}
if( event == EVENT_CLEANUP )
kill_card(player, card, KILL_EXILE);
return 0;
}
int deadly_designs_effect(int player, int card, event_t event){
card_instance_t *instance = get_card_instance(player, card);
if( event == EVENT_STATIC_EFFECTS && affect_me(player, card) && stack_size == 0 ){
if( instance->targets[0].player > -1 ){
if( get_id(instance->targets[0].player, instance->targets[0].card) != CARD_ID_DEADLY_DESIGNS ){
instance->targets[0].player = instance->targets[0].card = -1;
kill_card(player, card, KILL_EXILE);
}
int p, c, found = 0;
for(p=0; p<2; p++){
for(c=0; c <= active_cards_count[p]; c++){
if( in_play(p, c) && p == instance->targets[0].player && c == instance->targets[0].card ){
found = 1;
break;
}
}
}
if( ! found ){
kill_card(player, card, KILL_EXILE);
}
}
}
if( ! IS_GAA_EVENT(event) ){
return 0;
}
int p = instance->targets[0].player;
int c = instance->targets[0].card;
if( event == EVENT_RESOLVE_ACTIVATION )
if( instance->targets[0].player > -1 )
add_counter(p, c, COUNTER_PLOT);
return generic_activated_ability(player, card, event, 0, MANACOST_X(2), 0, NULL, NULL);
}
int card_deadly_designs(int player, int card, event_t event){
/* Deadly Designs |1|B 0x200f09d
* Enchantment
* |2: Put a plot counter on ~. Any player may activate this ability.
* When there are five or more plot counters on ~, sacrifice it. If you do, destroy up to two target creatures. */
card_instance_t *instance = get_card_instance(player, card);
if( event == EVENT_STATIC_EFFECTS && in_play(player, card) && affect_me(player, card) ){
if( ! (is_humiliated(player, card) & AL_TRIG) && count_counters(player, card, COUNTER_PLOT) >= 5 && stack_size == 0 && instance->targets[9].card != 66 ){
if( ! check_special_flags2(player, card, SF2_CANNOT_BE_SACRIFICED) ){
int legacy = create_legacy_effect(player, card, &deadly_designs_legacy);
card_instance_t *leg = get_card_instance(player, legacy);
leg->targets[0].player = player;
leg->targets[0].card = card;
leg->targets[1].player = get_protections_from(player, card);
leg->number_of_targets = 2;
instance->targets[9].card = 66;
kill_card(player, card, KILL_SACRIFICE);
}
}
int p;
int c;
int found = 0;
for(p=0; p<2; p++){
for(c=0; c <= active_cards_count[p]; c++){
if( in_play(p, c) && is_what(p, c, TYPE_EFFECT) ){
card_instance_t *inst = get_card_instance(p, c);
if( inst->info_slot == (int)deadly_designs_effect ){
if( (inst->targets[0].player == player && inst->targets[0].card == card) )
{
if( p == player ){
kill_card(p, c, KILL_EXILE);
}
else{
found = 1;
if( p == 1 ){
break;
}
}
}
}
}
}
}
if( ! found && instance->targets[9].card != 66 ){
int fake = add_card_to_hand(1-player, instance->internal_card_id);
int legacy = create_legacy_activate(1-player, fake, &deadly_designs_effect);
card_instance_t *leg = get_card_instance(1-player, legacy);
leg->targets[0].player = player;
leg->targets[0].card = card;
leg->number_of_targets = 1;
obliterate_card(1-player, fake);
}
}
if( ! IS_GAA_EVENT(event) ){
return global_enchantment(player, card, event);
}
if( event == EVENT_RESOLVE_ACTIVATION ){
add_counter(instance->parent_controller, instance->parent_card, COUNTER_PLOT);
}
return generic_activated_ability(player, card, event, 0, MANACOST_X(2), 0, NULL, NULL);
}
PS. this happens with things like
Ifh-Biff Efreet too, it's just less obvious because it isn't made to leave the BF the way this card is
PPS. I've updated the legacy text too; will commit with the above code