127 lines
4.1 KiB
Java
127 lines
4.1 KiB
Java
package com.bernard.murder.game;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.time.Instant;
|
|
import java.time.ZoneId;
|
|
import java.time.format.DateTimeFormatter;
|
|
import java.util.HashMap;
|
|
import java.util.HashSet;
|
|
import java.util.Locale;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
import java.util.function.Supplier;
|
|
import java.util.stream.Collectors;
|
|
|
|
import javax.swing.Timer;
|
|
|
|
import com.amihaiemil.eoyaml.Yaml;
|
|
import com.amihaiemil.eoyaml.YamlMapping;
|
|
import com.bernard.murder.model.Inventaire;
|
|
import com.bernard.murder.model.Objet;
|
|
import com.bernard.murder.model.Partie;
|
|
import com.bernard.murder.model.Personnage;
|
|
|
|
public class GameManager {
|
|
|
|
Partie partie;
|
|
Map<Inventaire,Set<Runnable>> inventoryUpdateListeners;
|
|
|
|
long startTime;
|
|
|
|
Timer quickSaver;
|
|
|
|
Supplier<YamlMapping> minelsQuicksaver;
|
|
|
|
public GameManager(Partie partie) {
|
|
this.partie = partie;
|
|
this.inventoryUpdateListeners = new HashMap<Inventaire, Set<Runnable>>();
|
|
this.minelsQuicksaver = () -> Yaml.createYamlMappingBuilder().build();
|
|
startTime = System.currentTimeMillis();
|
|
|
|
quickSaver = new Timer(10_000, e -> this.quickSave());
|
|
quickSaver.start();
|
|
}
|
|
|
|
public synchronized void moveObjet(Objet o, Inventaire toInv) {
|
|
Inventaire inv = partie.findObjectInventory(o);
|
|
System.out.println("Moving "+o+" from "+inv+" to "+toInv);
|
|
inv.removeObjet(o);
|
|
toInv.addObjet(o);
|
|
inventoryUpdate(inv);
|
|
inventoryUpdate(toInv);
|
|
}
|
|
|
|
public void inventoryUpdate(Inventaire inv) {
|
|
if(!inventoryUpdateListeners.containsKey(inv))return;
|
|
for(Runnable r : inventoryUpdateListeners.get(inv))
|
|
r.run();
|
|
}
|
|
|
|
public void dumpCurrentState() {
|
|
System.out.println(partie);
|
|
}
|
|
|
|
public void addInventoryUpdateListener(Inventaire inv, Runnable runnable) {
|
|
if(!inventoryUpdateListeners.containsKey(inv))
|
|
inventoryUpdateListeners.put(inv, new HashSet<Runnable>());
|
|
inventoryUpdateListeners.get(inv).add(runnable);
|
|
}
|
|
|
|
public void quickSave() {
|
|
System.out.println("Quicksaving");
|
|
File toSave = new File(quickSaveFilename());
|
|
File tempOldSave = new File(quickSaveFilename()+".tmp");
|
|
if(toSave.exists())toSave.renameTo(tempOldSave);
|
|
|
|
try {
|
|
GameCreator.quickSave(toSave, partie,minelsQuicksaver.get());
|
|
System.out.println("Quicksaved");
|
|
if(tempOldSave.exists())tempOldSave.delete();
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
|
|
}
|
|
|
|
public String quickSaveFilename() {
|
|
return "murder-"+DateTimeFormatter.ofPattern("uu-MM-dd_HH'h'mm").withZone(ZoneId.systemDefault()).withLocale(Locale.getDefault()).format(Instant.ofEpochMilli(startTime))+".bernard.quickmurder";
|
|
}
|
|
|
|
public Set<Inventaire> getEveryInventaire() {
|
|
Set<Inventaire> inventaires = new HashSet<Inventaire>();
|
|
inventaires.addAll(partie.pieces());
|
|
inventaires.addAll(partie.personnages());
|
|
partie.personnagesStream().forEach(p -> inventaires.addAll(p.espacePersos()));
|
|
return inventaires;
|
|
}
|
|
|
|
public Set<Inventaire> getEveryInventaireByName(Set<String> names) {
|
|
Set<Inventaire> inventaires = new HashSet<Inventaire>();
|
|
inventaires.addAll(partie.pieces());
|
|
inventaires.addAll(partie.personnages());
|
|
partie.personnagesStream().forEach(p -> inventaires.addAll(p.espacePersos()));
|
|
return inventaires.stream().filter(i -> names.contains(i.getInventoryName())).collect(Collectors.toSet());
|
|
}
|
|
|
|
public Personnage getPersoByName(String key) {
|
|
return partie.personnagesStream().filter(p -> key.equalsIgnoreCase(p.getNom())).findAny().orElse(null);
|
|
}
|
|
|
|
public void bindMinelQuicksaver(Supplier<YamlMapping> minelsQuicksaver) {
|
|
this.minelsQuicksaver = minelsQuicksaver;
|
|
}
|
|
|
|
public Inventaire getInventoryByName(String name) {
|
|
Set<Inventaire> inventaires = new HashSet<Inventaire>();
|
|
inventaires.addAll(partie.pieces());
|
|
inventaires.addAll(partie.personnages());
|
|
partie.personnagesStream().forEach(p -> inventaires.addAll(p.espacePersos()));
|
|
return inventaires.stream().filter(i -> name.equalsIgnoreCase(i.getInventoryName())).findAny().orElseGet(()->{
|
|
System.out.println("JE n'ai pas trouvé l'inventaire "+name+" dans la liste "+inventaires.stream().map(Inventaire::getInventoryName).collect(Collectors.joining(",")));
|
|
return null;
|
|
});
|
|
}
|
|
|
|
}
|