*Converted Commander rules to an effect. (Fixes being unable to cast an Akroma, Angel of Fury commander face down)

This commit is contained in:
Hellfish
2013-09-16 06:14:46 +00:00
parent 727920679c
commit eee4322173
5 changed files with 54 additions and 15 deletions

View File

@@ -1880,16 +1880,11 @@ public class Card extends GameEntity implements Comparable<Card> {
} }
if(this.isCommander) if(this.isCommander)
{ {
sb.append(this.getOwner().getName() + "'s Commander\r\n"); sb.append(getOwner() + "'s Commander\r\n\r\n");
for(Player p : getOwner().getGame().getPlayers()) { }
if(p.equals(getOwner())) if(this.getName().equals("Commander effect"))
continue; {
sb.append(CardFactoryUtil.getCommanderInfo(getOwner()));
Map<Card,Integer> map = p.getCommanderDamage();
if(map.containsKey(this)) {
sb.append("Damage to " + p.getName() + ": "+ map.get(this) + "\r\n");
}
}
} }
sb.append(this.getAbilityText()); sb.append(this.getAbilityText());

View File

@@ -141,6 +141,7 @@ public class CardFactory {
out.addImprinted(o); out.addImprinted(o);
} }
out.setCommander(in.isCommander()); out.setCommander(in.isCommander());
/*
if(out.isCommander()) if(out.isCommander())
{ {
out.addStaticAbility("Mode$ RaiseCost | Amount$ CommanderCostRaise | Type$ Spell | ValidCard$ Card.Self+wasCastFromCommand | EffectZone$ All | AffectedZone$ Stack"); out.addStaticAbility("Mode$ RaiseCost | Amount$ CommanderCostRaise | Type$ Spell | ValidCard$ Card.Self+wasCastFromCommand | EffectZone$ All | AffectedZone$ Stack");
@@ -150,7 +151,7 @@ public class CardFactory {
out.addSpellAbility(sa); out.addSpellAbility(sa);
} }
*/
return out; return out;
} }

View File

@@ -2040,7 +2040,7 @@ public class CardFactoryUtil {
card.addSpellAbility(AbilityFactory.getAbility(rawAbility, card)); card.addSpellAbility(AbilityFactory.getAbility(rawAbility, card));
} }
} }
/*
public static final void addCommanderAbilities(final Card cmd) { public static final void addCommanderAbilities(final Card cmd) {
ReplacementEffect re = ReplacementHandler.parseReplacement( ReplacementEffect re = ReplacementHandler.parseReplacement(
"Event$ Moved | Destination$ Graveyard,Exile | ValidCard$ Card.Self | Secondary$ True | Optional$ True | OptionalDecider$ You | ReplaceWith$ CommanderMoveReplacement | " + "Event$ Moved | Destination$ Graveyard,Exile | ValidCard$ Card.Self | Secondary$ True | Optional$ True | OptionalDecider$ You | ReplaceWith$ CommanderMoveReplacement | " +
@@ -2059,6 +2059,21 @@ public class CardFactoryUtil {
cmd.addIntrinsicAbility("SP$ PermanentCreature | SorcerySpeed$ True | ActivationZone$ Command | SubAbility$ DBCommanderIncCast | Cost$ " + cmdManaCost); cmd.addIntrinsicAbility("SP$ PermanentCreature | SorcerySpeed$ True | ActivationZone$ Command | SubAbility$ DBCommanderIncCast | Cost$ " + cmdManaCost);
cmd.addStaticAbility("Mode$ RaiseCost | Amount$ CommanderCostRaise | Type$ Spell | ValidCard$ Card.Self+wasCastFromCommand | EffectZone$ All | AffectedZone$ Stack"); cmd.addStaticAbility("Mode$ RaiseCost | Amount$ CommanderCostRaise | Type$ Spell | ValidCard$ Card.Self+wasCastFromCommand | EffectZone$ All | AffectedZone$ Stack");
} }
*/
public static final String getCommanderInfo(final Player originPlayer ) {
StringBuilder sb = new StringBuilder();
for(Player p : originPlayer.getGame().getPlayers()) {
if(p.equals(originPlayer))
continue;
Map<Card,Integer> map = p.getCommanderDamage();
if(map.containsKey(originPlayer.getCommander())) {
sb.append("Commander Damage to " + p.getName() + ": "+ map.get(originPlayer.getCommander()) + "\r\n");
}
}
return sb.toString();
}
/** /**
* <p> * <p>

View File

@@ -19,8 +19,11 @@ import forge.Card;
import forge.CardLists; import forge.CardLists;
import forge.CardPredicates; import forge.CardPredicates;
import forge.GameLogEntryType; import forge.GameLogEntryType;
import forge.ImageCache;
import forge.card.CardDb; import forge.card.CardDb;
import forge.card.cardfactory.CardFactoryUtil; import forge.card.cardfactory.CardFactoryUtil;
import forge.card.replacement.ReplacementEffect;
import forge.card.replacement.ReplacementHandler;
import forge.card.trigger.Trigger; import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerHandler;
import forge.deck.CardPool; import forge.deck.CardPool;
@@ -101,7 +104,26 @@ public class GameNew {
com.add(cmd); com.add(cmd);
player.setCommander(cmd); player.setCommander(cmd);
CardFactoryUtil.addCommanderAbilities(cmd); final Card eff = new Card(player.getGame().nextCardId());
eff.setName("Commander effect");
eff.addType("Effect");
eff.setToken(true);
eff.setOwner(player);
eff.setColor(cmd.getColor());
eff.setImmutable(true);
eff.setSVar("CommanderMoveReplacement", "DB$ ChangeZone | Origin$ Battlefield,Graveyard,Exile,Library | Destination$ Command | Defined$ ReplacedCard");
eff.setSVar("DBCommanderIncCast","DB$ StoreSVar | SVar$ CommanderCostRaise | Type$ CountSVar | Expression$ CommanderCostRaise/Plus.2");
eff.setSVar("CommanderCostRaise","Number$0");
Trigger t = TriggerHandler.parseTrigger("Mode$ SpellCast | Static$ True | ValidCard$ Card.YouOwn+IsCommander+wasCastFromCommand | Execute$ DBCommanderIncCast", eff, true);
eff.addTrigger(t);
ReplacementEffect r = ReplacementHandler.parseReplacement("Event$ Moved | Destination$ Graveyard,Exile | ValidCard$ Card.IsCommander+YouOwn | Secondary$ True | Optional$ True | OptionalDecider$ You | ReplaceWith$ CommanderMoveReplacement | Description$ If a commander would be put into its owner's graveyard or exile from anywhere, that player may put it into the command zone instead.", eff, true);
eff.addReplacementEffect(r);
eff.addStaticAbility("Mode$ Continuous | EffectZone$ Command | AddKeyword$ May be played | Affected$ Card.YouOwn+IsCommander | AffectedZone$ Command");
eff.addStaticAbility("Mode$ RaiseCost | EffectZone$ Command | Amount$ CommanderCostRaise | Type$ Spell | ValidCard$ Card.YouOwn+IsCommander+wasCastFromCommand | EffectZone$ All | AffectedZone$ Stack");
player.getZone(ZoneType.Command).add(eff);
} }
} }

View File

@@ -29,7 +29,9 @@ import javax.swing.border.MatteBorder;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.Card; import forge.Card;
import forge.Singletons; import forge.Singletons;
import forge.card.cardfactory.CardFactoryUtil;
import forge.game.Game; import forge.game.Game;
import forge.game.GameType;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.framework.DragCell; import forge.gui.framework.DragCell;
@@ -90,10 +92,11 @@ public enum VPlayers implements IVDoc<CPlayers> {
final InfoLabel prevention = new InfoLabel(); final InfoLabel prevention = new InfoLabel();
final InfoLabel keywords = new InfoLabel(); final InfoLabel keywords = new InfoLabel();
final InfoLabel antes = new InfoLabel(); final InfoLabel antes = new InfoLabel();
this.infoLBLs.put(p, new JLabel[] { name, life, hand, draw, prevention, keywords, antes }); final InfoLabel cmd = new InfoLabel();
this.infoLBLs.put(p, new JLabel[] { name, life, hand, draw, prevention, keywords, antes, cmd });
// Set border on bottom label, and larger font on player name // Set border on bottom label, and larger font on player name
antes.setBorder(new MatteBorder(0, 0, 1, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS))); cmd.setBorder(new MatteBorder(0, 0, 1, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS)));
name.setText(p.getName()); name.setText(p.getName());
} }
} }
@@ -170,6 +173,9 @@ public enum VPlayers implements IVDoc<CPlayers> {
} }
temp[6].setText(sb.toString()); temp[6].setText(sb.toString());
} }
if(p0.getGame().getType() == GameType.Commander) {
temp[7].setText(CardFactoryUtil.getCommanderInfo(p0));
}
} }
} }