mirror of
https://github.com/magefree/mage.git
synced 2025-12-27 22:12:03 -08:00
* Added Dream Halls and Curse of chain (and what was neccessary to get Dream Hall costs to work).
This commit is contained in:
parent
f86ef6f625
commit
c8d76cdaaf
18 changed files with 299 additions and 32 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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<>();
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue