Fixed ClassCastException at the end of quest games

This commit is contained in:
Fnoed
2012-03-17 23:50:58 +00:00
parent 2df62d75f6
commit 8bc45fe020
3 changed files with 1024 additions and 1042 deletions

View File

@@ -1,327 +1,324 @@
package forge.gui.home.quest; package forge.gui.home.quest;
import java.io.File; import forge.AllZone;
import java.util.Set; import forge.Command;
import forge.Constant;
import javax.swing.ImageIcon; import forge.Singletons;
import javax.swing.SwingUtilities; import forge.control.FControl;
import javax.swing.SwingWorker; import forge.deck.Deck;
import forge.game.GameNew;
import org.apache.commons.lang3.StringUtils; import forge.game.GameType;
import forge.gui.OverlayUtils;
import net.miginfocom.swing.MigLayout; import forge.gui.deckeditor.QuestCardShop;
import forge.AllZone; import forge.gui.toolbox.FLabel;
import forge.Command; import forge.gui.toolbox.FPanel;
import forge.Constant; import forge.gui.toolbox.FSkin;
import forge.Singletons; import forge.gui.toolbox.FTextArea;
import forge.control.FControl; import forge.properties.ForgeProps;
import forge.deck.Deck; import forge.properties.NewConstants;
import forge.game.GameNew; import forge.quest.QuestChallenge;
import forge.game.GameType; import forge.quest.QuestController;
import forge.gui.OverlayUtils; import forge.quest.QuestEvent;
import forge.gui.deckeditor.QuestCardShop; import forge.quest.QuestUtil;
import forge.gui.toolbox.FLabel; import forge.quest.data.QuestAchievements;
import forge.gui.toolbox.FPanel; import forge.quest.data.QuestAssets;
import forge.gui.toolbox.FSkin; import forge.quest.data.QuestMode;
import forge.gui.toolbox.FTextArea; import forge.quest.data.QuestPreferences.QPref;
import forge.properties.ForgeProps; import forge.quest.data.item.QuestItemType;
import forge.properties.NewConstants; import forge.quest.data.pet.QuestPetAbstract;
import forge.quest.QuestChallenge; import net.miginfocom.swing.MigLayout;
import forge.quest.QuestController; import org.apache.commons.lang3.StringUtils;
import forge.quest.QuestEvent;
import forge.quest.QuestEvent.QuestEventType; import javax.swing.*;
import forge.quest.QuestUtil; import java.io.File;
import forge.quest.data.QuestAchievements; import java.util.Set;
import forge.quest.data.QuestAssets;
import forge.quest.data.QuestMode; import static forge.quest.QuestEvent.QuestEventType.CHALLENGE;
import forge.quest.data.QuestPreferences.QPref;
import forge.quest.data.item.QuestItemType; /**
import forge.quest.data.pet.QuestPetAbstract; * Utilities for the quest submenu, all over the MVC spectrum.
* If a piece of code can be reused, it's dumped here.
/** */
* Utilities for the quest submenu, all over the MVC spectrum. public class SubmenuQuestUtil {
* If a piece of code can be reused, it's dumped here. private static SelectablePanel selectedOpponent;
*/
public class SubmenuQuestUtil { /**
private static SelectablePanel selectedOpponent; * <p>
* nextChallengeInWins.
/** * </p>
* <p> *
* nextChallengeInWins. * @return a int.
* </p> */
* public static int nextChallengeInWins() {
* @return a int. final QuestController qData = AllZone.getQuest();
*/ final int challengesPlayed = qData.getAchievements().getChallengesPlayed();
public static int nextChallengeInWins() {
final QuestController qData = AllZone.getQuest(); int mul = 5;
final int challengesPlayed = qData.getAchievements().getChallengesPlayed(); if (qData.getAssets().hasItem(QuestItemType.ZEPPELIN)) {
mul = 3;
int mul = 5; } else if (qData.getAssets().hasItem(QuestItemType.MAP)) {
if (qData.getAssets().hasItem(QuestItemType.ZEPPELIN)) { mul = 4;
mul = 3; }
} else if (qData.getAssets().hasItem(QuestItemType.MAP)) {
mul = 4; final int wins = qData.getAchievements().getWin();
} final int delta = (wins < 20 ? 20 - wins : (challengesPlayed * mul) - wins);
final int wins = qData.getAchievements().getWin(); return (delta > 0) ? delta : 0;
final int delta = (wins < 20 ? 20 - wins : (challengesPlayed * mul) - wins); }
return (delta > 0) ? delta : 0; /** Updates stats, pets panels for both duels and challenges. */
} public static void updateStatsAndPet() {
final QuestController qData = AllZone.getQuest();
/** Updates stats, pets panels for both duels and challenges. */ final QuestAchievements qA = qData.getAchievements();
public static void updateStatsAndPet() { final QuestAssets qS = qData.getAssets();
final QuestController qData = AllZone.getQuest();
final QuestAchievements qA = qData.getAchievements(); if (qA == null) { return; }
final QuestAssets qS = qData.getAssets();
final IStatsAndPet[] viewsToUpdate = new IStatsAndPet[] {
if (qA == null) { return; } VSubmenuDuels.SINGLETON_INSTANCE,
VSubmenuChallenges.SINGLETON_INSTANCE
final IStatsAndPet[] viewsToUpdate = new IStatsAndPet[] { };
VSubmenuDuels.SINGLETON_INSTANCE,
VSubmenuChallenges.SINGLETON_INSTANCE
}; for (final IStatsAndPet view : viewsToUpdate) {
// Fantasy UI display
view.getLblNextChallengeInWins().setVisible(true);
for (final IStatsAndPet view : viewsToUpdate) { view.getBtnBazaar().setVisible(true);
// Fantasy UI display view.getLblLife().setVisible(true);
view.getLblNextChallengeInWins().setVisible(true);
view.getBtnBazaar().setVisible(true); // Stats panel
view.getLblLife().setVisible(true); view.getLblCredits().setText("Credits: " + qS.getCredits());
view.getLblLife().setText("Life: " + qS.getLife(qData.getMode()));
// Stats panel view.getLblWins().setText("Wins: " + qA.getWin());
view.getLblCredits().setText("Credits: " + qS.getCredits()); view.getLblLosses().setText("Losses: " + qA.getLost());
view.getLblLife().setText("Life: " + qS.getLife(qData.getMode())); view.updateCurrentDeckStatus();
view.getLblWins().setText("Wins: " + qA.getWin());
view.getLblLosses().setText("Losses: " + qA.getLost()); final int num = SubmenuQuestUtil.nextChallengeInWins();
view.updateCurrentDeckStatus(); if (num == 0) {
view.getLblNextChallengeInWins().setText("Next challenge available now.");
final int num = SubmenuQuestUtil.nextChallengeInWins(); }
if (num == 0) { else {
view.getLblNextChallengeInWins().setText("Next challenge available now."); view.getLblNextChallengeInWins().setText("Next challenge available in " + num + " wins.");
} }
else {
view.getLblNextChallengeInWins().setText("Next challenge available in " + num + " wins."); view.getLblWinStreak().setText(
} "Win streak: " + qA.getWinStreakCurrent()
+ " (Best:" + qA.getWinStreakBest() + ")");
view.getLblWinStreak().setText(
"Win streak: " + qA.getWinStreakCurrent() // Start panel: pet, plant, zep.
+ " (Best:" + qA.getWinStreakBest() + ")"); if (qData.getMode() == QuestMode.Fantasy) {
final Set<String> petList = qS.getPetManager().getAvailablePetNames();
// Start panel: pet, plant, zep. final QuestPetAbstract currentPet = qS.getPetManager().getSelectedPet();
if (qData.getMode() == QuestMode.Fantasy) {
final Set<String> petList = qS.getPetManager().getAvailablePetNames(); view.getCbxPet().removeAllItems();
final QuestPetAbstract currentPet = qS.getPetManager().getSelectedPet(); // Pet list visibility
if (petList.size() > 0) {
view.getCbxPet().removeAllItems(); view.getCbxPet().setEnabled(true);
// Pet list visibility view.getCbxPet().addItem("Don't summon a pet");
if (petList.size() > 0) { for (final String pet : petList) {
view.getCbxPet().setEnabled(true); view.getCbxPet().addItem("Summon " + pet);
view.getCbxPet().addItem("Don't summon a pet"); }
for (final String pet : petList) {
view.getCbxPet().addItem("Summon " + pet); if (currentPet != null) { view.getCbxPet().setSelectedItem("Summon " + currentPet.getName()); }
} } else {
view.getCbxPet().setVisible(false);
if (currentPet != null) { view.getCbxPet().setSelectedItem("Summon " + currentPet.getName()); } }
} else {
view.getCbxPet().setVisible(false); // Plant visiblity
} if (qS.getPetManager().getPlant().getLevel() == 0) {
view.getCbPlant().setVisible(false);
// Plant visiblity }
if (qS.getPetManager().getPlant().getLevel() == 0) { else {
view.getCbPlant().setVisible(false); view.getCbPlant().setVisible(true);
} view.getCbPlant().setSelected(qS.getPetManager().shouldPlantBeUsed());
else { }
view.getCbPlant().setVisible(true);
view.getCbPlant().setSelected(qS.getPetManager().shouldPlantBeUsed()); view.getCbZep().setVisible(qS.hasItem(QuestItemType.ZEPPELIN));
} }
else {
view.getCbZep().setVisible(qS.hasItem(QuestItemType.ZEPPELIN)); // Classic mode display changes
} view.getCbxPet().setVisible(false);
else { view.getCbPlant().setVisible(false);
// Classic mode display changes view.getCbZep().setVisible(false);
view.getCbxPet().setVisible(false); view.getLblNextChallengeInWins().setVisible(false);
view.getCbPlant().setVisible(false); view.getBtnBazaar().setVisible(false);
view.getCbZep().setVisible(false); view.getLblLife().setVisible(false);
view.getLblNextChallengeInWins().setVisible(false); }
view.getBtnBazaar().setVisible(false); }
view.getLblLife().setVisible(false); }
}
} /** @return {@link forge.view.home.ViewQuest.SelectablePanel} */
} public static SelectablePanel getSelectedOpponent() {
return selectedOpponent;
/** @return {@link forge.view.home.ViewQuest.SelectablePanel} */ }
public static SelectablePanel getSelectedOpponent() {
return selectedOpponent; /** @return {@link forge.deck.Deck} */
} public static Deck getCurrentDeck() {
Deck d = null;
/** @return {@link forge.deck.Deck} */
public static Deck getCurrentDeck() { if (AllZone.getQuest().getAssets() != null) {
Deck d = null; d = AllZone.getQuest().getMyDecks().get(
Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_DECK));
if (AllZone.getQuest().getAssets() != null) { }
d = AllZone.getQuest().getMyDecks().get(
Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_DECK)); return d;
} }
return d; /** */
} @SuppressWarnings("serial")
public static void showSpellShop() {
/** */ final Command exit = new Command() {
@SuppressWarnings("serial") @Override
public static void showSpellShop() { public void execute() {
final Command exit = new Command() { AllZone.getQuest().save();
@Override updateStatsAndPet();
public void execute() { }
AllZone.getQuest().save(); };
updateStatsAndPet();
} final QuestCardShop g = new QuestCardShop(AllZone.getQuest());
}; g.show(exit);
g.setVisible(true);
final QuestCardShop g = new QuestCardShop(AllZone.getQuest()); }
g.show(exit);
g.setVisible(true); /** */
} public static void showBazaar() {
Singletons.getControl().changeState(FControl.QUEST_BAZAAR);
/** */ Singletons.getView().getFrame().validate();
public static void showBazaar() { }
Singletons.getControl().changeState(FControl.QUEST_BAZAAR);
Singletons.getView().getFrame().validate(); /** */
} public static void startGame() {
final QuestController qData = AllZone.getQuest();
/** */ final QuestEvent event = selectedOpponent.getEvent();
public static void startGame() {
final QuestController qData = AllZone.getQuest(); SwingUtilities.invokeLater(new Runnable() {
final QuestEvent event = selectedOpponent.getEvent(); @Override
public void run() {
SwingUtilities.invokeLater(new Runnable() { OverlayUtils.startGameOverlay();
@Override OverlayUtils.showOverlay();
public void run() { }
OverlayUtils.startGameOverlay(); });
OverlayUtils.showOverlay();
} final SwingWorker<Object, Void> worker = new SwingWorker<Object, Void>() {
}); @Override
public Object doInBackground() {
final SwingWorker<Object, Void> worker = new SwingWorker<Object, Void>() { Constant.Runtime.HUMAN_DECK[0] = SubmenuQuestUtil.getCurrentDeck();
@Override Constant.Runtime.COMPUTER_DECK[0] = event.getEventDeck();
public Object doInBackground() { Constant.Runtime.setGameType(GameType.Quest);
Constant.Runtime.HUMAN_DECK[0] = SubmenuQuestUtil.getCurrentDeck();
Constant.Runtime.COMPUTER_DECK[0] = event.getEventDeck(); qData.getEventManager().randomizeOpponents();
Constant.Runtime.setGameType(GameType.Quest); qData.setCurrentEvent(event);
qData.save();
qData.getEventManager().randomizeOpponents();
qData.setCurrentEvent(event); if (qData.getMode() == QuestMode.Fantasy) {
qData.save(); int lifeAI = 20;
int lifeHuman = 20;
if (qData.getMode() == QuestMode.Fantasy) {
int lifeAI = 20; if (selectedOpponent.getEvent().getEventType() == CHALLENGE) {
int lifeHuman = 20; int extraLife = 0;
if (selectedOpponent.getEvent().getEventType().equals(QuestEventType.CHALLENGE)) { // If zeppelin has been purchased, gear will be at level 2.
int extraLife = 0; if (qData.getAssets().hasItem(QuestItemType.ZEPPELIN)
&& VSubmenuChallenges.SINGLETON_INSTANCE.getCbZep().isSelected()) {
// If zeppelin has been purchased, gear will be at level 2. extraLife = 3;
if (qData.getAssets().hasItem(QuestItemType.ZEPPELIN) }
&& VSubmenuChallenges.SINGLETON_INSTANCE.getCbZep().isSelected()) { lifeAI = ((QuestChallenge) event).getAILife();
extraLife = 3; lifeHuman = qData.getAssets().getLife(qData.getMode()) + extraLife;
} }
lifeAI = ((QuestChallenge) event).getAILife();
lifeHuman = qData.getAssets().getLife(qData.getMode()) + extraLife; GameNew.newGame(
} Constant.Runtime.HUMAN_DECK[0],
Constant.Runtime.COMPUTER_DECK[0],
GameNew.newGame( QuestUtil.getHumanStartingCards(qData.getAssets(), event),
Constant.Runtime.HUMAN_DECK[0], QuestUtil.getComputerStartingCards(event),
Constant.Runtime.COMPUTER_DECK[0], lifeHuman,
QuestUtil.getHumanStartingCards(qData.getAssets(), event), lifeAI,
QuestUtil.getComputerStartingCards(event), event.getIconFilename());
lifeHuman, } // End isFantasy
lifeAI, else {
event.getIconFilename()); GameNew.newGame(SubmenuQuestUtil.getCurrentDeck(), event.getEventDeck());
} // End isFantasy }
else { return null;
GameNew.newGame(SubmenuQuestUtil.getCurrentDeck(), event.getEventDeck()); }
}
return null; @Override
} public void done() {
OverlayUtils.hideOverlay();
@Override }
public void done() { };
OverlayUtils.hideOverlay(); worker.execute();
} }
};
worker.execute(); /** Selectable panels for duels and challenges. */
} @SuppressWarnings("serial")
public static class SelectablePanel extends FPanel {
/** Selectable panels for duels and challenges. */ private final QuestEvent event;
@SuppressWarnings("serial")
public static class SelectablePanel extends FPanel { /** @param e0 &emsp; QuestEvent */
private final QuestEvent event; public SelectablePanel(final QuestEvent e0) {
super();
/** @param e0 &emsp; QuestEvent */ this.event = e0;
public SelectablePanel(final QuestEvent e0) { this.setSelectable(true);
super(); this.setHoverable(true);
this.event = e0; this.setLayout(new MigLayout("insets 0, gap 0"));
this.setSelectable(true);
this.setHoverable(true); this.setCommand(new Command() {
this.setLayout(new MigLayout("insets 0, gap 0")); @Override
public void execute() {
this.setCommand(new Command() { if (selectedOpponent != null) {
@Override selectedOpponent.setSelected(false);
public void execute() { }
if (selectedOpponent != null) {
selectedOpponent.setSelected(false); if (VSubmenuDuels.SINGLETON_INSTANCE.getPanel().isShowing() && getCurrentDeck() != null) {
} VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(true);
VSubmenuChallenges.SINGLETON_INSTANCE.getBtnStart().setEnabled(false);
if (VSubmenuDuels.SINGLETON_INSTANCE.getPanel().isShowing() && getCurrentDeck() != null) { }
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(true); else if (VSubmenuChallenges.SINGLETON_INSTANCE.getPanel().isShowing() && getCurrentDeck() != null) {
VSubmenuChallenges.SINGLETON_INSTANCE.getBtnStart().setEnabled(false); VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(false);
} VSubmenuChallenges.SINGLETON_INSTANCE.getBtnStart().setEnabled(true);
else if (VSubmenuChallenges.SINGLETON_INSTANCE.getPanel().isShowing() && getCurrentDeck() != null) { }
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(false);
VSubmenuChallenges.SINGLETON_INSTANCE.getBtnStart().setEnabled(true); selectedOpponent = SubmenuQuestUtil.SelectablePanel.this;
} }
});
selectedOpponent = SubmenuQuestUtil.SelectablePanel.this;
} // Icon
}); final File base = ForgeProps.getFile(NewConstants.IMAGE_ICON);
final File file = new File(base, event.getIconFilename());
// Icon
final File base = ForgeProps.getFile(NewConstants.IMAGE_ICON); final FLabel lblIcon = new FLabel.Builder().iconScaleFactor(1).build();
final File file = new File(base, event.getIconFilename()); if (!file.exists()) {
lblIcon.setIcon(FSkin.getIcon(FSkin.ForgeIcons.ICO_UNKNOWN));
final FLabel lblIcon = new FLabel.Builder().iconScaleFactor(1).build(); }
if (!file.exists()) { else {
lblIcon.setIcon(FSkin.getIcon(FSkin.ForgeIcons.ICO_UNKNOWN)); lblIcon.setIcon(new ImageIcon(file.toString()));
} }
else { this.add(lblIcon, "h 60px!, w 60px!, gap 10px 10px 10px 0, span 1 2");
lblIcon.setIcon(new ImageIcon(file.toString()));
} // Name
this.add(lblIcon, "h 60px!, w 60px!, gap 10px 10px 10px 0, span 1 2"); final FLabel lblName = new FLabel.Builder().hoverable(false).build();
if (event.getEventType() == CHALLENGE) {
// Name lblName.setText(event.getTitle() + ": "
final FLabel lblName = new FLabel.Builder().hoverable(false).build(); + StringUtils.capitalize(event.getDifficulty())
if (event.getEventType().equals(QuestEventType.CHALLENGE)) { + (((QuestChallenge) event).isRepeatable() ? ", Repeatable" : ""));
lblName.setText(event.getTitle() + ": " }
+ StringUtils.capitalize(event.getDifficulty()) else {
+ (((QuestChallenge) event).isRepeatable() ? ", Repeatable" : "")); lblName.setText(event.getTitle() + ": "
} + StringUtils.capitalize(event.getDifficulty()));
else { }
lblName.setText(event.getTitle() + ": " this.add(lblName, "h 31px!, gap 0 0 10px 5px, wrap");
+ StringUtils.capitalize(event.getDifficulty()));
} // Description
this.add(lblName, "h 31px!, gap 0 0 10px 5px, wrap"); final FTextArea tarDesc = new FTextArea();
tarDesc.setText(event.getDescription());
// Description
final FTextArea tarDesc = new FTextArea(); tarDesc.setFont(FSkin.getItalicFont(12));
tarDesc.setText(event.getDescription()); this.add(tarDesc, "w 80%!, h 30px!");
}
tarDesc.setFont(FSkin.getItalicFont(12));
this.add(tarDesc, "w 80%!, h 30px!"); /** @return QuestEvent */
} public QuestEvent getEvent() {
return event;
/** @return QuestEvent */ }
public QuestEvent getEvent() { }
return event; }
}
}
}

View File

@@ -17,15 +17,12 @@
*/ */
package forge.quest; package forge.quest;
import forge.*;
import forge.quest.data.QuestAssets;
import java.util.List; import java.util.List;
import forge.AllZone; import static forge.quest.QuestEvent.QuestEventType.CHALLENGE;
import forge.Card;
import forge.CardList;
import forge.CardUtil;
import forge.Player;
import forge.quest.QuestEvent.QuestEventType;
import forge.quest.data.QuestAssets;
/** /**
* <p> * <p>
@@ -65,7 +62,7 @@ public class QuestUtil {
public static CardList getComputerStartingCards(final QuestEvent qe) { public static CardList getComputerStartingCards(final QuestEvent qe) {
final CardList list = new CardList(); final CardList list = new CardList();
if (qe.getEventType().equals(QuestEventType.CHALLENGE)) { if (qe.getEventType() == CHALLENGE) {
final List<String> extras = ((QuestChallenge) qe).getAIExtraCards(); final List<String> extras = ((QuestChallenge) qe).getAIExtraCards();
for (final String s : extras) { for (final String s : extras) {
@@ -116,7 +113,7 @@ public class QuestUtil {
public static CardList getHumanStartingCards(final QuestAssets qa, final QuestEvent qe) { public static CardList getHumanStartingCards(final QuestAssets qa, final QuestEvent qe) {
final CardList list = QuestUtil.getHumanStartingCards(qa); final CardList list = QuestUtil.getHumanStartingCards(qa);
if (qe.getEventType().equals(QuestEventType.CHALLENGE)) { if (qe.getEventType() == CHALLENGE) {
final List<String> extras = ((QuestChallenge) qe).getHumanExtraCards(); final List<String> extras = ((QuestChallenge) qe).getHumanExtraCards();
for (final String s : extras) { for (final String s : extras) {

File diff suppressed because it is too large Load Diff