implement Orcish Farmer

This commit is contained in:
Steven Knipe 2025-10-31 22:38:42 -07:00 committed by xenohedron
parent 066fb6dd46
commit d785193b97
6 changed files with 110 additions and 0 deletions

View file

@ -0,0 +1,78 @@
package mage.cards.o;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.PhaseStep;
import mage.constants.SubType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetLandPermanent;
import java.util.UUID;
/**
* @author notgreat
*/
public final class OrcishFarmer extends CardImpl {
public OrcishFarmer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}");
this.subtype.add(SubType.ORC);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// {T}: Target land becomes a Swamp until its controller's next untap step.
Ability ability = new SimpleActivatedAbility(new OrcishFarmerEffect(), new TapSourceCost());
ability.addTarget(new TargetLandPermanent());
this.addAbility(ability);
}
private OrcishFarmer(final OrcishFarmer card) {
super(card);
}
@Override
public OrcishFarmer copy() {
return new OrcishFarmer(this);
}
}
class OrcishFarmerEffect extends BecomesBasicLandTargetEffect {
OrcishFarmerEffect() {
super(Duration.Custom, SubType.SWAMP);
setText("Target land becomes a Swamp until its controller's next untap step");
}
protected OrcishFarmerEffect(final OrcishFarmerEffect effect) {
super(effect);
}
public OrcishFarmerEffect copy() {
return new OrcishFarmerEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent p = game.getPermanent(getTargetPointer().getFirst(game, source));
if (p == null) {
discard();
return false;
}
if (getEffectStartingOnTurn() != game.getTurnNum()
&& game.isActivePlayer(p.getControllerId())
&& game.getStep().getType() == PhaseStep.UNTAP) {
discard();
return false;
}
return super.apply(game, source);
}
}

View file

@ -317,6 +317,7 @@ public final class FifthEdition extends ExpansionSet {
cards.add(new SetCardInfo("Obelisk of Undoing", 392, Rarity.RARE, mage.cards.o.ObeliskOfUndoing.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Artillery", 253, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Captain", 254, Rarity.UNCOMMON, mage.cards.o.OrcishCaptain.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Farmer", 256, Rarity.COMMON, mage.cards.o.OrcishFarmer.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Oriflamme", 257, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Squatters", 258, Rarity.RARE, mage.cards.o.OrcishSquatters.class, RETRO_ART));
cards.add(new SetCardInfo("Order of the Sacred Torch", 48, Rarity.RARE, mage.cards.o.OrderOfTheSacredTorch.class, RETRO_ART));

View file

@ -264,6 +264,7 @@ public final class IceAge extends ExpansionSet {
cards.add(new SetCardInfo("Oath of Lim-Dul", 156, Rarity.RARE, mage.cards.o.OathOfLimDul.class, RETRO_ART));
cards.add(new SetCardInfo("Onyx Talisman", 331, Rarity.UNCOMMON, mage.cards.o.OnyxTalisman.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Cannoneers", 205, Rarity.UNCOMMON, mage.cards.o.OrcishCannoneers.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Farmer", 207, Rarity.COMMON, mage.cards.o.OrcishFarmer.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Healer", 208, Rarity.UNCOMMON, mage.cards.o.OrcishHealer.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Librarian", 209, Rarity.RARE, mage.cards.o.OrcishLibrarian.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Lumberjack", 210, Rarity.COMMON, mage.cards.o.OrcishLumberjack.class, RETRO_ART));

View file

@ -177,6 +177,7 @@ public final class MastersEditionII extends ExpansionSet {
cards.add(new SetCardInfo("Orc General", 137, Rarity.UNCOMMON, mage.cards.o.OrcGeneral.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Cannoneers", 138, Rarity.UNCOMMON, mage.cards.o.OrcishCannoneers.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Captain", 139, Rarity.UNCOMMON, mage.cards.o.OrcishCaptain.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Farmer", 141, Rarity.COMMON, mage.cards.o.OrcishFarmer.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Lumberjack", 142, Rarity.COMMON, mage.cards.o.OrcishLumberjack.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Squatters", 143, Rarity.RARE, mage.cards.o.OrcishSquatters.class, RETRO_ART));
cards.add(new SetCardInfo("Orcish Veteran", 144, Rarity.COMMON, mage.cards.o.OrcishVeteran.class, RETRO_ART));

View file

@ -266,4 +266,29 @@ public class LandTypeChangingEffectsTest extends CardTestPlayerBase {
assertType(urborgtoy, CardType.LAND, SubType.ISLAND);
assertType("Mountain", CardType.LAND, SubType.ISLAND);
}
@Test
public void testOrcishFarmer() {
// {T}: Target land becomes a Swamp until its controller's next untap step
addCard(Zone.BATTLEFIELD, playerA, "Orcish Farmer", 2);
addCard(Zone.BATTLEFIELD, playerA, "Plains");
addCard(Zone.BATTLEFIELD, playerB, "Reliquary Tower");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Target", "Plains");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Target", "Reliquary Tower");
checkSubType("Plains is Swamp on same turn", 1, PhaseStep.END_TURN, playerA, "Plains", SubType.SWAMP, true);
checkSubType("Plains is no longer Plains on same turn", 1, PhaseStep.END_TURN, playerA, "Plains", SubType.PLAINS, false);
checkSubType("Reliquary Tower is Swamp on same turn", 1, PhaseStep.END_TURN, playerB, "Reliquary Tower", SubType.SWAMP, true);
checkSubType("Plains is Swamp on next turn", 2, PhaseStep.UPKEEP, playerA, "Plains", SubType.SWAMP, true);
checkSubType("Plains is no longer Plains on next turn", 2, PhaseStep.UPKEEP, playerA, "Plains", SubType.PLAINS, false);
checkSubType("Reliquary Tower no longer Swamp on next turn", 2, PhaseStep.UPKEEP, playerB, "Reliquary Tower", SubType.SWAMP, false);
setStrictChooseMode(true);
setStopAt(3, PhaseStep.UPKEEP);
execute();
assertNotSubtype("Plains", SubType.SWAMP);
assertSubtype("Plains", SubType.PLAINS);
}
}

View file

@ -248,6 +248,10 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu
return startingControllerId;
}
protected int getEffectStartingOnTurn() {
return effectStartingOnTurn;
}
@Override
public void setStartingControllerAndTurnNum(Game game, UUID startingController, UUID activePlayerId) {
this.startingControllerId = startingController;