Bläddra i källkod

Starting to implement the ability to renew spell lists after taking a rest. This is done in part by 'caching' the previous list of spells selected, so that a player can easily reload the last slot, or make small adjustments.
TODO: Implement re-generating data
TODO: Implement spell selection dialogue.

Sam Jaffe 8 år sedan
förälder
incheckning
136c3f5408

+ 4 - 0
src/org/leumasjaffe/charsheet/model/magic/DDSpellbook.java

@@ -21,6 +21,8 @@ import lombok.NonNull;
 public interface DDSpellbook {
 	@NonNull Collection<DDSpell> spellsKnownAtLevel( int level );
 	@NonNull List<DDSpell> spellsPreparedAtLevel( int level );
+
+	default boolean preparesSpells() { return false; }
 	
 	default int numSpellsKnownAtLevel( int level ) {
 		return spellsKnownAtLevel( level ).size();
@@ -33,4 +35,6 @@ public interface DDSpellbook {
 	}
 	
 	void castSpell( int level, final DDSpell spell );
+	
+	void renew();
 }

+ 15 - 2
src/org/leumasjaffe/charsheet/model/magic/impl/Inspired.java

@@ -7,7 +7,6 @@ import java.util.Map;
 
 import org.leumasjaffe.charsheet.model.DDClass;
 import org.leumasjaffe.charsheet.model.magic.DDSpell;
-import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
 
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
@@ -17,7 +16,7 @@ import lombok.experimental.NonFinal;
 
 @AllArgsConstructor
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
-public class Inspired implements DDSpellbook {
+public class Inspired implements Prepared {
 	@AllArgsConstructor
 	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 	private static class Level {
@@ -67,4 +66,18 @@ public class Inspired implements DDSpellbook {
 	private Level get(int level) {
 		return spellInfo.getOrDefault(level, new Level(Collections.emptyList(), Collections.emptyList(), 0));
 	}
+
+	@Override
+	public List<DDSpell> getSpellsPreparedPreviouslyForLevel(int level) {
+		return Collections.unmodifiableList(get(level).spellsPreparedPreviously);
+	}
+
+	@Override
+	public void prepareSpells(int level, List<DDSpell> spells) {
+		final Level lInfo = get(level);
+		lInfo.spellsPrepared.clear();
+		lInfo.spellsPreparedPreviously.clear();
+		lInfo.spellsPrepared.addAll(spells);
+		lInfo.spellsPreparedPreviously.addAll(spells);
+	}
 }

+ 20 - 0
src/org/leumasjaffe/charsheet/model/magic/impl/Prepared.java

@@ -0,0 +1,20 @@
+package org.leumasjaffe.charsheet.model.magic.impl;
+
+import java.util.List;
+
+import org.leumasjaffe.charsheet.model.magic.DDSpell;
+import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
+
+import lombok.NonNull;
+
+public interface Prepared extends DDSpellbook {
+	@Override
+	default boolean preparesSpells() { return true; }
+
+	@NonNull List<DDSpell> getSpellsPreparedPreviouslyForLevel(int level);
+	
+	void prepareSpells(int level, List<DDSpell> spells);
+	
+	@Override
+	default void renew() { throw new UnsupportedOperationException(); }
+}

+ 19 - 3
src/org/leumasjaffe/charsheet/model/magic/impl/Researched.java

@@ -6,7 +6,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.leumasjaffe.charsheet.model.magic.DDSpell;
-import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
 
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
@@ -16,7 +15,7 @@ import lombok.experimental.NonFinal;
 
 @AllArgsConstructor
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
-public class Researched implements DDSpellbook {
+public class Researched implements Prepared {
 	@AllArgsConstructor
 	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 	private static class Level {
@@ -49,9 +48,26 @@ public class Researched implements DDSpellbook {
 		}
 		--get(level).spellsPerDay;
 	}
-	
 
 	private Level get(int level) {
 		return spellInfo.getOrDefault(level, new Level(Collections.emptySet(), Collections.emptyList(), Collections.emptyList(), 0));
 	}
+	
+
+	@Override
+	public List<DDSpell> getSpellsPreparedPreviouslyForLevel(int level) {
+		return Collections.unmodifiableList(get(level).spellsPreparedPreviously);
+	}
+
+	@Override
+	public void prepareSpells(int level, List<DDSpell> spells) {
+		final Level lInfo = get(level);
+		if (!lInfo.spellsKnown.containsAll(spells)) {
+			throw new IllegalArgumentException("Attempted to prepare spells that you don't know");
+		}
+		lInfo.spellsPrepared.clear();
+		lInfo.spellsPreparedPreviously.clear();
+		lInfo.spellsPrepared.addAll(spells);
+		lInfo.spellsPreparedPreviously.addAll(spells);
+	}
 }

+ 4 - 0
src/org/leumasjaffe/charsheet/model/magic/impl/Spontaneous.java

@@ -53,6 +53,10 @@ public class Spontaneous implements DDSpellbook {
 		}
 		--get(level).spellsPerDayRemaining;
 	}
+	
+	public void renew() {
+		spellInfo.values().stream().forEach(lInfo -> lInfo.spellsPerDayRemaining = lInfo.spellsPerDay);
+	}
 
 	private Level get(int level) {
 		return spellInfo.getOrDefault(level, new Level(Collections.emptyList(), 0, 0));

+ 30 - 0
src/org/leumasjaffe/charsheet/view/D20Sheet.java

@@ -22,6 +22,7 @@ import javax.swing.KeyStroke;
 import javax.swing.UIManager;
 
 import org.leumasjaffe.charsheet.model.DDCharacter;
+import org.leumasjaffe.charsheet.model.DDCharacterClass;
 import org.leumasjaffe.charsheet.view.dev.DeveloperMenu;
 
 import java.awt.event.KeyEvent;
@@ -104,6 +105,35 @@ public class D20Sheet extends JFrame {
 		mntmExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.CTRL_MASK));
 		mnFile.add(mntmExit);
 		
+		JMenu mnSession = new JMenu("Session");
+		menuBar.add(mnSession);
+		
+		JMenuItem mntmGainExperience = new JMenuItem("Gain Experience");
+		mnSession.add(mntmGainExperience);
+		
+		JMenuItem mntmTakeRest = new JMenuItem("Take Rest");
+		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 1: Heal Character according to info
+			// Step 1.1: Heal non-lethal damage
+			// Step 1.2: Heal ability damage
+			// Step 2: Regenerate spells prepared
+			// Step 2.1: If Spontaneous, skip (2)
+			for (DDCharacterClass dclass : model.getClasses()) {
+				dclass.getSpellBook().ifPresent(sb -> {
+					if (sb.preparesSpells()) {
+						
+					} else {
+						sb.renew();
+					}
+				});
+			}
+			// Step N: regenerate spellbooks
+		});
+		mnSession.add(mntmTakeRest);
+		
 		developerMenu = new DeveloperMenu();
 		menuBar.add(developerMenu);