PageRenderTime 42ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/MWClient/src/main/java/mw/client/managers/GameManager.java

http://magicwars.googlecode.com/
Java | 660 lines | 561 code | 35 blank | 64 comment | 10 complexity | b79f54b56fa1888ff71daa94dde15776 MD5 | raw file
  1. package mw.client.managers;
  2. import java.awt.Color;
  3. import java.io.Serializable;
  4. import java.rmi.RemoteException;
  5. import java.util.ArrayList;
  6. import java.util.HashSet;
  7. import javax.swing.JEditorPane;
  8. import javax.swing.JFrame;
  9. import javax.swing.JList;
  10. import javax.swing.JOptionPane;
  11. import javax.swing.JScrollPane;
  12. import javax.swing.ListSelectionModel;
  13. import javax.swing.event.ListSelectionEvent;
  14. import javax.swing.event.ListSelectionListener;
  15. import mw.client.dialogs.ChoiceDialog;
  16. import mw.client.gui.MWClient;
  17. import mw.client.gui.MWHandBeneath;
  18. import mw.client.input.InputManager;
  19. import mw.client.input.Input_ChoosePermanents;
  20. import mw.client.input.Input_DiscardCard;
  21. import mw.client.input.Input_Madness;
  22. import mw.client.input.Input_Mulligan;
  23. import mw.client.input.Input_PayAdditional;
  24. import mw.client.input.Input_PayDiscardCard;
  25. import mw.client.input.Input_PayManaCost;
  26. import mw.client.input.Input_PlayFirst;
  27. import mw.client.input.Input_TargetCreaturePlayer;
  28. import mw.client.input.Input_TargetInPlay;
  29. import mw.client.input.Input_YesNo;
  30. import mw.mtgforge.Input;
  31. import mw.server.model.Card;
  32. import mw.server.model.SideboardInfo;
  33. import mw.server.model.MagicWarsModel.PhaseName;
  34. import mw.server.model.bean.CardBean;
  35. import mw.server.model.bean.SpellBean;
  36. import mw.server.model.cost.ManaCost;
  37. import mw.utils.DateUtil;
  38. import org.apache.log4j.Logger;
  39. public class GameManager {
  40. private static final Logger log = Logger.getLogger(GameManager.class);
  41. /**
  42. * MTG Client singleton.
  43. */
  44. private static MWClient client = null;
  45. public static MWClient getClient() {
  46. if (client == null) {
  47. client = new MWClient();
  48. client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  49. //AudioManager.playMagicWarsTheme();
  50. }
  51. return client;
  52. }
  53. /**
  54. * Game manager. Used for managing all mtg zones in the game.
  55. */
  56. private static GameManager gameManager = null;
  57. public static GameManager getManager() {
  58. if (gameManager == null) {
  59. gameManager = new GameManager();
  60. }
  61. return gameManager;
  62. }
  63. private GameManager() {
  64. }
  65. /**
  66. * Ask about mulligan.
  67. */
  68. public void askAboutMulligan() {
  69. getInputControl().setInput(new Input_Mulligan());
  70. }
  71. /**
  72. * Ask about playing first
  73. */
  74. public void askAboutPlayingFirst() {
  75. getInputControl().setInput(new Input_PlayFirst());
  76. }
  77. /**
  78. * Ask player to pay for spell.
  79. */
  80. public void askPayForSpell(SpellBean spell) {
  81. Input input = new Input_PayManaCost(spell);
  82. setCurrentInput(input);
  83. getInputControl().setInput(input);
  84. }
  85. /**
  86. * Ask player to choose target (creature or player\plainswalker).
  87. */
  88. public void askChooseTargetCreatureOrPlayer(SpellBean spell) {
  89. getInputControl().setInput(new Input_TargetCreaturePlayer(spell));
  90. }
  91. /**
  92. * Ask player to choose Yes or No.
  93. */
  94. public void askChooseYesOrNo(SpellBean spell) {
  95. getInputControl().setInput(new Input_YesNo(spell));
  96. }
  97. /**
  98. * Ask player to choose specific targets
  99. */
  100. public void askChooseTheTargets(SpellBean spell) {
  101. getInputControl().setInput(new Input_TargetInPlay(spell));
  102. }
  103. /**
  104. * Ask player to choose specific targets
  105. */
  106. public void askChoosePermanents(SpellBean spell) {
  107. getInputControl().setInput(new Input_ChoosePermanents(spell));
  108. }
  109. /**
  110. * Ask player to choose specific targets to pay
  111. */
  112. public void askChooseTheTargetsForPay(SpellBean spell) {
  113. getInputControl().setInput(new Input_PayAdditional(spell));
  114. }
  115. /**
  116. * Ask player to choose specific card
  117. */
  118. public void askChooseSpecificCard(SpellBean spell) {
  119. DialogManager.getManager().showChoiceDialog(spell.getChoiceBeans(), spell.areTargetsOptional(), spell.isCancelStopsPlaying());
  120. }
  121. /**
  122. * Ask player to choose specific ability
  123. */
  124. public void askChooseSpecificAbility(SpellBean spell, ArrayList<SpellBean> list) {
  125. DialogManager.getManager().showAbilityChoiceDialog(list, spell.areTargetsOptional());
  126. }
  127. /**
  128. * Ask player to choose specific ability to play
  129. */
  130. public void askChooseSpecificAbilityToPlay(ArrayList<SpellBean> sp) {
  131. ArrayList<Object> params = new ArrayList<Object>();
  132. params.addAll(sp);
  133. GameManager.getManager().setChosenObject(null);
  134. DialogManager.getManager().showChooseDialog(params);
  135. while (GameManager.getManager().getChosenObject() == null) {
  136. try {
  137. Thread.sleep(10);
  138. } catch (InterruptedException ie) {
  139. log.error(ie);
  140. }
  141. }
  142. SpellBean sb = (SpellBean)GameManager.getManager().getChosenObject();
  143. try {
  144. ConnectionManager.sendAddChosenAbilityToPlay(sb);
  145. } catch (RemoteException re) {
  146. re.printStackTrace();
  147. }
  148. /*if (sp.get(0).isChooseTwo()) {
  149. params.remove(sb); // remove already chosen
  150. GameManager.getManager().setChosenObject(null);
  151. DialogManager.getManager().showChooseDialog(params);
  152. while (GameManager.getManager().getChosenObject() == null) {
  153. try {
  154. Thread.sleep(10);
  155. } catch (InterruptedException ie) {
  156. log.error(ie);
  157. }
  158. }
  159. sb = (SpellBean)GameManager.getManager().getChosenObject();
  160. try {
  161. ConnectionManager.sendAddChosenAbilityToPlay(sb);
  162. } catch (RemoteException re) {
  163. re.printStackTrace();
  164. }
  165. }*/
  166. }
  167. public void askChooseValue(ArrayList<Serializable> values) {
  168. askChooseValue(values, null);
  169. }
  170. public void askChooseValue(ArrayList<Serializable> values, String title) {
  171. ArrayList<Object> params = new ArrayList<Object>();
  172. params.addAll(values);
  173. GameManager.getManager().setChosenObject(null);
  174. DialogManager.getManager().showChooseDialog(params, title);
  175. while (GameManager.getManager().getChosenObject() == null) {
  176. try {
  177. Thread.sleep(10);
  178. } catch (InterruptedException ie) {
  179. log.error(ie);
  180. }
  181. }
  182. Serializable result = (Serializable)GameManager.getManager().getChosenObject();
  183. try {
  184. ConnectionManager.sendResult(result);
  185. } catch (RemoteException re) {
  186. re.printStackTrace();
  187. }
  188. }
  189. /**
  190. * Ask player to choose mana symbol to use to pay for the spell
  191. */
  192. public void askChooseManaSymbol(ArrayList<String> choices) {
  193. String manaSymbol = "0";
  194. HashSet<String> manaSet = new HashSet<String>();
  195. boolean hasHybrid = false;
  196. for (String choice : choices) {
  197. if (choice.contains("\\")) {
  198. hasHybrid = true;
  199. break;
  200. }
  201. manaSet.add(choice);
  202. }
  203. if (!hasHybrid) {
  204. GameManager.getManager().setChosenManaSymbol(null);
  205. DialogManager.getManager().showManaChoiceDialog(manaSet);
  206. manaSymbol = GameManager.getManager().getChosenManaSymbol();
  207. try {
  208. while (manaSymbol == null) {
  209. Thread.sleep(0);
  210. manaSymbol = GameManager.getManager().getChosenManaSymbol();
  211. }
  212. } catch (InterruptedException ie) {
  213. ie.printStackTrace();
  214. }
  215. } else {
  216. manaSymbol = (String) getChoice("Choose mana symbol to pay for", choices.toArray());
  217. }
  218. try {
  219. Input input = GameManager.getInputControl().getInput();
  220. Input_PayManaCost payInput = null;
  221. if (input instanceof Input_PayManaCost) {
  222. payInput = (Input_PayManaCost) input;
  223. }
  224. /* commented: bug fix [25.10.2008:ancient lotus]
  225. if (payInput == null) {
  226. return;
  227. }
  228. */
  229. ManaCost newManaCost = ConnectionManager.sendChosenManaSymbol(manaSymbol);
  230. if (newManaCost != null && payInput != null) {
  231. payInput.updateManaCost(newManaCost);
  232. }
  233. } catch (RemoteException re) {
  234. re.printStackTrace();
  235. }
  236. }
  237. /**
  238. * Ask player to choose a planeswalker or player to attack
  239. */
  240. public String askChoosePlayersToAttack(String[] names) {
  241. return (String)getChoice("Choose", names);
  242. }
  243. public void askChooseX() {
  244. askChooseX(false);
  245. }
  246. /**
  247. * Ask player to choose X for the spell
  248. */
  249. public void askChooseX(boolean isXValue2) {
  250. final JEditorPane pane = new JEditorPane();
  251. String s = "";
  252. Integer x = null;
  253. while(x == null)
  254. {
  255. int result = JOptionPane.showConfirmDialog(null, pane, "Type X or press Cancel", JOptionPane.OK_CANCEL_OPTION);
  256. if (result == JOptionPane.CANCEL_OPTION) {
  257. if (isXValue2) {
  258. try {
  259. ConnectionManager.sendXValue2(0);
  260. } catch (RemoteException e) {
  261. log.error(e.getStackTrace());
  262. }
  263. }
  264. break;
  265. }
  266. s = pane.getText().trim();
  267. try {
  268. x = Integer.parseInt(s);
  269. } catch (NumberFormatException e) {
  270. log.error("Wrong number format. Try again.");
  271. JOptionPane.showMessageDialog(null, "Wrong number format. Try again.", "Error", JOptionPane.ERROR_MESSAGE);
  272. pane.setText("");
  273. }
  274. if (x != null && x > 99) {
  275. log.warn("Number is too big (should be less than 100). Try again.");
  276. JOptionPane.showMessageDialog(null, "Number is too big (should be less than 100). Try again.", "Warning", JOptionPane.WARNING_MESSAGE);
  277. pane.setText("");
  278. x = null;
  279. }
  280. }
  281. if (x != null) {
  282. try {
  283. if (isXValue2) {
  284. ConnectionManager.sendXValue2(x);
  285. } else {
  286. ConnectionManager.sendXValue(x);
  287. }
  288. } catch (RemoteException e) {
  289. log.error(e.getStackTrace());
  290. }
  291. }
  292. }
  293. /**
  294. * Ask player to choose player
  295. */
  296. /*public void askChooseTargetPlayer() {
  297. getInputControl().setInput(new Input_TargetPlayer());
  298. }*/
  299. /**
  300. * Ask player to choose card to discard
  301. */
  302. public void askChooseCardToDiscard(SpellBean spell) {
  303. getInputControl().setInput(new Input_DiscardCard(spell));
  304. }
  305. /**
  306. * Ask player to play discarded cards for their madness cost
  307. */
  308. public void askPlayMadness() {
  309. getInputControl().setInput(new Input_Madness());
  310. }
  311. /**
  312. * Ask player to choose card to discard to pay for a spell
  313. */
  314. public void askChooseCardToDiscardToPay(SpellBean spell) {
  315. getInputControl().setInput(new Input_PayDiscardCard(spell));
  316. }
  317. /**
  318. * Get player's hand size
  319. */
  320. public int getMyHandSize() {
  321. int handsize = 0;
  322. try {
  323. handsize = ConnectionManager.getRMIConnection().getHandSize(ProfileManager.getMyId());
  324. } catch (RemoteException re) {
  325. re.printStackTrace();
  326. }
  327. return handsize;
  328. }
  329. public PhaseName getCurrentPhase() {
  330. return currentPhase;
  331. }
  332. public void setCurrentPhase(PhaseName currentPhase) {
  333. this.currentPhase = currentPhase;
  334. if (isCurrentPhase(PhaseName.combat_declare_attackers)) {
  335. WindowManager.getManager().getBeforeDamageStack().setVisible(true);
  336. WindowManager.getManager().getAfterDamageStack().setVisible(true);
  337. } else if (isCurrentPhase(PhaseName.combat_declare_blockers)) {
  338. WindowManager.getManager().getBeforeDamageStack().setVisible(true);
  339. WindowManager.getManager().getAfterDamageStack().setVisible(true);
  340. if (priorityPID == ProfileManager.getMyId()) {
  341. WindowManager.getGuideWindow().reset();
  342. ClientCombatManager.getManager().getCombatFromServer();
  343. } else {
  344. GameManager.getInputControl().blankInput();
  345. }
  346. } else if (isCurrentPhase(PhaseName.main2)) {
  347. WindowManager.getManager().getBeforeDamageStack().setVisible(false);
  348. WindowManager.getManager().getAfterDamageStack().setVisible(false);
  349. WindowManager.getManager().clearArrows();
  350. }
  351. boolean isOpponentTurn = false;
  352. if (priorityPID == ProfileManager.getMyId()) {
  353. GameManager.getInputControl().updateInput();
  354. if (currentPhase.equals(PhaseName.at_endofturn)) {
  355. isOpponentTurn = true; // special case, display it on opponent phase window
  356. }
  357. } else {
  358. GameManager.getInputControl().blankInput();
  359. isOpponentTurn = true;
  360. }
  361. /**
  362. * Update phases drawing
  363. */
  364. if (isOpponentTurn) {
  365. WindowManager.getManager().getMyPhases().setCurrentPhase(PhaseName.blank);
  366. WindowManager.getManager().getOpponentPhases().setCurrentPhase(currentPhase);
  367. } else {
  368. WindowManager.getManager().getMyPhases().setCurrentPhase(currentPhase);
  369. WindowManager.getManager().getOpponentPhases().setCurrentPhase(PhaseName.blank);
  370. }
  371. if (isCurrentPhase(PhaseName.cleanup)) {
  372. WindowManager.getManager().getMyTable().repaintAllCards();
  373. WindowManager.getManager().getOpponentTable().repaintAllCards();
  374. WindowManager.getManager().closeAllRevealWindows();
  375. if (SettingsManager.getManager().getHandType() == 2) {
  376. WindowManager.getManager().getHandBeneath().repaintHand();
  377. }
  378. String time = "[" + DateUtil.now("H:mm:ss") + "]";
  379. WindowManager.getDisplayWindow().addMessage(time + " ", cyanColor);
  380. WindowManager.getDisplayWindow().addMessage("Next turn\n", cyanColor);
  381. WindowManager.getDisplayWindow().showText("");
  382. WindowManager.getDisplayWindow().showInfo("");
  383. AudioManager.playEndTurn();
  384. } else {
  385. AudioManager.playNextPhase();
  386. }
  387. }
  388. public static Object getChoice(String message, Object choices[])
  389. {
  390. final JList list = new JList(choices);
  391. list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  392. if(choices[0] instanceof Card)
  393. {
  394. list.addListSelectionListener(new ListSelectionListener()
  395. {
  396. public void valueChanged(ListSelectionEvent ev)
  397. {
  398. if(list.getSelectedValue() instanceof Card) {
  399. WindowManager.getDisplayWindow().showCard((CardBean)list.getSelectedValue());
  400. }
  401. }
  402. });
  403. }
  404. Object o = list.getSelectedValue();
  405. while(o == null)
  406. {
  407. JOptionPane.showMessageDialog(null, new JScrollPane(list), message, JOptionPane.OK_OPTION);
  408. o = list.getSelectedValue();
  409. }
  410. return o;
  411. }
  412. public boolean isCurrentPhase(PhaseName phaseName) {
  413. return this.currentPhase.equals(phaseName);
  414. }
  415. public void setHasPriority(int pid) {
  416. log.debug("setPriorityPID: " + pid);
  417. priorityPID = pid;
  418. }
  419. public int getPriorityPID() {
  420. log.debug("getPriorityPID: " + priorityPID);
  421. return priorityPID;
  422. }
  423. public CardBean getChosenCard() {
  424. if (chosenCards.size() == 0) {
  425. return null;
  426. }
  427. return chosenCards.get(0);
  428. }
  429. public void setChosenCard(CardBean card) {
  430. if (chosenCards.size() > 0) {
  431. CardBean c = chosenCards.get(0);
  432. if (!c.equals(card)) {
  433. currentChoiceDlg.turnCardBorderOff(c);
  434. }
  435. chosenCards.clear();
  436. }
  437. chosenCards.add(card);
  438. currentChoiceDlg.changeTitle(card.getName());
  439. }
  440. public void resetChosenCards() {
  441. if (chosenCards.size() > 0) {
  442. currentChoiceDlg.turnCardBorderOff(chosenCards.get(0));
  443. }
  444. chosenCards.clear();
  445. if (currentChoiceDlg != null) {
  446. currentChoiceDlg.changeTitle("none");
  447. }
  448. }
  449. public void addChosenCard(CardBean card) {
  450. chosenCards.add(card);
  451. }
  452. public ChoiceDialog getCurrentChoiceDlg() {
  453. return currentChoiceDlg;
  454. }
  455. public void setCurrentChoiceDlg(ChoiceDialog currentChoiceDlg) {
  456. this.currentChoiceDlg = currentChoiceDlg;
  457. }
  458. public String getChosenManaSymbol() {
  459. return chosenManaSymbol;
  460. }
  461. public void setChosenManaSymbol(String chosenManaSymbol) {
  462. this.chosenManaSymbol = chosenManaSymbol;
  463. }
  464. public String getChosenDeck() {
  465. return chosenDeck;
  466. }
  467. public void setChosenDeck(String chosenDeck) {
  468. this.chosenDeck = chosenDeck;
  469. }
  470. public String getChosenDeckAI() {
  471. return chosenDeckAI;
  472. }
  473. public void setChosenDeckAI(String chosenDeckAI) {
  474. this.chosenDeckAI = chosenDeckAI;
  475. }
  476. public Object getChosenObject() {
  477. return chosenObject;
  478. }
  479. public void setChosenObject(Object chosenObject) {
  480. this.chosenObject = chosenObject;
  481. }
  482. public boolean isSolitareGame() {
  483. return solitareGame;
  484. }
  485. public void setSolitareGame(boolean value) {
  486. this.solitareGame = value;
  487. }
  488. public boolean isGameCreated() {
  489. return gameCreated;
  490. }
  491. public void setGameCreated(boolean gameCreated) {
  492. log.info("setGameCreated:"+gameCreated);
  493. this.gameCreated = gameCreated;
  494. }
  495. public static InputManager getInputControl() {
  496. return inputControl;
  497. }
  498. public static void setInputControl(InputManager im) {
  499. inputControl = im;
  500. }
  501. public boolean isLocked() {
  502. return lock;
  503. }
  504. public void setLocked(boolean locked) {
  505. this.lock = locked;
  506. }
  507. public Input getCurrentInput() {
  508. return currentInput;
  509. }
  510. public void setCurrentInput(Input currentInput) {
  511. this.currentInput = currentInput;
  512. }
  513. public boolean isSideboarding() {
  514. return sideboarding;
  515. }
  516. public void setSideboarding(boolean sideboarding) {
  517. this.sideboarding = sideboarding;
  518. }
  519. public SideboardInfo getSideboarded() {
  520. return sideboarded;
  521. }
  522. public void setSideboarded(SideboardInfo sideboarded) {
  523. this.sideboarded = sideboarded;
  524. }
  525. /****************************************************************************
  526. * DATA
  527. */
  528. /**
  529. * ID of active player
  530. */
  531. private int priorityPID;
  532. /**
  533. * Input manager.
  534. */
  535. private static InputManager inputControl = null;
  536. /**
  537. * Phase name
  538. */
  539. private PhaseName currentPhase = PhaseName.blank;
  540. /**
  541. * Chosen cards;
  542. */
  543. private ArrayList<CardBean> chosenCards = new ArrayList<CardBean>();
  544. private String chosenManaSymbol = null;
  545. private ChoiceDialog currentChoiceDlg;
  546. private Color cyanColor = new Color(0,100,100,150);
  547. private String chosenDeck;
  548. private String chosenDeckAI;
  549. private Object chosenObject;
  550. private SideboardInfo sideboarded;
  551. private boolean solitareGame = false;
  552. private boolean gameCreated = false;
  553. private boolean sideboarding = false;
  554. private boolean lock;
  555. private Input currentInput;
  556. }