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> inventoryUpdateListeners; long startTime; Timer quickSaver; Supplier minelsQuicksaver; public GameManager(Partie partie) { this.partie = partie; this.inventoryUpdateListeners = new HashMap>(); 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()); inventoryUpdateListeners.get(inv).add(runnable); } public void quickSave() { File toSave = new File(quickSaveFilename()); File tempOldSave = new File(quickSaveFilename()+".tmp"); if(toSave.exists())toSave.renameTo(tempOldSave); try { GameCreator.quickSave(toSave, partie,minelsQuicksaver.get()); if(tempOldSave.exists())tempOldSave.delete(); } catch (IOException e) { e.printStackTrace(); System.err.println("La sauvegarde rapide n'a pas fonctionné. Elle est donc désactivée."); quickSaver.stop(); } } 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 void removeQuickSaves() { for(File f : (new File(".")).listFiles((f,n) -> n.startsWith("murder-") && n.endsWith(".bernard.quickmurder"))) { f.delete(); } } public Set getEveryInventaire() { Set inventaires = new HashSet(); inventaires.addAll(partie.pieces()); inventaires.addAll(partie.personnages()); partie.personnagesStream().forEach(p -> inventaires.addAll(p.espacePersos())); return inventaires; } public Set getEveryInventaireByName(Set names) { Set inventaires = new HashSet(); 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 minelsQuicksaver) { this.minelsQuicksaver = minelsQuicksaver; } public Inventaire getInventoryByName(String name) { Set inventaires = new HashSet(); 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.err.println("JE n'ai pas trouvé l'inventaire "+name+" dans la liste "+inventaires.stream().map(Inventaire::getInventoryName).collect(Collectors.joining(","))); return null; }); } public void createObjet(String newName, Inventaire inv) { Objet o = new Objet(newName); System.out.println("Création de l'objet "+o+" dans "+inv); inv.addObjet(o); inventoryUpdate(inv); } public void deleteObjet(Objet o, Inventaire inv) { System.out.println("Destruction de l'objet "+o+" dans "+inv); inv.removeObjet(o); inventoryUpdate(inv); } public void renameObjet(Objet o, String newName, Inventaire inv) { System.out.println("Renommage de l'objet "+o+" en "+newName+" dans "+inv); Objet newObjet = new Objet(newName); inv.removeObjet(o); inv.addObjet(newObjet); inventoryUpdate(inv); } }