Kaynağa Gözat

Allowing configuration-based deferment of level up until an extended rest.
Fixing expectedLevel calculations.
Moving experience data into UtilityClass

Sam Jaffe 8 yıl önce
ebeveyn
işleme
e5bda8bd54

+ 5 - 0
src/main/lombok/org/leumasjaffe/charsheet/config/Constants.java

@@ -19,4 +19,9 @@ public final class Constants {
 	public enum DurationMeasurement {
 		NATURAL, ROUNDS
 	}
+	
+	public String K_LEVELUP = "Applies Level-Up";
+	public enum LevelUpStyle {
+		IMMEDIATELY, DURING_REST
+	}
 }

+ 32 - 30
src/main/lombok/org/leumasjaffe/charsheet/view/D20Sheet.java

@@ -1,39 +1,44 @@
 package org.leumasjaffe.charsheet.view;
 
-import javax.swing.JFileChooser;
-import javax.swing.JFrame;
-import javax.swing.JTabbedPane;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
-
-import lombok.AccessLevel;
-import lombok.NonNull;
-import lombok.SneakyThrows;
-import lombok.experimental.FieldDefaults;
-import lombok.experimental.NonFinal;
+import static org.leumasjaffe.charsheet.config.Constants.K_LEVELUP;
+import static org.leumasjaffe.charsheet.config.Constants.LevelUpStyle.DURING_REST;
+import static org.leumasjaffe.charsheet.config.Constants.LevelUpStyle.IMMEDIATELY;
 
 import java.awt.BorderLayout;
-import javax.swing.JPanel;
-import javax.swing.JMenuBar;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.WindowEvent;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
 import javax.swing.JMenu;
+import javax.swing.JMenuBar;
 import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
 import javax.swing.KeyStroke;
 import javax.swing.UIManager;
 
+import org.leumasjaffe.charsheet.config.Config;
 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.charsheet.view.level.ExperienceDialog;
 import org.leumasjaffe.observer.ObserverDispatch;
 
-import java.awt.event.KeyEvent;
-import java.awt.event.WindowEvent;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.awt.event.InputEvent;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
+
+import lombok.AccessLevel;
+import lombok.NonNull;
+import lombok.SneakyThrows;
+import lombok.experimental.FieldDefaults;
+import lombok.experimental.NonFinal;
 
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 public class D20Sheet extends JFrame {
@@ -118,15 +123,10 @@ public class D20Sheet extends JFrame {
 		
 		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);
+			ExperienceDialog.GainExperience(this.model);
+			if (Config.get(K_LEVELUP, IMMEDIATELY) == IMMEDIATELY) {
+				DialogBuilder.showLevelUpDialog(this, this.model, 0);
+			}
 		});
 		mnSession.add(mntmGainExperience);
 		
@@ -134,7 +134,9 @@ public class D20Sheet extends JFrame {
 		mntmTakeRest.addActionListener(e -> {
 			// Step 0: Gather information about the rest
 			// Step 0.1: Check if 8-hour or full day
-			// Step 0.2: Check if Long-Term-Care
+			// Step 0.2: Check for level-up
+			DialogBuilder.showLevelUpDialog(this, this.model, 0);
+			// Step 0.3: Check if Long-Term-Care
 			// Step 1: Heal Character according to info
 			// Step 1.1: Heal non-lethal damage
 			// Step 1.2: Heal ability damage

+ 20 - 2
src/main/lombok/org/leumasjaffe/charsheet/view/config/ConfigEnumPanel.java

@@ -45,7 +45,7 @@ public class ConfigEnumPanel<E extends Enum<E>> extends JPanel {
 		panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
 		
 		for (E e : clazz.getEnumConstants()) {
-			JRadioButton button = new JRadioButton(e.name());
+			JRadioButton button = new JRadioButton(toTitleCase(e.name()));
 			buttons.put(e, button);
 			panel.add(button);
 		}
@@ -56,4 +56,22 @@ public class ConfigEnumPanel<E extends Enum<E>> extends JPanel {
 		ActionListener listen = e -> Config.set(name, Enum.valueOf(clazz, e.getActionCommand()));
 		buttons.values().forEach(b -> b.addActionListener(listen));
 	}
-}
+
+	public static String toTitleCase(final String input) {
+	    final StringBuilder titleCase = new StringBuilder();
+	    titleCase.ensureCapacity(input.length());
+	    boolean nextTitleCase = true;
+
+	    for (char c : input.replaceAll("_", " ").toCharArray()) {
+	        if (Character.isSpaceChar(c)) {
+	            nextTitleCase = true;
+	        } else if (nextTitleCase) {
+	            c = Character.toTitleCase(c);
+	            nextTitleCase = false;
+	        } else {
+	        	c = Character.toLowerCase(c);
+	        }
+	        titleCase.append(c);
+	    }
+	    return titleCase.toString();
+	}}

+ 1 - 0
src/main/lombok/org/leumasjaffe/charsheet/view/config/ConfigPanel.java

@@ -74,5 +74,6 @@ public class ConfigPanel extends JPanel {
 		
 		panel_2.add(new ConfigEnumPanel<>(Constants.K_DISTANCE, Constants.DistanceMeasurement.class));
 		panel_2.add(new ConfigEnumPanel<>(Constants.K_DURATION, Constants.DurationMeasurement.class));
+		panel_2.add(new ConfigEnumPanel<>(Constants.K_LEVELUP, Constants.LevelUpStyle.class));
 	}
 }

+ 22 - 0
src/main/lombok/org/leumasjaffe/charsheet/view/level/ExperienceDialog.java

@@ -0,0 +1,22 @@
+package org.leumasjaffe.charsheet.view.level;
+
+import javax.swing.JOptionPane;
+
+import org.leumasjaffe.charsheet.model.DDCharacter;
+import org.leumasjaffe.charsheet.model.observable.IntValue;
+import org.leumasjaffe.observer.ObserverDispatch;
+
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public class ExperienceDialog {
+	public void GainExperience(DDCharacter model) {
+		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 = model.getExperience();
+		mdlExp.value(mdlExp.value()+exp);
+		ObserverDispatch.notifySubscribers(mdlExp, null);
+	}
+}

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

@@ -36,7 +36,7 @@ public class LevelUpDialog extends JPanel {
 	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;
+		final int expectedLevel = Math.abs(Arrays.binarySearch(EXPERIENCE_CACHE, exp) + 1);
 		return bonusLevels + expectedLevel - currentLevel;
 	}