remove runOld and getReplacementListOld

This commit is contained in:
Ryan1729
2019-09-27 17:13:44 -06:00
parent a3b0d8ac3c
commit df4b0b03b9
12 changed files with 82 additions and 80 deletions

View File

@@ -2079,8 +2079,7 @@ public class AiController {
return true;
}
public ReplacementEffect chooseSingleReplacementEffect(List<ReplacementEffect> list,
Map<String, Object> runParams) {
public ReplacementEffect chooseSingleReplacementEffect(List<ReplacementEffect> list) {
// no need to choose anything
if (list.size() <= 1) {
return Iterables.getFirst(list, null);

View File

@@ -866,8 +866,8 @@ public class PlayerControllerAi extends PlayerController {
}
@Override
public ReplacementEffect chooseSingleReplacementEffect(String prompt, List<ReplacementEffect> possibleReplacers, Map<String, Object> runParams) {
return brains.chooseSingleReplacementEffect(possibleReplacers, runParams);
public ReplacementEffect chooseSingleReplacementEffect(String prompt, List<ReplacementEffect> possibleReplacers) {
return brains.chooseSingleReplacementEffect(possibleReplacers);
}
@Override

View File

@@ -10,6 +10,7 @@ import forge.card.MagicColor;
import forge.game.Game;
import forge.game.GameObject;
import forge.game.GlobalRuleChange;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.*;
@@ -1789,8 +1790,8 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
public boolean doReturnCommanderLogic(SpellAbility sa, Player aiPlayer) {
Map<String, Object> originalParams = (Map<String, Object>)sa.getReplacingObject("OriginalParams");
SpellAbility causeSa = (SpellAbility)originalParams.get("Cause");
Map<AbilityKey, Object> originalParams = (Map<AbilityKey, Object>)sa.getReplacingObject(AbilityKey.OriginalParams);
SpellAbility causeSa = (SpellAbility)originalParams.get(AbilityKey.Cause);
SpellAbility causeSub = null;
// Squee, the Immortal: easier to recast it (the call below has to be "contains" since SA is an intrinsic effect)

View File

@@ -85,6 +85,7 @@ public enum AbilityKey {
Origin("Origin"),
OriginalController("OriginalController"),
OriginalDefender("OriginalDefender"),
OriginalParams("OriginalParams"),
PayingMana("PayingMana"),
Phase("Phase"),
Player("Player"),
@@ -92,6 +93,7 @@ public enum AbilityKey {
Prevention("Prevention"),
Produced("Produced"),
Regeneration("Regeneration"),
ReplacementResult("ReplacementResult"),
Result("Result"),
Scheme("Scheme"),
Source("Source"),

View File

@@ -2,6 +2,7 @@ package forge.game.ability.effects;
import java.util.Map;
import forge.game.ability.AbilityKey;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Maps;
@@ -31,10 +32,10 @@ public class ReplaceDamageEffect extends SpellAbilityEffect {
String varValue = sa.getParamOrDefault("VarName", "1");
@SuppressWarnings("unchecked")
Map<String, Object> originalParams = (Map<String, Object>) sa.getReplacingObject("OriginalParams");
Map<String, Object> params = Maps.newHashMap(originalParams);
Map<AbilityKey, Object> originalParams = (Map<AbilityKey, Object>) sa.getReplacingObject(AbilityKey.OriginalParams);
Map<AbilityKey, Object> params = AbilityKey.newMap(originalParams);
Integer dmg = (Integer) sa.getReplacingObject("DamageAmount");
Integer dmg = (Integer) sa.getReplacingObject(AbilityKey.DamageAmount);
int prevent = AbilityUtils.calculateAmount(card, varValue, sa);
@@ -54,27 +55,27 @@ public class ReplaceDamageEffect extends SpellAbilityEffect {
// no damage for original target anymore
if (dmg <= 0) {
originalParams.put("ReplacementResult", ReplacementResult.Replaced);
originalParams.put(AbilityKey.ReplacementResult, ReplacementResult.Replaced);
return;
}
params.put("DamageAmount", dmg);
params.put(AbilityKey.DamageAmount, dmg);
//try to call replacementHandler with new Params
ReplacementResult result = game.getReplacementHandler().runOld(event, params);
ReplacementResult result = game.getReplacementHandler().run(event, params);
switch (result) {
case NotReplaced:
case Updated: {
for (Map.Entry<String, Object> e : params.entrySet()) {
for (Map.Entry<AbilityKey, Object> e : params.entrySet()) {
originalParams.put(e.getKey(), e.getValue());
}
// effect was updated
originalParams.put("ReplacementResult", ReplacementResult.Updated);
originalParams.put(AbilityKey.ReplacementResult, ReplacementResult.Updated);
break;
}
default:
// effect was replaced with something else
originalParams.put("ReplacementResult", result);
originalParams.put(AbilityKey.ReplacementResult, result);
break;
}
}

View File

@@ -7,6 +7,7 @@ import com.google.common.collect.Maps;
import forge.game.Game;
import forge.game.GameObject;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -23,14 +24,14 @@ public class ReplaceEffect extends SpellAbilityEffect {
final Card card = sa.getHostCard();
final Game game = card.getGame();
final String varName = sa.getParam("VarName");
final AbilityKey varName = AbilityKey.fromString(sa.getParam("VarName"));
final String varValue = sa.getParam("VarValue");
final String type = sa.getParamOrDefault("VarType", "amount");
final ReplacementType retype = sa.getReplacementEffect().getMode();
@SuppressWarnings("unchecked")
Map<String, Object> originalParams = (Map<String, Object>) sa.getReplacingObject("OriginalParams");
Map<String, Object> params = Maps.newHashMap(originalParams);
Map<AbilityKey, Object> originalParams = (Map<AbilityKey, Object>) sa.getReplacingObject(AbilityKey.OriginalParams);
Map<AbilityKey, Object> params = Maps.newHashMap(originalParams);
if ("Card".equals(type)) {
List<Card> list = AbilityUtils.getDefinedCards(card, varValue, sa);
@@ -56,25 +57,25 @@ public class ReplaceEffect extends SpellAbilityEffect {
params.put(varName, AbilityUtils.calculateAmount(card, varValue, sa));
}
if (params.containsKey("EffectOnly")) {
params.put("EffectOnly", true);
if (params.containsKey(AbilityKey.EffectOnly)) {
params.put(AbilityKey.EffectOnly, true);
}
//try to call replacementHandler with new Params
ReplacementResult result = game.getReplacementHandler().runOld(retype, params);
ReplacementResult result = game.getReplacementHandler().run(retype, params);
switch (result) {
case NotReplaced:
case Updated: {
for (Map.Entry<String, Object> e : params.entrySet()) {
for (Map.Entry<AbilityKey, Object> e : params.entrySet()) {
originalParams.put(e.getKey(), e.getValue());
}
// effect was updated
originalParams.put("ReplacementResult", ReplacementResult.Updated);
originalParams.put(AbilityKey.ReplacementResult, ReplacementResult.Updated);
break;
}
default:
// effect was replaced with something else
originalParams.put("ReplacementResult", result);
originalParams.put(AbilityKey.ReplacementResult, result);
break;
}
}

View File

@@ -3,6 +3,7 @@ package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
import forge.game.ability.AbilityKey;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Maps;
@@ -36,10 +37,10 @@ public class ReplaceSplitDamageEffect extends SpellAbilityEffect {
String varValue = sa.getParamOrDefault("VarName", "1");
@SuppressWarnings("unchecked")
Map<String, Object> originalParams = (Map<String, Object>) sa.getReplacingObject("OriginalParams");
Map<String, Object> params = Maps.newHashMap(originalParams);
Map<AbilityKey, Object> originalParams = (Map<AbilityKey , Object>) sa.getReplacingObject(AbilityKey.OriginalParams);
Map<AbilityKey, Object> params = AbilityKey.newMap(originalParams);
Integer dmg = (Integer) sa.getReplacingObject("DamageAmount");
Integer dmg = (Integer) sa.getReplacingObject(AbilityKey.DamageAmount);
int prevent = AbilityUtils.calculateAmount(card, varValue, sa);
@@ -57,15 +58,15 @@ public class ReplaceSplitDamageEffect extends SpellAbilityEffect {
card.setSVar(varValue, "Number$" + prevent);
}
Card sourceLKI = (Card) sa.getReplacingObject("Source");
Card sourceLKI = (Card) sa.getReplacingObject(AbilityKey.Source);
CardDamageMap damageMap = (CardDamageMap) originalParams.get("DamageMap");
CardDamageMap preventMap = (CardDamageMap) originalParams.get("PreventMap");
GameEntityCounterTable counterTable = (GameEntityCounterTable) originalParams.get("CounterTable");
SpellAbility cause = (SpellAbility) originalParams.get("Cause");
CardDamageMap damageMap = (CardDamageMap) originalParams.get(AbilityKey.DamageMap);
CardDamageMap preventMap = (CardDamageMap) originalParams.get(AbilityKey.PreventMap);
GameEntityCounterTable counterTable = (GameEntityCounterTable) originalParams.get(AbilityKey.CounterTable);
SpellAbility cause = (SpellAbility) originalParams.get(AbilityKey.Cause);
boolean isCombat = (Boolean) originalParams.get("IsCombat");
boolean noPrevention = (Boolean) originalParams.get("NoPreventDamage");
boolean isCombat = (Boolean) originalParams.get(AbilityKey.IsCombat);
boolean noPrevention = (Boolean) originalParams.get(AbilityKey.NoPreventDamage);
GameEntity obj = (GameEntity) list.get(0);
@@ -74,26 +75,26 @@ public class ReplaceSplitDamageEffect extends SpellAbilityEffect {
// no damage for original target anymore
if (dmg <= 0) {
originalParams.put("ReplacementResult", ReplacementResult.Replaced);
originalParams.put(AbilityKey.ReplacementResult, ReplacementResult.Replaced);
return;
}
params.put("DamageAmount", dmg);
params.put(AbilityKey.DamageAmount, dmg);
//try to call replacementHandler with new Params
ReplacementResult result = game.getReplacementHandler().runOld(event, params);
ReplacementResult result = game.getReplacementHandler().run(event, params);
switch (result) {
case NotReplaced:
case Updated: {
for (Map.Entry<String, Object> e : params.entrySet()) {
for (Map.Entry<AbilityKey, Object> e : params.entrySet()) {
originalParams.put(e.getKey(), e.getValue());
}
// effect was updated
originalParams.put("ReplacementResult", ReplacementResult.Updated);
originalParams.put(AbilityKey.ReplacementResult, ReplacementResult.Updated);
break;
}
default:
// effect was replaced with something else
originalParams.put("ReplacementResult", result);
originalParams.put(AbilityKey.ReplacementResult, result);
break;
}
}

View File

@@ -211,7 +211,7 @@ public abstract class PlayerController {
Map<String, Object> params);
public abstract boolean confirmPayment(CostPart costPart, String string, SpellAbility sa);
public abstract ReplacementEffect chooseSingleReplacementEffect(String prompt, List<ReplacementEffect> possibleReplacers, Map<String, Object> runParams);
public abstract ReplacementEffect chooseSingleReplacementEffect(String prompt, List<ReplacementEffect> possibleReplacers);
public abstract String chooseProtectionType(String string, SpellAbility sa, List<String> choices);
// these 4 need some refining.

View File

@@ -56,22 +56,16 @@ public class ReplacementHandler {
//private final List<ReplacementEffect> tmpEffects = new ArrayList<ReplacementEffect>();
public List<ReplacementEffect> getReplacementList(final ReplacementType event, final Map<AbilityKey, Object> runParams, final ReplacementLayer layer) {
return getReplacementListOld(event, toStringMap(runParams), layer);
}
// The plan is to slowly refactor any usages of getReplacementListOld to use getReplacementList. Then we can just inline
// getReplacementListOld into getReplacementList and change the code inside to just always use a Map<AbilityKey, Object>.
// The reason we can't just call them both getReplacementList is because we get a same erasure compile error if we do.
private List<ReplacementEffect> getReplacementListOld(final ReplacementType event, final Map<String, Object> runParams, final ReplacementLayer layer) {
final CardCollection preList = new CardCollection();
boolean checkAgain = false;
Card affectedLKI = null;
Card affectedCard = null;
if (ReplacementType.Moved.equals(event) && ZoneType.Battlefield.equals(runParams.get("Destination"))) {
if (ReplacementType.Moved.equals(event) && ZoneType.Battlefield.equals(runParams.get(AbilityKey.Destination))) {
// if it was caused by an replacement effect, use the already calculated RE list
// otherwise the RIOT card would cause a StackError
SpellAbility cause = (SpellAbility) runParams.get("Cause");
SpellAbility cause = (SpellAbility) runParams.get(AbilityKey.Cause);
if (cause != null && cause.isReplacementAbility()) {
final ReplacementEffect re = cause.getReplacementEffect();
// only return for same layer
@@ -81,13 +75,13 @@ public class ReplacementHandler {
}
// Rule 614.12 Enter the Battlefield Replacement Effects look at what the card would be on the battlefield
affectedCard = (Card) runParams.get("Affected");
affectedCard = (Card) runParams.get(AbilityKey.Affected);
affectedLKI = CardUtil.getLKICopy(affectedCard);
affectedLKI.setLastKnownZone(affectedCard.getController().getZone(ZoneType.Battlefield));
preList.add(affectedLKI);
game.getAction().checkStaticAbilities(false, Sets.newHashSet(affectedLKI), preList);
checkAgain = true;
runParams.put("Affected", affectedLKI);
runParams.put(AbilityKey.Affected, affectedLKI);
}
final List<ReplacementEffect> possibleReplacers = Lists.newArrayList();
@@ -124,7 +118,7 @@ public class ReplacementHandler {
&& (layer == null || replacementEffect.getLayer() == layer)
&& event.equals(replacementEffect.getMode())
&& replacementEffect.requirementsCheck(game)
&& replacementEffect.canReplace(runParams)
&& replacementEffect.canReplace(toStringMap(runParams))
&& !possibleReplacers.contains(replacementEffect)
&& replacementEffect.zonesCheck(cardZone)) {
possibleReplacers.add(replacementEffect);
@@ -142,7 +136,7 @@ public class ReplacementHandler {
for (final ReplacementEffect re : affectedLKI.getReplacementEffects()) {
re.setHostCard(affectedCard);
}
runParams.put("Affected", affectedCard);
runParams.put(AbilityKey.Affected, affectedCard);
}
game.getAction().checkStaticAbilities(false);
}
@@ -159,15 +153,7 @@ public class ReplacementHandler {
* @return ReplacementResult, an enum that represents what happened to the replacement effect.
*/
public ReplacementResult run(ReplacementType event, final Map<AbilityKey, Object> runParams) {
return runOld(event, toStringMap(runParams));
}
// The plan is to slowly refactor any usages of runOld to use run. Then we can just inline
// runOld into run and change the code inside to just always use a Map<AbilityKey, Object>.
// The reason we can't just call them both run is because we get a same erasure compile error if we do.
@Deprecated
public ReplacementResult runOld(ReplacementType event, final Map<String, Object> runParams) {
final Object affected = runParams.get("Affected");
final Object affected = runParams.get(AbilityKey.Affected);
Player decider = null;
// Figure out who decides which of multiple replacements to apply
@@ -190,15 +176,14 @@ public class ReplacementHandler {
}
@Deprecated
private ReplacementResult run(final ReplacementType event, final Map<String, Object> runParams, final ReplacementLayer layer, final Player decider) {
final List<ReplacementEffect> possibleReplacers = getReplacementListOld(event, runParams, layer);
private ReplacementResult run(final ReplacementType event, final Map<AbilityKey, Object> runParams, final ReplacementLayer layer, final Player decider) {
final List<ReplacementEffect> possibleReplacers = getReplacementList(event, runParams, layer);
if (possibleReplacers.isEmpty()) {
return ReplacementResult.NotReplaced;
}
ReplacementEffect chosenRE = decider.getController().chooseSingleReplacementEffect("Choose a replacement effect to apply first.", possibleReplacers, runParams);
ReplacementEffect chosenRE = decider.getController().chooseSingleReplacementEffect("Choose a replacement effect to apply first.", possibleReplacers);
possibleReplacers.remove(chosenRE);
@@ -207,7 +192,7 @@ public class ReplacementHandler {
ReplacementResult res = executeReplacement(runParams, chosenRE, decider, game);
if (res == ReplacementResult.NotReplaced) {
if (!possibleReplacers.isEmpty()) {
res = runOld(event, runParams);
res = run(event, runParams);
}
chosenRE.setHasRun(false);
chosenRE.setOtherChoices(null);
@@ -231,7 +216,7 @@ public class ReplacementHandler {
* @param replacementEffect
* the replacement effect to run
*/
private ReplacementResult executeReplacement(final Map<String, Object> runParams,
private ReplacementResult executeReplacement(final Map<AbilityKey, Object> runParams,
final ReplacementEffect replacementEffect, final Player decider, final Game game) {
final Map<String, String> mapParams = replacementEffect.getMapParams();
@@ -253,9 +238,9 @@ public class ReplacementHandler {
SpellAbility tailend = effectSA;
do {
replacementEffect.setReplacingObjects(runParams, tailend);
replacementEffect.setReplacingObjects(toStringMap(runParams), tailend);
//set original Params to update them later
tailend.setReplacingObject("OriginalParams", runParams);
tailend.setReplacingObject(AbilityKey.OriginalParams, runParams);
tailend = tailend.getSubAbility();
} while(tailend != null);
@@ -264,9 +249,9 @@ public class ReplacementHandler {
effectSA = replacementEffect.getOverridingAbility();
SpellAbility tailend = effectSA;
do {
replacementEffect.setReplacingObjects(runParams, tailend);
replacementEffect.setReplacingObjects(toStringMap(runParams), tailend);
//set original Params to update them later
tailend.setReplacingObject("OriginalParams", runParams);
tailend.setReplacingObject(AbilityKey.OriginalParams, runParams);
tailend = tailend.getSubAbility();
} while(tailend != null);
}
@@ -293,7 +278,7 @@ public class ReplacementHandler {
Card cardForUi = host.getCardForUi();
String effectDesc = TextUtil.fastReplace(replacementEffect.toString(), "CARDNAME", cardForUi.getName());
final String question = replacementEffect instanceof ReplaceDiscard
? TextUtil.concatWithSpace("Apply replacement effect of", cardForUi.toString(), "to", TextUtil.addSuffix(runParams.get("Card").toString(),"?\r\n"), TextUtil.enclosedParen(effectDesc))
? TextUtil.concatWithSpace("Apply replacement effect of", cardForUi.toString(), "to", TextUtil.addSuffix(runParams.get(AbilityKey.Card).toString(),"?\r\n"), TextUtil.enclosedParen(effectDesc))
: TextUtil.concatWithSpace("Apply replacement effect of", TextUtil.addSuffix(cardForUi.toString(),"?\r\n"), TextUtil.enclosedParen(effectDesc));
boolean confirmed = optDecider.getController().confirmReplacementEffect(replacementEffect, effectSA, question);
if (!confirmed) {
@@ -310,9 +295,9 @@ public class ReplacementHandler {
Player player = host.getController();
if (mapParams.containsKey("ManaReplacement")) {
final SpellAbility manaAb = (SpellAbility) runParams.get("AbilityMana");
final Player player1 = (Player) runParams.get("Player");
final String rep = (String) runParams.get("Mana");
final SpellAbility manaAb = (SpellAbility) runParams.get(AbilityKey.AbilityMana);
final Player player1 = (Player) runParams.get(AbilityKey.Player);
final String rep = (String) runParams.get(AbilityKey.Mana);
// Replaced mana type
final Card repHost = host;
String repType = repHost.getSVar(mapParams.get("ManaReplacement"));
@@ -325,8 +310,8 @@ public class ReplacementHandler {
player.getController().playSpellAbilityNoStack(effectSA, true);
// if the spellability is a replace effect then its some new logic
// if ReplacementResult is set in run params use that instead
if (runParams.containsKey("ReplacementResult")) {
return (ReplacementResult) runParams.get("ReplacementResult");
if (runParams.containsKey(AbilityKey.ReplacementResult)) {
return (ReplacementResult) runParams.get(AbilityKey.ReplacementResult);
}
}

View File

@@ -599,10 +599,22 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
public boolean hasReplacingObject(final String type) {
return replacingObjects.containsKey(type);
}
public Object getReplacingObject(final AbilityKey type) {
return getReplacingObject(type.toString());
}
// Eventually we want to switch the internal map to be a `Map<AbilityKey, Object>` instead of a
// `Map<String, Object>`.
@Deprecated
public Object getReplacingObject(final String type) {
final Object res = replacingObjects.get(type);
return res;
}
public void setReplacingObject(final AbilityKey type, final Object o) {
setReplacingObject(type.toString(), o);
}
// Eventually we want to switch the internal map to be a `Map<AbilityKey, Object>` instead of a
// `Map<String, Object>`.
@Deprecated
public void setReplacingObject(final String type, final Object o) {
replacingObjects.put(type, o);
}

View File

@@ -506,7 +506,7 @@ public class PlayerControllerForTests extends PlayerController {
}
@Override
public ReplacementEffect chooseSingleReplacementEffect(String prompt, List<ReplacementEffect> possibleReplacers, Map<String, Object> runParams) {
public ReplacementEffect chooseSingleReplacementEffect(String prompt, List<ReplacementEffect> possibleReplacers) {
// TODO Auto-generated method stub
return Iterables.getFirst(possibleReplacers, null);
}

View File

@@ -1587,7 +1587,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
@Override
public ReplacementEffect chooseSingleReplacementEffect(final String prompt,
final List<ReplacementEffect> possibleReplacers, final Map<String, Object> runParams) {
final List<ReplacementEffect> possibleReplacers) {
final ReplacementEffect first = possibleReplacers.get(0);
if (possibleReplacers.size() == 1) {
return first;