Ver código fonte

Updating LevelUpSkillDialogue to apply changes on submit.
Making skill.ranks an IntValue in order to Observe it.

Sam Jaffe 8 anos atrás
pai
commit
07a42cf1c0

+ 8 - 8
resources/Potato.json

@@ -51,14 +51,14 @@
   },
   
   "skills":[
-    {"name":"Concentration","ranks":3.0,"pointsSpent":3},
-    {"name":"Craft (blacksmithing)","ranks":4.0,"pointsSpent":4},
-    {"name":"Diplomacy","ranks":1.0,"pointsSpent":1},
-    {"name":"Heal","ranks":4.0,"pointsSpent":4},
-    {"name":"Knowledge (arcana)","ranks":6.0,"pointsSpent":6},
-    {"name":"Knowledge (religion)","ranks":5.0,"pointsSpent":5},
-    {"name":"Knowledge (nature)","ranks":6.0,"pointsSpent":6},
-    {"name":"Perform (sing)","ranks":3.0,"pointsSpent":3}
+    {"name":"Concentration","ranks":3,"pointsSpent":3},
+    {"name":"Craft (blacksmithing)","ranks":4,"pointsSpent":4},
+    {"name":"Diplomacy","ranks":1,"pointsSpent":1},
+    {"name":"Heal","ranks":4,"pointsSpent":4},
+    {"name":"Knowledge (arcana)","ranks":6,"pointsSpent":6},
+    {"name":"Knowledge (religion)","ranks":5,"pointsSpent":5},
+    {"name":"Knowledge (nature)","ranks":6,"pointsSpent":6},
+    {"name":"Perform (sing)","ranks":3,"pointsSpent":3}
   ],
   
   "inventory":{

+ 7 - 6
src/org/leumasjaffe/charsheet/model/skill/DDSkill.java

@@ -1,5 +1,7 @@
 package org.leumasjaffe.charsheet.model.skill;
 
+import org.leumasjaffe.charsheet.model.observable.IntValue;
+
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -15,7 +17,7 @@ public class DDSkill {
 	final @Getter(AccessLevel.NONE) @Delegate DDSkillPrototype name;
 
 //	boolean isClassSkill = false;
-	@Setter(value=AccessLevel.PRIVATE) int ranks = 0; // CC skills are 2/1 point, you cannot have half-ranks
+	@Setter(value=AccessLevel.PRIVATE) IntValue ranks = new IntValue(0); // CC skills are 2/1 point, you cannot have half-ranks
 	// This would be 2x ranks if cross-class, 1x if class.
 	// Unless you gain it as a class skill later, in which case it might be in-between
 	@Setter(value=AccessLevel.PRIVATE) int pointsSpent = 0;
@@ -24,9 +26,8 @@ public class DDSkill {
 		this.name = proto;
 	}
 	
-//	public void allocatePoints(int points) {
-//		pointsSpent += points;
-//		if ( isClassSkill ) { ranks += points; }
-//		else { ranks += ( points / 2.0 ); }
-//	}
+	public void spendPoints(int ranks, boolean isCC) {
+		this.ranks.value(this.ranks.value() + ranks);
+		this.pointsSpent += (ranks * (isCC ? 2 : 1));
+	}
 }

+ 10 - 1
src/org/leumasjaffe/charsheet/view/skills/SkillLevelUpDialogue.java

@@ -18,6 +18,9 @@ import org.leumasjaffe.observer.ObservableListener;
 
 import java.awt.GridBagConstraints;
 import java.awt.Insets;
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.swing.JLabel;
 import javax.swing.JButton;
 import javax.swing.JDialog;
@@ -92,9 +95,12 @@ public class SkillLevelUpDialogue extends JPanel {
 		gbc_btnSubmitSkillChange.gridy = 0;
 		panel.add(btnSubmitSkillChange, gbc_btnSubmitSkillChange);
 		
+		final List<SkillLevelUpLine> lines = new ArrayList<>();
 		final DDSkills skills = chara.getSkills();
 		skills.getSkills().stream().forEach( skill -> {
-			skillPanel.add(new SkillLevelUpLine(chara, cclass, skill, pointsAvaliable));
+			SkillLevelUpLine line = new SkillLevelUpLine(chara, cclass, skill, pointsAvaliable);
+			skillPanel.add(line);
+			lines.add(line);
 		});
 		
 		ObservableListener<JTextField, IntValue> purchaseListener = new ObservableListener<>(pointsRemaining, (c, v) -> {
@@ -105,6 +111,9 @@ public class SkillLevelUpDialogue extends JPanel {
 		
 		btnSubmitSkillChange.addActionListener(e -> {
 			((JDialog) this.getParent().getParent().getParent()).dispose();
+			lines.stream().forEach(l -> {
+				l.applyChange();
+			});
 		});
 	}
 	

+ 32 - 33
src/org/leumasjaffe/charsheet/view/skills/SkillLevelUpLine.java

@@ -9,8 +9,6 @@ import org.leumasjaffe.charsheet.model.observable.IntValue;
 import org.leumasjaffe.charsheet.model.skill.DDSkill;
 import org.leumasjaffe.charsheet.util.StringHelper;
 import org.leumasjaffe.observer.IndirectObservableListener;
-import org.leumasjaffe.observer.Observable;
-import org.leumasjaffe.observer.ObservableListener;
 import org.leumasjaffe.observer.ObserverDispatch;
 
 import lombok.AccessLevel;
@@ -21,6 +19,7 @@ import javax.swing.JCheckBox;
 import java.awt.GridBagConstraints;
 import javax.swing.JLabel;
 import java.awt.Insets;
+import java.util.function.IntFunction;
 import java.awt.Dimension;
 import javax.swing.JTextField;
 import java.awt.Color;
@@ -37,13 +36,17 @@ public class SkillLevelUpLine extends JPanel {
 	 * 
 	 */
 	private static final long serialVersionUID = 1L;
-	ObservableListener<JTextField, IntValue> modifierListener;
+	boolean isClassSkill;
+	DDSkill skill;
+	IntValue current;
 	IndirectObservableListener<JTextField, DDCharacter> totalListener;
-
+	
 	public SkillLevelUpLine(final DDCharacter chara, final DDCharacterClass cclass, final DDSkill skill, IntValue pointsAvaliable) {
-		final IntValue current = new IntValue(0);
-		final int pointsPerRank = cclass.isClassSkill(skill.getName()) ? 1 : 2;
-		final int startingRanks = skill.getRanks();
+		isClassSkill = cclass.isClassSkill(skill.getName());
+		this.skill = skill;
+		current = new IntValue(0);
+		final int pointsPerRank = isClassSkill ? 1 : 2;
+		final int maxPoints = (chara.getLevel() + 3) / pointsPerRank - skill.getRanks().value();
 		
 		setBorder(new MatteBorder(0, 0, 1, 0, (Color) new Color(0, 0, 0)));
 		setPreferredSize(new Dimension(475, 22));
@@ -186,50 +189,46 @@ public class SkillLevelUpLine extends JPanel {
 		add(points, gbc_points);
 		points.setColumns(10);
 		
+		IntFunction<Void> lambda = (value) -> {
+			pointsAvaliable.value(pointsAvaliable.value() - (value * pointsPerRank));
+			current.value(current.value() + value);
+			points.setText(Integer.toString(current.value()));
+			ObserverDispatch.notifySubscribers(pointsAvaliable, this);
+			ObserverDispatch.notifySubscribers(current, this);
+			return null;
+		};
+		
 		plus.addActionListener((e) -> {
-			if (pointsAvaliable.value() >= pointsPerRank) {
-				pointsAvaliable.value(pointsAvaliable.value() - pointsPerRank);
-				current.value(current.value() + 1);
-				points.setText(Integer.toString(current.value()));
-				ObserverDispatch.notifySubscribers(pointsAvaliable, this);
-			} else {
-				// TODO warning
-			}
+			if (pointsAvaliable.value() >= pointsPerRank && current.value() < maxPoints) { lambda.apply(1); }
 		});
 		minus.addActionListener((e) -> {
-			if (current.value() > 0) {
-				pointsAvaliable.value(pointsAvaliable.value() + pointsPerRank);
-				current.value(current.value() - 1);
-				points.setText(Integer.toString(current.value()));
-				ObserverDispatch.notifySubscribers(pointsAvaliable, this);
-			} else {
-				// TODO warning
-			}
+			if (current.value() > 0) { lambda.apply(-1); }
 		});
 
 		if ( skill.getAbility().isEmpty() ) {
 			totalListener = new IndirectObservableListener<>(total,
 					(c, v) -> {
-						c.setText(StringHelper.toString(skill.getRanks()));
+						c.setText(StringHelper.toString(skill.getRanks().value() + current.value()));
 					});
-			modifierListener = null;
-			totalListener.setObserved(chara, new Observable());
+			totalListener.setObserved(chara, current);
 		} else {
 			totalListener = new IndirectObservableListener<>(total,
 					(c, v) -> {
-						final float skillRanks = skill.getRanks();
+						final int skillRanks = skill.getRanks().value();
 						final int mod = Ability.modifier(Ability.fields.get(skill.getAbility())
 								.apply(chara.getAbilities().getBase()).value());
-						c.setText(StringHelper.toString(skillRanks + mod));
+						c.setText(StringHelper.toString(skillRanks + mod + current.value()));
 					});
-			modifierListener = new ObservableListener<>(modifier, 
-					( c, v ) -> c.setText(StringHelper.toString(Ability.modifier(v.value()))));
 			
 			final IntValue abilScore = 	Ability.fields.get(skill.getAbility())
 					.apply(chara.getAbilities().getBase());
-			totalListener.setObserved(chara, abilScore);
-			modifierListener.setObserved(abilScore);
+			modifier.setText(StringHelper.toString(Ability.modifier(abilScore.value())));
+			totalListener.setObserved(chara, current);
 		}
 	}
-	
+
+	void applyChange() {
+		skill.spendPoints(current.value(), !isClassSkill);
+		ObserverDispatch.notifySubscribers(skill.getRanks(), this);
+	}
 }

+ 8 - 5
src/org/leumasjaffe/charsheet/view/skills/SkillLine.java

@@ -8,7 +8,6 @@ import org.leumasjaffe.charsheet.model.observable.IntValue;
 import org.leumasjaffe.charsheet.model.skill.DDSkill;
 import org.leumasjaffe.charsheet.util.StringHelper;
 import org.leumasjaffe.observer.IndirectObservableListener;
-import org.leumasjaffe.observer.Observable;
 import org.leumasjaffe.observer.ObservableListener;
 
 import lombok.AccessLevel;
@@ -31,7 +30,7 @@ public class SkillLine extends JPanel {
 	 * 
 	 */
 	private static final long serialVersionUID = 1L;
-	ObservableListener<JTextField, IntValue> modifierListener;
+	ObservableListener<JTextField, IntValue> modifierListener, skillListener;
 	IndirectObservableListener<JTextField, DDCharacter> totalListener;
 
 	public SkillLine(final DDCharacter chara, final DDSkill skill) {
@@ -166,11 +165,11 @@ public class SkillLine extends JPanel {
 						c.setText(StringHelper.toString(skill.getRanks()));
 					});
 			modifierListener = null;
-			totalListener.setObserved(chara, new Observable());
+			totalListener.setObserved(chara, skill.getRanks());
 		} else {
 			totalListener = new IndirectObservableListener<>(total,
 					(c, v) -> {
-						final float skillRanks = skill.getRanks();
+						final float skillRanks = skill.getRanks().value();
 						final int mod = Ability.modifier(Ability.fields.get(skill.getAbility())
 								.apply(chara.getAbilities().getBase()).value());
 						c.setText(StringHelper.toString(skillRanks + mod));
@@ -180,9 +179,13 @@ public class SkillLine extends JPanel {
 			
 			final IntValue abilScore = 	Ability.fields.get(skill.getAbility())
 					.apply(chara.getAbilities().getBase());
-			totalListener.setObserved(chara, abilScore);
+			totalListener.setObserved(chara, skill.getRanks(), abilScore);
 			modifierListener.setObserved(abilScore);
 		}
+		skillListener = new ObservableListener<>(ranks, (c, v) -> {
+			c.setText(StringHelper.toString(v));
+		});
+		skillListener.setObserved(skill.getRanks());
 	}
 	
 }