|
|
@@ -1,9 +1,7 @@
|
|
|
package org.leumasjaffe.charsheet.view.level;
|
|
|
|
|
|
-import static org.leumasjaffe.charsheet.view.level.LevelUpSpellPanel.SpellPickType.*;
|
|
|
-
|
|
|
import java.util.ArrayList;
|
|
|
-import java.util.Collection;
|
|
|
+import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
import java.util.Optional;
|
|
|
import java.util.SortedSet;
|
|
|
@@ -12,6 +10,12 @@ import java.util.function.Consumer;
|
|
|
|
|
|
import javax.swing.JPanel;
|
|
|
|
|
|
+import org.leumasjaffe.charsheet.controller.magic.ChooseSpellTuple;
|
|
|
+import org.leumasjaffe.charsheet.controller.magic.LearnSpellPicker;
|
|
|
+import org.leumasjaffe.charsheet.controller.magic.PrepareDomainSpellPicker;
|
|
|
+import org.leumasjaffe.charsheet.controller.magic.PrepareNewlyLearnedSpellPicker;
|
|
|
+import org.leumasjaffe.charsheet.controller.magic.PrepareSpellPicker;
|
|
|
+import org.leumasjaffe.charsheet.controller.magic.SpellPicker;
|
|
|
import org.leumasjaffe.charsheet.model.DDCharacterClass;
|
|
|
import org.leumasjaffe.charsheet.model.DDCharacterClass.DDSpellbookWrapper;
|
|
|
import org.leumasjaffe.charsheet.model.magic.DDSpell;
|
|
|
@@ -19,7 +23,6 @@ import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
|
|
|
import org.leumasjaffe.charsheet.model.observable.BoolGate;
|
|
|
import org.leumasjaffe.charsheet.model.observable.IntValue;
|
|
|
import org.leumasjaffe.charsheet.view.magic.SelectSpellsPanel;
|
|
|
-import org.leumasjaffe.charsheet.view.magic.SelectSpellsPanel.Info;
|
|
|
import org.leumasjaffe.charsheet.view.skills.SkillLevelUpPanel;
|
|
|
import org.leumasjaffe.function.VoidVoidFunction;
|
|
|
import org.leumasjaffe.observer.ObservableListener;
|
|
|
@@ -34,6 +37,7 @@ import javax.swing.JTabbedPane;
|
|
|
|
|
|
import java.awt.GridBagConstraints;
|
|
|
import java.awt.Insets;
|
|
|
+
|
|
|
import java.awt.Component;
|
|
|
import javax.swing.Box;
|
|
|
import javax.swing.JButton;
|
|
|
@@ -41,7 +45,8 @@ import javax.swing.JButton;
|
|
|
@SuppressWarnings("serial")
|
|
|
@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
|
|
|
class UpdateClassWithLevelPanel extends JPanel {
|
|
|
- static int FEATURE_INDEX = 0, CHOOSE_SKILL_INDEX = 1, LEARN_SPELL_INDEX = 2, PREPARE_SPELL_INDEX = 3;
|
|
|
+ static int FEATURE_INDEX = 0, CHOOSE_SKILL_INDEX = 1, LEARN_SPELL_INDEX = 2, PREPARE_SPELL_INDEX = 3,
|
|
|
+ PREPARE_BONUS_SPELL_INDEX = 4;
|
|
|
|
|
|
LevelUpClassInfo levelUpInfo;
|
|
|
JTabbedPane tabbedPane;
|
|
|
@@ -49,15 +54,20 @@ class UpdateClassWithLevelPanel extends JPanel {
|
|
|
SkillLevelUpPanel skills;
|
|
|
@NonFinal Optional<LevelUpSpellPanel> learnSpells = Optional.empty();
|
|
|
@NonFinal Optional<LevelUpSpellPanel> prepSpells = Optional.empty();
|
|
|
+ @NonFinal Optional<LevelUpSpellPanel> prepBonusSpells = Optional.empty();
|
|
|
|
|
|
- BoolGate readyCount = new BoolGate(4);
|
|
|
+ BoolGate readyCount = new BoolGate(5);
|
|
|
ObservableListener<Consumer<Boolean>, BoolGate> listener;
|
|
|
@NonFinal ObservableListener<UpdateClassWithLevelPanel, BoolGate> learnAndPrepareListener = null;
|
|
|
|
|
|
LU_FeaturesPanel featurePanel;
|
|
|
+
|
|
|
|
|
|
public UpdateClassWithLevelPanel(LevelUpClassInfo info, VoidVoidFunction back,
|
|
|
Consumer<Boolean> setReady) {
|
|
|
+ readyCount.set(LEARN_SPELL_INDEX, true);
|
|
|
+ readyCount.set(PREPARE_SPELL_INDEX, true);
|
|
|
+ readyCount.set(PREPARE_BONUS_SPELL_INDEX, true);
|
|
|
this.levelUpInfo = info;
|
|
|
info.ddClass.getLevel().value(info.toLevel);
|
|
|
GridBagLayout gridBagLayout = new GridBagLayout();
|
|
|
@@ -86,16 +96,7 @@ class UpdateClassWithLevelPanel extends JPanel {
|
|
|
};
|
|
|
tabbedPane.addTab("Skills", null, skills, null);
|
|
|
|
|
|
- // FIXME: Provide Work for secondary
|
|
|
- info.ddClass.getSpellBook().map(DDSpellbookWrapper::getMain).ifPresent(sb -> {
|
|
|
- readyCount.set(LEARN_SPELL_INDEX, !sb.learnsSpells());
|
|
|
- readyCount.set(PREPARE_SPELL_INDEX, !sb.preparesSpells());
|
|
|
- if (sb.learnsSpells()) {
|
|
|
- createPanelsForLearnSpell(sb);
|
|
|
- } else if (sb.preparesSpells()) {
|
|
|
- createPanelForPrepareSpells(sb);
|
|
|
- }
|
|
|
- });
|
|
|
+ info.ddClass.getSpellBook().ifPresent(wrap -> initSpellTabs(info, wrap));
|
|
|
|
|
|
JPanel panel = new JPanel();
|
|
|
GridBagConstraints gbc_panel = new GridBagConstraints();
|
|
|
@@ -126,23 +127,38 @@ class UpdateClassWithLevelPanel extends JPanel {
|
|
|
|
|
|
listener = readyCount.makeListener(setReady);
|
|
|
}
|
|
|
+
|
|
|
+ void initSpellTabs(LevelUpClassInfo info, DDSpellbookWrapper wrap) {
|
|
|
+ DDSpellbook sb = wrap.getMain();
|
|
|
+ readyCount.set(LEARN_SPELL_INDEX, !sb.learnsSpells());
|
|
|
+ readyCount.set(PREPARE_SPELL_INDEX, !sb.preparesSpells());
|
|
|
+ if (sb.learnsSpells()) {
|
|
|
+ createPanelsForLearnSpell(new ChooseSpellTuple(info.ddCharacter, info.ddClass, sb));
|
|
|
+ } else if (sb.preparesSpells()) {
|
|
|
+ createPanelForPrepareSpells(new ChooseSpellTuple(info.ddCharacter, info.ddClass, sb));
|
|
|
+ }
|
|
|
+ wrap.getSecondary().ifPresent(sec -> {
|
|
|
+ readyCount.set(PREPARE_BONUS_SPELL_INDEX, false);
|
|
|
+ createBonusSpellbookPreparePanel(new ChooseSpellTuple(info.ddCharacter, info.ddClass, sec));
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
- private void createPanelForPrepareSpells(DDSpellbook sb) {
|
|
|
- prepSpells = Optional.of(new LevelUpSpellPanel(PREPARE,
|
|
|
- new SelectSpellsPanel.Info(levelUpInfo.ddCharacter, levelUpInfo.ddClass, sb),
|
|
|
+ private void createPanelForPrepareSpells(ChooseSpellTuple info) {
|
|
|
+ prepSpells = Optional.of(new LevelUpSpellPanel(new PrepareSpellPicker(info),
|
|
|
+ new ChooseSpellTuple(levelUpInfo.ddCharacter, levelUpInfo.ddClass, info.spellBook),
|
|
|
readyCount.handle(PREPARE_SPELL_INDEX)));
|
|
|
tabbedPane.addTab("Prepare Spells", null, prepSpells.get(), null);
|
|
|
}
|
|
|
|
|
|
- private void createPanelsForLearnSpell(DDSpellbook sb) {
|
|
|
- learnSpells = Optional.of(new LevelUpSpellPanel(LEARN,
|
|
|
- new SelectSpellsPanel.Info(levelUpInfo.ddCharacter, levelUpInfo.ddClass, sb),
|
|
|
+ private void createPanelsForLearnSpell(ChooseSpellTuple info) {
|
|
|
+ learnSpells = Optional.of(new LevelUpSpellPanel(new LearnSpellPicker(info),
|
|
|
+ new ChooseSpellTuple(levelUpInfo.ddCharacter, levelUpInfo.ddClass, info.spellBook),
|
|
|
readyCount.handle(LEARN_SPELL_INDEX)));
|
|
|
tabbedPane.addTab("Learn Spells", null, learnSpells.get(), null);
|
|
|
- if (sb.preparesSpells()) {
|
|
|
+ if (info.spellBook.preparesSpells()) {
|
|
|
learnAndPrepareListener = new ObservableListener<>(this, (c, v) -> {
|
|
|
if (v.get(LEARN_SPELL_INDEX)) {
|
|
|
- if (!prepSpells.isPresent()) c.createPrepareLearnedSpellPanel(learnSpells.get(), sb);
|
|
|
+ if (!prepSpells.isPresent()) c.createPrepareLearnedSpellPanel(learnSpells.get(), info);
|
|
|
} else {
|
|
|
prepSpells.ifPresent(c.tabbedPane::remove);
|
|
|
c.prepSpells = Optional.empty();
|
|
|
@@ -151,26 +167,23 @@ class UpdateClassWithLevelPanel extends JPanel {
|
|
|
learnAndPrepareListener.setObserved(readyCount);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private void createBonusSpellbookPreparePanel(ChooseSpellTuple info) {
|
|
|
+ prepBonusSpells = Optional.of(new LevelUpSpellPanel(new PrepareDomainSpellPicker(info),
|
|
|
+ new ChooseSpellTuple(levelUpInfo.ddCharacter, levelUpInfo.ddClass, info.spellBook),
|
|
|
+ readyCount.handle(PREPARE_BONUS_SPELL_INDEX)));
|
|
|
+ tabbedPane.addTab("Bonus Spells", null, prepBonusSpells.get(), null);
|
|
|
+ }
|
|
|
|
|
|
- private void createPrepareLearnedSpellPanel(LevelUpSpellPanel spells, DDSpellbook sb) {
|
|
|
- LevelUpSpellPanel.SpellPicker pick = new LevelUpSpellPanel.SpellPicker() {
|
|
|
- @Override
|
|
|
- public List<List<Integer>> getSpellCounts(Info info) {
|
|
|
- return PREPARE.getSpellCounts(info);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Collection<DDSpell> getAvailableSpells(Info info, int i) {
|
|
|
- final Collection<DDSpell> start = new ArrayList<>(PREPARE.getAvailableSpells(info, i));
|
|
|
- if (spells.getPanels().get(i) != null) {
|
|
|
- start.addAll(spells.getPanels().get(i).getPrepared());
|
|
|
- }
|
|
|
- return start;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
+ private void createPrepareLearnedSpellPanel(LevelUpSpellPanel spells, ChooseSpellTuple info) {
|
|
|
+ SpellPicker pick = new PrepareNewlyLearnedSpellPicker(info, level ->
|
|
|
+ Optional.ofNullable(spells.getPanels().get(level))
|
|
|
+ .map(SelectSpellsPanel::getPrepared)
|
|
|
+ .orElse(Collections.emptyList())
|
|
|
+ );
|
|
|
+
|
|
|
prepSpells = Optional.of(new LevelUpSpellPanel(pick,
|
|
|
- new SelectSpellsPanel.Info(levelUpInfo.ddCharacter, levelUpInfo.ddClass, sb),
|
|
|
+ new ChooseSpellTuple(levelUpInfo.ddCharacter, levelUpInfo.ddClass, info.spellBook),
|
|
|
readyCount.handle(PREPARE_SPELL_INDEX)));
|
|
|
tabbedPane.addTab("Prepare Spells", null, prepSpells.get(), null);
|
|
|
}
|
|
|
@@ -183,23 +196,32 @@ class UpdateClassWithLevelPanel extends JPanel {
|
|
|
}
|
|
|
|
|
|
|
|
|
- private void commitSpellbook(DDSpellbook book) {
|
|
|
+ private void commitSpellbook(DDSpellbookWrapper wrap) {
|
|
|
learnSpells.ifPresent(pan -> {
|
|
|
final List<SelectSpellsPanel> selections = pan.getPanels();
|
|
|
for (int i = 0; i < selections.size(); ++i) {
|
|
|
if (selections.get(i) == null) continue;
|
|
|
- List<DDSpell> known = new ArrayList<>(book.spellsKnownAtLevel(i));
|
|
|
+ List<DDSpell> known = new ArrayList<>(wrap.getMain().spellsKnownAtLevel(i));
|
|
|
known.addAll(selections.get(i).getPrepared());
|
|
|
- book.learnSpells(i, known);
|
|
|
+ wrap.getMain().learnSpells(i, known);
|
|
|
}
|
|
|
});
|
|
|
prepSpells.ifPresent(pan -> {
|
|
|
final List<SelectSpellsPanel> selections = pan.getPanels();
|
|
|
for (int i = 0; i < selections.size(); ++i) {
|
|
|
if (selections.get(i) == null) continue;
|
|
|
- List<DDSpell> known = new ArrayList<>(book.spellsPreparedAtLevel(i));
|
|
|
- known.addAll(selections.get(i).getPrepared());
|
|
|
- book.prepareSpells(i, known);
|
|
|
+ List<DDSpell> prep = new ArrayList<>(wrap.getMain().spellsPreparedAtLevel(i));
|
|
|
+ prep.addAll(selections.get(i).getPrepared());
|
|
|
+ wrap.getMain().prepareSpells(i, prep);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ prepBonusSpells.ifPresent(pan -> {
|
|
|
+ final List<SelectSpellsPanel> selections = pan.getPanels();
|
|
|
+ for (int i = 0; i < selections.size(); ++i) {
|
|
|
+ if (selections.get(i) == null) continue;
|
|
|
+ List<DDSpell> prep = new ArrayList<>(wrap.getSecondary().get().spellsPreparedAtLevel(i));
|
|
|
+ prep.addAll(selections.get(i).getPrepared());
|
|
|
+ wrap.getSecondary().get().prepareSpells(i, prep);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
@@ -207,9 +229,7 @@ class UpdateClassWithLevelPanel extends JPanel {
|
|
|
public void commitAllChanges() {
|
|
|
final String className = levelUpInfo.ddClass.getName();
|
|
|
skills.commitAllChanges();
|
|
|
- // FIXME: Secondary spellbook here too?
|
|
|
- final Optional<DDSpellbook> maybeBook = levelUpInfo.ddClass.getSpellBook().map(DDSpellbookWrapper::getMain);
|
|
|
- maybeBook.ifPresent(this::commitSpellbook);
|
|
|
+ levelUpInfo.ddClass.getSpellBook().ifPresent(this::commitSpellbook);
|
|
|
final SortedSet<DDCharacterClass> classes = new TreeSet<>(levelUpInfo.ddCharacter.getClasses());
|
|
|
classes.removeIf(cc -> cc.getName().equals(className));
|
|
|
classes.add(levelUpInfo.ddClass);
|