mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 20:28:00 +00:00
Add dice rolling
This commit is contained in:
@@ -115,8 +115,8 @@ public final class AbilityFactory {
|
||||
*
|
||||
* @param abString
|
||||
* a {@link java.lang.String} object.
|
||||
* @param hostCard
|
||||
* a {@link forge.game.card.Card} object.
|
||||
* @param state
|
||||
* a {@link forge.game.card.CardState} object.
|
||||
* @return a {@link forge.game.spellability.SpellAbility} object.
|
||||
*/
|
||||
public static final SpellAbility getAbility(final String abString, final CardState state) {
|
||||
@@ -282,6 +282,14 @@ public final class AbilityFactory {
|
||||
}
|
||||
}
|
||||
|
||||
if (api == ApiType.RollDice) {
|
||||
for (String param : mapParams.keySet()) {
|
||||
if (param.startsWith("On") || param.equals("Else")) {
|
||||
spellAbility.setAdditionalAbility(param, getSubAbility(state, mapParams.get(param), sVarHolder));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (spellAbility instanceof SpellApiBased && hostCard.isPermanent()) {
|
||||
String desc = mapParams.containsKey("SpellDescription") ? mapParams.get("SpellDescription")
|
||||
: spellAbility.getHostCard().getName();
|
||||
@@ -386,7 +394,6 @@ public final class AbilityFactory {
|
||||
*
|
||||
* @param sa
|
||||
* a {@link forge.game.spellability.SpellAbility} object.
|
||||
* @param mapParams
|
||||
*/
|
||||
private static final void initializeParams(final SpellAbility sa) {
|
||||
|
||||
@@ -402,7 +409,6 @@ public final class AbilityFactory {
|
||||
*
|
||||
* @param sa
|
||||
* a {@link forge.game.spellability.SpellAbility} object.
|
||||
* @param mapParams
|
||||
*/
|
||||
private static final void makeRestrictions(final SpellAbility sa) {
|
||||
// SpellAbilityRestrictions should be added in here
|
||||
@@ -417,7 +423,6 @@ public final class AbilityFactory {
|
||||
*
|
||||
* @param sa
|
||||
* a {@link forge.game.spellability.SpellAbility} object.
|
||||
* @param mapParams
|
||||
*/
|
||||
private static final void makeConditions(final SpellAbility sa) {
|
||||
// SpellAbilityRestrictions should be added in here
|
||||
|
||||
@@ -143,6 +143,7 @@ public enum ApiType {
|
||||
Reveal (RevealEffect.class),
|
||||
RevealHand (RevealHandEffect.class),
|
||||
ReverseTurnOrder (ReverseTurnOrderEffect.class),
|
||||
RollDice (RollDiceEffect.class),
|
||||
RollPlanarDice (RollPlanarDiceEffect.class),
|
||||
RunChaos (RunChaosEffect.class),
|
||||
Sacrifice (SacrificeEffect.class),
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
package forge.game.ability.effects;
|
||||
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.ability.AbilityUtils;
|
||||
import forge.game.ability.SpellAbilityEffect;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.player.PlayerCollection;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.trigger.TriggerType;
|
||||
import forge.util.Localizer;
|
||||
import forge.util.MyRandom;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class RollDiceEffect extends SpellAbilityEffect {
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.card.abilityfactory.SpellEffect#getStackDescription(java.util.Map, forge.card.spellability.SpellAbility)
|
||||
*/
|
||||
@Override
|
||||
protected String getStackDescription(SpellAbility sa) {
|
||||
final PlayerCollection player = getTargetPlayers(sa);
|
||||
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
if (player.size() == 1 && player.get(0).equals(sa.getActivatingPlayer())) {
|
||||
stringBuilder.append("Roll ");
|
||||
} else {
|
||||
stringBuilder.append(player).append(" rolls ");
|
||||
}
|
||||
stringBuilder.append(sa.getParamOrDefault("Amt", "a")).append(" ");
|
||||
stringBuilder.append(sa.getParamOrDefault("Sides", "6")).append("-sided ");
|
||||
if (sa.getParamOrDefault("Amt", "1").equals("1")) {
|
||||
stringBuilder.append("die.");
|
||||
} else {
|
||||
stringBuilder.append("dice.");
|
||||
}
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.card.ability.SpellAbilityEffect#resolve(forge.card.spellability.SpellAbility)
|
||||
*/
|
||||
@Override
|
||||
public void resolve(SpellAbility sa) {
|
||||
final Card host = sa.getHostCard();
|
||||
|
||||
int amount = AbilityUtils.calculateAmount(host, sa.getParamOrDefault("Amt", "1"), sa);
|
||||
int sides = AbilityUtils.calculateAmount(host, sa.getParamOrDefault("Sides", "6"), sa);
|
||||
|
||||
final PlayerCollection playersToRoll = getTargetPlayers(sa);
|
||||
|
||||
for(Player player : playersToRoll) {
|
||||
int total = 0;
|
||||
List<Integer> rolls = new ArrayList<>();
|
||||
for (int i = 0; i < amount; i++) {
|
||||
int roll = MyRandom.getRandom().nextInt(sides) + 1;
|
||||
rolls.add(roll);
|
||||
|
||||
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
|
||||
runParams.put(AbilityKey.Player, player);
|
||||
runParams.put(AbilityKey.Result, roll);
|
||||
player.getGame().getTriggerHandler().runTrigger(TriggerType.RolledDie, runParams, false);
|
||||
|
||||
total += roll;
|
||||
}
|
||||
|
||||
String message = Localizer.getInstance().getMessage("lblPlayerRolledResult", player, StringUtils.join(rolls, ", "));
|
||||
player.getGame().getAction().nofityOfValue(sa, player, message, null);
|
||||
|
||||
if (sa.hasParam("ResultSVar")) {
|
||||
host.setSVar(sa.getParam("ResultSVar"), ""+total);
|
||||
}
|
||||
if (sa.hasAdditionalAbility("OnDoubles") && rolls.get(0).equals(rolls.get(1))) {
|
||||
AbilityUtils.resolve(sa.getAdditionalAbility("OnDoubles"));
|
||||
}
|
||||
if (sa.hasAdditionalAbility("On"+total)) {
|
||||
AbilityUtils.resolve(sa.getAdditionalAbility("On"+total));
|
||||
} else if (sa.hasAdditionalAbility("Else")) {
|
||||
AbilityUtils.resolve(sa.getAdditionalAbility("Else"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -119,6 +119,8 @@ public enum CounterEnumType {
|
||||
|
||||
FUNGUS("FNGUS", 121, 219, 151),
|
||||
|
||||
FUNK("FUNK", 215, 24, 222),
|
||||
|
||||
FURY("FURY", 255, 120, 89),
|
||||
|
||||
FUSE("FUSE", 255, 122, 85),
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
package forge.game.trigger;
|
||||
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.util.Expressions;
|
||||
import forge.util.Localizer;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class TriggerRolledDie extends Trigger {
|
||||
|
||||
public TriggerRolledDie(final Map<String, String> params, final Card host, final boolean intrinsic) {
|
||||
super(params, host, intrinsic);
|
||||
}
|
||||
|
||||
/** {@inheritDoc}
|
||||
* @param runParams*/
|
||||
@Override
|
||||
public final boolean performTest(final Map<AbilityKey, Object> runParams) {
|
||||
if (hasParam("ValidPlayer")) {
|
||||
if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","),
|
||||
this.getHostCard())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (hasParam("ValidResult")) {
|
||||
String[] params = getParam("ValidResult").split(",");
|
||||
final int result = (int) runParams.get(AbilityKey.Result);
|
||||
for (String param : params) {
|
||||
if (StringUtils.isNumeric(param)) {
|
||||
if (param.equals("" + result)) return true;
|
||||
} else {
|
||||
final String comp = param.substring(0, 2);
|
||||
final int rightSide = Integer.parseInt(param.substring(2));
|
||||
if (Expressions.compare(result, comp, rightSide)) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {
|
||||
sa.setTriggeringObjectsFrom(runParams, AbilityKey.Result, AbilityKey.Player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getImportantStackObjects(SpellAbility sa) {
|
||||
return Localizer.getInstance().getMessage("lblPlayer") + ": " + sa.getTriggeringObject(AbilityKey.Player) + ", " +
|
||||
Localizer.getInstance().getMessage("lblResultIs", sa.getTriggeringObject(AbilityKey.Result));
|
||||
}
|
||||
}
|
||||
@@ -84,6 +84,7 @@ public enum TriggerType {
|
||||
PlaneswalkedTo(TriggerPlaneswalkedTo.class),
|
||||
Regenerated(TriggerRegenerated.class),
|
||||
Revealed(TriggerRevealed.class),
|
||||
RolledDie(TriggerRolledDie.class),
|
||||
Sacrificed(TriggerSacrificed.class),
|
||||
Scry(TriggerScry.class),
|
||||
SearchedLibrary(TriggerSearchedLibrary.class),
|
||||
|
||||
Reference in New Issue
Block a user