EquipItemController.java 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package org.leumasjaffe.charsheet.controller;
  2. import static org.leumasjaffe.charsheet.model.inventory.EquipmentSlot.*;
  3. import javax.swing.JOptionPane;
  4. import org.leumasjaffe.charsheet.model.inventory.DDEquipment;
  5. import org.leumasjaffe.charsheet.model.inventory.DDItem;
  6. import org.leumasjaffe.charsheet.model.inventory.EquipmentSlot;
  7. import org.leumasjaffe.charsheet.view.dialog.EquipItemDialog;
  8. import org.leumasjaffe.observer.ObserverDispatch;
  9. import lombok.RequiredArgsConstructor;
  10. public class EquipItemController {
  11. public static void accept(final DDEquipment inv, final DDItem item) {
  12. if (item.getUnequippedCount() == 0) { return; }
  13. if (inv.canEquip(item) || new Helper(inv).getReplaceItem(item.getSlot())) {
  14. item.adjustCounEquipped(+1);
  15. inv.equipNext(item);
  16. ObserverDispatch.notifySubscribers(inv, null);
  17. }
  18. }
  19. @RequiredArgsConstructor
  20. private static class Helper {
  21. private static final String QUERY_REPLACE = "Replace Equipped Item";
  22. private static final String REPLACE_EITHER = "Which of the following items would you like to replace?";
  23. private static final String REPLACE_BOTH = "Do you want to replace both of the following items?";
  24. private static final String REPLACE_ONE = "Do you want to replace the following item?";
  25. final DDEquipment inv;
  26. private boolean getReplaceItem(final EquipmentSlot slot) {
  27. switch (slot) {
  28. case TWO_HANDS: return selectToReplaceAllOf(TWO_HANDS, MAIN_HAND, OFF_HAND);
  29. case ONE_HAND: return selectToReplaceOneOf(MAIN_HAND, OFF_HAND);
  30. case RING: return selectToReplaceOneOf(RING1, RING2);
  31. default: return selectToReplace(slot);
  32. }
  33. }
  34. private boolean selectToReplaceAllOf(final EquipmentSlot base,
  35. final EquipmentSlot slot1, final EquipmentSlot slot2) {
  36. if (inv.get(slot1).getSlot() == base) {
  37. return selectToReplace(slot1);
  38. } else if (JOptionPane.showConfirmDialog(null, createDialogTwoSlots(REPLACE_BOTH, slot1, slot2),
  39. QUERY_REPLACE, JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
  40. doUnequip(slot1);
  41. doUnequip(slot2);
  42. return true;
  43. }
  44. return false;
  45. }
  46. private boolean selectToReplaceOneOf(final EquipmentSlot slot1,
  47. final EquipmentSlot slot2) {
  48. final int choice = JOptionPane.showOptionDialog(null, createDialogTwoSlots(REPLACE_EITHER, slot1, slot2),
  49. QUERY_REPLACE, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null,
  50. new String[] {"Cancel", slot1.toString(), slot2.toString()}, null);
  51. if (choice == JOptionPane.YES_OPTION) {
  52. doUnequip(slot1);
  53. return true;
  54. } else if (choice == JOptionPane.NO_OPTION) {
  55. doUnequip(slot2);
  56. return true;
  57. }
  58. return false;
  59. }
  60. private boolean selectToReplace(final EquipmentSlot slot) {
  61. if (JOptionPane.showConfirmDialog(null, createDialogOneSlot(slot), QUERY_REPLACE, JOptionPane.YES_NO_OPTION)
  62. == JOptionPane.YES_OPTION) {
  63. doUnequip(slot);
  64. return true;
  65. }
  66. return false;
  67. }
  68. private void doUnequip(final EquipmentSlot slot) {
  69. inv.get(slot).adjustCounEquipped(-1);
  70. inv.unequip(slot);
  71. }
  72. private EquipItemDialog createDialogOneSlot(final EquipmentSlot slot) {
  73. return new EquipItemDialog(REPLACE_ONE, slot, inv.get(slot));
  74. }
  75. private EquipItemDialog createDialogTwoSlots(final String message,
  76. final EquipmentSlot slot1, final EquipmentSlot slot2) {
  77. return new EquipItemDialog(message,
  78. new EquipItemDialog.Tuple(slot1, inv.get(slot1)),
  79. new EquipItemDialog.Tuple(slot2, inv.get(slot2)));
  80. }
  81. }
  82. }