Merge branch 'trig' into 'master'

makeChoices for Trigger: move to stack entry

See merge request core-developers/forge!5028
This commit is contained in:
Michael Kamensky
2021-07-16 03:33:32 +00:00
5 changed files with 31 additions and 43 deletions

View File

@@ -510,7 +510,6 @@ public class AiController {
landList = unreflectedLands;
}
//try to skip lands that enter the battlefield tapped
if (!nonLandsInHand.isEmpty()) {
CardCollection nonTappedLands = new CardCollection();
@@ -534,6 +533,7 @@ public class AiController {
}
}
// TODO if this is the only source for a color we need badly prioritize it instead
if (foundTapped) {
continue;
}
@@ -2046,11 +2046,6 @@ public class AiController {
}
}
// check
for (int i = 0; i < library.size(); i++) {
System.out.println(library.get(i));
}
return library;
} // smoothComputerManaCurve()

View File

@@ -1899,8 +1899,7 @@ public class ComputerUtilMana {
if (!res.contains(a)) {
if (cost.isReusuableResource()) {
res.add(0, a);
}
else {
} else {
res.add(res.size(), a);
}
}

View File

@@ -31,8 +31,6 @@ import forge.game.IHasSVars;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.ability.effects.CharmEffect;
import forge.game.card.*;
import forge.game.player.Player;
import forge.game.spellability.AbilitySub;
@@ -347,7 +345,6 @@ public class TriggerHandler {
}
private boolean runNonStaticTriggersForPlayer(final Player player, final TriggerWaiting wt, final List<Trigger> delayedTriggersWorkingCopy) {
final TriggerType mode = wt.getMode();
final Map<AbilityKey, Object> runParams = wt.getParams();
final List<Trigger> triggers = wt.getTriggers() != null ? wt.getTriggers() : activeTriggers;
@@ -503,7 +500,6 @@ public class TriggerHandler {
// runs it if so.
// Return true if the trigger went off, false otherwise.
private void runSingleTriggerInternal(final Trigger regtrig, final Map<AbilityKey, Object> runParams) {
// All tests passed, execute ability.
if (regtrig instanceof TriggerTapsForMana) {
final SpellAbility abMana = (SpellAbility) runParams.get(AbilityKey.AbilityMana);
@@ -519,8 +515,7 @@ public class TriggerHandler {
if (sa == null) {
if (!regtrig.hasParam("Execute")) {
sa = new SpellAbility.EmptySa(host);
}
else {
} else {
String name = regtrig.getParam("Execute");
if (!host.getCurrentState().hasSVar(name)) {
System.err.println("Warning: tried to run a trigger for card " + host + " referencing a SVar " + name + " not present on the current state " + host.getCurrentState() + ". Aborting trigger execution to prevent a crash.");
@@ -577,12 +572,6 @@ public class TriggerHandler {
}
sa.setStackDescription(sa.toString());
if (sa.getApi() == ApiType.Charm && !sa.isWrapper()) {
if (!CharmEffect.makeChoices(sa)) {
// 603.3c If no mode is chosen, the ability is removed from the stack.
return;
}
}
Player decider = null;
boolean isMandatory = false;
@@ -592,8 +581,7 @@ public class TriggerHandler {
}
else if (sa instanceof AbilitySub || !sa.hasParam("Cost") || sa.getParam("Cost").equals("0")) {
isMandatory = true;
}
else { // triggers with a cost can't be mandatory
} else { // triggers with a cost can't be mandatory
sa.setOptionalTrigger(true);
decider = sa.getActivatingPlayer();
}
@@ -605,8 +593,7 @@ public class TriggerHandler {
wrapperAbility.setLastStateBattlefield(game.getLastStateBattlefield());
if (regtrig.isStatic()) {
wrapperAbility.getActivatingPlayer().getController().playTrigger(host, wrapperAbility, isMandatory);
}
else {
} else {
game.getStack().addSimultaneousStackEntry(wrapperAbility);
}

View File

@@ -549,7 +549,6 @@ public class WrappedAbility extends Ability {
sa.setXManaCostPaid(n);
}
public CardState getCardState() {
return sa.getCardState();
}

View File

@@ -40,6 +40,7 @@ import forge.game.GameObject;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.ability.effects.CharmEffect;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardUtil;
@@ -224,8 +225,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
undoStackOwner = activator;
}
undoStack.push(sp);
}
else {
} else {
clearUndoStack();
}
@@ -628,8 +628,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
if (sa.usesTargeting()) {
if (sa.isZeroTargets()) {
// Nothing targeted, and nothing needs to be targeted.
}
else {
} else {
// Some targets were chosen, fizzling for this subability is now possible
//fizzle = true;
// With multi-targets, as long as one target is still legal,
@@ -675,8 +674,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
}
else if (sa.getTargetCard() != null) {
fizzle = !sa.canTarget(sa.getTargetCard());
}
else {
} else {
// Set fizzle to the same as the parent if there's no target info
fizzle = parentFizzled;
}
@@ -809,9 +807,19 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
}
final List<SpellAbility> activePlayerSAs = Lists.newArrayList();
final List<SpellAbility> failedSAs = Lists.newArrayList();
for (int i = 0; i < simultaneousStackEntryList.size(); i++) {
SpellAbility sa = simultaneousStackEntryList.get(i);
Player activator = sa.getActivatingPlayer();
if (sa.getApi() == ApiType.Charm) {
if (!CharmEffect.makeChoices(sa)) {
// 603.3c If no mode is chosen, the ability is removed from the stack.
failedSAs.add(sa);
continue;
}
}
if (activator == null) {
if (sa.getHostCard().getController().equals(activePlayer)) {
activePlayerSAs.add(sa);
@@ -823,6 +831,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
}
}
simultaneousStackEntryList.removeAll(activePlayerSAs);
simultaneousStackEntryList.removeAll(failedSAs);
if (activePlayerSAs.isEmpty()) {
return false;
@@ -875,8 +884,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
public final void addCastCommand(final String valid, final GameCommand c) {
if (commandList.containsKey(valid)) {
commandList.get(valid).add(0, c);
}
else {
} else {
commandList.put(valid, Lists.newArrayList(c));
}
}