mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
CardStateName: combine Modal with Transformed (#8305)
* CardStateName: combine Modal with Transformed * Make new TMDFC transformable --------- Co-authored-by: tool4EvEr <tool4EvEr@>
This commit is contained in:
@@ -481,7 +481,7 @@ public class AiController {
|
|||||||
|
|
||||||
if (lands.size() >= Math.max(maxCmcInHand, 6)) {
|
if (lands.size() >= Math.max(maxCmcInHand, 6)) {
|
||||||
// don't play MDFC land if other side is spell and enough lands are available
|
// don't play MDFC land if other side is spell and enough lands are available
|
||||||
if (!c.isLand() || (c.isModal() && !c.getState(CardStateName.Modal).getType().isLand())) {
|
if (!c.isLand() || (c.isModal() && !c.getState(CardStateName.Backside).getType().isLand())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -321,9 +321,7 @@ public abstract class GameState {
|
|||||||
newText.append(":Cloaked");
|
newText.append(":Cloaked");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (c.getCurrentStateName().equals(CardStateName.Transformed)) {
|
if (c.getCurrentStateName().equals(CardStateName.Flipped)) {
|
||||||
newText.append("|Transformed");
|
|
||||||
} else if (c.getCurrentStateName().equals(CardStateName.Flipped)) {
|
|
||||||
newText.append("|Flipped");
|
newText.append("|Flipped");
|
||||||
} else if (c.getCurrentStateName().equals(CardStateName.Meld)) {
|
} else if (c.getCurrentStateName().equals(CardStateName.Meld)) {
|
||||||
newText.append("|Meld");
|
newText.append("|Meld");
|
||||||
@@ -332,8 +330,12 @@ public abstract class GameState {
|
|||||||
newText.append(":");
|
newText.append(":");
|
||||||
newText.append(c.getMeldedWith().getName()).append(suffix);
|
newText.append(c.getMeldedWith().getName()).append(suffix);
|
||||||
}
|
}
|
||||||
} else if (c.getCurrentStateName().equals(CardStateName.Modal)) {
|
} else if (c.getCurrentStateName().equals(CardStateName.Backside)) {
|
||||||
newText.append("|Modal");
|
if (c.isModal()) {
|
||||||
|
newText.append("|Modal");
|
||||||
|
} else {
|
||||||
|
newText.append("|Transformed");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c.getPlayerAttachedTo() != null) {
|
if (c.getPlayerAttachedTo() != null) {
|
||||||
@@ -1314,8 +1316,8 @@ public abstract class GameState {
|
|||||||
if (info.endsWith("Cloaked")) {
|
if (info.endsWith("Cloaked")) {
|
||||||
c.setCloaked(new SpellAbility.EmptySa(ApiType.Cloak, c));
|
c.setCloaked(new SpellAbility.EmptySa(ApiType.Cloak, c));
|
||||||
}
|
}
|
||||||
} else if (info.startsWith("Transformed")) {
|
} else if (info.startsWith("Transformed") || info.startsWith("Modal")) {
|
||||||
c.setState(CardStateName.Transformed, true);
|
c.setState(CardStateName.Backside, true);
|
||||||
c.setBackSide(true);
|
c.setBackSide(true);
|
||||||
} else if (info.startsWith("Flipped")) {
|
} else if (info.startsWith("Flipped")) {
|
||||||
c.setState(CardStateName.Flipped, true);
|
c.setState(CardStateName.Flipped, true);
|
||||||
@@ -1333,9 +1335,6 @@ public abstract class GameState {
|
|||||||
}
|
}
|
||||||
c.setState(CardStateName.Meld, true);
|
c.setState(CardStateName.Meld, true);
|
||||||
c.setBackSide(true);
|
c.setBackSide(true);
|
||||||
} else if (info.startsWith("Modal")) {
|
|
||||||
c.setState(CardStateName.Modal, true);
|
|
||||||
c.setBackSide(true);
|
|
||||||
}
|
}
|
||||||
else if (info.startsWith("OnAdventure")) {
|
else if (info.startsWith("OnAdventure")) {
|
||||||
String abAdventure = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ForgetOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.!copiedSpell";
|
String abAdventure = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ForgetOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.!copiedSpell";
|
||||||
|
|||||||
@@ -153,8 +153,8 @@ public class PlayAi extends SpellAbilityAi {
|
|||||||
final boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
|
final boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
|
||||||
final CardStateName state;
|
final CardStateName state;
|
||||||
if (sa.hasParam("CastTransformed")) {
|
if (sa.hasParam("CastTransformed")) {
|
||||||
state = CardStateName.Transformed;
|
state = CardStateName.Backside;
|
||||||
options.forEach(c -> c.changeToState(CardStateName.Transformed));
|
options.forEach(c -> c.changeToState(CardStateName.Backside));
|
||||||
} else {
|
} else {
|
||||||
state = CardStateName.Original;
|
state = CardStateName.Original;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -166,6 +166,24 @@ public final class CardRules implements ICardCharacteristics {
|
|||||||
return Iterables.concat(Arrays.asList(mainPart, otherPart), specializedParts.values());
|
return Iterables.concat(Arrays.asList(mainPart, otherPart), specializedParts.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isTransformable() {
|
||||||
|
if (CardSplitType.Transform == getSplitType()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (CardSplitType.Modal != getSplitType()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (ICardFace face : getAllFaces()) {
|
||||||
|
for (String spell : face.getAbilities()) {
|
||||||
|
if (spell.contains("AB$ SetState") && spell.contains("Mode$ Transform")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO check keywords if needed
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public ICardFace getWSpecialize() {
|
public ICardFace getWSpecialize() {
|
||||||
return specializedParts.get(CardStateName.SpecializeW);
|
return specializedParts.get(CardStateName.SpecializeW);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ import java.util.EnumSet;
|
|||||||
public enum CardSplitType
|
public enum CardSplitType
|
||||||
{
|
{
|
||||||
None(FaceSelectionMethod.USE_PRIMARY_FACE, null),
|
None(FaceSelectionMethod.USE_PRIMARY_FACE, null),
|
||||||
Transform(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Transformed),
|
Transform(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Backside),
|
||||||
Meld(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Meld),
|
Meld(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Meld),
|
||||||
Split(FaceSelectionMethod.COMBINE, CardStateName.RightSplit),
|
Split(FaceSelectionMethod.COMBINE, CardStateName.RightSplit),
|
||||||
Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped),
|
Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped),
|
||||||
Adventure(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Secondary),
|
Adventure(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Secondary),
|
||||||
Omen(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Secondary),
|
Omen(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Secondary),
|
||||||
Modal(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Modal),
|
Modal(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Backside),
|
||||||
Specialize(FaceSelectionMethod.USE_ACTIVE_FACE, null);
|
Specialize(FaceSelectionMethod.USE_ACTIVE_FACE, null);
|
||||||
|
|
||||||
public static final EnumSet<CardSplitType> DUAL_FACED_CARDS = EnumSet.of(
|
public static final EnumSet<CardSplitType> DUAL_FACED_CARDS = EnumSet.of(
|
||||||
|
|||||||
@@ -5,12 +5,11 @@ public enum CardStateName {
|
|||||||
Original,
|
Original,
|
||||||
FaceDown,
|
FaceDown,
|
||||||
Flipped,
|
Flipped,
|
||||||
Transformed,
|
Backside,
|
||||||
Meld,
|
Meld,
|
||||||
LeftSplit,
|
LeftSplit,
|
||||||
RightSplit,
|
RightSplit,
|
||||||
Secondary,
|
Secondary,
|
||||||
Modal,
|
|
||||||
EmptyRoom,
|
EmptyRoom,
|
||||||
SpecializeW,
|
SpecializeW,
|
||||||
SpecializeU,
|
SpecializeU,
|
||||||
@@ -42,7 +41,7 @@ public enum CardStateName {
|
|||||||
return CardStateName.Flipped;
|
return CardStateName.Flipped;
|
||||||
}
|
}
|
||||||
if ("DoubleFaced".equalsIgnoreCase(value)) {
|
if ("DoubleFaced".equalsIgnoreCase(value)) {
|
||||||
return CardStateName.Transformed;
|
return CardStateName.Backside;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new IllegalArgumentException("No element named " + value + " in enum CardCharactersticName");
|
throw new IllegalArgumentException("No element named " + value + " in enum CardCharactersticName");
|
||||||
|
|||||||
@@ -2989,14 +2989,14 @@ public class AbilityUtils {
|
|||||||
if (tgtCard.isFaceDown()) {
|
if (tgtCard.isFaceDown()) {
|
||||||
collectSpellsForPlayEffect(list, original, controller, withAltCost);
|
collectSpellsForPlayEffect(list, original, controller, withAltCost);
|
||||||
} else {
|
} else {
|
||||||
if (state == CardStateName.Transformed && tgtCard.isPermanent() && !tgtCard.isAura()) {
|
if (state == CardStateName.Backside && !tgtCard.isModal() && tgtCard.isPermanent() && !tgtCard.isAura()) {
|
||||||
// casting defeated battle
|
// casting defeated battle
|
||||||
Spell sp = new SpellPermanent(tgtCard, original);
|
Spell sp = new SpellPermanent(tgtCard, original);
|
||||||
sp.setCardState(original);
|
sp.setCardState(original);
|
||||||
list.add(sp);
|
list.add(sp);
|
||||||
}
|
}
|
||||||
if (tgtCard.isModal() && tgtCard.hasState(CardStateName.Modal)) {
|
if (tgtCard.isModal() && tgtCard.hasState(CardStateName.Backside)) {
|
||||||
collectSpellsForPlayEffect(list, tgtCard.getState(CardStateName.Modal), controller, withAltCost);
|
collectSpellsForPlayEffect(list, tgtCard.getState(CardStateName.Backside), controller, withAltCost);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -302,7 +302,7 @@ public class CopyPermanentEffect extends TokenEffectBase {
|
|||||||
copy.setStates(CardFactory.getCloneStates(original, copy, sa));
|
copy.setStates(CardFactory.getCloneStates(original, copy, sa));
|
||||||
// force update the now set State
|
// force update the now set State
|
||||||
if (original.isTransformable()) {
|
if (original.isTransformable()) {
|
||||||
copy.setState(original.isTransformed() ? CardStateName.Transformed : CardStateName.Original, true, true);
|
copy.setState(original.isTransformed() ? CardStateName.Backside : CardStateName.Original, true, true);
|
||||||
} else {
|
} else {
|
||||||
copy.setState(copy.getCurrentStateName(), true, true);
|
copy.setState(copy.getCurrentStateName(), true, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -276,13 +276,13 @@ public class PlayEffect extends SpellAbilityEffect {
|
|||||||
CardStateName state = CardStateName.Original;
|
CardStateName state = CardStateName.Original;
|
||||||
|
|
||||||
if (sa.hasParam("CastTransformed")) {
|
if (sa.hasParam("CastTransformed")) {
|
||||||
if (!tgtCard.changeToState(CardStateName.Transformed)) {
|
if (!tgtCard.changeToState(CardStateName.Backside)) {
|
||||||
// Failed to transform. In the future, we might need to just remove this option and continue
|
// Failed to transform. In the future, we might need to just remove this option and continue
|
||||||
amount--;
|
amount--;
|
||||||
System.err.println("CastTransformed failed for '" + tgtCard + "'.");
|
System.err.println("CastTransformed failed for '" + tgtCard + "'.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
state = CardStateName.Transformed;
|
state = CardStateName.Backside;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<SpellAbility> sas = AbilityUtils.getSpellsFromPlayEffect(tgtCard, controller, state, !altCost);
|
List<SpellAbility> sas = AbilityUtils.getSpellsFromPlayEffect(tgtCard, controller, state, !altCost);
|
||||||
|
|||||||
@@ -554,8 +554,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
|||||||
}
|
}
|
||||||
public boolean setState(final CardStateName state, boolean updateView, boolean forceUpdate) {
|
public boolean setState(final CardStateName state, boolean updateView, boolean forceUpdate) {
|
||||||
boolean rollback = state == CardStateName.Original
|
boolean rollback = state == CardStateName.Original
|
||||||
&& (currentStateName == CardStateName.Flipped || currentStateName == CardStateName.Transformed);
|
&& (currentStateName == CardStateName.Flipped || currentStateName == CardStateName.Backside);
|
||||||
boolean transform = state == CardStateName.Flipped || state == CardStateName.Transformed || state == CardStateName.Meld;
|
boolean transform = state == CardStateName.Flipped || state == CardStateName.Backside || state == CardStateName.Meld;
|
||||||
boolean needsTransformAnimation = transform || rollback;
|
boolean needsTransformAnimation = transform || rollback;
|
||||||
// faceDown has higher priority over clone states
|
// faceDown has higher priority over clone states
|
||||||
// while text change states doesn't apply while the card is faceDown
|
// while text change states doesn't apply while the card is faceDown
|
||||||
@@ -675,7 +675,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
|||||||
c.backside = !c.backside;
|
c.backside = !c.backside;
|
||||||
// 613.7g A transforming double-faced permanent receives a new timestamp each time it transforms.
|
// 613.7g A transforming double-faced permanent receives a new timestamp each time it transforms.
|
||||||
c.setLayerTimestamp(ts);
|
c.setLayerTimestamp(ts);
|
||||||
boolean result = c.changeToState(c.backside ? CardStateName.Transformed : CardStateName.Original);
|
boolean result = c.changeToState(c.backside ? CardStateName.Backside : CardStateName.Original);
|
||||||
retResult = retResult || result;
|
retResult = retResult || result;
|
||||||
}
|
}
|
||||||
if (hasMergedCard()) {
|
if (hasMergedCard()) {
|
||||||
@@ -939,7 +939,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
CardStateName destState = transformCard.backside ? CardStateName.Original : CardStateName.Transformed;
|
CardStateName destState = transformCard.backside ? CardStateName.Original : CardStateName.Backside;
|
||||||
|
|
||||||
// use Original State for the transform check
|
// use Original State for the transform check
|
||||||
if (!transformCard.getOriginalState(destState).getType().isPermanent()) {
|
if (!transformCard.getOriginalState(destState).getType().isPermanent()) {
|
||||||
@@ -1056,7 +1056,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
|||||||
}
|
}
|
||||||
|
|
||||||
public final boolean isTransformable() {
|
public final boolean isTransformable() {
|
||||||
return getRules() != null && getRules().getSplitType() == CardSplitType.Transform;
|
return getRules() != null && getRules().isTransformable();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean isMeldable() {
|
public final boolean isMeldable() {
|
||||||
@@ -2930,7 +2930,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
|||||||
sb.append("(Gain the next level as a sorcery to add its ability.)").append(linebreak);
|
sb.append("(Gain the next level as a sorcery to add its ability.)").append(linebreak);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state.getStateName().equals(CardStateName.Transformed) &&
|
if (state.getStateName().equals(CardStateName.Backside) && state.getCard().isTransformable() &&
|
||||||
state.getView().getOracleText().startsWith("(Transforms")) {
|
state.getView().getOracleText().startsWith("(Transforms")) {
|
||||||
sb.append("(").append(Localizer.getInstance().getMessage("lblTransformsFrom",
|
sb.append("(").append(Localizer.getInstance().getMessage("lblTransformsFrom",
|
||||||
CardTranslation.getTranslatedName(state.getCard().getState(CardStateName.Original).getName())));
|
CardTranslation.getTranslatedName(state.getCard().getState(CardStateName.Original).getName())));
|
||||||
@@ -5753,7 +5753,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
|||||||
return isInstant() || isSorcery() || (isAura() && !isInZone(ZoneType.Battlefield));
|
return isInstant() || isSorcery() || (isAura() && !isInZone(ZoneType.Battlefield));
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean hasPlayableLandFace() { return isLand() || (isModal() && getState(CardStateName.Modal).getType().isLand()); }
|
public final boolean hasPlayableLandFace() { return isLand() || (isModal() && getState(CardStateName.Backside).getType().isLand()); }
|
||||||
|
|
||||||
public final boolean isLand() { return getType().isLand(); }
|
public final boolean isLand() { return getType().isLand(); }
|
||||||
public final boolean isBasicLand() { return getType().isBasicLand(); }
|
public final boolean isBasicLand() { return getType().isBasicLand(); }
|
||||||
@@ -7550,7 +7550,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
|||||||
System.out.println(TextUtil.concatWithSpace("Illegal Split Card CMC mode", mode.toString(),"passed to getCMC!"));
|
System.out.println(TextUtil.concatWithSpace("Illegal Split Card CMC mode", mode.toString(),"passed to getCMC!"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (currentStateName == CardStateName.Transformed) {
|
} else if (currentStateName == CardStateName.Backside && !isModal()) {
|
||||||
// Except in the cases were we clone the back-side of a DFC.
|
// Except in the cases were we clone the back-side of a DFC.
|
||||||
if (getCopiedPermanent() != null) {
|
if (getCopiedPermanent() != null) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -7699,8 +7699,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Add Modal Spells
|
// Add Modal Spells
|
||||||
if (isModal() && hasState(CardStateName.Modal)) {
|
if (isModal() && hasState(CardStateName.Backside)) {
|
||||||
for (SpellAbility sa : getState(CardStateName.Modal).getSpellAbilities()) {
|
for (SpellAbility sa : getState(CardStateName.Backside).getSpellAbilities()) {
|
||||||
//add alternative costs as additional spell abilities
|
//add alternative costs as additional spell abilities
|
||||||
// only add Spells there
|
// only add Spells there
|
||||||
if (sa.isSpell() || sa.isLandAbility()) {
|
if (sa.isSpell() || sa.isLandAbility()) {
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ public class CardCopyService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final boolean fromIsFlipCard = copyFrom.isFlipCard();
|
final boolean fromIsFlipCard = copyFrom.isFlipCard();
|
||||||
final boolean fromIsTransformedCard = copyFrom.getCurrentStateName() == CardStateName.Transformed || copyFrom.getCurrentStateName() == CardStateName.Meld;
|
final boolean fromIsTransformedCard = copyFrom.getCurrentStateName() == CardStateName.Backside || copyFrom.getCurrentStateName() == CardStateName.Meld;
|
||||||
|
|
||||||
if (fromIsFlipCard) {
|
if (fromIsFlipCard) {
|
||||||
if (to.getCurrentStateName().equals(CardStateName.Flipped)) {
|
if (to.getCurrentStateName().equals(CardStateName.Flipped)) {
|
||||||
@@ -163,7 +163,7 @@ public class CardCopyService {
|
|||||||
&& sourceSA != null && ApiType.CopySpellAbility.equals(sourceSA.getApi())
|
&& sourceSA != null && ApiType.CopySpellAbility.equals(sourceSA.getApi())
|
||||||
&& targetSA != null && targetSA.isSpell() && targetSA.getHostCard().isPermanent()) {
|
&& targetSA != null && targetSA.isSpell() && targetSA.getHostCard().isPermanent()) {
|
||||||
copyState(copyFrom, CardStateName.Original, to, CardStateName.Original);
|
copyState(copyFrom, CardStateName.Original, to, CardStateName.Original);
|
||||||
copyState(copyFrom, CardStateName.Transformed, to, CardStateName.Transformed);
|
copyState(copyFrom, CardStateName.Backside, to, CardStateName.Backside);
|
||||||
// 707.10g If an effect creates a copy of a transforming permanent spell, the copy is also a transforming permanent spell that has both a front face and a back face.
|
// 707.10g If an effect creates a copy of a transforming permanent spell, the copy is also a transforming permanent spell that has both a front face and a back face.
|
||||||
// The characteristics of its front and back face are determined by the copiable values of the same face of the spell it is a copy of, as modified by any other copy effects.
|
// The characteristics of its front and back face are determined by the copiable values of the same face of the spell it is a copy of, as modified by any other copy effects.
|
||||||
// If the spell it is a copy of has its back face up, the copy is created with its back face up. The token that’s put onto the battlefield as that spell resolves is a transforming token.
|
// If the spell it is a copy of has its back face up, the copy is created with its back face up. The token that’s put onto the battlefield as that spell resolves is a transforming token.
|
||||||
@@ -257,8 +257,8 @@ public class CardCopyService {
|
|||||||
newCopy.getState(CardStateName.Flipped).copyFrom(copyFrom.getState(CardStateName.Flipped), true);
|
newCopy.getState(CardStateName.Flipped).copyFrom(copyFrom.getState(CardStateName.Flipped), true);
|
||||||
} else if (copyFrom.isTransformable()) {
|
} else if (copyFrom.isTransformable()) {
|
||||||
newCopy.getState(CardStateName.Original).copyFrom(copyFrom.getState(CardStateName.Original), true);
|
newCopy.getState(CardStateName.Original).copyFrom(copyFrom.getState(CardStateName.Original), true);
|
||||||
newCopy.addAlternateState(CardStateName.Transformed, false);
|
newCopy.addAlternateState(CardStateName.Backside, false);
|
||||||
newCopy.getState(CardStateName.Transformed).copyFrom(copyFrom.getState(CardStateName.Transformed), true);
|
newCopy.getState(CardStateName.Backside).copyFrom(copyFrom.getState(CardStateName.Backside), true);
|
||||||
} else if (copyFrom.hasState(CardStateName.Secondary)) {
|
} else if (copyFrom.hasState(CardStateName.Secondary)) {
|
||||||
newCopy.getState(CardStateName.Original).copyFrom(copyFrom.getState(CardStateName.Original), true);
|
newCopy.getState(CardStateName.Original).copyFrom(copyFrom.getState(CardStateName.Original), true);
|
||||||
newCopy.addAlternateState(CardStateName.Secondary, false);
|
newCopy.addAlternateState(CardStateName.Secondary, false);
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public class CardFactory {
|
|||||||
copy.setStates(getCloneStates(original, copy, sourceSA));
|
copy.setStates(getCloneStates(original, copy, sourceSA));
|
||||||
// force update the now set State
|
// force update the now set State
|
||||||
if (original.isTransformable()) {
|
if (original.isTransformable()) {
|
||||||
copy.setState(original.isTransformed() ? CardStateName.Transformed : CardStateName.Original, true, true);
|
copy.setState(original.isTransformed() ? CardStateName.Backside : CardStateName.Original, true, true);
|
||||||
} else {
|
} else {
|
||||||
copy.setState(copy.getCurrentStateName(), true, true);
|
copy.setState(copy.getCurrentStateName(), true, true);
|
||||||
}
|
}
|
||||||
@@ -549,9 +549,9 @@ public class CardFactory {
|
|||||||
ret1.copyFrom(in.getState(CardStateName.Original), false, sa);
|
ret1.copyFrom(in.getState(CardStateName.Original), false, sa);
|
||||||
result.put(CardStateName.Original, ret1);
|
result.put(CardStateName.Original, ret1);
|
||||||
|
|
||||||
final CardState ret2 = new CardState(out, CardStateName.Transformed);
|
final CardState ret2 = new CardState(out, CardStateName.Backside);
|
||||||
ret2.copyFrom(in.getState(CardStateName.Transformed), false, sa);
|
ret2.copyFrom(in.getState(CardStateName.Backside), false, sa);
|
||||||
result.put(CardStateName.Transformed, ret2);
|
result.put(CardStateName.Backside, ret2);
|
||||||
} else if (in.isSplitCard()) {
|
} else if (in.isSplitCard()) {
|
||||||
// for split cards, copy all three states
|
// for split cards, copy all three states
|
||||||
final CardState ret1 = new CardState(out, CardStateName.Original);
|
final CardState ret1 = new CardState(out, CardStateName.Original);
|
||||||
|
|||||||
@@ -416,10 +416,14 @@ public class CardState extends GameObject implements IHasSVars, ITranslatable {
|
|||||||
|
|
||||||
// SpellPermanent only for Original State
|
// SpellPermanent only for Original State
|
||||||
switch(getStateName()) {
|
switch(getStateName()) {
|
||||||
|
case Backside:
|
||||||
|
if (!getCard().isModal()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case Original:
|
case Original:
|
||||||
case LeftSplit:
|
case LeftSplit:
|
||||||
case RightSplit:
|
case RightSplit:
|
||||||
case Modal:
|
|
||||||
case SpecializeB:
|
case SpecializeB:
|
||||||
case SpecializeG:
|
case SpecializeG:
|
||||||
case SpecializeR:
|
case SpecializeR:
|
||||||
|
|||||||
@@ -1964,9 +1964,9 @@ public class Player extends GameEntity implements Comparable<Player> {
|
|||||||
speedEffect.setOwner(this);
|
speedEffect.setOwner(this);
|
||||||
speedEffect.setGamePieceType(GamePieceType.EFFECT);
|
speedEffect.setGamePieceType(GamePieceType.EFFECT);
|
||||||
|
|
||||||
speedEffect.addAlternateState(CardStateName.Transformed, false);
|
speedEffect.addAlternateState(CardStateName.Backside, false);
|
||||||
CardState speedFront = speedEffect.getState(CardStateName.Original);
|
CardState speedFront = speedEffect.getState(CardStateName.Original);
|
||||||
CardState speedBack = speedEffect.getState(CardStateName.Transformed);
|
CardState speedBack = speedEffect.getState(CardStateName.Backside);
|
||||||
|
|
||||||
speedFront.setImageKey("t:speed");
|
speedFront.setImageKey("t:speed");
|
||||||
speedFront.setName("Start Your Engines!");
|
speedFront.setName("Start Your Engines!");
|
||||||
@@ -1990,7 +1990,7 @@ public class Player extends GameEntity implements Comparable<Player> {
|
|||||||
speedEffect.updateStateForView();
|
speedEffect.updateStateForView();
|
||||||
|
|
||||||
if(this.maxSpeed())
|
if(this.maxSpeed())
|
||||||
speedEffect.setState(CardStateName.Transformed, true);
|
speedEffect.setState(CardStateName.Backside, true);
|
||||||
|
|
||||||
final PlayerZone com = getZone(ZoneType.Command);
|
final PlayerZone com = getZone(ZoneType.Command);
|
||||||
com.add(speedEffect);
|
com.add(speedEffect);
|
||||||
@@ -2006,8 +2006,8 @@ public class Player extends GameEntity implements Comparable<Player> {
|
|||||||
String label = this.maxSpeed() ? localizer.getMessage("lblMaxSpeed") : localizer.getMessage("lblSpeed", this.speed);
|
String label = this.maxSpeed() ? localizer.getMessage("lblMaxSpeed") : localizer.getMessage("lblSpeed", this.speed);
|
||||||
speedEffect.setOverlayText(label);
|
speedEffect.setOverlayText(label);
|
||||||
if(maxSpeed() && speedEffect.getCurrentStateName() == CardStateName.Original)
|
if(maxSpeed() && speedEffect.getCurrentStateName() == CardStateName.Original)
|
||||||
speedEffect.setState(CardStateName.Transformed, true);
|
speedEffect.setState(CardStateName.Backside, true);
|
||||||
else if(!maxSpeed() && speedEffect.getCurrentStateName() == CardStateName.Transformed)
|
else if(!maxSpeed() && speedEffect.getCurrentStateName() == CardStateName.Backside)
|
||||||
speedEffect.setState(CardStateName.Original, true);
|
speedEffect.setState(CardStateName.Original, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1755,7 +1755,7 @@ public class GameSimulationTest extends SimulationTest {
|
|||||||
|
|
||||||
AssertJUnit.assertFalse(outlaw.isCloned());
|
AssertJUnit.assertFalse(outlaw.isCloned());
|
||||||
AssertJUnit.assertTrue(outlaw.isTransformable());
|
AssertJUnit.assertTrue(outlaw.isTransformable());
|
||||||
AssertJUnit.assertTrue(outlaw.hasState(CardStateName.Transformed));
|
AssertJUnit.assertTrue(outlaw.hasState(CardStateName.Backside));
|
||||||
AssertJUnit.assertTrue(outlaw.canTransform(null));
|
AssertJUnit.assertTrue(outlaw.canTransform(null));
|
||||||
AssertJUnit.assertFalse(outlaw.isBackSide());
|
AssertJUnit.assertFalse(outlaw.isBackSide());
|
||||||
|
|
||||||
@@ -1788,7 +1788,7 @@ public class GameSimulationTest extends SimulationTest {
|
|||||||
|
|
||||||
AssertJUnit.assertTrue(clonedOutLaw.isCloned());
|
AssertJUnit.assertTrue(clonedOutLaw.isCloned());
|
||||||
AssertJUnit.assertTrue(clonedOutLaw.isTransformable());
|
AssertJUnit.assertTrue(clonedOutLaw.isTransformable());
|
||||||
AssertJUnit.assertTrue(clonedOutLaw.hasState(CardStateName.Transformed));
|
AssertJUnit.assertTrue(clonedOutLaw.hasState(CardStateName.Backside));
|
||||||
AssertJUnit.assertTrue(clonedOutLaw.canTransform(null));
|
AssertJUnit.assertTrue(clonedOutLaw.canTransform(null));
|
||||||
AssertJUnit.assertFalse(clonedOutLaw.isBackSide());
|
AssertJUnit.assertFalse(clonedOutLaw.isBackSide());
|
||||||
|
|
||||||
@@ -1807,7 +1807,7 @@ public class GameSimulationTest extends SimulationTest {
|
|||||||
|
|
||||||
AssertJUnit.assertTrue(transformOutLaw.isCloned());
|
AssertJUnit.assertTrue(transformOutLaw.isCloned());
|
||||||
AssertJUnit.assertTrue(transformOutLaw.isTransformable());
|
AssertJUnit.assertTrue(transformOutLaw.isTransformable());
|
||||||
AssertJUnit.assertTrue(transformOutLaw.hasState(CardStateName.Transformed));
|
AssertJUnit.assertTrue(transformOutLaw.hasState(CardStateName.Backside));
|
||||||
AssertJUnit.assertTrue(transformOutLaw.canTransform(null));
|
AssertJUnit.assertTrue(transformOutLaw.canTransform(null));
|
||||||
AssertJUnit.assertTrue(transformOutLaw.isBackSide());
|
AssertJUnit.assertTrue(transformOutLaw.isBackSide());
|
||||||
|
|
||||||
@@ -1822,7 +1822,7 @@ public class GameSimulationTest extends SimulationTest {
|
|||||||
|
|
||||||
AssertJUnit.assertFalse(transformOutLaw.isCloned());
|
AssertJUnit.assertFalse(transformOutLaw.isCloned());
|
||||||
AssertJUnit.assertTrue(transformOutLaw.isTransformable());
|
AssertJUnit.assertTrue(transformOutLaw.isTransformable());
|
||||||
AssertJUnit.assertTrue(transformOutLaw.hasState(CardStateName.Transformed));
|
AssertJUnit.assertTrue(transformOutLaw.hasState(CardStateName.Backside));
|
||||||
AssertJUnit.assertTrue(transformOutLaw.canTransform(null));
|
AssertJUnit.assertTrue(transformOutLaw.canTransform(null));
|
||||||
AssertJUnit.assertTrue(transformOutLaw.isBackSide());
|
AssertJUnit.assertTrue(transformOutLaw.isBackSide());
|
||||||
|
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ public class FCardPanel extends FDisplayObject {
|
|||||||
CardRenderer.drawCardWithOverlays(g, card, x2, y, w2, h, getStackPosition());
|
CardRenderer.drawCardWithOverlays(g, card, x2, y, w2, h, getStackPosition());
|
||||||
} else {
|
} else {
|
||||||
//transform
|
//transform
|
||||||
if (card.getCurrentState().getState() == CardStateName.Transformed || card.getCurrentState().getState() == CardStateName.Flipped) {
|
if (card.getCurrentState().getState() == CardStateName.Backside || card.getCurrentState().getState() == CardStateName.Flipped) {
|
||||||
DURATION = 0.16f;
|
DURATION = 0.16f;
|
||||||
CardRenderer.drawCardWithOverlays(g, card, x2, y, w2, h, getStackPosition());
|
CardRenderer.drawCardWithOverlays(g, card, x2, y, w2, h, getStackPosition());
|
||||||
} else if (card.getCurrentState().getState() == CardStateName.Meld) {
|
} else if (card.getCurrentState().getState() == CardStateName.Meld) {
|
||||||
|
|||||||
@@ -249,9 +249,8 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards {
|
|||||||
}
|
}
|
||||||
return true; //original can always be shown if not a face down that can't be shown
|
return true; //original can always be shown if not a face down that can't be shown
|
||||||
case Flipped:
|
case Flipped:
|
||||||
case Transformed:
|
|
||||||
case Meld:
|
case Meld:
|
||||||
case Modal:
|
case Backside:
|
||||||
return true;
|
return true;
|
||||||
case Secondary:
|
case Secondary:
|
||||||
if (cv.isFaceDown()) {
|
if (cv.isFaceDown()) {
|
||||||
|
|||||||
@@ -2964,8 +2964,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
forgeCard.changeToState(forgeCard.getRules().getSplitType().getChangedStateName());
|
forgeCard.changeToState(forgeCard.getRules().getSplitType().getChangedStateName());
|
||||||
if (forgeCard.getCurrentStateName().equals(CardStateName.Transformed) ||
|
if (forgeCard.getCurrentStateName().equals(CardStateName.Backside)) {
|
||||||
forgeCard.getCurrentStateName().equals(CardStateName.Modal)) {
|
|
||||||
forgeCard.setBackSide(true);
|
forgeCard.setBackSide(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user