diff --git a/forge-core/src/main/java/forge/card/CardRulesPredicates.java b/forge-core/src/main/java/forge/card/CardRulesPredicates.java index 131b6c738cf..b5727b9cbec 100644 --- a/forge-core/src/main/java/forge/card/CardRulesPredicates.java +++ b/forge-core/src/main/java/forge/card/CardRulesPredicates.java @@ -604,6 +604,7 @@ public final class CardRulesPredicates { }; public static final Predicate IS_PLANESWALKER = CardRulesPredicates.coreType(true, CardType.CoreType.Planeswalker); + public static final Predicate IS_BATTLE = CardRulesPredicates.coreType(true, CardType.CoreType.Battle); public static final Predicate IS_INSTANT = CardRulesPredicates.coreType(true, CardType.CoreType.Instant); public static final Predicate IS_SORCERY = CardRulesPredicates.coreType(true, CardType.CoreType.Sorcery); public static final Predicate IS_ENCHANTMENT = CardRulesPredicates.coreType(true, CardType.CoreType.Enchantment); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardTypeFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardTypeFilter.java index a80e406082b..a3e1de165ae 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardTypeFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardTypeFilter.java @@ -37,6 +37,7 @@ public class CardTypeFilter extends StatTypeFilter { addToggleButton(widget, StatTypes.PLANESWALKER); addToggleButton(widget, StatTypes.INSTANT); addToggleButton(widget, StatTypes.SORCERY); + addToggleButton(widget, StatTypes.BATTLE); } @Override diff --git a/forge-gui-mobile/src/forge/assets/FSkin.java b/forge-gui-mobile/src/forge/assets/FSkin.java index e209547ea4f..d0f2fdd411d 100644 --- a/forge-gui-mobile/src/forge/assets/FSkin.java +++ b/forge-gui-mobile/src/forge/assets/FSkin.java @@ -217,7 +217,7 @@ public class FSkin { final FileHandle f4 = getDefaultSkinFile(ForgeConstants.SPRITE_AVATARS_FILE); final FileHandle f5 = getSkinFile(ForgeConstants.SPRITE_AVATARS_FILE); final FileHandle f6 = getDefaultSkinFile(SourceFile.OLD_FOILS.getFilename()); - final FileHandle f7 = getSkinFile(ForgeConstants.SPRITE_MANAICONS_FILE); + final FileHandle f7 = getDefaultSkinFile(ForgeConstants.SPRITE_MANAICONS_FILE); final FileHandle f8 = getDefaultSkinFile(ForgeConstants.SPRITE_SLEEVES_FILE); final FileHandle f9 = getDefaultSkinFile(ForgeConstants.SPRITE_SLEEVES2_FILE); final FileHandle f10 = getDefaultSkinFile(ForgeConstants.SPRITE_BORDER_FILE); diff --git a/forge-gui-mobile/src/forge/assets/FSkinImage.java b/forge-gui-mobile/src/forge/assets/FSkinImage.java index 786b8e62f8e..81901cca2e6 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinImage.java +++ b/forge-gui-mobile/src/forge/assets/FSkinImage.java @@ -326,6 +326,7 @@ public enum FSkinImage implements FImage { PLANESWALKER (FSkinProp.IMG_PLANESWALKER, SourceFile.MANAICONS), PACK (FSkinProp.IMG_PACK, SourceFile.ICONS), SORCERY (FSkinProp.IMG_SORCERY, SourceFile.MANAICONS), + BATTLE (FSkinProp.IMG_BATTLE, SourceFile.MANAICONS), COMMANDER (FSkinProp.IMG_COMMANDER, SourceFile.ICONS), //Buttons diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index 867e076619c..e55dd3f79a7 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -150,7 +150,7 @@ public class CardImageRenderer { float ptBoxHeight = 0; float textBoxHeight = h - headerHeight - artHeight - typeBoxHeight - outerBorderThickness - artInset; - if (state.isCreature() || state.isPlaneswalker() || state.getType().hasSubtype("Vehicle")) { + if (state.isCreature() || state.isPlaneswalker() || state.getType().hasSubtype("Vehicle") || state.isBattle()) { ptBoxHeight = 2 * PT_FONT.getCapHeight(); } //space for artist @@ -721,6 +721,8 @@ public class CardImageRenderer { pieces.add("/"); pieces.add(String.valueOf(state.getToughness())); pieces.add("]"); + } else if (state.isBattle()) { + pieces.add(String.valueOf(state.getDefense())); } else { return; } diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 9a57dc1f4d5..9387ef759fe 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -533,6 +533,8 @@ public class CardRenderer { type += " (" + loyalty + ")"; } else if (card.getCurrentState().getType().hasSubtype("Vehicle")) { type += String.format(" [%s / %s]", power, toughness); + } else if (card.getCurrentState().isBattle()) { + type += " (" + card.getCurrentState().getDefense() + ")"; } g.drawText(type, typeFont, foreColor, x, y, availableTypeWidth, lineHeight, false, Align.left, true); } diff --git a/forge-gui-mobile/src/forge/card/CardZoom.java b/forge-gui-mobile/src/forge/card/CardZoom.java index af1f739329c..9068323150d 100644 --- a/forge-gui-mobile/src/forge/card/CardZoom.java +++ b/forge-gui-mobile/src/forge/card/CardZoom.java @@ -66,6 +66,8 @@ public class CardZoom extends FOverlay { } public static void show(final List items0, int currentIndex0, ActivateHandler activateHandler0) { + if (items == null) { return; } + if (currentIndex0 < 0 || items.size() <= currentIndex0) { return; } items = items0; activateHandler = activateHandler0; currentIndex = currentIndex0; diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/CardTypeFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/CardTypeFilter.java index 167beaaeb2a..e27218dcd8b 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/CardTypeFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/CardTypeFilter.java @@ -34,6 +34,7 @@ public class CardTypeFilter extends StatTypeFilter { addToggleButton(widget, StatTypes.PLANESWALKER); addToggleButton(widget, StatTypes.INSTANT); addToggleButton(widget, StatTypes.SORCERY); + addToggleButton(widget, StatTypes.BATTLE); } @Override diff --git a/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java b/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java index 365697fe63d..f1b799143f8 100644 --- a/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java @@ -89,7 +89,7 @@ public class TargetingOverlay { } if (null != combat) { final GameEntityView defender = combat.getDefender(c); - // if c is attacking a planeswalker + // if c is attacking a planeswalker or battle if (defender instanceof CardView) { drawArrow(g, endpoints.get(defender.getId()), endpoints.get(c.getId()), ArcConnection.FoesAttacking); } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAssignCombatDamage.java b/forge-gui-mobile/src/forge/screens/match/views/VAssignCombatDamage.java index 806d66e948c..70e2dd8a717 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAssignCombatDamage.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAssignCombatDamage.java @@ -88,14 +88,6 @@ public class VAssignCombatDamage extends FDialog { throw new RuntimeException("Asking to assign damage to object which is not present in defenders list"); } - /** Constructor. - * - * @param attacker0 {@link forge.game.card.Card} - * @param blockers List<{@link forge.game.card.Card}> - * @param damage0 int - * @param defender GameEntity that's bein attacked - * @param overrideOrder override combatant order - */ public VAssignCombatDamage(final CardView attacker, final List blockers, final int damage0, final GameEntityView defender0, boolean overrideOrder, boolean maySkip, final WaitCallback> waitCallback) { super(Forge.getLocalizer().getMessage("lbLAssignDamageDealtBy").replace("%s",CardTranslation.getTranslatedName(attacker.getName())) , 3); @@ -420,8 +412,6 @@ public class VAssignCombatDamage extends FDialog { return totalDamageToAssign - spent; } - /** Updates labels and other UI elements. - * @param index index of the last assigned damage*/ private void updateLabels() { int damageLeft = totalDamageToAssign; boolean allHaveLethal = true; @@ -469,13 +459,19 @@ public class VAssignCombatDamage extends FDialog { } else if (defender instanceof CardView) { // planeswalker CardView pw = (CardView)defender; - lethalDamage = Integer.valueOf(pw.getCurrentState().getLoyalty()); + if (((CardView) defender).getCurrentState().isPlaneswalker()) { + lethalDamage = Integer.parseInt(pw.getCurrentState().getLoyalty()); + } else { + lethalDamage = Integer.parseInt(pw.getCurrentState().getDefense()); + } } } else { lethalDamage = Math.max(0, source.getLethalDamage()); if (source.getCurrentState().getType().isPlaneswalker()) { - lethalDamage = Integer.valueOf(source.getCurrentState().getLoyalty()); + lethalDamage = Integer.parseInt(source.getCurrentState().getLoyalty()); + } else if (source.getCurrentState().getType().isBattle()) { + lethalDamage = Integer.parseInt(source.getCurrentState().getDefense()); } else if (attackerHasDeathtouch) { lethalDamage = Math.min(lethalDamage, 1); } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VReveal.java b/forge-gui-mobile/src/forge/screens/match/views/VReveal.java index ae8eee12c92..ae0a15d99ca 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VReveal.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VReveal.java @@ -176,6 +176,8 @@ public class VReveal extends FDropDown { type += " (" + paperCard.getRules().getPower() + " / " + paperCard.getRules().getToughness() + ")"; } else if (paperCard.getRules().getType().isPlaneswalker()) { type += " (" + paperCard.getRules().getInitialLoyalty() + ")"; + } else if (paperCard.getRules().getType().isBattle()) { + type += " (" + paperCard.getRules().getDefense() + ")"; } else if (paperCard.getRules().getType().hasSubtype("Vehicle")) { type += String.format(" [%s / %s]", paperCard.getRules().getPower(), paperCard.getRules().getToughness()); } diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index ddcc90817c0..b5e49a87152 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -824,6 +824,7 @@ lblEnchantments=Enchantments lblPlaneswalkers=Planeswalkers lblInstants=Instants lblSorceries=Sorceries +lblBattles=Battles lblCCMC0=Cards with mana value 0 lblCCMC1=Cards with mana value 1 lblCCMC2=Cards with mana value 2 diff --git a/forge-gui/res/skins/default/sprite_manaicons.png b/forge-gui/res/skins/default/sprite_manaicons.png index 510a9f70688..1984711327f 100644 Binary files a/forge-gui/res/skins/default/sprite_manaicons.png and b/forge-gui/res/skins/default/sprite_manaicons.png differ diff --git a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java index 9e0808c2f45..40bd8bfd68a 100644 --- a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java @@ -97,7 +97,7 @@ public enum GroupDef { if (type.isLand()) { //make Artifact Lands appear in Lands group return 2; } - if (type.isArtifact() || type.isEnchantment() || type.isPlaneswalker() || type.isInstant() || type.isSorcery()) { + if (type.isArtifact() || type.isEnchantment() || type.isPlaneswalker() || type.isInstant() || type.isSorcery() || type.isBattle()) { return 1; } } @@ -106,7 +106,7 @@ public enum GroupDef { }), CARD_TYPE("lblType", - new String[] { "Planeswalker", "Creature", "Sorcery", "Instant", "Artifact", "Enchantment", "Land", "Tribal instant" }, + new String[] { "Planeswalker", "Creature", "Sorcery", "Instant", "Artifact", "Enchantment", "Land", "Tribal instant", "Battle" }, new Function() { @Override public ColumnDef apply(final Integer groupIndex) { @@ -142,6 +142,9 @@ public enum GroupDef { if (type.isEnchantment()) { return 5; } + if (type.isBattle()) { + return 8; + } if (type.isLand()) { return 6; } diff --git a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java index 96a15a9210d..712f4aae0a4 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java @@ -47,6 +47,7 @@ public final class SItemManagerUtil { PLANESWALKER (FSkinProp.IMG_PLANESWALKER, CardRulesPredicates.Presets.IS_PLANESWALKER, "lblPlaneswalkers"), INSTANT (FSkinProp.IMG_INSTANT, CardRulesPredicates.Presets.IS_INSTANT, "lblInstants"), SORCERY (FSkinProp.IMG_SORCERY, CardRulesPredicates.Presets.IS_SORCERY, "lblSorceries"), + BATTLE (FSkinProp.IMG_BATTLE, CardRulesPredicates.Presets.IS_BATTLE, "lblBattles"), CMC_0 (FSkinProp.IMG_MANA_0, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 0), "lblCCMC0"), CMC_1 (FSkinProp.IMG_MANA_1, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 1), "lblCCMC1"), diff --git a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java index 67244b90ccc..b56cf612abf 100644 --- a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java +++ b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java @@ -363,6 +363,7 @@ public enum FSkinProp { IMG_PLANESWALKER (new int[] {330, 740, 80, 80}, PropType.MANAICONS), IMG_PACK (new int[] {80, 760, 40, 40}, PropType.IMAGE), IMG_SORCERY (new int[] {412, 740, 80, 80}, PropType.MANAICONS), + IMG_BATTLE (new int[] {330, 822, 80, 80}, PropType.MANAICONS), IMG_COMMANDER (new int[] {120, 760, 40, 40}, PropType.IMAGE), IMG_ALCHEMY (new int[] {248, 822, 80, 80}, PropType.MANAICONS),