If the AI cloned your deck, don't use your deck as a reward base if there aren't more than 5 choices.

This commit is contained in:
Chris H
2025-05-08 21:53:35 -04:00
parent 778066a622
commit aeb39b99bb
2 changed files with 54 additions and 32 deletions

View File

@@ -14,6 +14,7 @@ import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import forge.Forge; import forge.Forge;
import forge.StaticData;
import forge.adventure.data.DialogData; import forge.adventure.data.DialogData;
import forge.adventure.data.EffectData; import forge.adventure.data.EffectData;
import forge.adventure.data.EnemyData; import forge.adventure.data.EnemyData;
@@ -441,61 +442,79 @@ public class EnemySprite extends CharacterSprite implements Steerable<Vector2> {
} }
public Array<Reward> getRewards() { public Array<Reward> getRewards() {
Array<Reward> ret=new Array<>(); Array<Reward> rewards = new Array<>();
//Collect custom rewards for chaos battles //Collect custom rewards for chaos battles
if (data.copyPlayerDeck && AdventurePlayer.current().isFantasyMode()) {
if (Current.latestDeck() != null) { if (data.copyPlayerDeck && Current.latestDeck() != null) {
List<PaperCard> paperCardList = Current.latestDeck().getMain().toFlatList().stream() List<PaperCard> paperCardList = Current.latestDeck().getMain().toFlatList().stream()
.filter(paperCard -> !paperCard.isVeryBasicLand() && !paperCard.getName().startsWith("Mox")) .filter(paperCard -> !paperCard.isVeryBasicLand())
.collect(Collectors.toList()); .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 //random uncommons from deck
List<PaperCard> uncommonCards = paperCardList.stream() List<PaperCard> uncommonCards = paperCardList.stream()
.filter(paperCard -> CardRarity.Uncommon.equals(paperCard.getRarity()) || CardRarity.Special.equals(paperCard.getRarity())) .filter(paperCard -> CardRarity.Uncommon.equals(paperCard.getRarity()) || CardRarity.Special.equals(paperCard.getRarity()))
.collect(Collectors.toList()); .collect(Collectors.toList());
if (!uncommonCards.isEmpty()) { if (!uncommonCards.isEmpty()) {
ret.add(new Reward(Aggregates.random(uncommonCards))); rewards.add(new Reward(Aggregates.random(uncommonCards)));
ret.add(new Reward(Aggregates.random(uncommonCards))); rewards.add(new Reward(Aggregates.random(uncommonCards)));
} }
//random commons from deck //random commons from deck
List<PaperCard> commmonCards = paperCardList.stream() List<PaperCard> commmonCards = paperCardList.stream()
.filter(paperCard -> CardRarity.Common.equals(paperCard.getRarity())) .filter(paperCard -> CardRarity.Common.equals(paperCard.getRarity()))
.collect(Collectors.toList()); .collect(Collectors.toList());
if (!commmonCards.isEmpty()) { if (!commmonCards.isEmpty()) {
ret.add(new Reward(Aggregates.random(commmonCards))); rewards.add(new Reward(Aggregates.random(commmonCards)));
ret.add(new Reward(Aggregates.random(commmonCards))); rewards.add(new Reward(Aggregates.random(commmonCards)));
ret.add(new Reward(Aggregates.random(commmonCards))); rewards.add(new Reward(Aggregates.random(commmonCards)));
} }
//random rare from deck //random rare from deck
List<PaperCard> rareCards = paperCardList.stream() List<PaperCard> rareCards = paperCardList.stream()
.filter(paperCard -> CardRarity.Rare.equals(paperCard.getRarity()) || CardRarity.MythicRare.equals(paperCard.getRarity())) .filter(paperCard -> CardRarity.Rare.equals(paperCard.getRarity()) || CardRarity.MythicRare.equals(paperCard.getRarity()))
.collect(Collectors.toList()); .collect(Collectors.toList());
if (!rareCards.isEmpty()) { if (!rareCards.isEmpty()) {
ret.add(new Reward(Aggregates.random(rareCards))); rewards.add(new Reward(Aggregates.random(rareCards)));
ret.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)); int val = ((MyRandom.getRandom().nextInt(2)+1)*100)+(MyRandom.getRandom().nextInt(101));
ret.add(new Reward(val)); rewards.add(new Reward(val));
ret.add(new Reward(Reward.Type.Life, 1)); rewards.add(new Reward(Reward.Type.Life, 1));
} else {
return rewards;
}
}
if(data.rewards != null) { //Collect standard rewards. if(data.rewards != null) { //Collect standard rewards.
Deck enemyDeck = Current.latestDeck(); Deck enemyDeck = Current.latestDeck();
// By popular demand, remove basic lands from the reward pool. // By popular demand, remove basic lands from the reward pool.
CardPool deckNoBasicLands = enemyDeck.getMain().getFilteredPool(PaperCardPredicates.fromRules(CardRulesPredicates.NOT_BASIC_LAND)); CardPool deckNoBasicLands = enemyDeck.getMain().getFilteredPool(PaperCardPredicates.fromRules(CardRulesPredicates.NOT_BASIC_LAND));
for (RewardData rdata : data.rewards) { for (RewardData rdata : data.rewards) {
ret.addAll(rdata.generate(false, enemyDeck == null ? null : deckNoBasicLands.toFlatList(),true )); rewards.addAll(rdata.generate(false, enemyDeck == null ? null : deckNoBasicLands.toFlatList(),true ));
} }
} }
if(rewards != null) { //Collect additional rewards. if(this.rewards != null) { //Collect additional rewards.
for(RewardData rdata: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. //Do not filter in case we want to FORCE basic lands. If it ever becomes a problem just repeat the same as above.
ret.addAll(rdata.generate(false,(Current.latestDeck() != null ? Current.latestDeck().getMain().toFlatList() : null), true)); rewards.addAll(rdata.generate(false,(Current.latestDeck() != null ? Current.latestDeck().getMain().toFlatList() : null), true));
} }
} }
} return rewards;
return ret;
} }
private void drawColorHints(Batch batch){ private void drawColorHints(Batch batch){

View File

@@ -576,6 +576,9 @@ public class EventScene extends MenuScene implements IAfterMatch {
} }
public void finishRound() { 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) { if (currentEvent.currentRound == currentEvent.rounds) {
finishEvent(); finishEvent();
} else currentEvent.currentRound += 1; } else currentEvent.currentRound += 1;