mirror of
https://github.com/correl/mage.git
synced 2024-12-26 03:00:11 +00:00
Merge pull request #3027 from drmDev/bug/gameofchaos
fixes #3022 Bug/gameofchaos
This commit is contained in:
commit
3d1aa304df
1 changed files with 29 additions and 27 deletions
|
@ -85,42 +85,35 @@ class GameOfChaosEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
Player you = game.getPlayer(source.getControllerId());
|
||||
Player targetOpponent = game.getPlayer(getTargetPointer().getFirst(game, source));
|
||||
|
||||
if (you != null && targetOpponent != null) {
|
||||
|
||||
|
||||
boolean continueFlipping = true;
|
||||
boolean youWinFlip = you.flipCoin(game); // controller flips first
|
||||
boolean controllerWonLast = false;
|
||||
int lifeAmount = 1; // starts with 1 life
|
||||
|
||||
while (continueFlipping) {
|
||||
|
||||
if (youWinFlip) { // flipper of coin wins, flipper gain 1 and non-flipper loses 1
|
||||
you.gainLife(lifeAmount, game);
|
||||
targetOpponent.loseLife(lifeAmount, game, false);
|
||||
if (targetOpponent.canRespond() && you.canRespond()) {
|
||||
continueFlipping = you.chooseUse(outcome, "Flip again?", source, game);
|
||||
controllerWonLast = true;
|
||||
boolean youWonFlip = you.flipCoin(game); // controller flips first
|
||||
boolean youWonLastFlip = false; // tracks if you won the flip last, negation of it means opponent won last
|
||||
int lifeAmount = 1; // starts stakes with 1 life
|
||||
|
||||
while (continueFlipping) {
|
||||
if (youWonFlip) { // flipper of coin wins, flipper gain 1 and non-flipper loses 1
|
||||
handleLifeChangesFromFlip(game, you, targetOpponent, lifeAmount);
|
||||
if (!cannotContinueFlipping(you, targetOpponent)) {
|
||||
continueFlipping = you.chooseUse(outcome, "You gained " + lifeAmount + " life! Flip again for double the life stakes?", source, game);
|
||||
youWonLastFlip = true;
|
||||
}
|
||||
} else { // non-flipper wins, flipper lose 1 and non-flipper gains 1
|
||||
you.loseLife(lifeAmount, game, false);
|
||||
targetOpponent.gainLife(lifeAmount, game);
|
||||
if (targetOpponent.canRespond() && you.canRespond()) {
|
||||
continueFlipping = targetOpponent.chooseUse(outcome, "Flip again?", source, game);
|
||||
controllerWonLast = false;
|
||||
handleLifeChangesFromFlip(game, targetOpponent, you, lifeAmount);
|
||||
if (!cannotContinueFlipping(you, targetOpponent)) {
|
||||
continueFlipping = targetOpponent.chooseUse(outcome, "You gained " + lifeAmount + " life! Flip again for double the life stakes?", source, game);
|
||||
youWonLastFlip = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!targetOpponent.canRespond() && !you.canRespond()) {
|
||||
if (cannotContinueFlipping(you, targetOpponent))
|
||||
continueFlipping = false;
|
||||
}
|
||||
|
||||
if (continueFlipping) {
|
||||
|
||||
if (continueFlipping) {
|
||||
lifeAmount *= 2; // double the life each time
|
||||
if (controllerWonLast) {
|
||||
youWinFlip = you.flipCoin(game);
|
||||
} else {
|
||||
youWinFlip = !targetOpponent.flipCoin(game); // negate the results for proper evaluation above
|
||||
}
|
||||
youWonFlip = youWonLastFlip ? you.flipCoin(game) : !targetOpponent.flipCoin(game); // negate the opponent's results for proper evaluation of if you won in next iteration
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -128,4 +121,13 @@ class GameOfChaosEffect extends OneShotEffect {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void handleLifeChangesFromFlip(Game game, Player playerGainingLife, Player playerLosingLife, int lifeAmount) {
|
||||
playerGainingLife.gainLife(lifeAmount, game);
|
||||
playerLosingLife.loseLife(lifeAmount, game, false);
|
||||
}
|
||||
|
||||
private boolean cannotContinueFlipping(Player you, Player opponent) {
|
||||
return (!you.canRespond() || !opponent.canRespond() || (you.canLoseByZeroOrLessLife() && you.getLife() <= 0) || (opponent.canLoseByZeroOrLessLife() && opponent.getLife() <= 0));
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue