mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 04:08:01 +00:00
Add Raging River
This commit is contained in:
@@ -24,6 +24,7 @@ public class AnimateEffect extends AnimateEffectBase {
|
|||||||
final Card source = sa.getHostCard();
|
final Card source = sa.getHostCard();
|
||||||
|
|
||||||
String animateRemembered = null;
|
String animateRemembered = null;
|
||||||
|
String animateImprinted = null;
|
||||||
|
|
||||||
//if host is not on the battlefield don't apply
|
//if host is not on the battlefield don't apply
|
||||||
if ((sa.hasParam("UntilHostLeavesPlay") || sa.hasParam("UntilLoseControlOfHost"))
|
if ((sa.hasParam("UntilHostLeavesPlay") || sa.hasParam("UntilLoseControlOfHost"))
|
||||||
@@ -35,6 +36,10 @@ public class AnimateEffect extends AnimateEffectBase {
|
|||||||
if (sa.hasParam("RememberObjects")) {
|
if (sa.hasParam("RememberObjects")) {
|
||||||
animateRemembered = sa.getParam("RememberObjects");
|
animateRemembered = sa.getParam("RememberObjects");
|
||||||
}
|
}
|
||||||
|
// Imprint Cards
|
||||||
|
if (sa.hasParam("ImprintCards")) {
|
||||||
|
animateImprinted = sa.getParam("ImprintCards");
|
||||||
|
}
|
||||||
|
|
||||||
// AF specific sa
|
// AF specific sa
|
||||||
Integer power = null;
|
Integer power = null;
|
||||||
@@ -162,6 +167,18 @@ public class AnimateEffect extends AnimateEffectBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// give Imprinted
|
||||||
|
if (animateImprinted != null) {
|
||||||
|
for (final Card imprintedCard : AbilityUtils.getDefinedCards(source, animateImprinted, sa)) {
|
||||||
|
c.addImprintedCard(imprintedCard);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restore immutable to effect
|
||||||
|
if (sa.hasParam("Immutable")) {
|
||||||
|
c.setImmutable(true);
|
||||||
|
}
|
||||||
|
|
||||||
game.fireEvent(new GameEventCardStatsChanged(c));
|
game.fireEvent(new GameEventCardStatsChanged(c));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -140,6 +140,10 @@ public class EffectEffect extends SpellAbilityEffect {
|
|||||||
final Card eff = createEffect(sa, controller, name, image);
|
final Card eff = createEffect(sa, controller, name, image);
|
||||||
eff.setSetCode(sa.getHostCard().getSetCode());
|
eff.setSetCode(sa.getHostCard().getSetCode());
|
||||||
eff.setRarity(sa.getHostCard().getRarity());
|
eff.setRarity(sa.getHostCard().getRarity());
|
||||||
|
// For Raging River effect to add attacker "left" or "right" pile later
|
||||||
|
if (sa.hasParam("Mutable")) {
|
||||||
|
eff.setImmutable(false);
|
||||||
|
}
|
||||||
|
|
||||||
// Abilities and triggers work the same as they do for Token
|
// Abilities and triggers work the same as they do for Token
|
||||||
// Grant abilities
|
// Grant abilities
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import forge.game.spellability.AbilitySub;
|
|||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.spellability.TargetRestrictions;
|
import forge.game.spellability.TargetRestrictions;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.util.Lang;
|
||||||
import forge.util.Localizer;
|
import forge.util.Localizer;
|
||||||
|
|
||||||
public class TwoPilesEffect extends SpellAbilityEffect {
|
public class TwoPilesEffect extends SpellAbilityEffect {
|
||||||
@@ -52,6 +53,7 @@ public class TwoPilesEffect extends SpellAbilityEffect {
|
|||||||
final Card card = sa.getHostCard();
|
final Card card = sa.getHostCard();
|
||||||
ZoneType zone = null;
|
ZoneType zone = null;
|
||||||
boolean pile1WasChosen = true;
|
boolean pile1WasChosen = true;
|
||||||
|
boolean isLeftRightPile = sa.hasParam("LeftRightPile");
|
||||||
|
|
||||||
if (sa.hasParam("Zone")) {
|
if (sa.hasParam("Zone")) {
|
||||||
zone = ZoneType.smartValueOf(sa.getParam("Zone"));
|
zone = ZoneType.smartValueOf(sa.getParam("Zone"));
|
||||||
@@ -89,8 +91,14 @@ public class TwoPilesEffect extends SpellAbilityEffect {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String title = "One".equals(sa.getParamOrDefault("FaceDown", "False")) ? Localizer.getInstance().getMessage("lblSelectCardForFaceDownPile") :
|
String title;
|
||||||
Localizer.getInstance().getMessage("lblDivideCardIntoTwoPiles");
|
if("One".equals(sa.getParamOrDefault("FaceDown", "False"))) {
|
||||||
|
title = Localizer.getInstance().getMessage("lblSelectCardForFaceDownPile");
|
||||||
|
} else if (isLeftRightPile) {
|
||||||
|
title = Localizer.getInstance().getMessage("lblSelectCardForLeftPile");
|
||||||
|
} else {
|
||||||
|
title = Localizer.getInstance().getMessage("lblDivideCardIntoTwoPiles");
|
||||||
|
}
|
||||||
|
|
||||||
card.clearRemembered();
|
card.clearRemembered();
|
||||||
|
|
||||||
@@ -103,11 +111,39 @@ public class TwoPilesEffect extends SpellAbilityEffect {
|
|||||||
//System.out.println("Pile 2:" + pile2);
|
//System.out.println("Pile 2:" + pile2);
|
||||||
|
|
||||||
|
|
||||||
|
if (isLeftRightPile) {
|
||||||
|
pile1WasChosen = true;
|
||||||
|
} else {
|
||||||
pile1WasChosen = chooser.getController().chooseCardsPile(sa, pile1, pile2, sa.getParamOrDefault("FaceDown", "False"));
|
pile1WasChosen = chooser.getController().chooseCardsPile(sa, pile1, pile2, sa.getParamOrDefault("FaceDown", "False"));
|
||||||
|
}
|
||||||
CardCollectionView chosenPile = pile1WasChosen ? pile1 : pile2;
|
CardCollectionView chosenPile = pile1WasChosen ? pile1 : pile2;
|
||||||
CardCollectionView unchosenPile = !pile1WasChosen ? pile1 : pile2;
|
CardCollectionView unchosenPile = !pile1WasChosen ? pile1 : pile2;
|
||||||
|
|
||||||
StringBuilder notification = new StringBuilder(chooser + " " + Localizer.getInstance().getMessage("lblChoosesPile") + " " + (pile1WasChosen ? "1" : "2") + ":\n");
|
StringBuilder notification = new StringBuilder();
|
||||||
|
if (isLeftRightPile) {
|
||||||
|
notification.append("\n");
|
||||||
|
notification.append(Lang.getInstance().getPossessedObject(separator.getName(), Localizer.getInstance().getMessage("lblLeftPile")));
|
||||||
|
notification.append("\n--------------------\n");
|
||||||
|
if (!chosenPile.isEmpty()) {
|
||||||
|
for (Card c : chosenPile) {
|
||||||
|
notification.append(c.getName()).append("\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
notification.append("(" + Localizer.getInstance().getMessage("lblEmptyPile") + ")\n");
|
||||||
|
}
|
||||||
|
notification.append("\n");
|
||||||
|
notification.append(Lang.getInstance().getPossessedObject(separator.getName(), Localizer.getInstance().getMessage("lblRightPile")));
|
||||||
|
notification.append("\n--------------------\n");
|
||||||
|
if (!unchosenPile.isEmpty()) {
|
||||||
|
for (Card c : unchosenPile) {
|
||||||
|
notification.append(c.getName()).append("\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
notification.append("(" + Localizer.getInstance().getMessage("lblEmptyPile") + ")\n");
|
||||||
|
}
|
||||||
|
p.getGame().getAction().notifyOfValue(sa, separator, notification.toString(), separator);
|
||||||
|
} else {
|
||||||
|
notification.append(chooser + " " + Localizer.getInstance().getMessage("lblChoosesPile") + " " + (pile1WasChosen ? "1" : "2") + ":\n");
|
||||||
if (!chosenPile.isEmpty()) {
|
if (!chosenPile.isEmpty()) {
|
||||||
for (Card c : chosenPile) {
|
for (Card c : chosenPile) {
|
||||||
notification.append(c.getName()).append("\n");
|
notification.append(c.getName()).append("\n");
|
||||||
@@ -115,8 +151,9 @@ public class TwoPilesEffect extends SpellAbilityEffect {
|
|||||||
} else {
|
} else {
|
||||||
notification.append("(" + Localizer.getInstance().getMessage("lblEmptyPile") + ")");
|
notification.append("(" + Localizer.getInstance().getMessage("lblEmptyPile") + ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
p.getGame().getAction().notifyOfValue(sa, chooser, notification.toString(), chooser);
|
p.getGame().getAction().notifyOfValue(sa, chooser, notification.toString(), chooser);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// take action on the chosen pile
|
// take action on the chosen pile
|
||||||
if (sa.hasParam("ChosenPile")) {
|
if (sa.hasParam("ChosenPile")) {
|
||||||
|
|||||||
20
forge-gui/res/cardsfolder/r/raging_river.txt
Normal file
20
forge-gui/res/cardsfolder/r/raging_river.txt
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
Name:Raging River
|
||||||
|
ManaCost:R R
|
||||||
|
Types:Enchantment
|
||||||
|
T:Mode$ AttackersDeclared | AttackingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRepeatDefender | TriggerDescription$ Whenever one or more creatures you control attack, each defending player divides all creatures without flying they control into a "left" pile and a "right" pile. Then, for each attacking creature you control, choose "left" or "right." That creature can't be blocked this combat except by creatures with flying and creatures in a pile with the chosen label.
|
||||||
|
SVar:TrigRepeatDefender:DB$ RepeatEach | RepeatPlayers$ TriggeredAttackedTarget | RepeatSubAbility$ DBDefLeftEffect | SubAbility$ DBAtkLeftRight
|
||||||
|
SVar:DBDefLeftEffect:DB$ Effect | EffectOwner$ Remembered | Name$ Raging River Left | StaticAbilities$ DBCantBlock | ImprintOnHost$ True | Mutable$ True | Duration$ UntilEndOfCombat | SubAbility$ DBDefRightEffect
|
||||||
|
SVar:DBDefRightEffect:DB$ Effect | EffectOwner$ Remembered | Name$ Raging River Right | StaticAbilities$ DBCantBlock | ImprintOnHost$ True | Mutable$ True | Duration$ UntilEndOfCombat | SubAbility$ DBDefLeftRight
|
||||||
|
SVar:DBCantBlock:Mode$ CantBlockBy | ValidAttacker$ Creature.IsRemembered | ValidBlocker$ Creature.withoutFlying+IsNotImprinted+YouCtrl | EffectZone$ Command
|
||||||
|
SVar:DBDefLeftRight:DB$ TwoPiles | Defined$ Remembered | Separator$ Remembered | ValidCards$ Creature.withoutFlying+RememberedPlayerCtrl | Zone$ Battlefield | LeftRightPile$ True | ChosenPile$ DBDefLeftPile | UnchosenPile$ DBDefRightPile | AILogic$ Random | SubAbility$ DBClearImprinted
|
||||||
|
SVar:DBDefLeftPile:DB$ Animate | Defined$ Imprinted.namedRaging River Left | ImprintCards$ Remembered | Permanent$ True | SubAbility$ DBLeftPump
|
||||||
|
SVar:DBDefRightPile:DB$ Animate | Defined$ Imprinted.namedRaging River Right | ImprintCards$ Remembered | Permanent$ True | SubAbility$ DBRightPump
|
||||||
|
SVar:DBClearImprinted:DB$ Cleanup | ClearImprinted$ True
|
||||||
|
SVar:DBAtkLeftRight:DB$ TwoPiles | Defined$ You | Separator$ You | ValidCards$ Creature.attacking+YouCtrl | Zone$ Battlefield | LeftRightPile$ True | ChosenPile$ DBAtkLeftPile | UnchosenPile$ DBAtkRightPile | AILogic$ Random | SubAbility$ DBCleanup
|
||||||
|
SVar:DBAtkLeftPile:DB$ Animate | Defined$ ValidCommand Effect.namedRaging River Left | RememberObjects$ RememberedCard | Permanent$ True | Immutable$ True | SubAbility$ DBLeftPump
|
||||||
|
SVar:DBAtkRightPile:DB$ Animate | Defined$ ValidCommand Effect.namedRaging River Right | RememberObjects$ RememberedCard | Permanent$ True | Immutable$ True | SubAbility$ DBRightPump
|
||||||
|
SVar:DBLeftPump:DB$ Pump | Defined$ Remembered | KW$ "Left" pile | UntilEndOfCombat$ True
|
||||||
|
SVar:DBRightPump:DB$ Pump | Defined$ Remembered | KW$ "Right" pile | UntilEndOfCombat$ True
|
||||||
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
|
SVar:PlayMain1:TRUE
|
||||||
|
Oracle:Whenever one or more creatures you control attack, each defending player divides all creatures without flying they control into a "left" pile and a "right" pile. Then, for each attacking creature you control, choose "left" or "right." That creature can't be blocked this combat except by creatures with flying and creatures in a pile with the chosen label.
|
||||||
@@ -1933,6 +1933,9 @@ lblTapOrUntapTarget=Tappe oder enttappe {0}?
|
|||||||
#TwoPilesEffect.java
|
#TwoPilesEffect.java
|
||||||
lblSelectCardForFaceDownPile=Wähle Karten für einen verdeckten Stapel
|
lblSelectCardForFaceDownPile=Wähle Karten für einen verdeckten Stapel
|
||||||
lblDivideCardIntoTwoPiles=Teile die Karten in zwei Stapel auf
|
lblDivideCardIntoTwoPiles=Teile die Karten in zwei Stapel auf
|
||||||
|
lblSelectCardForLeftPile=Select cards for the left pile
|
||||||
|
lblLeftPile=Left pile
|
||||||
|
lblRightPile=Right pile
|
||||||
lblChoosesPile=wähle Stapel
|
lblChoosesPile=wähle Stapel
|
||||||
lblEmptyPile=Leerer Stapel
|
lblEmptyPile=Leerer Stapel
|
||||||
#UntapEffect.java
|
#UntapEffect.java
|
||||||
|
|||||||
@@ -1933,6 +1933,9 @@ lblTapOrUntapTarget=Tap or Untap {0}?
|
|||||||
#TwoPilesEffect.java
|
#TwoPilesEffect.java
|
||||||
lblSelectCardForFaceDownPile=Select cards for a face down pile
|
lblSelectCardForFaceDownPile=Select cards for a face down pile
|
||||||
lblDivideCardIntoTwoPiles=Divide cards into two piles
|
lblDivideCardIntoTwoPiles=Divide cards into two piles
|
||||||
|
lblSelectCardForLeftPile=Select cards for the left pile
|
||||||
|
lblLeftPile=Left pile
|
||||||
|
lblRightPile=Right pile
|
||||||
lblChoosesPile=chooses Pile
|
lblChoosesPile=chooses Pile
|
||||||
lblEmptyPile=Empty pile
|
lblEmptyPile=Empty pile
|
||||||
#UntapEffect.java
|
#UntapEffect.java
|
||||||
|
|||||||
@@ -1933,6 +1933,9 @@ lblTapOrUntapTarget=¿Girar o Enderezar {0}?
|
|||||||
#TwoPilesEffect.java
|
#TwoPilesEffect.java
|
||||||
lblSelectCardForFaceDownPile=Selecciona las cartas para un montón boca abajo
|
lblSelectCardForFaceDownPile=Selecciona las cartas para un montón boca abajo
|
||||||
lblDivideCardIntoTwoPiles=Dividir las cartas en dos montones
|
lblDivideCardIntoTwoPiles=Dividir las cartas en dos montones
|
||||||
|
lblSelectCardForLeftPile=Select cards for the left pile
|
||||||
|
lblLeftPile=Left pile
|
||||||
|
lblRightPile=Right pile
|
||||||
lblChoosesPile=elige Montón
|
lblChoosesPile=elige Montón
|
||||||
lblEmptyPile=Montón vacío
|
lblEmptyPile=Montón vacío
|
||||||
#UntapEffect.java
|
#UntapEffect.java
|
||||||
|
|||||||
@@ -1933,6 +1933,9 @@ lblTapOrUntapTarget=Tap or Untap {0}?
|
|||||||
#TwoPilesEffect.java
|
#TwoPilesEffect.java
|
||||||
lblSelectCardForFaceDownPile=Select cards for a face down pile
|
lblSelectCardForFaceDownPile=Select cards for a face down pile
|
||||||
lblDivideCardIntoTwoPiles=Divide cards into two piles
|
lblDivideCardIntoTwoPiles=Divide cards into two piles
|
||||||
|
lblSelectCardForLeftPile=Select cards for the left pile
|
||||||
|
lblLeftPile=Left pile
|
||||||
|
lblRightPile=Right pile
|
||||||
lblChoosesPile=chooses Pile
|
lblChoosesPile=chooses Pile
|
||||||
lblEmptyPile=Empty pile
|
lblEmptyPile=Empty pile
|
||||||
#UntapEffect.java
|
#UntapEffect.java
|
||||||
|
|||||||
@@ -1933,6 +1933,9 @@ lblTapOrUntapTarget={0}をタップまたはアンタップしますか?
|
|||||||
#TwoPilesEffect.java
|
#TwoPilesEffect.java
|
||||||
lblSelectCardForFaceDownPile=裏向き束のカードを選ぶ
|
lblSelectCardForFaceDownPile=裏向き束のカードを選ぶ
|
||||||
lblDivideCardIntoTwoPiles=カードを 2つの束に分ける
|
lblDivideCardIntoTwoPiles=カードを 2つの束に分ける
|
||||||
|
lblSelectCardForLeftPile=「左」の束のカードを選ぶ
|
||||||
|
lblLeftPile=「左」の束
|
||||||
|
lblRightPile=「右」の束
|
||||||
lblChoosesPile=束を選んだ
|
lblChoosesPile=束を選んだ
|
||||||
lblEmptyPile=空っぽの束
|
lblEmptyPile=空っぽの束
|
||||||
#UntapEffect.java
|
#UntapEffect.java
|
||||||
|
|||||||
@@ -1933,6 +1933,9 @@ lblTapOrUntapTarget=横置还是重置{0}?
|
|||||||
#TwoPilesEffect.java
|
#TwoPilesEffect.java
|
||||||
lblSelectCardForFaceDownPile=选择一个面朝下的堆
|
lblSelectCardForFaceDownPile=选择一个面朝下的堆
|
||||||
lblDivideCardIntoTwoPiles=将牌分为两堆
|
lblDivideCardIntoTwoPiles=将牌分为两堆
|
||||||
|
lblSelectCardForLeftPile=Select cards for the left pile
|
||||||
|
lblLeftPile=Left pile
|
||||||
|
lblRightPile=Right pile
|
||||||
lblChoosesPile=选择堆
|
lblChoosesPile=选择堆
|
||||||
lblEmptyPile=空堆
|
lblEmptyPile=空堆
|
||||||
#UntapEffect.java
|
#UntapEffect.java
|
||||||
|
|||||||
@@ -492,7 +492,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
|
|||||||
// Otherwise, use the order dialog to be able to grab multiple cards in
|
// Otherwise, use the order dialog to be able to grab multiple cards in
|
||||||
// one shot
|
// one shot
|
||||||
|
|
||||||
if (max == 1) {
|
if (min == 1 && max == 1) {
|
||||||
final Card singleChosen = chooseSingleEntityForEffect(sourceList, sa, title, isOptional, params);
|
final Card singleChosen = chooseSingleEntityForEffect(sourceList, sa, title, isOptional, params);
|
||||||
return singleChosen == null ? CardCollection.EMPTY : new CardCollection(singleChosen);
|
return singleChosen == null ? CardCollection.EMPTY : new CardCollection(singleChosen);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user