Przeglądaj źródła

механизм настроения

kpmy 7 lat temu
rodzic
commit
4dd5a0f07f

+ 14 - 1
src/main/java/in/ocsf/frei/geld/core/model/aspects/DwarfTask.java

@@ -1,5 +1,18 @@
 package in.ocsf.frei.geld.core.model.aspects;/* kpmy 25.11.2017 */
 
+import org.apache.commons.math3.complex.Complex;
+
 public enum DwarfTask {
-    EAT, REST
+    EAT(Complex.valueOf(0.0, 0.4)),
+    REST(Complex.valueOf(0.0, 0.5));
+
+    private Complex value;
+
+    DwarfTask(Complex value) {
+        this.value = value;
+    }
+
+    public Complex getValue() {
+        return value;
+    }
 }

+ 14 - 0
src/main/java/in/ocsf/frei/geld/core/model/aspects/DwarfTaskExecutor.java

@@ -2,6 +2,8 @@ package in.ocsf.frei.geld.core.model.aspects;/* kpmy 25.11.2017 */
 
 public class DwarfTaskExecutor {
 
+    private Integer hours;
+
     private DwarfTaskDescriptor descriptor;
 
     public DwarfTaskDescriptor getDescriptor() {
@@ -12,5 +14,17 @@ public class DwarfTaskExecutor {
         this.descriptor = descriptor;
     }
 
+    public static DwarfTaskExecutor getInstance() {
+        DwarfTaskExecutor ret = new DwarfTaskExecutor();
+        ret.hours = 0;
+        return ret;
+    }
 
+    public Integer getHours() {
+        return hours;
+    }
+
+    public void setHours(Integer hours) {
+        this.hours = hours;
+    }
 }

+ 43 - 1
src/main/java/in/ocsf/frei/geld/core/model/aspects/EnergyAspect.java

@@ -6,6 +6,8 @@ import in.ocsf.frei.geld.core.model.LiveCycle;
 import in.ocsf.frei.geld.core.model.SimpleEvent;
 import org.apache.commons.lang3.Range;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.function.BiConsumer;
 
 public class EnergyAspect implements DwarfAspect {
@@ -13,8 +15,11 @@ public class EnergyAspect implements DwarfAspect {
     private static final Range<Double> sleepRange = Range.between(LiveCycle.DAYLY_ENERGY * 2 / 3, LiveCycle.DAYLY_ENERGY);
 
     private Double energy;
+
     private Double loss;
 
+    private Map<String, Double> mood;
+
     public EnergyAspect() {
     }
 
@@ -22,6 +27,7 @@ public class EnergyAspect implements DwarfAspect {
         EnergyAspect ret = new EnergyAspect();
         ret.energy = LiveCycle.TOTAL_ENERGY;
         ret.loss = 0.0;
+        ret.mood = new HashMap<>();
         return ret;
     }
 
@@ -33,6 +39,22 @@ public class EnergyAspect implements DwarfAspect {
         this.energy = energy;
     }
 
+    public Double getLoss() {
+        return loss;
+    }
+
+    public void setLoss(Double loss) {
+        this.loss = loss;
+    }
+
+    public Map<String, Double> getMood() {
+        return mood;
+    }
+
+    public void setMood(Map<String, Double> mood) {
+        this.mood = mood;
+    }
+
     @Override
     public BiConsumer<DwarfContext, Dwarf> perform() {
         return (context, dwarf) -> {
@@ -50,7 +72,27 @@ public class EnergyAspect implements DwarfAspect {
         };
     }
 
+    public void addMood(String type, Double value) {
+        this.mood.put(type, Math.min(1.0, Math.max(value, -1.0)));
+    }
+
     public void addFood() {
-        this.energy += 2500;
+        this.energy = Math.min(LiveCycle.TOTAL_ENERGY, this.energy + 2500);
+        this.addMood(DwarfTask.EAT.name(), DwarfTask.EAT.getValue().getImaginary());
+    }
+
+    public void doRest(Integer hours) {
+        Double hourPart = DwarfTask.REST.getValue().getImaginary() / LiveCycle.HOURS;
+        addMood(DwarfTask.REST.name(), Math.min(DwarfTask.REST.getValue().getImaginary(), hourPart * hours));
+    }
+
+    public void doSuccess(Integer hours) {
+        Double prev = this.mood.getOrDefault("OK", 0.0);
+        addMood("OK", prev + hours.doubleValue() / 10.0);
+    }
+
+    public void doError(Integer hours) {
+        Double prev = this.mood.getOrDefault("OK", 0.0);
+        addMood("OK", prev - hours.doubleValue() / 10.0);
     }
 }

+ 10 - 1
src/main/java/in/ocsf/frei/geld/core/model/aspects/ManagerAspect.java

@@ -32,7 +32,7 @@ public class ManagerAspect implements DwarfDefaultAspect {
     public BiConsumer<DwarfContext, Dwarf> perform() {
         return (ctx, dwarf) -> {
             if (executor == null) {
-                executor = new DwarfTaskExecutor();
+                executor = DwarfTaskExecutor.getInstance();
                 executor.setDescriptor(TaskAspect.REST);
             }
 
@@ -46,16 +46,25 @@ public class ManagerAspect implements DwarfDefaultAspect {
                 if (deltaF.apply(top.getComplexValue(), executor.getDescriptor().getComplexValue())) {
                     ctx.addEvent(this, new ChangeExecutorEvent(executor.getDescriptor(), top));
                     executor.setDescriptor(top);
+                    executor.setHours(0);
                 }
             } else if (!top.getComplexValue().equals(executor.getDescriptor().getComplexValue())) {
                 top.setId(executor.getDescriptor().getId());
                 executor.setDescriptor(top);
             }
 
+            executor.setHours(executor.getHours() + 1);
+
             if (executor.getDescriptor().getTask() != DwarfTask.REST) {
                 ExecutorStatus status = dwarf.getDecision().getStatus(executor.getDescriptor().getId());
+                if (Arrays.asList(OK).contains(status))
+                    dwarf.getEnergy().doSuccess(executor.getHours());
+                if (Arrays.asList(ERROR).contains(status))
+                    dwarf.getEnergy().doError(executor.getHours());
                 if (Arrays.asList(OK, ERROR, BREAK).contains(status))
                     executor = null;
+            } else {
+                dwarf.getEnergy().doRest(executor.getHours());
             }
         };
     }

+ 2 - 2
src/main/java/in/ocsf/frei/geld/core/model/aspects/TaskAspect.java

@@ -12,8 +12,8 @@ import java.util.function.Function;
 
 public class TaskAspect implements DwarfDefaultAspect {
 
-    public static final DwarfTaskDescriptor REST = DwarfTaskDescriptor.getInstance(DwarfTask.REST, Complex.valueOf(0, 0.5));
-    private static Function<Dwarf, Complex> hungerF = (dwarf -> Complex.valueOf(dwarf.getFeelings().getHunger() / 100, 0.4));
+    public static final DwarfTaskDescriptor REST = DwarfTaskDescriptor.getInstance(DwarfTask.REST, DwarfTask.REST.getValue());
+    private static Function<Dwarf, Complex> hungerF = (dwarf -> Complex.valueOf(dwarf.getFeelings().getHunger() / 100, 0).add(DwarfTask.EAT.getValue()));
     //комплексное число обозначает противоречие приятного и полезного
     private Map<DwarfTask, DwarfTaskDescriptor> queue;