ソースを参照

Adding ability to gain experience.
- TODO: flesh out level up panel
- TODO: postpone leveling up?

Sam Jaffe 8 年 前
コミット
e9ac471cd5

+ 14 - 0
src/main/lombok/org/leumasjaffe/charsheet/view/D20Sheet.java

@@ -18,12 +18,15 @@ import javax.swing.JPanel;
 import javax.swing.JMenuBar;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
 import javax.swing.KeyStroke;
 import javax.swing.UIManager;
 
 import org.leumasjaffe.charsheet.model.DDCharacter;
 import org.leumasjaffe.charsheet.model.DDCharacterClass;
+import org.leumasjaffe.charsheet.model.observable.IntValue;
 import org.leumasjaffe.charsheet.observer.ObserverHelper;
+import org.leumasjaffe.observer.ObserverDispatch;
 
 import java.awt.event.KeyEvent;
 import java.awt.event.WindowEvent;
@@ -114,6 +117,17 @@ public class D20Sheet extends JFrame {
 		menuBar.add(mnSession);
 		
 		JMenuItem mntmGainExperience = new JMenuItem("Gain Experience");
+		mntmGainExperience.addActionListener(e -> {
+			// TODO move to own thing?
+			final String input = JOptionPane.showInputDialog("How much experience");
+			if (input == null || input.isEmpty()) return;
+			final int exp = Integer.parseInt(input);
+			if (exp <= 0) return;
+			final IntValue mdlExp = this.model.getExperience();
+			mdlExp.value(mdlExp.value()+exp);
+			ObserverDispatch.notifySubscribers(mdlExp, this);
+			DialogBuilder.showLevelUpDialog(this, this.model, 0);
+		});
 		mnSession.add(mntmGainExperience);
 		
 		JMenuItem mntmTakeRest = new JMenuItem("Take Rest");

+ 14 - 6
src/main/lombok/org/leumasjaffe/charsheet/view/DeveloperMenu.java

@@ -19,16 +19,24 @@ public class DeveloperMenu extends JMenu {
 	
 	public DeveloperMenu(final JFrame parent) {
 		super("Developer");
-		JMenuItem mntmLevelUp = new JMenuItem("Level Up - Skill");
-		mntmLevelUp.addActionListener( e -> {
-			Object[] choices = model[0].getClasses().stream().map(DDCharacterClass::getName).collect(Collectors.toList()).toArray();
-			String clazz = (String) JOptionPane.showInputDialog(this.getParent(), "Which Class is Leveling Up?", "Level Up - Skill", 
+		JMenuItem mntmLevelUp = new JMenuItem("Level Up - Class");
+		mntmLevelUp.addActionListener(e -> {
+			DialogBuilder.showLevelUpDialog(parent, model[0], 1);
+		});
+		add(mntmLevelUp);
+		JMenuItem mntmLUSkill = new JMenuItem("Level Up - Skill");
+		mntmLUSkill.addActionListener(e -> {
+			Object[] choices = model[0].getClasses().stream().map(DDCharacterClass::getName)
+					.collect(Collectors.toList()).toArray();
+			String clazz = (String) JOptionPane.showInputDialog(this.getParent(), 
+					"Which Class is Leveling Up?", "Level Up - Skill", 
 					JOptionPane.QUESTION_MESSAGE, null, choices, choices[0]);
 			if (clazz != null) {
-				DialogBuilder.createSkillDialog(parent, model[0], model[0].getClasses().stream().filter(c -> c.getName().equals(clazz)).findFirst().get());
+				DialogBuilder.createSkillDialog(parent, model[0], model[0].getClasses().stream()
+						.filter(c -> c.getName().equals(clazz)).findFirst().get());
 			}
 		});
-		add(mntmLevelUp);
+		add(mntmLUSkill);
 	}
 	
 	public void setModel(DDCharacter model) {

+ 14 - 1
src/main/lombok/org/leumasjaffe/charsheet/view/DialogBuilder.java

@@ -9,8 +9,10 @@ import javax.swing.JPanel;
 import org.leumasjaffe.charsheet.model.DDCharacter;
 import org.leumasjaffe.charsheet.model.DDCharacterClass;
 import org.leumasjaffe.charsheet.view.config.ConfigPanel;
+import org.leumasjaffe.charsheet.view.level.LevelUpDialog;
 import org.leumasjaffe.charsheet.view.magic.PrepareSpellsDialog;
 import org.leumasjaffe.charsheet.view.skills.SkillLevelUpDialog;
+import org.leumasjaffe.format.StringFormatter;
 
 import lombok.experimental.UtilityClass;
 
@@ -37,5 +39,16 @@ public class DialogBuilder {
 	public void showConfigDialog(final JFrame parent) {
 		createDialog(parent, "Config", new ConfigPanel());
 	}
-
+	
+	public void showLevelUpDialog(final JFrame parent, DDCharacter chara, int bonusLevels) {
+		final int levelsGained = LevelUpDialog.computeLevelsNeeded(chara, bonusLevels);
+		if (levelsGained == 1) {
+			createDialog(parent, "Level Up", new LevelUpDialog(chara));
+			return;
+		}
+		for (int i = 0; i < levelsGained; ++i) {
+			createDialog(parent, new StringFormatter("Level Up - {} of {}").format(i, levelsGained),
+					new LevelUpDialog(chara));
+		}
+	}
 }

+ 33 - 0
src/main/lombok/org/leumasjaffe/charsheet/view/level/LevelUpDialog.java

@@ -0,0 +1,33 @@
+package org.leumasjaffe.charsheet.view.level;
+
+import java.util.Arrays;
+
+import javax.swing.JPanel;
+
+import org.leumasjaffe.charsheet.model.DDCharacter;
+
+@SuppressWarnings("serial")
+public class LevelUpDialog extends JPanel {
+	private static final int[] EXPERIENCE_CACHE;
+	static {
+		final int levelsToCalc = 20;
+		EXPERIENCE_CACHE = new int[levelsToCalc];
+		for (int i = 0; i < levelsToCalc; ++i) {
+			EXPERIENCE_CACHE[i] = experienceForLevel(i);
+		}
+	}
+	
+	public static int computeLevelsNeeded(DDCharacter chara, int bonusLevels) {
+		final int exp = chara.getExperience().value();
+		final int currentLevel = chara.getLevel();
+		final int expectedLevel = Arrays.binarySearch(EXPERIENCE_CACHE, exp) + 1;
+		return bonusLevels + expectedLevel - currentLevel;
+	}
+	
+	public LevelUpDialog(DDCharacter chara) {
+	}
+	
+	private static int experienceForLevel(int level) {
+		return 500 * level * (level + 1);
+	}
+}