mirror of
https://github.com/magefree/mage.git
synced 2026-01-21 18:59:58 -08:00
[FIN] Implement Edgar, King of Figaro, rework coin flips (#13672)
* add method for multiple coin flips * [FIN] Implement Edgar, King of Figaro * add extra note * update coin flip logic * add test
This commit is contained in:
parent
e1f4e9db59
commit
136988de29
13 changed files with 345 additions and 87 deletions
|
|
@ -12,6 +12,7 @@ public class FlipCoinEvent extends GameEvent {
|
|||
private boolean result;
|
||||
private final boolean chosen;
|
||||
private final boolean winnable;
|
||||
private boolean autoWin = false;
|
||||
private int flipCount = 1;
|
||||
|
||||
public FlipCoinEvent(UUID playerId, Ability source, boolean result, boolean chosen, boolean winnable) {
|
||||
|
|
@ -53,6 +54,14 @@ public class FlipCoinEvent extends GameEvent {
|
|||
this.flipCount = flipCount;
|
||||
}
|
||||
|
||||
public void setAutoWin(boolean autoWin) {
|
||||
this.autoWin = autoWin;
|
||||
}
|
||||
|
||||
public boolean isAutoWin() {
|
||||
return autoWin;
|
||||
}
|
||||
|
||||
public CoinFlippedEvent createFlippedEvent() {
|
||||
return new CoinFlippedEvent(playerId, sourceId, flipCount, result, chosen, winnable);
|
||||
}
|
||||
|
|
|
|||
25
Mage/src/main/java/mage/game/events/FlipCoinsEvent.java
Normal file
25
Mage/src/main/java/mage/game/events/FlipCoinsEvent.java
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
package mage.game.events;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class FlipCoinsEvent extends GameEvent {
|
||||
|
||||
private boolean isHeadsAndWon = false;
|
||||
|
||||
public FlipCoinsEvent(UUID playerId, int amount, Ability source) {
|
||||
super(EventType.FLIP_COINS, playerId, source, playerId, amount, false);
|
||||
}
|
||||
|
||||
public void setHeadsAndWon(boolean headsAndWon) {
|
||||
isHeadsAndWon = headsAndWon;
|
||||
}
|
||||
|
||||
public boolean isHeadsAndWon() {
|
||||
return isHeadsAndWon;
|
||||
}
|
||||
}
|
||||
|
|
@ -401,7 +401,7 @@ public class GameEvent implements Serializable {
|
|||
SURVEIL, SURVEILED,
|
||||
PROLIFERATE, PROLIFERATED,
|
||||
FATESEALED,
|
||||
FLIP_COIN, COIN_FLIPPED,
|
||||
FLIP_COIN, FLIP_COINS, COIN_FLIPPED,
|
||||
REPLACE_ROLLED_DIE, // for Clam-I-Am workaround only
|
||||
ROLL_DIE, DIE_ROLLED,
|
||||
ROLL_DICE, DICE_ROLLED,
|
||||
|
|
|
|||
|
|
@ -533,6 +533,8 @@ public interface Player extends MageItem, Copyable<Player> {
|
|||
|
||||
boolean hasProtectionFrom(MageObject source, Game game);
|
||||
|
||||
List<Boolean> flipCoins(Ability source, Game game, int amount, boolean winnable);
|
||||
|
||||
boolean flipCoin(Ability source, Game game, boolean winnable);
|
||||
|
||||
boolean flipCoinResult(Game game);
|
||||
|
|
@ -748,11 +750,12 @@ public interface Player extends MageItem, Copyable<Player> {
|
|||
|
||||
/**
|
||||
* Set the value for X in spells and abilities
|
||||
*
|
||||
* @param isManaPay helper param for better AI logic
|
||||
*/
|
||||
int announceX(int min, int max, String message, Game game, Ability source, boolean isManaPay);
|
||||
|
||||
// TODO: rework to use pair's list of effect + ability instead string's map
|
||||
// TODO: rework to use pair's list of effect + ability instead string's map
|
||||
int chooseReplacementEffect(Map<String, String> effectsMap, Map<String, MageObject> objectsMap, Game game);
|
||||
|
||||
TriggeredAbility chooseTriggeredAbility(List<TriggeredAbility> abilities, Game game);
|
||||
|
|
@ -764,7 +767,6 @@ public interface Player extends MageItem, Copyable<Player> {
|
|||
void selectBlockers(Ability source, Game game, UUID defendingPlayerId);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param source can be null for system actions like define damage
|
||||
*/
|
||||
int getAmount(int min, int max, String message, Ability source, Game game);
|
||||
|
|
|
|||
|
|
@ -3054,44 +3054,66 @@ public abstract class PlayerImpl implements Player, Serializable {
|
|||
*/
|
||||
@Override
|
||||
public boolean flipCoin(Ability source, Game game, boolean winnable) {
|
||||
boolean chosen = false;
|
||||
if (winnable) {
|
||||
chosen = this.chooseUse(Outcome.Benefit, "Heads or tails?", "", "Heads", "Tails", source, game);
|
||||
game.informPlayers(getLogName() + " chose " + CardUtil.booleanToFlipName(chosen));
|
||||
}
|
||||
boolean result = this.flipCoinResult(game);
|
||||
FlipCoinEvent event = new FlipCoinEvent(playerId, source, result, chosen, winnable);
|
||||
game.replaceEvent(event);
|
||||
game.informPlayers(getLogName() + " flipped " + CardUtil.booleanToFlipName(event.getResult())
|
||||
+ CardUtil.getSourceLogName(game, source));
|
||||
if (event.getFlipCount() > 1) {
|
||||
boolean canChooseHeads = event.getResult();
|
||||
boolean canChooseTails = !event.getResult();
|
||||
for (int i = 1; i < event.getFlipCount(); i++) {
|
||||
boolean tempFlip = this.flipCoinResult(game);
|
||||
canChooseHeads = canChooseHeads || tempFlip;
|
||||
canChooseTails = canChooseTails || !tempFlip;
|
||||
game.informPlayers(getLogName() + " flipped " + CardUtil.booleanToFlipName(tempFlip));
|
||||
return flipCoins(source, game, 1, winnable).get(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Boolean> flipCoins(Ability source, Game game, int amount, boolean winnable) {
|
||||
List<Boolean> results = new ArrayList<>();
|
||||
FlipCoinsEvent flipsEvent = new FlipCoinsEvent(this.getId(), amount, source);
|
||||
game.replaceEvent(flipsEvent);
|
||||
for (int i = 0; i < flipsEvent.getAmount(); i++) {
|
||||
if (flipsEvent.isHeadsAndWon()) {
|
||||
if (winnable) {
|
||||
game.informPlayers(getLogName() + " chose " + CardUtil.booleanToFlipName(true));
|
||||
}
|
||||
game.informPlayers(getLogName() + " flipped " + CardUtil.booleanToFlipName(true) + CardUtil.getSourceLogName(game, source));
|
||||
if (winnable) {
|
||||
game.informPlayers(getLogName() + " won the flip" + CardUtil.getSourceLogName(game, source));
|
||||
}
|
||||
game.fireEvent(new FlipCoinEvent(playerId, source, true, true, winnable).createFlippedEvent());
|
||||
results.add(true);
|
||||
continue;
|
||||
}
|
||||
if (canChooseHeads && canChooseTails) {
|
||||
event.setResult(chooseUse(Outcome.Benefit, "Choose which flip to keep",
|
||||
(event.isWinnable() ? "(You called " + event.getChosenName() + ")" : null),
|
||||
"Heads", "Tails", source, game
|
||||
));
|
||||
boolean chosen;
|
||||
if (winnable) {
|
||||
chosen = this.chooseUse(Outcome.Benefit, "Heads or tails?", "", "Heads", "Tails", source, game);
|
||||
game.informPlayers(getLogName() + " chose " + CardUtil.booleanToFlipName(chosen));
|
||||
} else {
|
||||
event.setResult(canChooseHeads);
|
||||
chosen = false;
|
||||
}
|
||||
game.informPlayers(getLogName() + " chose to keep " + CardUtil.booleanToFlipName(event.getResult()));
|
||||
}
|
||||
if (event.isWinnable()) {
|
||||
game.informPlayers(getLogName() + " " + (event.getResult() == event.getChosen() ? "won" : "lost") + " the flip"
|
||||
boolean result = this.flipCoinResult(game);
|
||||
FlipCoinEvent event = new FlipCoinEvent(playerId, source, result, chosen, winnable);
|
||||
game.replaceEvent(event);
|
||||
game.informPlayers(getLogName() + " flipped " + CardUtil.booleanToFlipName(event.getResult())
|
||||
+ CardUtil.getSourceLogName(game, source));
|
||||
if (event.getFlipCount() > 1) {
|
||||
boolean canChooseHeads = event.getResult();
|
||||
boolean canChooseTails = !event.getResult();
|
||||
for (int j = 1; j < event.getFlipCount(); j++) {
|
||||
boolean tempFlip = this.flipCoinResult(game);
|
||||
canChooseHeads = canChooseHeads || tempFlip;
|
||||
canChooseTails = canChooseTails || !tempFlip;
|
||||
game.informPlayers(getLogName() + " flipped " + CardUtil.booleanToFlipName(tempFlip));
|
||||
}
|
||||
if (canChooseHeads && canChooseTails) {
|
||||
event.setResult(chooseUse(Outcome.Benefit, "Choose which flip to keep",
|
||||
(event.isWinnable() ? "(You called " + event.getChosenName() + ")" : null),
|
||||
"Heads", "Tails", source, game
|
||||
));
|
||||
} else {
|
||||
event.setResult(canChooseHeads);
|
||||
}
|
||||
game.informPlayers(getLogName() + " chose to keep " + CardUtil.booleanToFlipName(event.getResult()));
|
||||
}
|
||||
if (event.isWinnable()) {
|
||||
game.informPlayers(getLogName() + " " + (event.getResult() == event.getChosen() ? "won" : "lost") + " the flip"
|
||||
+ CardUtil.getSourceLogName(game, source));
|
||||
}
|
||||
game.fireEvent(event.createFlippedEvent());
|
||||
results.add(event.isWinnable() ? event.getResult() == event.getChosen() : event.getResult());
|
||||
}
|
||||
game.fireEvent(event.createFlippedEvent());
|
||||
if (event.isWinnable()) {
|
||||
return event.getResult() == event.getChosen();
|
||||
}
|
||||
return event.getResult();
|
||||
return results;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue