mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
Merge remote-tracking branch 'upstream/master' into collector-number-in-card-list-and-card-db-refactoring
This commit is contained in:
@@ -208,7 +208,6 @@ public class AiAttackController {
|
|||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public final boolean isEffectiveAttacker(final Player ai, final Card attacker, final Combat combat) {
|
public final boolean isEffectiveAttacker(final Player ai, final Card attacker, final Combat combat) {
|
||||||
|
|
||||||
// if the attacker will die when attacking don't attack
|
// if the attacker will die when attacking don't attack
|
||||||
if ((attacker.getNetToughness() + ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, null, combat, true)) <= 0) {
|
if ((attacker.getNetToughness() + ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, null, combat, true)) <= 0) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -314,14 +314,14 @@ public abstract class GameState {
|
|||||||
} else if (c.getCurrentStateName().equals(CardStateName.Modal)) {
|
} else if (c.getCurrentStateName().equals(CardStateName.Modal)) {
|
||||||
newText.append("|Modal");
|
newText.append("|Modal");
|
||||||
}
|
}
|
||||||
if (c.isAttachedToEntity()) {
|
|
||||||
newText.append("|AttachedTo:").append(c.getEntityAttachedTo().getId());
|
|
||||||
}
|
|
||||||
if (c.getPlayerAttachedTo() != null) {
|
if (c.getPlayerAttachedTo() != null) {
|
||||||
// TODO: improve this for game states with more than two players
|
// TODO: improve this for game states with more than two players
|
||||||
newText.append("|EnchantingPlayer:");
|
newText.append("|EnchantingPlayer:");
|
||||||
Player p = c.getPlayerAttachedTo();
|
Player p = c.getPlayerAttachedTo();
|
||||||
newText.append(p.getController().isAI() ? "AI" : "HUMAN");
|
newText.append(p.getController().isAI() ? "AI" : "HUMAN");
|
||||||
|
} else if (c.isAttachedToEntity()) {
|
||||||
|
newText.append("|AttachedTo:").append(c.getEntityAttachedTo().getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c.getDamage() > 0) {
|
if (c.getDamage() > 0) {
|
||||||
|
|||||||
@@ -294,7 +294,7 @@ public class CardStorageReader {
|
|||||||
|
|
||||||
private void executeLoadTask(final Collection<CardRules> result, final List<Callable<List<CardRules>>> tasks, final CountDownLatch cdl) {
|
private void executeLoadTask(final Collection<CardRules> result, final List<Callable<List<CardRules>>> tasks, final CountDownLatch cdl) {
|
||||||
try {
|
try {
|
||||||
if ( useThreadPool ) {
|
if (useThreadPool) {
|
||||||
final ExecutorService executor = ThreadUtil.getComputingPool(0.5f);
|
final ExecutorService executor = ThreadUtil.getComputingPool(0.5f);
|
||||||
final List<Future<List<CardRules>>> parts = executor.invokeAll(tasks);
|
final List<Future<List<CardRules>>> parts = executor.invokeAll(tasks);
|
||||||
executor.shutdown();
|
executor.shutdown();
|
||||||
|
|||||||
@@ -423,7 +423,7 @@ public final class CardRules implements ICardCharacteristics {
|
|||||||
String variable = colonPos > 0 ? value.substring(0, colonPos) : value;
|
String variable = colonPos > 0 ? value.substring(0, colonPos) : value;
|
||||||
value = colonPos > 0 ? value.substring(1+colonPos) : null;
|
value = colonPos > 0 ? value.substring(1+colonPos) : null;
|
||||||
|
|
||||||
if ( "RemoveDeck".equals(variable) ) {
|
if ("RemoveDeck".equals(variable)) {
|
||||||
this.removedFromAIDecks |= "All".equalsIgnoreCase(value);
|
this.removedFromAIDecks |= "All".equalsIgnoreCase(value);
|
||||||
this.removedFromRandomDecks |= "Random".equalsIgnoreCase(value);
|
this.removedFromRandomDecks |= "Random".equalsIgnoreCase(value);
|
||||||
this.removedFromNonCommanderDecks |= "NonCommander".equalsIgnoreCase(value);
|
this.removedFromNonCommanderDecks |= "NonCommander".equalsIgnoreCase(value);
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public class RepeatEffect extends SpellAbilityEffect {
|
|||||||
@Override
|
@Override
|
||||||
protected String getStackDescription(final SpellAbility sa) {
|
protected String getStackDescription(final SpellAbility sa) {
|
||||||
return "Repeat something. Somebody should really write a better StackDescription!";
|
return "Repeat something. Somebody should really write a better StackDescription!";
|
||||||
} // end repeatStackDescription()
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void resolve(final SpellAbility sa) {
|
public void resolve(final SpellAbility sa) {
|
||||||
|
|||||||
@@ -3,6 +3,6 @@ ManaCost:3 W
|
|||||||
Types:Enchantment
|
Types:Enchantment
|
||||||
T:Mode$ Phase | Phase$ Upkeep | CheckSVar$ X | SVarCompare$ GE1 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of each upkeep, if you lost life last turn, create a 1/1 white Soldier creature token.
|
T:Mode$ Phase | Phase$ Upkeep | CheckSVar$ X | SVarCompare$ GE1 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of each upkeep, if you lost life last turn, create a 1/1 white Soldier creature token.
|
||||||
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_soldier | TokenOwner$ You | LegacyImage$ w 1 1 soldier m15
|
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_soldier | TokenOwner$ You | LegacyImage$ w 1 1 soldier m15
|
||||||
SVar:X:Count$Controller$LifeLostLastTurn
|
SVar:X:PlayerCountPropertyYou$LifeLostLastTurn
|
||||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/first_response.jpg
|
SVar:Picture:http://www.wizards.com/global/images/magic/general/first_response.jpg
|
||||||
Oracle:At the beginning of each upkeep, if you lost life last turn, create a 1/1 white Soldier creature token.
|
Oracle:At the beginning of each upkeep, if you lost life last turn, create a 1/1 white Soldier creature token.
|
||||||
@@ -3,13 +3,11 @@ ManaCost:1 B G
|
|||||||
Types:Legendary Planeswalker Grist
|
Types:Legendary Planeswalker Grist
|
||||||
Loyalty:3
|
Loyalty:3
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | ExcludeZone$ Battlefield | SetPower$ 1 | SetToughness$ 1 | AddType$ Creature & Insect | CharacteristicDefining$ True | Description$ As long as CARDNAME isn't on the battlefield, it's a 1/1 Insect creature in addition to its other types.
|
S:Mode$ Continuous | Affected$ Card.Self | ExcludeZone$ Battlefield | SetPower$ 1 | SetToughness$ 1 | AddType$ Creature & Insect | CharacteristicDefining$ True | Description$ As long as CARDNAME isn't on the battlefield, it's a 1/1 Insect creature in addition to its other types.
|
||||||
A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | SubAbility$ DBRepeat | SpellDescription$ Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process.
|
A:AB$ Repeat | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | RepeatSubAbility$ CleanupBegin | RepeatCheckSVar$ MilledInsect | RepeatSVarCompare$ EQ1 | SubAbility$ DBCleanup | SpellDescription$ Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process. | StackDescription$ Spelldescription
|
||||||
SVar:DBRepeat:DB$ Repeat | RepeatSubAbility$ CleanupBegin | MaxRepeat$ MaxRepeats | RepeatCheckSVar$ MilledInsect | RepeatSVarCompare$ EQ1 | SubAbility$ DBCleanup
|
|
||||||
SVar:CleanupBegin:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBToken
|
SVar:CleanupBegin:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBToken
|
||||||
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ bg_1_1_insect | TokenOwner$ You | Planeswalker$ True | SubAbility$ DBMill | SpellDescription$ Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process.
|
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ bg_1_1_insect | TokenOwner$ You | Planeswalker$ True | SubAbility$ DBMill | SpellDescription$ Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process.
|
||||||
SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ 1 | RememberMilled$ True | SubAbility$ DBPutCounter
|
SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ 1 | RememberMilled$ True | SubAbility$ DBPutCounter
|
||||||
SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ LOYALTY | CounterNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.Insect | ConditionCompare$ EQ1
|
SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ LOYALTY | CounterNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.Insect | ConditionCompare$ EQ1
|
||||||
SVar:MaxRepeats:Count$InYourLibrary
|
|
||||||
SVar:MilledInsect:Remembered$Valid Card.Insect
|
SVar:MilledInsect:Remembered$Valid Card.Insect
|
||||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
A:AB$ ImmediateTrigger | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Execute$ TrigDestroy | UnlessCost$ Sac<1/Creature> | UnlessPayer$ You | UnlessSwitched$ True | SpellDescription$ You may sacrifice a creature. When you do, destroy target creature or planeswalker.
|
A:AB$ ImmediateTrigger | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Execute$ TrigDestroy | UnlessCost$ Sac<1/Creature> | UnlessPayer$ You | UnlessSwitched$ True | SpellDescription$ You may sacrifice a creature. When you do, destroy target creature or planeswalker.
|
||||||
@@ -18,4 +16,4 @@ A:AB$ LoseLife | Cost$ SubCounter<5/LOYALTY> | LifeAmount$ X | Defined$ Player.O
|
|||||||
SVar:X:Count$TypeInYourYard.Creature
|
SVar:X:Count$TypeInYourYard.Creature
|
||||||
DeckHas:Ability$Token & Ability$Mill
|
DeckHas:Ability$Token & Ability$Mill
|
||||||
DeckHints:Type$Insect
|
DeckHints:Type$Insect
|
||||||
Oracle:As long as Grist, the Hunger Tide isn't on the battlefield, it's a 1/1 Insect creature in addition to its other types.\n[+1]: Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process.\n[−2]: You may sacrifice a creature. When you do, destroy target creature or planeswalker.\n[−5]: Each opponent loses life equal to the number of creature cards in your graveyard.
|
Oracle:As long as Grist, the Hunger Tide isn't on the battlefield, it's a 1/1 Insect creature in addition to its other types.\n[+1]: Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process.\n[-2]: You may sacrifice a creature. When you do, destroy target creature or planeswalker.\n[-5]: Each opponent loses life equal to the number of creature cards in your graveyard.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ T:Mode$ Phase | Phase$ Upkeep | CheckSVar$ X | SVarCompare$ GE1 | TriggerZones$
|
|||||||
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
|
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
|
||||||
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, you gain life equal to its toughness.
|
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, you gain life equal to its toughness.
|
||||||
SVar:TrigGainLife:DB$GainLife | Defined$ TriggeredCardController | LifeAmount$ Y
|
SVar:TrigGainLife:DB$GainLife | Defined$ TriggeredCardController | LifeAmount$ Y
|
||||||
SVar:X:Count$Controller$LifeLostLastTurn
|
SVar:X:PlayerCountPropertyYou$LifeLostLastTurn
|
||||||
SVar:Y:TriggeredCard$CardToughness
|
SVar:Y:TriggeredCard$CardToughness
|
||||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/paladin_of_atonement.jpg
|
SVar:Picture:http://www.wizards.com/global/images/magic/general/paladin_of_atonement.jpg
|
||||||
Oracle:At the beginning of each upkeep, if you lost life last turn, put a +1/+1 counter on Paladin of Atonement.\nWhen Paladin of Atonement dies, you gain life equal to its toughness.
|
Oracle:At the beginning of each upkeep, if you lost life last turn, put a +1/+1 counter on Paladin of Atonement.\nWhen Paladin of Atonement dies, you gain life equal to its toughness.
|
||||||
@@ -788,6 +788,11 @@ ScryfallCode=J21
|
|||||||
780 C Tranquil Thicket
|
780 C Tranquil Thicket
|
||||||
781 C Unknown Shores
|
781 C Unknown Shores
|
||||||
782 C Wind-Scarred Crag
|
782 C Wind-Scarred Crag
|
||||||
|
783 L Plains
|
||||||
|
784 L Island
|
||||||
|
785 L Swamp
|
||||||
|
786 L Mountain
|
||||||
|
787 L Forest
|
||||||
|
|
||||||
[tokens]
|
[tokens]
|
||||||
u_8_8_kraken
|
u_8_8_kraken
|
||||||
|
|||||||
@@ -12,4 +12,4 @@ ScryfallCode=PMPS08
|
|||||||
3 R Swamp @John Avon
|
3 R Swamp @John Avon
|
||||||
4 R Mountain @John Avon
|
4 R Mountain @John Avon
|
||||||
5 R Forest @John Avon
|
5 R Forest @John Avon
|
||||||
a1%202007 R Jaya Ballard, Task Mage @Matt Cavotta
|
A1 R Jaya Ballard, Task Mage @Matt Cavotta
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ ScryfallCode=SLD
|
|||||||
56 R Arcbound Ravager @Danny Miller
|
56 R Arcbound Ravager @Danny Miller
|
||||||
57 M Darksteel Colossus @Hector Ortiz
|
57 M Darksteel Colossus @Hector Ortiz
|
||||||
58 R Walking Ballista @Bad Flip Productions, Inc.
|
58 R Walking Ballista @Bad Flip Productions, Inc.
|
||||||
|
59 R Squire @Noah Bradley
|
||||||
60 R Storm Crow @Jesper Ejsing
|
60 R Storm Crow @Jesper Ejsing
|
||||||
61 R Goblin Snowman @Victor Adame Minguez
|
61 R Goblin Snowman @Victor Adame Minguez
|
||||||
62 R Mudhole @Titus Lunter
|
62 R Mudhole @Titus Lunter
|
||||||
|
|||||||
Reference in New Issue
Block a user