AF:Charm makes choices on being cast

remove unused imports
This commit is contained in:
Maxmtg
2012-11-06 06:08:28 +00:00
parent 24b362f939
commit 20188bce3f
6 changed files with 52 additions and 23 deletions

View File

@@ -30,7 +30,9 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.card.abilityfactory.AbilityFactory;
import forge.card.abilityfactory.ApiType;
import forge.card.abilityfactory.effects.AttachEffect;
import forge.card.abilityfactory.effects.CharmEffect;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.cost.Cost;
import forge.card.cost.CostPayment;
@@ -1954,6 +1956,11 @@ public class GameAction {
public final void playSpellAbility(SpellAbility sa) {
sa.setActivatingPlayer(Singletons.getControl().getPlayer());
AbilityFactory af = sa.getAbilityFactory();
if (af != null && af.getAPI() == ApiType.Charm && !sa.isWrapper()) {
CharmEffect.makeChoices(sa);
}
sa = GameAction.chooseOptionalAdditionalCosts(sa);
if (sa == null) {

View File

@@ -17,6 +17,7 @@ public enum ApiType {
Bond ( BondEffect.class, BondAi.class ),
ChangeZone(null, null), // not converted
ChangeZoneAll(ChangeZoneAllEffect.class, ChangeZoneAllAi.class), // classes extracted but not converted
/** This is <b>Modal</b>, like 'choose one - ' or 'choose two - '. <br> Might be great to rename this api and update all scripts.*/
Charm(CharmEffect.class, CharmAi.class),
ChooseCard ( ChooseCardEffect.class, ChooseCardAi.class ),
ChooseColor ( ChooseColorEffect.class, ChooseColorAi.class ),

View File

@@ -21,7 +21,6 @@ import forge.card.abilityfactory.ApiType;
import forge.card.abilityfactory.SpellAiLogic;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.cost.Cost;
import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target;
import forge.card.staticability.StaticAbility;
@@ -495,12 +494,6 @@ public class AttachAi extends SpellAiLogic {
}
}
// check SubAbilities DoTrigger?
final AbilitySub abSub = sa.getSubAbility();
if (abSub != null) {
return abSub.doTrigger(mandatory);
}
return true;
}

View File

@@ -30,6 +30,24 @@ public class CharmEffect extends SpellEffect {
@Override
public void resolve(java.util.Map<String,String> params, SpellAbility sa) {
// all chosen modes have been chained as subabilities to this sa.
// so nothing to do in this resolve
}
@Override
protected String getStackDescription(java.util.Map<String,String> params, SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
// nothing stack specific for Charm
return sb.toString();
}
public static void makeChoices(SpellAbility sa) {
AbilityFactory af = sa.getAbilityFactory();
final Map<String, String> params = af.getMapParams();
//this resets all previous choices
sa.setSubAbility(null);
final int num = Integer.parseInt(params.containsKey("CharmNum") ? params.get("CharmNum") : "1");
final int min = params.containsKey("MinCharmNum") ? Integer.parseInt(params.get("MinCharmNum")) : num;
@@ -59,21 +77,24 @@ public class CharmEffect extends SpellEffect {
else
chosen = CharmAi.chooseOptionsAi(activator, true, choices, num, min);
// if ( null == chosen) throw Exception! // only AI might return no list at all
for(AbilitySub as : chosen)
{
as.setActivatingPlayer(sa.getActivatingPlayer());
AbilityFactory.resolve(as, false);
chainAbilities(sa, chosen);
}
private static void chainAbilities(SpellAbility sa, List<AbilitySub> chosen) {
SpellAbility saDeepest = sa;
while( saDeepest.getSubAbility() != null)
saDeepest = saDeepest.getSubAbility();
for(AbilitySub sub : chosen){
saDeepest.setSubAbility(sub);
sub.setActivatingPlayer(saDeepest.getActivatingPlayer());
sub.setParent(saDeepest);
// to chain the next one
saDeepest = sub;
}
}
@Override
protected String getStackDescription(java.util.Map<String,String> params, SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
// nothing stack specific for Charm
return sb.toString();
}
}

View File

@@ -11,7 +11,6 @@ import forge.GameEntity;
import forge.Singletons;
import forge.card.abilityfactory.SpellEffect;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target;
import forge.game.player.Player;
import forge.game.zone.ZoneType;

View File

@@ -30,6 +30,8 @@ import forge.Command;
import forge.GameActionUtil;
import forge.Singletons;
import forge.card.abilityfactory.AbilityFactory;
import forge.card.abilityfactory.ApiType;
import forge.card.abilityfactory.effects.CharmEffect;
import forge.card.cost.Cost;
import forge.card.spellability.Ability;
import forge.card.spellability.AbilitySub;
@@ -486,7 +488,13 @@ public class TriggerHandler {
sa[0].setActivatingPlayer(p);
}
sa[0].setStackDescription(sa[0].toString());
// TODO - for Charms to supports AI, this needs to be removed
// ---TODO - for Charms to supports AI, this needs to be removed
//if (sa[0].getActivatingPlayer().isHuman()) {
final AbilityFactory af = sa[0].getAbilityFactory();
if (af != null && af.getAPI() == ApiType.Charm && !sa[0].isWrapper()) {
CharmEffect.makeChoices(sa[0]);
}
//}
boolean mand = false;
if (params.containsKey("OptionalDecider")) {
sa[0].setOptionalTrigger(true);