Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[40K] Implement The Red Terror #12647

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 93 additions & 0 deletions Mage.Sets/src/mage/cards/t/TheRedTerror.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package mage.cards.t;

import mage.MageInt;
import mage.MageObject;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.DamagedBatchAllEvent;
import mage.game.events.DamagedEvent;
import mage.game.events.GameEvent;

import java.util.UUID;

/**
* @author Sidorovich77
*/
public final class TheRedTerror extends CardImpl {


public TheRedTerror(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");

this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.TYRANID);
this.power = new MageInt(4);
this.toughness = new MageInt(3);

// Whenever a red source you control deals damage to one or more permanents and/or players, put a +1/+1 counter on The Red Terror.
this.addAbility(new TheRedTerrorTriggeredAbility().withFlavorWord("Advanced Species"));

}

private TheRedTerror(final TheRedTerror card) {
super(card);
}

@Override
public TheRedTerror copy() {
return new TheRedTerror(this);
}
}

class TheRedTerrorTriggeredAbility extends TriggeredAbilityImpl {

TheRedTerrorTriggeredAbility() {
super(Zone.BATTLEFIELD, new AddCountersSourceEffect(
CounterType.P1P1.createInstance(1), false
).setText("put a +1/+1 counter on {this}"));
setTriggerPhrase("Whenever a red source you control deals damage to one or more permanents and/or players, ");
}

private TheRedTerrorTriggeredAbility(final TheRedTerrorTriggeredAbility ability) {
super(ability);
}

@Override
public TheRedTerrorTriggeredAbility copy() {
return new TheRedTerrorTriggeredAbility(this);
}

@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_ALL;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oof, this is subtly bugged and needs its own batch event, that's a larger scope

example: multiple red sources you control simultaneously deal damage, should be a trigger for each, but they're all combined here

Copy link
Contributor Author

@Sidorovich77 Sidorovich77 Aug 13, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean it's possible to use existing events like DAMAGED_BATCH_FOR_PERMANENTS, DAMAGED_BATCH_FOR_PLAYERS? Maybe use them simultaneously? And if so, should I make a checkTrigger for each of them separately?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I mean that a new batch event needs to be added to the engine, one that batches on source instead of target

}

public boolean checkTrigger(GameEvent event, Game game) {
DamagedBatchAllEvent batchAllEvent = (DamagedBatchAllEvent) event;
for (DamagedEvent batchAllEvent1 : batchAllEvent.getEvents()) {
int damage = ((DamagedBatchAllEvent) event)
.getEvents()
.stream()
.filter(damagedEvent -> isControlledBy(game.getControllerId(damagedEvent.getAttackerId())))
.mapToInt(GameEvent::getAmount)
.sum();
if (damage < 1) {
return false;
}

MageObject sourceObject = game.getObject(batchAllEvent1.getSourceId());
if (sourceObject != null && sourceObject.getColor(game).isRed()) {
return true;
}
}
return false;
}
}
1 change: 1 addition & 0 deletions Mage.Sets/src/mage/sets/Warhammer40000.java
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ private Warhammer40000() {
cards.add(new SetCardInfo("The Golden Throne", 157, Rarity.RARE, mage.cards.t.TheGoldenThrone.class));
cards.add(new SetCardInfo("The Horus Heresy", 126, Rarity.RARE, mage.cards.t.TheHorusHeresy.class));
cards.add(new SetCardInfo("The Lost and the Damned", 129, Rarity.UNCOMMON, mage.cards.t.TheLostAndTheDamned.class));
cards.add(new SetCardInfo("The Red Terror", 83, Rarity.RARE, mage.cards.t.TheRedTerror.class));
cards.add(new SetCardInfo("The Swarmlord", 4, Rarity.MYTHIC, mage.cards.t.TheSwarmlord.class));
cards.add(new SetCardInfo("The War in Heaven", 69, Rarity.RARE, mage.cards.t.TheWarInHeaven.class));
cards.add(new SetCardInfo("Their Name Is Death", 62, Rarity.RARE, mage.cards.t.TheirNameIsDeath.class));
Expand Down