mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 04:08:01 +00:00
Fix stuck dialogue when reloading save
This commit is contained in:
@@ -3,6 +3,7 @@ package forge.adventure.scene;
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import forge.Forge;
|
||||
import forge.Graphics;
|
||||
import forge.LobbyPlayer;
|
||||
@@ -72,6 +73,9 @@ public class DuelScene extends ForgeScene {
|
||||
boolean isArena = false;
|
||||
AdventureEventData eventData;
|
||||
private LoadingOverlay matchOverlay;
|
||||
final int enemyAvatarKey = 90001;
|
||||
final int playerAvatarKey = 90000;
|
||||
FOptionPane bossDialogue;
|
||||
List<IPaperCard> playerExtras = new ArrayList<>();
|
||||
List<IPaperCard> AIExtras = new ArrayList<>();
|
||||
|
||||
@@ -98,7 +102,8 @@ public class DuelScene extends ForgeScene {
|
||||
|
||||
//Persists expended (or potentially gained) shards back to Adventure
|
||||
if (eventData == null || eventData.eventRules.allowsShards) {
|
||||
List<PlayerControllerHuman> humans = hostedMatch.getHumanControllers(); {
|
||||
List<PlayerControllerHuman> humans = hostedMatch.getHumanControllers();
|
||||
{
|
||||
if (humans.size() == 1) {
|
||||
Current.player().setShards(humans.get(0).getPlayer().getNumManaShards());
|
||||
}
|
||||
@@ -110,29 +115,28 @@ public class DuelScene extends ForgeScene {
|
||||
String enemyName = enemy.getName();
|
||||
boolean showMessages = enemy.getData().boss || (enemy.getData().copyPlayerDeck && Current.player().isUsingCustomDeck());
|
||||
Current.player().clearBlessing();
|
||||
if ((chaosBattle || showMessages) && !winner) {
|
||||
final FBufferedImage fb = new FBufferedImage(120, 120) {
|
||||
@Override
|
||||
protected void draw(Graphics g, float w, float h) {
|
||||
if (FSkin.getAvatars().get(90001) != null)
|
||||
g.drawImage(FSkin.getAvatars().get(90001), 0, 0, w, h);
|
||||
}
|
||||
};
|
||||
if (chaosBattle || showMessages) {
|
||||
final FBufferedImage fb = getFBEnemyAvatar();
|
||||
callbackExit = true;
|
||||
if (winner) {
|
||||
afterGameEnd(enemyName, winner);
|
||||
} else {
|
||||
boolean finalWinner = winner;
|
||||
FThreads.invokeInEdtNowOrLater(() -> FOptionPane.showMessageDialog(Forge.getLocalizer().getMessage("AdvBossInsult"+Aggregates.randomInt(1, 44)), enemyName, fb, new Callback<Integer>() {
|
||||
@Override
|
||||
public void run(Integer result) {
|
||||
bossDialogue = createFOption(Forge.getLocalizer().getMessage("AdvBossInsult" + Aggregates.randomInt(1, 44)),
|
||||
enemyName, fb, () -> {
|
||||
afterGameEnd(enemyName, finalWinner);
|
||||
exitDuelScene();
|
||||
fb.dispose();
|
||||
});
|
||||
}
|
||||
}));
|
||||
FThreads.invokeInEdtNowOrLater(() -> bossDialogue.show());
|
||||
} else {
|
||||
afterGameEnd(enemyName, winner);
|
||||
}
|
||||
}
|
||||
|
||||
Runnable endRunnable = null;
|
||||
|
||||
void afterGameEnd(String enemyName, boolean winner) {
|
||||
Forge.restrictAdvMenus = winner;
|
||||
endRunnable = () -> Gdx.app.postRunnable(() -> {
|
||||
@@ -149,10 +153,21 @@ public class DuelScene extends ForgeScene {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void exitDuelScene() {
|
||||
Forge.setTransitionScreen(new TransitionScreen(endRunnable, Forge.takeScreenshot(), false, false));
|
||||
}
|
||||
|
||||
private FOptionPane createFOption(String message, String title, FBufferedImage icon, Runnable runnable) {
|
||||
return new FOptionPane(message, null, title, icon, null, ImmutableList.of(Forge.getLocalizer().getMessage("lblOK")), -1, new Callback<Integer>() {
|
||||
@Override
|
||||
public void run(Integer result) {
|
||||
if (runnable != null)
|
||||
runnable.run();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void addEffects(RegisteredPlayer player, Array<EffectData> effects) {
|
||||
if (effects == null) return;
|
||||
//Apply various combat effects.
|
||||
@@ -190,8 +205,7 @@ public class DuelScene extends ForgeScene {
|
||||
Set<GameType> appliedVariants = new HashSet<>();
|
||||
if (eventData != null && eventData.eventRules != null) {
|
||||
appliedVariants.add(eventData.eventRules.gameType);
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
appliedVariants.add(GameType.Adventure);
|
||||
}
|
||||
|
||||
@@ -211,8 +225,8 @@ public class DuelScene extends ForgeScene {
|
||||
|
||||
humanPlayer = RegisteredPlayer.forVariants(playerCount, appliedVariants, playerDeck, null, false, null, null);
|
||||
LobbyPlayer playerObject = GamePlayerUtil.getGuiPlayer();
|
||||
FSkin.getAvatars().put(90000, advPlayer.avatar());
|
||||
playerObject.setAvatarIndex(90000);
|
||||
FSkin.getAvatars().put(playerAvatarKey, advPlayer.avatar());
|
||||
playerObject.setAvatarIndex(playerAvatarKey);
|
||||
humanPlayer.setPlayer(playerObject);
|
||||
humanPlayer.setTeamNumber(0);
|
||||
humanPlayer.setStartingLife(eventData != null ? eventData.eventRules.startingLife : advPlayer.getLife());
|
||||
@@ -274,9 +288,11 @@ public class DuelScene extends ForgeScene {
|
||||
currentEnemy = enemy.getData();
|
||||
boolean bossBattle = currentEnemy.boss;
|
||||
for (int i = 0; i < 8 && currentEnemy != null; i++) {
|
||||
Deck deck = null;
|
||||
Deck deck;
|
||||
|
||||
if (this.chaosBattle) { //random challenge for chaos mode
|
||||
if (deckProxyMapMap == null)
|
||||
continue;
|
||||
//aiextras
|
||||
List<IPaperCard> aiCards = new ArrayList<>();
|
||||
for (String s : deckProxyMapMap.get(deckProxy).getRight()) {
|
||||
@@ -297,8 +313,8 @@ public class DuelScene extends ForgeScene {
|
||||
enemyPlayer.setName(enemy.getName()); //Override name if defined in the map.(only supported for 1 enemy atm)
|
||||
TextureRegion enemyAvatar = enemy.getAvatar(i);
|
||||
enemyAvatar.flip(true, false); //flip facing left
|
||||
FSkin.getAvatars().put(90001 + i, enemyAvatar);
|
||||
enemyPlayer.setAvatarIndex(90001 + i);
|
||||
FSkin.getAvatars().put(enemyAvatarKey + i, enemyAvatar);
|
||||
enemyPlayer.setAvatarIndex(enemyAvatarKey + i);
|
||||
aiPlayer.setPlayer(enemyPlayer);
|
||||
aiPlayer.setTeamNumber(currentEnemy.teamNumber);
|
||||
aiPlayer.setStartingLife(eventData != null ? eventData.eventRules.startingLife : Math.round((float) currentEnemy.life * advPlayer.getDifficulty().enemyLifeFactor));
|
||||
@@ -308,8 +324,11 @@ public class DuelScene extends ForgeScene {
|
||||
if (currentEnemy.equipment != null) {
|
||||
for (String oppItem : currentEnemy.equipment) {
|
||||
ItemData item = ItemData.getItem(oppItem);
|
||||
if (item == null)
|
||||
continue;
|
||||
equipmentEffects.add(item.effect);
|
||||
if (item.effect.opponent != null) playerEffects.add(item.effect.opponent);
|
||||
if (item.effect.opponent != null)
|
||||
playerEffects.add(item.effect.opponent);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -343,8 +362,7 @@ public class DuelScene extends ForgeScene {
|
||||
rules = new GameRules(eventData.eventRules.gameType);
|
||||
rules.setGamesPerMatch(eventData.eventRules.gamesPerMatch);
|
||||
bossBattle = false;
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
rules = new GameRules(GameType.Adventure);
|
||||
rules.setGamesPerMatch(enemy.getData().gamesPerMatch);
|
||||
}
|
||||
@@ -358,21 +376,11 @@ public class DuelScene extends ForgeScene {
|
||||
MatchController.instance.setGameView(hostedMatch.getGameView());
|
||||
boolean showMessages = enemy.getData().boss || (enemy.getData().copyPlayerDeck && Current.player().isUsingCustomDeck());
|
||||
if (chaosBattle || showMessages) {
|
||||
final FBufferedImage fb = new FBufferedImage(120, 120) {
|
||||
@Override
|
||||
protected void draw(Graphics g, float w, float h) {
|
||||
if (FSkin.getAvatars().get(90001) != null)
|
||||
g.drawImage(FSkin.getAvatars().get(90001), 0, 0, w, h);
|
||||
}
|
||||
};
|
||||
|
||||
final FBufferedImage fb = getFBEnemyAvatar();
|
||||
bossDialogue = createFOption(Forge.getLocalizer().getMessage("AdvBossIntro" + Aggregates.randomInt(1, 35)),
|
||||
enemy.getName(), fb, fb::dispose);
|
||||
matchOverlay = new LoadingOverlay(() -> FThreads.delayInEDT(300, () -> FThreads.invokeInEdtNowOrLater(() ->
|
||||
FOptionPane.showMessageDialog(Forge.getLocalizer().getMessage("AdvBossIntro"+Aggregates.randomInt(1, 35)), enemy.getName(), fb, new Callback<Integer>() {
|
||||
@Override
|
||||
public void run(Integer result) {
|
||||
fb.dispose();
|
||||
}
|
||||
}))), false, true);
|
||||
bossDialogue.show())), false, true);
|
||||
} else {
|
||||
matchOverlay = new LoadingOverlay(null);
|
||||
}
|
||||
@@ -397,6 +405,7 @@ public class DuelScene extends ForgeScene {
|
||||
public void initDuels(PlayerSprite playerSprite, EnemySprite enemySprite) {
|
||||
initDuels(playerSprite, enemySprite, false, null);
|
||||
}
|
||||
|
||||
public void initDuels(PlayerSprite playerSprite, EnemySprite enemySprite, boolean isArena, AdventureEventData eventData) {
|
||||
this.player = playerSprite;
|
||||
this.enemy = enemySprite;
|
||||
@@ -439,4 +448,14 @@ public class DuelScene extends ForgeScene {
|
||||
}
|
||||
return AI;
|
||||
}
|
||||
|
||||
private FBufferedImage getFBEnemyAvatar() {
|
||||
return new FBufferedImage(120, 120) {
|
||||
@Override
|
||||
protected void draw(Graphics g, float w, float h) {
|
||||
if (FSkin.getAvatars().get(enemyAvatarKey) != null)
|
||||
g.drawImage(FSkin.getAvatars().get(enemyAvatarKey), 0, 0, w, h);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -316,10 +316,10 @@ public class MatchController extends AbstractGuiGame {
|
||||
MatchController.writeMatchPreferences();
|
||||
if (getGameView().isMatchOver()){
|
||||
Forge.setCursor(null, "0");
|
||||
if (!DuelScene.instance().hasCallbackExit()){
|
||||
DuelScene.instance().GameEnd();
|
||||
if (!DuelScene.instance().hasCallbackExit())
|
||||
DuelScene.instance().exitDuelScene();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
else{
|
||||
|
||||
@@ -45,6 +45,7 @@ public class AdventureWinLose extends ControlWinLose {
|
||||
saveOptions();
|
||||
getView().hide();
|
||||
DuelScene.instance().GameEnd();
|
||||
if (!DuelScene.instance().hasCallbackExit())
|
||||
DuelScene.instance().exitDuelScene();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user