* Added Dream Halls and Curse of chain (and what was neccessary to get Dream Hall costs to work).

This commit is contained in:
LevelX2 2014-07-27 11:22:22 +02:00
parent f86ef6f625
commit c8d76cdaaf
18 changed files with 299 additions and 32 deletions

View file

@ -106,7 +106,7 @@ public class AlternativeCostSourceAbility extends StaticAbility implements Alter
Player player = game.getPlayer(ability.getControllerId());
if (player != null) {
if (alternateCosts.canPay(ability.getSourceId(), ability.getControllerId(), game) &&
player.chooseUse(Outcome.Detriment, alternateCosts.isEmpty() ? "Cast without paying its mana cost?":"Pay alternative costs?", game)) {
player.chooseUse(Outcome.Detriment, alternateCosts.isEmpty() ? "Cast without paying its mana cost?":"Pay alternative costs? (" + alternateCosts.getText() +")", game)) {
ability.getManaCostsToPay().clear();
ability.getCosts().clear();
for (Cost cost : alternateCosts) {
@ -121,7 +121,11 @@ public class AlternativeCostSourceAbility extends StaticAbility implements Alter
}
}
}
} else {
return false;
}
} else {
return false;
}
}
return isActivated(ability, game);

View file

@ -41,10 +41,18 @@ public class DiscardCardCost extends DiscardTargetCost {
}
public DiscardCardCost(boolean randomDiscard) {
super(new TargetCardInHand(new FilterCard(randomDiscard ?"a card at random":"a card")), randomDiscard);
this(new FilterCard(randomDiscard ?"a card at random":"a card"), randomDiscard);
}
public DiscardCardCost(DiscardCardCost cost) {
public DiscardCardCost(FilterCard filter) {
this(filter, false);
}
public DiscardCardCost(FilterCard filter, boolean randomDiscard) {
super(new TargetCardInHand(filter), randomDiscard);
}
public DiscardCardCost(final DiscardCardCost cost) {
super(cost);
}

View file

@ -87,7 +87,7 @@ public class DiscardTargetCost extends CostImpl {
return false;
}
this.cards.add(card.copy());
paid |= player.discard(card, null, game);
paid |= player.discard(card, ability, game);
}
}
}
@ -96,7 +96,7 @@ public class DiscardTargetCost extends CostImpl {
@Override
public boolean canPay(UUID sourceId, UUID controllerId, Game game) {
return targets.canChoose(controllerId, game);
return targets.canChoose(sourceId, controllerId, game);
}
@Override

View file

@ -80,7 +80,7 @@ public class CastCardFromOutsideTheGameEffect extends OneShotEffect {
return false;
}
Set<Card> filtered = cards.getCards(filterCard, game);
Set<Card> filtered = cards.getCards(filterCard, source.getSourceId(), source.getControllerId(), game);
if (filtered.isEmpty()) {
game.informPlayer(player, "You have no " + filterCard.getMessage() + " outside the game.");
return false;

View file

@ -45,7 +45,7 @@ import mage.players.Player;
public class ReturnToHandFromGraveyardAllEffect extends OneShotEffect {
private FilterCard filter;
private final FilterCard filter;
public ReturnToHandFromGraveyardAllEffect(FilterCard filter) {
super(Outcome.ReturnToHand);
@ -65,7 +65,7 @@ public class ReturnToHandFromGraveyardAllEffect extends OneShotEffect {
for (UUID playerId : controller.getInRange()) {
Player player = game.getPlayer(playerId);
if (player != null) {
for (Card card :player.getGraveyard().getCards(filter, game)) {
for (Card card :player.getGraveyard().getCards(filter, source.getSourceId(), source.getControllerId(), game)) {
card.moveToZone(Zone.HAND, playerId, game, false);
}
}

View file

@ -45,6 +45,7 @@ public interface Cards extends Set<UUID>, Serializable {
void addAll(List<Card> createCards);
Set<Card> getCards(Game game);
Set<Card> getCards(FilterCard filter, Game game);
Set<Card> getCards(FilterCard filter, UUID sourceId, UUID playerId, Game game);
Collection<Card> getUniqueCards(Game game);
Card getRandom(Game game);
int count(FilterCard filter, Game game);

View file

@ -156,6 +156,18 @@ public class CardsImpl extends LinkedHashSet<UUID> implements Cards, Serializabl
return result;
}
@Override
public Set<Card> getCards(FilterCard filter, UUID sourceId, UUID playerId, Game game) {
Set<Card> cards = new LinkedHashSet<>();
for (UUID card: this) {
boolean match = filter.match(game.getCard(card), sourceId, playerId, game);
if (match) {
cards.add(game.getCard(card));
}
}
return cards;
}
@Override
public Set<Card> getCards(FilterCard filter, Game game) {
Set<Card> cards = new LinkedHashSet<>();

View file

@ -0,0 +1,35 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package mage.filter.predicate.mageobject;
import mage.MageObject;
import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.game.Game;
/**
*
* @author LevelX2
*/
public class SharesColorWithSourcePredicate implements ObjectSourcePlayerPredicate<ObjectSourcePlayer<MageObject>> {
@Override
public boolean apply(ObjectSourcePlayer<MageObject> input, Game game) {
MageObject sourceObject = game.getObject(input.getSourceId());
if (sourceObject != null) {
return input.getObject().getColor().shares(sourceObject.getColor());
}
return false;
}
@Override
public String toString() {
return "shares a color";
}
}

View file

@ -92,7 +92,7 @@ public class TargetCard extends TargetObject {
if (player != null) {
switch (zone) {
case HAND:
for (Card card : player.getHand().getCards(filter, game)) {
for (Card card : player.getHand().getCards(filter, sourceId, sourceControllerId, game)) {
if (sourceId == null || isNotTarget() || !game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, card.getId(), sourceId, sourceControllerId))) {
possibleTargets++;
if (possibleTargets >= this.minNumberOfTargets) {
@ -102,7 +102,7 @@ public class TargetCard extends TargetObject {
}
break;
case GRAVEYARD:
for (Card card : player.getGraveyard().getCards(filter, game)) {
for (Card card : player.getGraveyard().getCards(filter, sourceId, sourceControllerId, game)) {
if (sourceId == null || isNotTarget() || !game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, card.getId(), sourceId, sourceControllerId))) {
possibleTargets++;
if (possibleTargets >= this.minNumberOfTargets) {
@ -161,14 +161,14 @@ public class TargetCard extends TargetObject {
if (player != null) {
switch (zone) {
case HAND:
for (Card card : player.getHand().getCards(filter, game)) {
for (Card card : player.getHand().getCards(filter, sourceId, sourceControllerId, game)) {
if (sourceId == null || isNotTarget() || !game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, card.getId(), sourceId, sourceControllerId))) {
possibleTargets.add(card.getId());
}
}
break;
case GRAVEYARD:
for (Card card : player.getGraveyard().getCards(filter, game)) {
for (Card card : player.getGraveyard().getCards(filter, sourceId, sourceControllerId, game)) {
if (sourceId == null || isNotTarget() || !game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, card.getId(), sourceId, sourceControllerId))) {
possibleTargets.add(card.getId());
}

View file

@ -77,7 +77,7 @@ public class Targets extends ArrayList<Target> {
public boolean choose(Outcome outcome, UUID playerId, UUID sourceId, Game game) {
if (this.size() > 0) {
if (!canChoose(playerId, game)) {
if (!canChoose(sourceId, playerId, game)) {
return false;
}
while (!isChosen()) {

View file

@ -86,7 +86,7 @@ public class TargetCardInHand extends TargetCard {
Set<UUID> possibleTargets = new HashSet<>();
Player player = game.getPlayer(playerId);
if (player != null) {
for (Card card : player.getHand().getCards(filter, game)) {
for (Card card : player.getHand().getCards(filter, sourceId, playerId, game)) {
if (sourceId == null || isNotTarget() || !game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, card.getId(), sourceId, playerId))) {
possibleTargets.add(card.getId());
}
@ -100,7 +100,7 @@ public class TargetCardInHand extends TargetCard {
int possibleTargets = 0;
Player player = game.getPlayer(sourceControllerId);
if (player != null) {
for (Card card : player.getHand().getCards(filter, game)) {
for (Card card : player.getHand().getCards(filter, sourceId, sourceControllerId, game)) {
if (sourceId == null || isNotTarget() || !game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, card.getId(), sourceId, sourceControllerId))) {
possibleTargets++;
if (possibleTargets >= this.minNumberOfTargets) {

View file

@ -94,7 +94,7 @@ public class TargetCardInYourGraveyard extends TargetCard {
public Set<UUID> possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
Set<UUID> possibleTargets = new HashSet<>();
Player player = game.getPlayer(sourceControllerId);
for (Card card : player.getGraveyard().getCards(filter, game)) {
for (Card card : player.getGraveyard().getCards(filter, sourceId, sourceControllerId, game)) {
if (sourceId == null || isNotTarget() || !game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, card.getId(), sourceId, sourceControllerId))) {
possibleTargets.add(card.getId());
}
@ -135,7 +135,7 @@ public class TargetCardInYourGraveyard extends TargetCard {
return true;
}
int possibleTargets = 0;
for (Card card : player.getGraveyard().getCards(filter, game)) {
for (Card card : player.getGraveyard().getCards(filter, sourceId, sourceControllerId, game)) {
if (sourceId == null || isNotTarget() || !game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, card.getId(), sourceId, sourceControllerId))) {
possibleTargets++;
if (possibleTargets >= this.minNumberOfTargets) {