From aeb39b99bb3c1e6427e1c3463a458eed68c8079c Mon Sep 17 00:00:00 2001 From: Chris H Date: Thu, 8 May 2025 21:53:35 -0400 Subject: [PATCH] If the AI cloned your deck, don't use your deck as a reward base if there aren't more than 5 choices. --- .../adventure/character/EnemySprite.java | 83 ++++++++++++------- .../src/forge/adventure/scene/EventScene.java | 3 + 2 files changed, 54 insertions(+), 32 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java b/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java index b8ad177eef1..b15ebfc427f 100644 --- a/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java +++ b/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java @@ -14,6 +14,7 @@ import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.utils.Array; import forge.Forge; +import forge.StaticData; import forge.adventure.data.DialogData; import forge.adventure.data.EffectData; import forge.adventure.data.EnemyData; @@ -441,61 +442,79 @@ public class EnemySprite extends CharacterSprite implements Steerable { } public Array getRewards() { - Array ret=new Array<>(); + Array rewards = new Array<>(); //Collect custom rewards for chaos battles - if (data.copyPlayerDeck && AdventurePlayer.current().isFantasyMode()) { - if (Current.latestDeck() != null) { - List paperCardList = Current.latestDeck().getMain().toFlatList().stream() - .filter(paperCard -> !paperCard.isVeryBasicLand() && !paperCard.getName().startsWith("Mox")) - .collect(Collectors.toList()); + + if (data.copyPlayerDeck && Current.latestDeck() != null) { + List paperCardList = Current.latestDeck().getMain().toFlatList().stream() + .filter(paperCard -> !paperCard.isVeryBasicLand()) + .toList(); + + if (paperCardList.size() < 6) { + // Player trying to cheese doppleganger and farm cards. Sorry, the fun police have arrived + // Static rewards of 199 GP, 9 Shards, and 1 Cheese Stands Alone + rewards.add(new Reward(199)); + rewards.add(new Reward(Reward.Type.Shards, 9)); + + PaperCard cheese = StaticData.instance().fetchCard("The Cheese Stands Alone"); + if (cheese != null) { + rewards.add(new Reward(cheese)); + } + return rewards; + } + + if (AdventurePlayer.current().isFantasyMode()) { //random uncommons from deck List uncommonCards = paperCardList.stream() .filter(paperCard -> CardRarity.Uncommon.equals(paperCard.getRarity()) || CardRarity.Special.equals(paperCard.getRarity())) .collect(Collectors.toList()); if (!uncommonCards.isEmpty()) { - ret.add(new Reward(Aggregates.random(uncommonCards))); - ret.add(new Reward(Aggregates.random(uncommonCards))); + rewards.add(new Reward(Aggregates.random(uncommonCards))); + rewards.add(new Reward(Aggregates.random(uncommonCards))); } //random commons from deck List commmonCards = paperCardList.stream() .filter(paperCard -> CardRarity.Common.equals(paperCard.getRarity())) .collect(Collectors.toList()); if (!commmonCards.isEmpty()) { - ret.add(new Reward(Aggregates.random(commmonCards))); - ret.add(new Reward(Aggregates.random(commmonCards))); - ret.add(new Reward(Aggregates.random(commmonCards))); + rewards.add(new Reward(Aggregates.random(commmonCards))); + rewards.add(new Reward(Aggregates.random(commmonCards))); + rewards.add(new Reward(Aggregates.random(commmonCards))); } //random rare from deck List rareCards = paperCardList.stream() .filter(paperCard -> CardRarity.Rare.equals(paperCard.getRarity()) || CardRarity.MythicRare.equals(paperCard.getRarity())) .collect(Collectors.toList()); if (!rareCards.isEmpty()) { - ret.add(new Reward(Aggregates.random(rareCards))); - ret.add(new Reward(Aggregates.random(rareCards))); + rewards.add(new Reward(Aggregates.random(rareCards))); + rewards.add(new Reward(Aggregates.random(rareCards))); } - } - int val = ((MyRandom.getRandom().nextInt(2)+1)*100)+(MyRandom.getRandom().nextInt(101)); - ret.add(new Reward(val)); - ret.add(new Reward(Reward.Type.Life, 1)); - } else { - if(data.rewards != null) { //Collect standard rewards. - Deck enemyDeck = Current.latestDeck(); - // By popular demand, remove basic lands from the reward pool. - CardPool deckNoBasicLands = enemyDeck.getMain().getFilteredPool(PaperCardPredicates.fromRules(CardRulesPredicates.NOT_BASIC_LAND)); - for (RewardData rdata : data.rewards) { - ret.addAll(rdata.generate(false, enemyDeck == null ? null : deckNoBasicLands.toFlatList(),true )); - } - } - if(rewards != null) { //Collect additional rewards. - for(RewardData rdata:rewards) { - //Do not filter in case we want to FORCE basic lands. If it ever becomes a problem just repeat the same as above. + int val = ((MyRandom.getRandom().nextInt(2)+1)*100)+(MyRandom.getRandom().nextInt(101)); + rewards.add(new Reward(val)); + rewards.add(new Reward(Reward.Type.Life, 1)); - ret.addAll(rdata.generate(false,(Current.latestDeck() != null ? Current.latestDeck().getMain().toFlatList() : null), true)); - } + return rewards; } } - return ret; + + if(data.rewards != null) { //Collect standard rewards. + Deck enemyDeck = Current.latestDeck(); + // By popular demand, remove basic lands from the reward pool. + CardPool deckNoBasicLands = enemyDeck.getMain().getFilteredPool(PaperCardPredicates.fromRules(CardRulesPredicates.NOT_BASIC_LAND)); + + for (RewardData rdata : data.rewards) { + rewards.addAll(rdata.generate(false, enemyDeck == null ? null : deckNoBasicLands.toFlatList(),true )); + } + } + if(this.rewards != null) { //Collect additional rewards. + for(RewardData rdata : this.rewards) { + //Do not filter in case we want to FORCE basic lands. If it ever becomes a problem just repeat the same as above. + + rewards.addAll(rdata.generate(false,(Current.latestDeck() != null ? Current.latestDeck().getMain().toFlatList() : null), true)); + } + } + return rewards; } private void drawColorHints(Batch batch){ diff --git a/forge-gui-mobile/src/forge/adventure/scene/EventScene.java b/forge-gui-mobile/src/forge/adventure/scene/EventScene.java index ea26ce4b344..30950d89f10 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/EventScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/EventScene.java @@ -576,6 +576,9 @@ public class EventScene extends MenuScene implements IAfterMatch { } public void finishRound() { + // TODO: Handle the scenario where a 3-match duel includes a draw. + // Currently, the system does not account for draws, which may lead to incorrect behavior. + // Consider adding logic to track and resolve draw matches, ensuring the overall match outcome is determined correctly. if (currentEvent.currentRound == currentEvent.rounds) { finishEvent(); } else currentEvent.currentRound += 1;