mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 19:58:00 +00:00
- Added Drain Power
This commit is contained in:
@@ -13,6 +13,7 @@ import java.util.TreeMap;
|
||||
*/
|
||||
public enum ApiType {
|
||||
Abandon (AbandonEffect.class),
|
||||
ActivateAbility (ActivateAbilityEffect.class),
|
||||
AddOrRemoveCounter (CountersPutOrRemoveEffect.class),
|
||||
AddPhase (AddPhaseEffect.class),
|
||||
AddTurn (AddTurnEffect.class),
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
package forge.game.ability.effects;
|
||||
|
||||
import forge.game.ability.SpellAbilityEffect;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardLists;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.spellability.TargetRestrictions;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.Lang;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ActivateAbilityEffect extends SpellAbilityEffect {
|
||||
@Override
|
||||
protected String getStackDescription(SpellAbility sa) {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
|
||||
final List<Player> tgtPlayers = getTargetPlayers(sa);
|
||||
|
||||
sb.append(StringUtils.join(tgtPlayers, ", "));
|
||||
sb.append(" activates ");
|
||||
sb.append(Lang.nounWithAmount(1, sa.hasParam("ManaAbility") ? "mana ability" : "ability"));
|
||||
sb.append(" of each ").append(sa.getParamOrDefault("Type", "Card"));
|
||||
sb.append(" he or she controls.");
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resolve(SpellAbility sa) {
|
||||
final TargetRestrictions tgt = sa.getTargetRestrictions();
|
||||
final boolean isManaAb = sa.hasParam("ManaAbility");
|
||||
// TODO: improve ai and fix corner cases
|
||||
|
||||
for (final Player p : getTargetPlayers(sa)) {
|
||||
if ((tgt == null) || p.canBeTargetedBy(sa)) {
|
||||
List<Card> list = CardLists.getType(p.getCardsIn(ZoneType.Battlefield), sa.getParamOrDefault("Type", "Card"));
|
||||
for (Card c : list) {
|
||||
List<SpellAbility> possibleAb = Lists.newArrayList(c.getAllPossibleAbilities(p, true));
|
||||
if (isManaAb) {
|
||||
possibleAb.retainAll(c.getManaAbility());
|
||||
}
|
||||
if (possibleAb.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
SpellAbility manaAb = p.getController().chooseSingleSpellForEffect(possibleAb, sa, "Choose a mana ability:");
|
||||
p.getController().playChosenSpellAbility(manaAb);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,9 +1,11 @@
|
||||
package forge.game.ability.effects;
|
||||
|
||||
import forge.game.ability.SpellAbilityEffect;
|
||||
import forge.game.mana.Mana;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.spellability.TargetRestrictions;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
@@ -27,7 +29,12 @@ public class DrainManaEffect extends SpellAbilityEffect {
|
||||
|
||||
for (final Player p : getTargetPlayers(sa)) {
|
||||
if ((tgt == null) || p.canBeTargetedBy(sa)) {
|
||||
p.getManaPool().clearPool(false);
|
||||
List<Mana> drained = p.getManaPool().clearPool(false);
|
||||
if (sa.hasParam("DrainMana")) {
|
||||
for (Mana mana : drained) {
|
||||
sa.getActivatingPlayer().getManaPool().addMana(mana);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,15 +125,15 @@ public class ManaPool implements Iterable<Mana> {
|
||||
* @return - the amount of mana removed this way
|
||||
* </p>
|
||||
*/
|
||||
public final int clearPool(boolean isEndOfPhase) {
|
||||
public final List<Mana> clearPool(boolean isEndOfPhase) {
|
||||
// isEndOfPhase parameter: true = end of phase, false = mana drain effect
|
||||
if (floatingMana.isEmpty()) { return 0; }
|
||||
List<Mana> cleared = new ArrayList<Mana>();
|
||||
if (floatingMana.isEmpty()) { return cleared; }
|
||||
|
||||
if (isEndOfPhase && owner.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.manapoolsDontEmpty)) {
|
||||
return 0;
|
||||
return cleared;
|
||||
}
|
||||
|
||||
int numRemoved = 0;
|
||||
boolean keepGreenMana = isEndOfPhase && owner.hasKeyword("Green mana doesn't empty from your mana pool as steps and phases end.");
|
||||
boolean convertToColorless = owner.hasKeyword("Convert unused mana to Colorless");
|
||||
|
||||
@@ -153,11 +153,12 @@ public class ManaPool implements Iterable<Mana> {
|
||||
pMana.add(mana);
|
||||
}
|
||||
}
|
||||
floatingMana.get(b).removeAll(pMana);
|
||||
if (convertToColorless) {
|
||||
floatingMana.get(b).removeAll(pMana);
|
||||
convertManaColor(b, MagicColor.COLORLESS);
|
||||
floatingMana.get(b).addAll(pMana);
|
||||
} else {
|
||||
numRemoved += floatingMana.get(b).size() - pMana.size();
|
||||
cleared.addAll(floatingMana.get(b));
|
||||
floatingMana.get(b).clear();
|
||||
floatingMana.putAll(b, pMana);
|
||||
}
|
||||
@@ -166,14 +167,14 @@ public class ManaPool implements Iterable<Mana> {
|
||||
if (convertToColorless) {
|
||||
convertManaColor(b, MagicColor.COLORLESS);
|
||||
} else {
|
||||
numRemoved += floatingMana.get(b).size();
|
||||
cleared.addAll(floatingMana.get(b));
|
||||
floatingMana.get(b).clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
owner.getGame().fireEvent(new GameEventManaPool(owner, EventValueChangeType.Cleared, null));
|
||||
return numRemoved;
|
||||
return cleared;
|
||||
}
|
||||
|
||||
private void convertManaColor(final byte originalColor, final byte toColor) {
|
||||
|
||||
@@ -410,7 +410,7 @@ public class PhaseHandler implements java.io.Serializable, IGameStateObject {
|
||||
}
|
||||
|
||||
for (Player p : game.getPlayers()) {
|
||||
int burn = p.getManaPool().clearPool(true);
|
||||
int burn = p.getManaPool().clearPool(true).size();
|
||||
|
||||
boolean manaBurns = game.getRules().hasManaBurn();
|
||||
if (manaBurns) {
|
||||
|
||||
Reference in New Issue
Block a user