diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index 5cc761138ff..48905fec905 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -6,6 +6,7 @@ import java.util.Set; public class GameRules { private final GameType gameType; private boolean manaBurn; + private boolean orderCombatants; private int poisonCountersToLose = 10; // is commonly 10, but turns into 15 for 2HG private int gamesPerMatch = 3; private int gamesToWinMatch = 2; @@ -37,6 +38,14 @@ public class GameRules { this.manaBurn = manaBurn; } + public boolean hasOrderCombatants() { + return orderCombatants; + } + + public void setOrderCombatants(final boolean ordered) { + this.orderCombatants = ordered; + } + public int getPoisonCountersToLose() { return poisonCountersToLose; } diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index 97b5e556680..37785ca8595 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -50,6 +50,7 @@ import java.util.Map.Entry; */ public class Combat { private final Player playerWhoAttacks; + private boolean legacyOrderCombatants; private AttackConstraints attackConstraints; // Defenders, as they are attacked by hostile forces private final FCollection attackableEntries = new FCollection<>(); @@ -58,8 +59,8 @@ public class Combat { private final Multimap attackedByBands = Multimaps.synchronizedMultimap(ArrayListMultimap.create()); private final Multimap blockedBands = Multimaps.synchronizedMultimap(ArrayListMultimap.create()); - private Map attackersOrderedForDamageAssignment = Maps.newHashMap(); - private Map blockersOrderedForDamageAssignment = Maps.newHashMap(); + private final Map attackersOrderedForDamageAssignment = Maps.newHashMap(); + private final Map blockersOrderedForDamageAssignment = Maps.newHashMap(); private CardCollection lkiCache = new CardCollection(); private CardDamageMap damageMap = new CardDamageMap(); @@ -68,6 +69,7 @@ public class Combat { public Combat(final Player attacker) { playerWhoAttacks = attacker; + legacyOrderCombatants = playerWhoAttacks.getGame().getRules().hasOrderCombatants(); initConstraints(); } @@ -481,7 +483,7 @@ public class Combat { /** If there are multiple blockers, the Attacker declares the Assignment Order */ public void orderBlockersForDamageAssignment(Card attacker, CardCollection blockers) { // this method performs controller's role - if (blockers.size() <= 1) { + if (blockers.size() <= 1 || !this.legacyOrderCombatants) { blockersOrderedForDamageAssignment.put(attacker, new CardCollection(blockers)); return; } @@ -518,10 +520,13 @@ public class Combat { final CardCollection oldBlockers = blockersOrderedForDamageAssignment.get(attacker); if (oldBlockers == null || oldBlockers.isEmpty()) { blockersOrderedForDamageAssignment.put(attacker, new CardCollection(blocker)); - } else { - CardCollection orderedBlockers = playerWhoAttacks.getController().orderBlocker(attacker, blocker, oldBlockers); + } else if (this.legacyOrderCombatants) { + CardCollection orderedBlockers = playerWhoAttacks.getController().orderBlocker(attacker, blocker, oldBlockers); blockersOrderedForDamageAssignment.put(attacker, orderedBlockers); - } + } else { + oldBlockers.add(blocker); + blockersOrderedForDamageAssignment.put(attacker, oldBlockers); + } } public void orderAttackersForDamageAssignment() { // this method performs controller's role @@ -536,7 +541,7 @@ public class Combat { // They need a reverse map here: Blocker => List Player blockerCtrl = blocker.getController(); - CardCollection orderedAttacker = attackers.size() <= 1 ? attackers : blockerCtrl.getController().orderAttackers(blocker, attackers); + CardCollection orderedAttacker = attackers.size() <= 1 || !this.legacyOrderCombatants ? attackers : blockerCtrl.getController().orderAttackers(blocker, attackers); // Damage Ordering needs to take cards like Melee into account, is that happening? attackersOrderedForDamageAssignment.put(blocker, orderedAttacker); @@ -858,7 +863,7 @@ public class Combat { } // No damage happens if blocked but no blockers left } else { Map map = assigningPlayer.getController().assignCombatDamage(attacker, orderedBlockers, attackers, - damageDealt, defender, divideCombatDamageAsChoose || getAttackingPlayer() != assigningPlayer); + damageDealt, defender, divideCombatDamageAsChoose || getAttackingPlayer() != assigningPlayer || !this.legacyOrderCombatants); attackers.remove(attacker); // player wants to assign another first diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index efe4a9ba1b2..9f68326c97e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -107,6 +107,7 @@ public enum CSubmenuPreferences implements ICDoc { lstControls.add(Pair.of(view.getCbAnte(), FPref.UI_ANTE)); lstControls.add(Pair.of(view.getCbAnteMatchRarity(), FPref.UI_ANTE_MATCH_RARITY)); lstControls.add(Pair.of(view.getCbManaBurn(), FPref.UI_MANABURN)); + lstControls.add(Pair.of(view.getCbOrderCombatants(), FPref.LEGACY_ORDER_COMBATANTS)); lstControls.add(Pair.of(view.getCbScaleLarger(), FPref.UI_SCALE_LARGER)); lstControls.add(Pair.of(view.getCbRenderBlackCardBorders(), FPref.UI_RENDER_BLACK_BORDERS)); lstControls.add(Pair.of(view.getCbLargeCardViewers(), FPref.UI_LARGE_CARD_VIEWERS)); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index 10d4afab6fb..0eabbbe9f97 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -69,6 +69,7 @@ public enum VSubmenuPreferences implements IVSubmenu { private final JCheckBox cbAnteMatchRarity = new OptionsCheckBox(localizer.getMessage("cbAnteMatchRarity")); private final JCheckBox cbEnableAICheats = new OptionsCheckBox(localizer.getMessage("cbEnableAICheats")); private final JCheckBox cbManaBurn = new OptionsCheckBox(localizer.getMessage("cbManaBurn")); + private final JCheckBox cbOrderCombatants = new OptionsCheckBox(localizer.getMessage("cbOrderCombatants")); private final JCheckBox cbManaLostPrompt = new OptionsCheckBox(localizer.getMessage("cbManaLostPrompt")); private final JCheckBox cbDevMode = new OptionsCheckBox(localizer.getMessage("cbDevMode")); private final JCheckBox cbLoadCardsLazily = new OptionsCheckBox(localizer.getMessage("cbLoadCardsLazily")); @@ -220,6 +221,9 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(cbManaBurn, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlManaBurn")), descriptionConstraints); + pnlPrefs.add(cbOrderCombatants, titleConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlOrderCombatants")), descriptionConstraints); + pnlPrefs.add(cbManaLostPrompt, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlManaLostPrompt")), descriptionConstraints); @@ -718,6 +722,10 @@ public enum VSubmenuPreferences implements IVSubmenu { return cbManaBurn; } + public JCheckBox getCbOrderCombatants() { + return cbOrderCombatants; + } + /** @return {@link javax.swing.JCheckBox} */ public JCheckBox getCbScaleLarger() { return cbScaleLarger; diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java index eac18dc65eb..d59dd3f192e 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java @@ -1,19 +1,7 @@ package forge.gamesimulationtests.util; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - import forge.deck.Deck; -import forge.game.Game; -import forge.game.GameLog; -import forge.game.GameLogEntry; -import forge.game.GameLogEntryType; -import forge.game.GameRules; -import forge.game.GameStage; -import forge.game.GameType; -import forge.game.Match; +import forge.game.*; import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.event.GameEventGameFinished; @@ -34,6 +22,11 @@ import forge.item.PaperCard; import forge.localinstance.properties.ForgePreferences.FPref; import forge.model.FModel; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + public class GameWrapper { private final List players; private final GameStateSpecification initialGameStateSpecification; @@ -77,6 +70,7 @@ public class GameWrapper { rules.setPlayForAnte(FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE)); rules.setMatchAnteRarity(FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE_MATCH_RARITY)); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); + rules.setOrderCombatants(FModel.getPreferences().getPrefBoolean(FPref.LEGACY_ORDER_COMBATANTS)); rules.setUseGrayText(FModel.getPreferences().getPrefBoolean(FPref.UI_GRAY_INACTIVE_TEXT)); Match match = new Match(rules, registeredPlayers, "Test"); game = match.createGame(); diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index 9ecfec087b2..9e22c5a42da 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -214,6 +214,11 @@ public class SettingsPage extends TabPage { Forge.getLocalizer().getMessage("cbManaBurn"), Forge.getLocalizer().getMessage("nlManaBurn")), 1); + lstSettings.addItem(new BooleanSetting(FPref.LEGACY_ORDER_COMBATANTS, + Forge.getLocalizer().getMessage("cbOrderCombatants"), + Forge.getLocalizer().getMessage("nlOrderCombatants")), + 1); + lstSettings.addItem(new BooleanSetting(FPref.UI_MANA_LOST_PROMPT, Forge.getLocalizer().getMessage("cbManaLostPrompt"), Forge.getLocalizer().getMessage("nlManaLostPrompt")), diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index d0e59c3ad83..326f0aca910 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -64,6 +64,7 @@ cbAnte=Spiele um Ante cbAnteMatchRarity=Passe Ante-Seltenheit an cbEnableAICheats=KI darf betrügen cbManaBurn=Manabrand +cbOrderCombatants=Kombattanten bestellen cbManaLostPrompt=Bestätige Leeren des Manapools cbDevMode=Entwicklermodus cbLoadCardsLazily=Lade Kartenskripte verzögert @@ -154,9 +155,10 @@ nlAnte=Entscheidet, ob um einen Einsatz (Ante) gespielt wird. nlAnteMatchRarity=Versucht den Spieleinsatz für alle Spieler ungefähr gleich zu halten. nlEnableAICheats=Erlaubt es der KI zu betrügen um Vorteile zu erlangen. Sofern die spezielle KI dies im Skript unterstützt. nlManaBurn=Spiele mit Manabrand (wurde mit M10 aus den Regeln entfernt). +nlOrderCombatants=Spielen Sie mit älteren kommandierenden Kämpfern (Regel von Magic 2010 bis vor Foundations). nlManaLostPrompt=Aktiviere, um vor Leerung des Manapools eine Warnung zu erhalten. nlEnforceDeckLegality=Erzwingt eine Deck-Konformität zum gewählten Format (minimale Deckgröße, Anzahl pro Karte im Deck, usw.). -nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). +nlpAiSideboardingMode=Wählen Sie die Art der KI-Sideboards: Aus (die KI tritt nicht ins Sideboard), KI (die KI-Sideboards für sich selbst, derzeit meist zufällig), Menschlich für KI (die menschlichen Spieler-Sideboards für die KI in Constructed-Formaten). nlPerformanceMode=Schalten zusätzlich Prüfungen auf statische Fähigkeiten ab, um das Spiel zu beschleunigen. Warnung: Kann Probleme mit 'Aufblitzen' bei Karten von KI-Gegner verursachen! nlFilteredHands=Erzeugt zwei Starthände, und behält die, welche am nächsten an der durchschnittlichen Länderanzahl im Deck ist. (Erfordert Neustart) nlCloneImgSource=Zeige das originale Kartenbild des Klones statt der geklonten Karte. diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 2976acc4c85..b813947ed45 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -64,6 +64,7 @@ cbAnte=Play for Ante cbAnteMatchRarity=Match Ante Rarity cbEnableAICheats=Allow AI Cheating cbManaBurn=Mana Burn +cbOrderCombatants=Order Combatants cbManaLostPrompt=Prompt Mana Pool Emptying cbDevMode=Developer Mode cbLoadCardsLazily=Load Card Scripts Lazily @@ -155,6 +156,7 @@ nlAnte=Determines whether or not the game is played for ante. nlAnteMatchRarity=Attempts to make antes the same rarity for all players. nlEnableAICheats=Allow the AI to cheat to gain advantage (for personalities that have cheat shuffling options set). nlManaBurn=Play with mana burn (from pre-Magic 2010 rules). +nlOrderCombatants=Play with legacy ordering combatants (rule from Magic 2010 to pre-Foundations). nlManaLostPrompt=When enabled, you get a warning if passing priority would cause you to lose mana in your mana pool. nlEnforceDeckLegality=Enforces deck legality relevant to each environment (minimum deck sizes, max card count etc). nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 709599f586e..4c70418c04d 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -64,6 +64,7 @@ cbAnte=Jugar con apuesta (Ante) cbAnteMatchRarity=Igualar rareza en apuesta (Ante) cbEnableAICheats=Permitir engaños de la IA cbManaBurn=Quemadura de maná +cbOrderCombatants=Orden de combatientes cbManaLostPrompt=Avisar antes de vaciar el maná en la reserva al pasar la fase cbDevMode=Modo Desarrollador cbLoadCardsLazily=Cargar scripts de cartas modo perezoso @@ -155,9 +156,10 @@ nlAnte=Determina si el juego se juega con apuesta o no. nlAnteMatchRarity=Intenta crear apuesta de la misma rareza para todos los jugadores. nlEnableAICheats=Permita que la IA haga trampa para obtener ventaja (para personalidades que tienen configuradas trampas al barajar). nlManaBurn=Jugar con quemadura de maná (reglas previas a Magic 2010). +nlOrderCombatants=Juega con combatientes ordenados heredados (gobierna desde Magic 2010 hasta Pre-Foundations). nlManaLostPrompt=Cuando está habilitado, recibes una advertencia si la prioridad de pase te haría perder maná en tu reserva de maná. nlEnforceDeckLegality=Aplica la legalidad del mazo correspondiente a cada entorno (tamaño mínimo de mazo, número máximo de cartas, etc.). -nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). +nlpAiSideboardingMode=Elige la forma en que se colocan los banquillos de la IA: Desactivado (la IA no se pone banquillo), IA (los banquillos de la IA para sí misma, actualmente en su mayoría aleatorios), Humanos para la IA (los banquillos del jugador humano para la IA en formatos Construidos). nlExperimentalRestore=EXPERIMENTAL - Almacena una instantánea que se utilizará para deshacer hechizos o habilidades nlPerformanceMode=Desactiva las comprobaciones de habilidades estáticas adicionales para acelerar el motor del juego. (Advertencia: rompe algunos escenarios ''como si tuviera flash'' cuando se lanzan cartas de propiedad de los oponentes). nlFilteredHands=Genera dos manos iniciales y mantiene la que tiene el recuento de tierras más cercano al promedio del mazo (Requiere reinicio) diff --git a/forge-gui/res/languages/fr-FR.properties b/forge-gui/res/languages/fr-FR.properties index 665c8a3433b..389cfba3d2f 100644 --- a/forge-gui/res/languages/fr-FR.properties +++ b/forge-gui/res/languages/fr-FR.properties @@ -64,6 +64,7 @@ cbAnte=Jouer pour l''ante cbAnteMatchRarity=Correspond à la rareté Ante cbEnableAICheats=Autoriser l''IA à tricher cbManaBurn=Brûlure de mana +cbOrderCombatants=Combattants de l''Ordre cbManaLostPrompt=Inviter la vidange de la réserve de mana cbDevMode=Mode développeur cbLoadCardsLazily=Charger les scripts de carte paresseusement @@ -154,9 +155,10 @@ nlAnte=Détermine si oui ou non le jeu est joué pour ante. nlAnteMatchRarity=Tente de donner aux antes la même rareté pour tous les joueurs. nlEnableAICheats=Autoriser l''IA à tricher pour obtenir un avantage (pour les personnalités qui ont défini des options de mélange de triche). nlManaBurn=Jouez avec la brûlure de mana (à partir des règles d''avant Magic 2010). +nlOrderCombatants=Jouez avec des combattants de l'ordre hérité (règle de Magic 2010 jusqu'aux pré-Fondations). nlManaLostPrompt=Lorsqu''il est activé, vous recevez un avertissement si le fait de passer la priorité vous ferait perdre du mana dans votre pool de mana. nlEnforceDeckLegality=Applique la légalité du deck en fonction de chaque environnement (taille minimale du deck, nombre maximum de cartes, etc.). -nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). +nlpAiSideboardingMode=Choisissez la manière dont les buffets de l'IA sont désactivés (l'IA ne fait pas de buffet), AI (les buffets de l''IA pour elle-même, actuellement principalement aléatoires), Human For AI (les buffets du joueur humain pour l''IA dans les formats Construits). nlPerformanceMode=Désactive les vérifications supplémentaires des capacités statiques pour accélérer le moteur de jeu. (Attention : casse certains scénarios ''comme si c''était flash'' lors du lancement de cartes appartenant à des adversaires). nlFilteredHands=Génère deux mains de départ et conserve celle dont le nombre de terrains est le plus proche de la moyenne pour le deck. (NÉCESSITE UN REDÉMARRAGE) nlCloneImgSource=Lorsqu''il est activé, les clones utiliseront leur art original au lieu de l''art de la carte clonée. diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index 23d0b728b7f..ff67d72094a 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -63,6 +63,7 @@ cbAnte=Gioca con la posta cbAnteMatchRarity=Abbina la rarità della posta cbEnableAICheats=Consenti all''IA di barare cbManaBurn=Mana burn +cbOrderCombatants=Combattenti dell''Ordine cbManaLostPrompt=Avviso svuotamento riserva di mana cbDevMode=Modalità sviluppatore cbLoadCardsLazily=Carica gli script delle carte lentamente @@ -153,9 +154,10 @@ nlAnte=Determina se l''incontro è giocato o meno con la posta. nlAnteMatchRarity=Tenta di rendere la posta della stessa rarità per tutti i giocatori. nlEnableAICheats=Consentire all''intelligenza artificiale di imbrogliare per ottenere un vantaggio (per le personalità che hanno impostato le opzioni per barare mescolando le carte). nlManaBurn=Gioca con mana burn (dalle regole pre-Magic 2010). +nlOrderCombatants=Gioca con combattenti con ordini legacy (regola da Magic 2010 a pre-Foundations). nlManaLostPrompt=Quando abilitato, viene visualizzato un avviso se passare la priorità potrebbe causare la perdita di mana nella riserva di mana. nlEnforceDeckLegality=Fa rispettare la legalità del mazzo relativa a ciascun ambiente (dimensioni minime del mazzo, numero massimo di carte ecc.). -nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). +nlpAiSideboardingMode=Scegli il modo in cui i sideboard dell'IA: Off (l'IA non utilizza il sideboard), AI (i sideboard dell''IA per se stessa, attualmente per lo più casuali), Umano per AI (i sideboard del giocatore umano per l''IA nei formati Constructed). nlPerformanceMode=Disabilita delle verifiche aggiuntive delle abilità statiche per velocizzare il motore di gioco. (Attenzione: non fa funzionare correttamente il giocare carte di proprietà di un avversario in contesti "come se avesse lampo"). nlFilteredHands=Genera due mani iniziali e mantiene quella con il numero di terre più vicino alla media del mazzo. (RIAVVIO NECESSARIO) nlCloneImgSource=Se abilitato, i cloni useranno la loro arte originale invece di quella della carta clonata. diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index 6920b588e0e..0228a44dedf 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -64,6 +64,7 @@ cbAnte=アンティルールを使用する。 cbAnteMatchRarity=アンティのレアリティを合わせる cbEnableAICheats=AIチートを有効する cbManaBurn=マナバーン +cbOrderCombatants=戦闘員の命令 cbManaLostPrompt=マナプールが空になる場合に警告する cbDevMode=開発者モード cbLoadCardsLazily=カードスクリプトを動的ロードする @@ -154,9 +155,10 @@ nlAnte=ゲームでアンティ(賭け)ルールを適用するか選択す nlAnteMatchRarity=すべてのプレイヤーに対してアンティを同じレアリティにしようとします。 nlEnableAICheats=AI がチートしてアドバンテージを獲得できるようにします。(チートシャッフルオプションが設定されている場合) nlManaBurn=マナバーンでプレイ。(基本セット2010 以前のマジックルール) +nlOrderCombatants=レガシーの命令戦闘員でプレイしてください (マジック 2010 から財団以前までのルール)。 nlManaLostPrompt=有効にすると、優先権を放棄するとマナプールのマナが失われる場合に警告が表示されます。 nlEnforceDeckLegality=各環境に使えるデッキの合法性を強制します。(最小デッキサイズ、最大カード数など) -nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). +nlpAiSideboardingMode=AI のサイドボード方法を選択します: オフ (AI はサイドボードしない)、AI (AI 自体のサイドボード、現在はほとんどランダム)、Human For AI (構築フォーマットの AI の人間プレイヤーのサイドボード)。 nlPerformanceMode=常在型能力の追加チェックを無効にして、ゲームエンジンを高速化します。 (警告:対戦相手が所有するカードをキャストするときに、「あたかもフラッシュがあるかのように」の能力が無効になるかもしれません。) nlFilteredHands=2つのハンドを生成し、デッキの平均土地数に最も近いハンドをキープします。 nlCloneImgSource=有効にすると、クローンはクローン先のカードのアートの代わりに元のアートを使用します。 diff --git a/forge-gui/res/languages/pt-BR.properties b/forge-gui/res/languages/pt-BR.properties index ee91a34fb19..aa5caa2a783 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -65,6 +65,7 @@ cbAnte=Jogar por Aposta cbAnteMatchRarity=Igualar Raridade da Aposta cbEnableAICheats=Permitir Trapaça IA cbManaBurn=Queima de Mana +cbOrderCombatants=Ordem Combatentes cbManaLostPrompt=Avisar esvaziamento de mana cbDevMode=Modo de Desenvolvedor cbLoadCardsLazily=Carregar Scripts de Cartas sob Demanda @@ -155,9 +156,10 @@ nlAnte=Determina se o jogo possui aposta. nlAnteMatchRarity=Tenta fazer as apostas com a mesma raridade para todos os jogadores. nlEnableAICheats=Permita que a trapaça IA obtenha vantagem (para personalidades que possuem opções de embaralhamento definidas). nlManaBurn=Jogar com queima de mana (das regras do Magic anteriores a 2010). +nlOrderCombatants=Jogue com combatentes ordenados legados (regra desde Magic 2010 até pré-Fundações). nlManaLostPrompt=Quando ativado, você recebe um aviso se a prioridade de passar fizer com que você perca mana na reserva de mana. nlEnforceDeckLegality=Força a legalidade do deck relevante para cada ambiente (tamanho mínimo, número máximo de cartas etc). -nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). +nlpAiSideboardingMode=Escolha a forma como os sideboards de IA: Off (a IA não faz sideboard), AI (os sideboards de IA para si, atualmente em sua maioria aleatórios), Human For AI (os sideboards de jogadores humanos para a IA em formatos Construídos). nlPerformanceMode=Desabilita verificações adicionais de habilidades estáticas para acelerar o jogo. (Aviso\: quebra alguns cenários 'como se tivesse lampejo' ao conjurar cartas pertencentes a adversários). nlFilteredHands=Gera duas mãos iniciais e mantém a mão mais próxima da média da contagem de terreno do deck. (REQUER REINÍCIO) nlCloneImgSource=Quando ativado os clones usarão sua arte original em vez da arte da carta clonada. diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 1affbd7a025..e89bf5ee479 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -64,6 +64,7 @@ cbAnte=赌博模式 cbAnteMatchRarity=赌注稀有度匹配 cbEnableAICheats=允许AI作弊 cbManaBurn=法术力灼烧 +cbOrderCombatants=秩序斗士 cbManaLostPrompt=提示法术力池将要清空 cbDevMode=开发人员模式 cbLoadCardsLazily=惰性加载卡牌脚本 @@ -155,6 +156,7 @@ nlAnte=确定游戏是否使用赌注 nlAnteMatchRarity=尝试为所有玩家生成同稀有度赌注 nlEnableAICheats=允许AI进行作弊以获得优势(对于已经设置了作弊洗牌的AI)。 nlManaBurn=使用法术力灼烧(M10之前的规则) +nlOrderCombatants=与传统的排序战斗者一起玩(规则从万智牌 2010 到基金会前期)。 nlManaLostPrompt=启用后,如果让过优先权会导致法术力池清空,你将收到一个警告提示。 nlEnforceDeckLegality=强制每个与环境相关的套牌合法性(最小单卡数,最大单卡数等)。 nlpAiSideboardingMode=选择AI换备的方式:Off为AI不换备,AI为AI随机换备,Human For AI为人类为AI换备。. diff --git a/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java b/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java index df56faac030..0b709967128 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java @@ -1,28 +1,13 @@ package forge.gamemodes.match; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import forge.ai.AiProfileUtil; -import forge.gui.control.PlaybackSpeed; -import org.apache.commons.lang3.StringUtils; - import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.eventbus.Subscribe; - import forge.LobbyPlayer; import forge.StaticData; -import forge.game.Game; -import forge.game.GameRules; -import forge.game.GameType; -import forge.game.GameView; -import forge.game.Match; +import forge.ai.AiProfileUtil; +import forge.game.*; import forge.game.event.GameEvent; import forge.game.event.GameEventSubgameEnd; import forge.game.event.GameEventSubgameStart; @@ -35,12 +20,9 @@ import forge.gui.FThreads; import forge.gui.GuiBase; import forge.gui.control.FControlGameEventHandler; import forge.gui.control.FControlGamePlayback; +import forge.gui.control.PlaybackSpeed; import forge.gui.control.WatchLocalGame; -import forge.gui.events.IUiEventVisitor; -import forge.gui.events.UiEvent; -import forge.gui.events.UiEventAttackerDeclared; -import forge.gui.events.UiEventBlockerAssigned; -import forge.gui.events.UiEventNextGameDecision; +import forge.gui.events.*; import forge.gui.interfaces.IGuiGame; import forge.interfaces.IGameController; import forge.localinstance.properties.ForgeConstants; @@ -58,6 +40,10 @@ import forge.util.TextUtil; import forge.util.collect.FCollectionView; import forge.util.maps.HashMapOfLists; import forge.util.maps.MapOfLists; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; +import java.util.Map.Entry; public class HostedMatch { private Match match; @@ -88,6 +74,7 @@ public class HostedMatch { gameRules.setPlayForAnte(FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE)); gameRules.setMatchAnteRarity(FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE_MATCH_RARITY)); gameRules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); + gameRules.setOrderCombatants(FModel.getPreferences().getPrefBoolean(FPref.LEGACY_ORDER_COMBATANTS)); gameRules.setUseGrayText(FModel.getPreferences().getPrefBoolean(FPref.UI_GRAY_INACTIVE_TEXT)); gameRules.setGamesPerMatch(FModel.getPreferences().getPrefInt(FPref.UI_MATCHES_PER_GAME)); // AI specific sideboarding rules diff --git a/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestController.java b/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestController.java index 6a66dfa6e72..4fa6d559bb5 100644 --- a/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestController.java +++ b/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestController.java @@ -17,11 +17,6 @@ */ package forge.gamemodes.planarconquest; -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - import forge.LobbyPlayer; import forge.card.CardType; import forge.deck.CardPool; @@ -51,6 +46,11 @@ import forge.util.FileUtil; import forge.util.storage.IStorage; import forge.util.storage.StorageImmediatelySerialized; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + public class ConquestController { private ConquestData model; private IStorage decks; @@ -138,6 +138,7 @@ public class ConquestController { final GameRules rules = new GameRules(GameType.PlanarConquest); rules.setGamesPerMatch(battle.gamesPerMatch()); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); + rules.setOrderCombatants(FModel.getPreferences().getPrefBoolean(FPref.LEGACY_ORDER_COMBATANTS)); final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); FThreads.invokeInEdtNowOrLater(() -> hostedMatch.startMatch(rules, variants, starter, humanStart, gui)); activeBattle = battle; diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/QuestDraftUtils.java b/forge-gui/src/main/java/forge/gamemodes/quest/QuestDraftUtils.java index 5586eeff3de..1eeba697ba7 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/QuestDraftUtils.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/QuestDraftUtils.java @@ -1,11 +1,6 @@ package forge.gamemodes.quest; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import com.google.common.collect.Lists; - import forge.deck.Deck; import forge.deck.DeckGroup; import forge.deck.DeckSection; @@ -28,6 +23,10 @@ import forge.player.GamePlayerUtil; import forge.util.MyRandom; import forge.util.storage.IStorage; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class QuestDraftUtils { public static boolean TOURNAMENT_TOGGLE = false; public static boolean AI_BACKGROUND = false; @@ -250,6 +249,7 @@ public class QuestDraftUtils { rules.setMatchAnteRarity(false); rules.setGamesPerMatch(3); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); + rules.setOrderCombatants(FModel.getPreferences().getPrefBoolean(FPref.LEGACY_ORDER_COMBATANTS)); rules.setUseGrayText(FModel.getPreferences().getPrefBoolean(FPref.UI_GRAY_INACTIVE_TEXT)); return rules; } diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtil.java b/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtil.java index 8da2af5514e..4894cde58e6 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtil.java @@ -594,7 +594,7 @@ public class QuestUtil { rules.setPlayForAnte(useAnte); rules.setMatchAnteRarity(matchAnteRarity); rules.setGamesPerMatch(qData.getMatchLength()); - rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); + rules.setOrderCombatants(FModel.getPreferences().getPrefBoolean(FPref.LEGACY_ORDER_COMBATANTS)); rules.setUseGrayText(FModel.getPreferences().getPrefBoolean(FPref.UI_GRAY_INACTIVE_TEXT)); final TreeSet variant = new TreeSet<>(); diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java index 6ada470ae44..7de802504c6 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java @@ -115,6 +115,7 @@ public class ForgePreferences extends PreferencesStore { UI_ANTE ("false"), UI_ANTE_MATCH_RARITY ("false"), UI_MANABURN("false"), + LEGACY_ORDER_COMBATANTS("false"), UI_SKIN ("Default"), UI_CJK_FONT (""), UI_PREFERRED_AVATARS_ONLY ("false"),