mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
Try to keep original card and not migrate to new card
This commit is contained in:
@@ -338,13 +338,10 @@ public class GameAction {
|
||||
}
|
||||
|
||||
// update state for view
|
||||
copied.updateStateForView();
|
||||
if (copied.isMerged()) {
|
||||
if (copied.getMergedToCard() != null) {
|
||||
copied.getMergedToCard().updateStateForView();
|
||||
} else {
|
||||
copied.getMergedCards().get(0).updateStateForView();
|
||||
}
|
||||
copied.getMergedToCard().updateStateForView();
|
||||
} else {
|
||||
copied.updateStateForView();
|
||||
}
|
||||
|
||||
if (fromBattlefield) {
|
||||
|
||||
@@ -47,17 +47,17 @@ public class MutateEffect extends SpellAbilityEffect {
|
||||
);
|
||||
final boolean putOnTop = (topCard == host);
|
||||
|
||||
host.setMergedToCard(target);
|
||||
// If first time mutate, add target first.
|
||||
if (target.getMergedCards().isEmpty()) {
|
||||
target.addMergedCard(target);
|
||||
}
|
||||
if (putOnTop) {
|
||||
host.addMergedCard(target);
|
||||
host.addMergedCards(target.getMergedCards());
|
||||
target.clearMergedCards();
|
||||
target.setMergedToCard(host);
|
||||
target.addMergedCardToTop(host);
|
||||
} else {
|
||||
target.addMergedCard(host);
|
||||
host.setMergedToCard(target);
|
||||
}
|
||||
|
||||
|
||||
// First remove current mutated states
|
||||
if (target.getMutatedTimestamp() != -1) {
|
||||
target.removeCloneState(target.getMutatedTimestamp());
|
||||
@@ -66,27 +66,21 @@ public class MutateEffect extends SpellAbilityEffect {
|
||||
// Now add all abilities from bottom cards
|
||||
final Long ts = game.getNextTimestamp();
|
||||
if (topCard.getCurrentStateName() != CardStateName.FaceDown) {
|
||||
final CardCloneStates mutatedStates = CardFactory.getMutatedCloneStates(topCard, sa);
|
||||
topCard.addCloneState(mutatedStates, ts);
|
||||
topCard.setMutatedTimestamp(ts);
|
||||
}
|
||||
if (topCard == target) {
|
||||
// Re-register triggers for target card
|
||||
game.getTriggerHandler().clearActiveTriggers(target, null);
|
||||
game.getTriggerHandler().registerActiveTrigger(target, false);
|
||||
final CardCloneStates mutatedStates = CardFactory.getMutatedCloneStates(target, sa);
|
||||
target.addCloneState(mutatedStates, ts);
|
||||
target.setMutatedTimestamp(ts);
|
||||
}
|
||||
// Re-register triggers for target card
|
||||
game.getTriggerHandler().clearActiveTriggers(target, null);
|
||||
game.getTriggerHandler().registerActiveTrigger(target, false);
|
||||
|
||||
game.getAction().moveToPlay(host, p, sa);
|
||||
|
||||
if (topCard == host) {
|
||||
CardFactory.migrateTopCard(host, target);
|
||||
} else {
|
||||
host.setTapped(target.isTapped());
|
||||
host.setFlipped(target.isFlipped());
|
||||
}
|
||||
topCard.setTimesMutated(topCard.getTimesMutated() + 1);
|
||||
host.setTapped(target.isTapped());
|
||||
host.setFlipped(target.isFlipped());
|
||||
target.setTimesMutated(target.getTimesMutated() + 1);
|
||||
|
||||
game.getTriggerHandler().runTrigger(TriggerType.Mutates, AbilityKey.mapFromCard(topCard), false);
|
||||
game.getTriggerHandler().runTrigger(TriggerType.Mutates, AbilityKey.mapFromCard(target), false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1010,8 +1010,9 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
public final void addMergedCard(final Card c) {
|
||||
mergedCards = view.addCard(mergedCards, c, TrackableProperty.MergedCards);
|
||||
}
|
||||
public final void addMergedCards(final Iterable<Card> cards) {
|
||||
mergedCards = view.addCards(mergedCards, cards, TrackableProperty.MergedCards);
|
||||
public final void addMergedCardToTop(final Card c) {
|
||||
mergedCards.add(0, c);
|
||||
view.setCards(mergedCards, mergedCards, TrackableProperty.MergedCards);
|
||||
}
|
||||
public final void removeMergedCard(final Card c) {
|
||||
mergedCards = view.removeCard(mergedCards, c, TrackableProperty.MergedCards);
|
||||
@@ -1028,7 +1029,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
}
|
||||
|
||||
public final boolean isMerged() {
|
||||
return !getMergedCards().isEmpty() || getMergedToCard() != null;
|
||||
return getMergedToCard() != null;
|
||||
}
|
||||
|
||||
public final boolean isMutated() {
|
||||
@@ -3740,9 +3741,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
if (tapped == tapped0) { return; }
|
||||
tapped = tapped0;
|
||||
view.updateTapped(this);
|
||||
for (final Card c : getMergedCards()) {
|
||||
c.setTapped(tapped0);
|
||||
}
|
||||
}
|
||||
|
||||
public final void tap() {
|
||||
|
||||
@@ -823,49 +823,23 @@ public class CardFactory {
|
||||
}
|
||||
|
||||
public static CardCloneStates getMutatedCloneStates(final Card card, final CardTraitBase sa) {
|
||||
final CardStateName state = card.getCurrentStateName();
|
||||
final Card top = card.getMergedCards().get(0);
|
||||
final CardStateName state = top.getCurrentStateName();
|
||||
final CardState ret = new CardState(card, state);
|
||||
ret.copyFrom(card.getState(state, true), false);
|
||||
ret.copyFrom(top.getState(state, true), false);
|
||||
|
||||
boolean first = true;
|
||||
for (final Card c : card.getMergedCards()) {
|
||||
if (first) {
|
||||
first = false;
|
||||
continue;
|
||||
}
|
||||
ret.addAbilitiesFrom(c.getCurrentState(), false);
|
||||
}
|
||||
|
||||
final CardCloneStates result = new CardCloneStates(card, sa);
|
||||
final CardCloneStates result = new CardCloneStates(top, sa);
|
||||
result.put(state, ret);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void migrateTopCard(final Card host, final Card target) {
|
||||
// Copy all status from target card and migrate all counters
|
||||
// Also update all reference of target card to new top card
|
||||
|
||||
// TODO: find out all necessary status that should be copied
|
||||
host.setTapped(target.isTapped());
|
||||
host.setSickness(target.isFirstTurnControlled());
|
||||
host.setFlipped(target.isFlipped());
|
||||
host.setDamage(target.getDamage());
|
||||
host.setTimesMutated(target.getTimesMutated());
|
||||
host.setMonstrous(target.isMonstrous());
|
||||
host.setRenowned(target.isRenowned());
|
||||
|
||||
// Migrate counters
|
||||
Map<CounterType, Integer> counters = target.getCounters();
|
||||
if (!counters.isEmpty()) {
|
||||
host.setCounters(Maps.newHashMap(counters));
|
||||
}
|
||||
target.clearCounters();
|
||||
|
||||
// Migrate attached cards
|
||||
CardCollectionView attached = target.getAttachedCards();
|
||||
for (final Card c : attached) {
|
||||
c.setEntityAttachedTo(host);
|
||||
}
|
||||
target.setAttachedCards(null);
|
||||
host.setAttachedCards(attached);
|
||||
|
||||
// TODO: move all remembered, imprinted objects to new top card
|
||||
// and possibly many other needs to be migrated.
|
||||
}
|
||||
|
||||
} // end class AbstractCardFactory
|
||||
|
||||
@@ -470,7 +470,7 @@ public class PlayerView extends GameEntityView {
|
||||
void updateZone(PlayerZone zone) {
|
||||
TrackableProperty prop = getZoneProp(zone.getZoneType());
|
||||
if (prop == null) { return; }
|
||||
set(prop, CardView.getCollection(zone.getCards(false, false)));
|
||||
set(prop, CardView.getCollection(zone.getCards(false, true)));
|
||||
|
||||
//update delirium
|
||||
if (ZoneType.Graveyard == zone.getZoneType())
|
||||
|
||||
Reference in New Issue
Block a user