From 3897fafc01becbd8f4f45168568b35943a22a6cf Mon Sep 17 00:00:00 2001 From: Mysaa Date: Wed, 26 May 2021 22:02:07 +0200 Subject: [PATCH] =?UTF-8?q?Premier=20commit=20-=20Introduction=20au=20syst?= =?UTF-8?q?=C3=A8me=20git?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 15 ++ build.gradle | 33 ++++ settings.gradle | 10 ++ .../java/com/bernard/murder/Murderator.java | 21 +++ .../java/com/bernard/murder/ParseUtils.java | 74 +++++++++ .../com/bernard/murder/game/GameCreator.java | 149 ++++++++++++++++++ .../com/bernard/murder/game/GameManager.java | 13 ++ .../java/com/bernard/murder/model/Action.java | 29 ++++ .../com/bernard/murder/model/Inventaire.java | 9 ++ .../java/com/bernard/murder/model/Objet.java | 22 +++ .../java/com/bernard/murder/model/Partie.java | 39 +++++ .../com/bernard/murder/model/Personnage.java | 59 +++++++ .../java/com/bernard/murder/model/Piece.java | 43 +++++ .../java/com/bernard/murder/model/Status.java | 21 +++ .../java/com/bernard/murder/module-info.java | 6 + .../bernard/murder/view/GlobalUIManager.java | 60 +++++++ .../bernard/murder/view/MinelsCreator.java | 49 ++++++ .../murder/view/MurderatorMainFrame.java | 128 +++++++++++++++ .../murder/view/minel/InventaireMinel.java | 58 +++++++ .../com/bernard/murder/view/minel/Minel.java | 21 +++ .../murder/view/minel/TextPanMinel.java | 37 +++++ src/main/resources/notepad.png | Bin 0 -> 53795 bytes src/test/resources/uneMurder.bernard.tmurder | 46 ++++++ 23 files changed, 942 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 settings.gradle create mode 100644 src/main/java/com/bernard/murder/Murderator.java create mode 100644 src/main/java/com/bernard/murder/ParseUtils.java create mode 100644 src/main/java/com/bernard/murder/game/GameCreator.java create mode 100644 src/main/java/com/bernard/murder/game/GameManager.java create mode 100644 src/main/java/com/bernard/murder/model/Action.java create mode 100644 src/main/java/com/bernard/murder/model/Inventaire.java create mode 100644 src/main/java/com/bernard/murder/model/Objet.java create mode 100644 src/main/java/com/bernard/murder/model/Partie.java create mode 100644 src/main/java/com/bernard/murder/model/Personnage.java create mode 100644 src/main/java/com/bernard/murder/model/Piece.java create mode 100644 src/main/java/com/bernard/murder/model/Status.java create mode 100644 src/main/java/com/bernard/murder/module-info.java create mode 100644 src/main/java/com/bernard/murder/view/GlobalUIManager.java create mode 100644 src/main/java/com/bernard/murder/view/MinelsCreator.java create mode 100644 src/main/java/com/bernard/murder/view/MurderatorMainFrame.java create mode 100644 src/main/java/com/bernard/murder/view/minel/InventaireMinel.java create mode 100644 src/main/java/com/bernard/murder/view/minel/Minel.java create mode 100644 src/main/java/com/bernard/murder/view/minel/TextPanMinel.java create mode 100644 src/main/resources/notepad.png create mode 100644 src/test/resources/uneMurder.bernard.tmurder diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7a3c30a --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Ignore Gradle project-specific cache directory +.gradle/ +gradlew +gradlew.bat +gradle/ + + +# Ignore Gradle build output directory +build/ +bin/ + +# Eclipse files +.classpath +.settings +.project diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..1d57227 --- /dev/null +++ b/build.gradle @@ -0,0 +1,33 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * This generated file contains a sample Java Library project to get you started. + * For more details take a look at the Java Libraries chapter in the Gradle + * User Manual available at https://docs.gradle.org/6.0/userguide/java_library_plugin.html + */ + +plugins { + // Apply the java-library plugin to add support for Java Library + id 'java-library' +} + +repositories { + // Use jcenter for resolving dependencies. + // You can declare any Maven/Ivy/file repository here. + jcenter() + mavenCentral() +} + +dependencies { + + compile 'com.amihaiemil.web:eo-yaml:4.3.3' + + // This dependency is exported to consumers, that is to say found on their compile classpath. + api 'org.apache.commons:commons-math3:3.6.1' + + // This dependency is used internally, and not exposed to consumers on their own compile classpath. + implementation 'com.google.guava:guava:28.0-jre' + + // Use JUnit test framework + testImplementation 'junit:junit:4.12' +} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..631e717 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/6.0/userguide/multi_project_builds.html + */ + +rootProject.name = 'Murderator' diff --git a/src/main/java/com/bernard/murder/Murderator.java b/src/main/java/com/bernard/murder/Murderator.java new file mode 100644 index 0000000..c7a608f --- /dev/null +++ b/src/main/java/com/bernard/murder/Murderator.java @@ -0,0 +1,21 @@ +package com.bernard.murder; + +import com.bernard.murder.view.MurderatorMainFrame; + +public class Murderator { + + static MurderatorMainFrame mainFrame; + + public static void main(String[] args) { + mainFrame = new MurderatorMainFrame(); + /*File f = new File("/home/mysaa/Documents/eclipse-workspace/Murderator/uneMurder.bernard.tmurder"); + try { + System.out.println(GameCreator.genFromFile(f)); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }*/ + mainFrame.startFrame(); + } + +} diff --git a/src/main/java/com/bernard/murder/ParseUtils.java b/src/main/java/com/bernard/murder/ParseUtils.java new file mode 100644 index 0000000..236ba58 --- /dev/null +++ b/src/main/java/com/bernard/murder/ParseUtils.java @@ -0,0 +1,74 @@ +package com.bernard.murder; + +import java.awt.Color; +import java.io.IOException; +import java.util.Collection; +import java.util.Set; +import java.util.Spliterator; +import java.util.Spliterators; +import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import com.amihaiemil.eoyaml.Yaml; +import com.amihaiemil.eoyaml.YamlMapping; +import com.amihaiemil.eoyaml.YamlNode; +import com.amihaiemil.eoyaml.YamlSequence; + +public class ParseUtils { + + static Pattern timeLengthPattern = Pattern.compile("^(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s?)?$"); + + public static long parseTimeLength(String tl) { + Matcher mtch = timeLengthPattern.matcher(tl); + if(!mtch.matches())throw new IllegalArgumentException("La chaine de caractères «"+tl+"» ne décrit pas un intervalle de temps normalisé"); + int h = mtch.group(2)==null?0:Integer.parseInt(mtch.group(2)); + int m = mtch.group(4)==null?0:Integer.parseInt(mtch.group(4)); + int s = mtch.group(6)==null?0:Integer.parseInt(mtch.group(6)); + return h*3600+m*60+s; + } + + public static Set union(Collection c1, Collection c2){ + Set out = c1.stream().collect(Collectors.toSet()); + out.addAll(c2); + return out; + } + + public static Set mappingKeys(YamlMapping mapping) throws IOException{ + return mapping.keys().stream().map(n ->{ + try { + return Yaml.createYamlInput(n.toString()).readYamlSequence().string(0); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + }).collect(Collectors.toSet()); + } + public static Stream sequenceStream(YamlSequence sequence){ + return StreamSupport.stream(Spliterators.spliteratorUnknownSize(sequence.iterator(),Spliterator.ORDERED),false); + } + + public static String node(YamlNode n){ + try { + return Yaml.createYamlInput(n.toString()).readYamlSequence().string(0); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public static Function wetherMapping(Function fnot,Function fyes){ + return n -> (n instanceof YamlMapping)?fyes.apply((YamlMapping)n):fnot.apply(n); + } + + public static Color randColor() { + return Color.getHSBColor((float) Math.random(), 1.0f, 1.0f); + } + public static Color getContrastColor(Color color) { + double y = (299 * color.getRed() + 587 * color.getGreen() + 114 * color.getBlue()) / 1000; + return y >= 128 ? Color.black : Color.white; + } +} diff --git a/src/main/java/com/bernard/murder/game/GameCreator.java b/src/main/java/com/bernard/murder/game/GameCreator.java new file mode 100644 index 0000000..917b865 --- /dev/null +++ b/src/main/java/com/bernard/murder/game/GameCreator.java @@ -0,0 +1,149 @@ +package com.bernard.murder.game; + +import static com.bernard.murder.ParseUtils.mappingKeys; +import static com.bernard.murder.ParseUtils.node; +import static com.bernard.murder.ParseUtils.parseTimeLength; +import static com.bernard.murder.ParseUtils.sequenceStream; + +import java.io.File; +import java.io.IOException; +import java.util.Map; +import java.util.Set; +import java.util.Spliterator; +import java.util.Spliterators; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import com.amihaiemil.eoyaml.Yaml; +import com.amihaiemil.eoyaml.YamlInput; +import com.amihaiemil.eoyaml.YamlMapping; +import com.amihaiemil.eoyaml.YamlNode; +import com.amihaiemil.eoyaml.YamlSequence; +import com.bernard.murder.ParseUtils; +import com.bernard.murder.model.Action; +import com.bernard.murder.model.Objet; +import com.bernard.murder.model.Partie; +import com.bernard.murder.model.Personnage; +import com.bernard.murder.model.Piece; +import com.bernard.murder.model.Status; + +public class GameCreator { + + public static Partie genFromFile(File toread) throws IOException{ + + YamlInput input = Yaml.createYamlInput(toread); + YamlMapping globalMap = input.readYamlMapping(); + + YamlMapping yjoueurs = globalMap.yamlMapping("joueurs"); + System.out.println(yjoueurs); + + // Pour pouvoir créer les objets et les espaces personnels + Set playerNames = mappingKeys(yjoueurs).stream().map(n -> n.toString()).collect(Collectors.toSet()); + + + YamlMapping yactions = globalMap.yamlMapping("actions"); + Set actions = yactions.keys() + .stream() + .map(n -> new Action(node(n), parseTimeLength(yactions.string(n)))) + .collect(Collectors.toSet()); + Map> persActions = playerNames.stream() + .collect(Collectors.toMap(Function.identity(), s -> actions.stream().map(Action::clone).collect(Collectors.toSet()))); + YamlSequence yinventory = globalMap.yamlSequence("inventaire"); + Set objets = StreamSupport.stream(Spliterators.spliteratorUnknownSize(yinventory.iterator(),Spliterator.ORDERED),false) + .map(n ->ParseUtils.node(n)) + .collect(Collectors.toSet()); + Map> persObjets = playerNames.stream() + .collect(Collectors.toMap(Function.identity(),p -> objets.stream().map(o ->new Objet(String.format(o,p))).collect(Collectors.toSet()))); + + YamlSequence ystatus = globalMap.yamlSequence("status"); + Set status = sequenceStream(ystatus).map(n -> new Status(node(n))).collect(Collectors.toSet()); + + YamlMapping yespaces = globalMap.yamlMapping("espaces"); + + Map> objetsDansEspaces = yespaces.keys().stream().collect(Collectors.toMap( + n -> node(n), + n-> parseHiddenObjects(yespaces.yamlSequence(n)) + )); + Set espaceObjets = yespaces.keys().stream() + .map(n -> new Piece(node(n), objetsDansEspaces.get(node(n)))) + .collect(Collectors.toSet()); + + YamlMapping yespacesPersos = globalMap.yamlMapping("espacesPersos"); + + Map> persespacesPersos = playerNames.stream().collect(Collectors.toMap( + Function.identity(), + p -> yespacesPersos.keys().stream() + .map(e -> new Piece( + String.format(node(e), p), + parseHiddenObjects(yespacesPersos.yamlSequence(e),p) + )) + .collect(Collectors.toSet()) + )); + + //Per perso settings + for(YamlNode pn : yjoueurs.keys()) { + String pname = node(pn); + System.out.println(pn); + System.out.println(yjoueurs.yamlMapping(pn)); + persActions.get(pname).addAll( + yjoueurs.yamlMapping(pn).yamlMapping("actions").keys() + .stream() + .map(n -> new Action(node(n), parseTimeLength(yjoueurs.yamlMapping(pn).yamlMapping("actions").string(n)))) + .collect(Collectors.toSet()) + ); + persObjets.get(pname).addAll( + StreamSupport.stream(Spliterators.spliteratorUnknownSize(yjoueurs.yamlMapping(pn).yamlSequence("inventaire").iterator(),Spliterator.ORDERED),false) + .map(n ->ParseUtils.node(n)) + .map(o ->new Objet(o)) + .collect(Collectors.toSet()) + ); + if(yjoueurs.yamlMapping(pn).yamlMapping("espacePerso")!= null) + // Plusieurs espaces + yjoueurs.yamlMapping(pn).yamlMapping("espacePerso").keys().forEach(n -> + persespacesPersos.get(pname) + .stream() + .filter(p -> p.getNom().contentEquals(node(n))) + .findAny() + .orElseGet(() -> new Piece(node(n))) + .insertObjects(parseHiddenObjects(yjoueurs.yamlMapping(pn).yamlMapping("espacePerso").yamlSequence(n))) + + ); + else + ((persespacesPersos.get(pname).isEmpty())? + Stream.of(new Piece(String.format("Espace de %s",pname))):persespacesPersos.get(pname).stream()) + .forEach(p -> p.insertObjects(parseHiddenObjects(yjoueurs.yamlMapping(pn).yamlSequence("espacePerso")))); + + + } + + + + Set personnages = playerNames.stream().map(p -> new Personnage( + p, + persObjets.get(p), + persActions.get(p), + status.stream().filter(st -> sequenceStream(ystatus) + .filter(n -> n instanceof YamlMapping) + .filter(n -> ((YamlMapping)n).string(st.getName())!=null) + .filter(n -> ((YamlMapping)((YamlMapping)n).yamlMapping(st.getName())).string("onStart").contentEquals("true")) + .findAny().isPresent()) + .collect(Collectors.toSet()), + persespacesPersos.get(p) + )).collect(Collectors.toSet()); + + return new Partie(personnages, status, espaceObjets); + } + + private static Map parseHiddenObjects(YamlSequence sequence,Object... nameFormat){ + return sequenceStream(sequence).collect(Collectors.toMap( + on -> new Objet(String.format((on instanceof YamlMapping)?(((YamlMapping)on).keys().stream().map(nn -> node(nn)).findAny().get()):node(on),nameFormat)), + on -> ((on instanceof YamlMapping)?(((YamlMapping)on).integer(((YamlMapping)on).keys().stream().findAny().get())):-1) + )); + } + private static Map parseHiddenObjects(YamlSequence sequence){ + return parseHiddenObjects(sequence, new Object[0]); + } + +} diff --git a/src/main/java/com/bernard/murder/game/GameManager.java b/src/main/java/com/bernard/murder/game/GameManager.java new file mode 100644 index 0000000..7040a93 --- /dev/null +++ b/src/main/java/com/bernard/murder/game/GameManager.java @@ -0,0 +1,13 @@ +package com.bernard.murder.game; + +import com.bernard.murder.model.Partie; + +public class GameManager { + + Partie partie; + + public GameManager(Partie partie) { + this.partie = partie; + } + +} diff --git a/src/main/java/com/bernard/murder/model/Action.java b/src/main/java/com/bernard/murder/model/Action.java new file mode 100644 index 0000000..32afae9 --- /dev/null +++ b/src/main/java/com/bernard/murder/model/Action.java @@ -0,0 +1,29 @@ +package com.bernard.murder.model; + +public class Action implements Cloneable{ + + String action; + long basetime; + long triggertime; + + public Action(String action, long basetime) { + this.action = action; + this.basetime = basetime; + this.triggertime = Long.MIN_VALUE; + } + + @Override + public Action clone() { + Action actions = new Action(action, basetime); + actions.triggertime = triggertime; + return actions; + } + + @Override + public String toString() { + return "Action [action=" + action + ", basetime=" + basetime + ", triggertime=" + triggertime + ", transient id=" + System.identityHashCode(this) + "]"; + } + + + +} diff --git a/src/main/java/com/bernard/murder/model/Inventaire.java b/src/main/java/com/bernard/murder/model/Inventaire.java new file mode 100644 index 0000000..46ab536 --- /dev/null +++ b/src/main/java/com/bernard/murder/model/Inventaire.java @@ -0,0 +1,9 @@ +package com.bernard.murder.model; + +import java.util.Set; + +public interface Inventaire { + + Set getObjects(); + +} diff --git a/src/main/java/com/bernard/murder/model/Objet.java b/src/main/java/com/bernard/murder/model/Objet.java new file mode 100644 index 0000000..0359c56 --- /dev/null +++ b/src/main/java/com/bernard/murder/model/Objet.java @@ -0,0 +1,22 @@ +package com.bernard.murder.model; + +public class Objet { + + String nom; + + public Objet(String nom) { + this.nom = nom; + } + + public String getNom() { + return nom; + } + + @Override + public String toString() { + return "Objet [nom=" + nom + "]"; + } + + + +} diff --git a/src/main/java/com/bernard/murder/model/Partie.java b/src/main/java/com/bernard/murder/model/Partie.java new file mode 100644 index 0000000..1e1d173 --- /dev/null +++ b/src/main/java/com/bernard/murder/model/Partie.java @@ -0,0 +1,39 @@ +package com.bernard.murder.model; + +import java.util.Set; +import java.util.stream.Stream; + +public class Partie { + + Set personnages; + Set statuz; + Set piece; + + + + public Partie(Set personnages, Set statuz, Set piece) { + this.personnages = personnages; + this.statuz = statuz; + this.piece = piece; + } + + public int persoCount() { + return personnages.size(); + } + + public Stream personnagesStream() { + return personnages.stream(); + } + + public Stream piecesStream() { + return piece.stream(); + } + + @Override + public String toString() { + return "Partie [personnages=" + personnages + ", statuz=" + statuz + ", piece=" + piece + "]"; + } + + + +} diff --git a/src/main/java/com/bernard/murder/model/Personnage.java b/src/main/java/com/bernard/murder/model/Personnage.java new file mode 100644 index 0000000..7468665 --- /dev/null +++ b/src/main/java/com/bernard/murder/model/Personnage.java @@ -0,0 +1,59 @@ +package com.bernard.murder.model; + +import java.util.Set; +import java.util.stream.Stream; + +public class Personnage implements Inventaire{ + + String nom; + Set inventaire; + Set actions; + Set status; + Set espacesPersos; + + + + public Personnage(String nom, Set inventaire, Set actions, Set status, + Set espacesPersos) { + super(); + this.nom = nom; + this.inventaire = inventaire; + this.actions = actions; + this.status = status; + this.espacesPersos = espacesPersos; + } + + + + public String getNom() { + return nom; + } + + + public Set getInventaire() { + return inventaire; + } + + public Stream streamEspacesPersos(){ + return espacesPersos.stream(); + } + + + + @Override + public String toString() { + return "Personnage [nom=" + nom + ", inventaire=" + inventaire + ", actions=" + actions + ", status=" + status + + ", espacesPersos=" + espacesPersos + "]"; + } + + + + @Override + public Set getObjects() { + return inventaire; + } + + + + +} diff --git a/src/main/java/com/bernard/murder/model/Piece.java b/src/main/java/com/bernard/murder/model/Piece.java new file mode 100644 index 0000000..d82ea83 --- /dev/null +++ b/src/main/java/com/bernard/murder/model/Piece.java @@ -0,0 +1,43 @@ +package com.bernard.murder.model; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class Piece implements Inventaire{ + + String nom; + + Map contenu; + + public Piece(String nom) { + this(nom, new HashMap()); + } + + public Piece(String nom, Map contenu) { + this.nom = nom; + this.contenu = contenu; + } + + @Override + public String toString() { + return "Piece [nom=" + nom + ", contenu=" + contenu + "]"; + } + + public String getNom() { + return nom; + } + + @Override + public Set getObjects() { + return contenu.keySet(); + } + + public void insertObjects(Map objs) { + contenu.putAll(objs); + } + + + + +} diff --git a/src/main/java/com/bernard/murder/model/Status.java b/src/main/java/com/bernard/murder/model/Status.java new file mode 100644 index 0000000..836d149 --- /dev/null +++ b/src/main/java/com/bernard/murder/model/Status.java @@ -0,0 +1,21 @@ +package com.bernard.murder.model; + +public class Status { + String name; + + public Status(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return "Status [name=" + name + "]"; + } + + + +} diff --git a/src/main/java/com/bernard/murder/module-info.java b/src/main/java/com/bernard/murder/module-info.java new file mode 100644 index 0000000..c426444 --- /dev/null +++ b/src/main/java/com/bernard/murder/module-info.java @@ -0,0 +1,6 @@ +module murder{ + + requires com.amihaiemil.eoyaml; + requires java.desktop; + +} \ No newline at end of file diff --git a/src/main/java/com/bernard/murder/view/GlobalUIManager.java b/src/main/java/com/bernard/murder/view/GlobalUIManager.java new file mode 100644 index 0000000..7400808 --- /dev/null +++ b/src/main/java/com/bernard/murder/view/GlobalUIManager.java @@ -0,0 +1,60 @@ +package com.bernard.murder.view; + +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import javax.swing.JPanel; + +import com.bernard.murder.model.Inventaire; +import com.bernard.murder.model.Objet; + +public class GlobalUIManager implements MouseListener{ + + public GlobalUIManager(JPanel globalPan) { + globalPan.addMouseListener(this); + } + + Set currentUIselection = new HashSet(); + Map inventaire = new HashMap<>(); + + + @Override + public void mouseClicked(MouseEvent e) { + + } + + @Override + public void mousePressed(MouseEvent e) { + System.out.println(e.getSource()); + System.out.println(e.getComponent()); + } + + @Override + public void mouseReleased(MouseEvent e) { + + + if(e.getButton()==MouseEvent.NOBUTTON) { + currentUIselection.clear(); + } + } + + @Override + public void mouseEntered(MouseEvent e) { + if(e.getButton()==MouseEvent.NOBUTTON) { + // Le clic a peut être été laché à l'exterieur + currentUIselection.clear(); + } + } + + @Override + public void mouseExited(MouseEvent e) { + + } + + + +} diff --git a/src/main/java/com/bernard/murder/view/MinelsCreator.java b/src/main/java/com/bernard/murder/view/MinelsCreator.java new file mode 100644 index 0000000..a816e49 --- /dev/null +++ b/src/main/java/com/bernard/murder/view/MinelsCreator.java @@ -0,0 +1,49 @@ +package com.bernard.murder.view; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import com.bernard.murder.game.GameManager; +import com.bernard.murder.model.Partie; +import com.bernard.murder.model.Personnage; +import com.bernard.murder.view.minel.InventaireMinel; +import com.bernard.murder.view.minel.Minel; +import com.bernard.murder.view.minel.TextPanMinel; + +public class MinelsCreator { + + public static Map> genSupMinels(Partie partie, GameManager manager) { + Map> outPute = new HashMap>(); + + List generalMinels = new ArrayList(); + + partie.piecesStream().map(p -> new InventaireMinel(manager, p)).forEach(m -> generalMinels.add(m)); + + generalMinels.add(new TextPanMinel(manager)); + + outPute.put("Général", generalMinels); + return outPute; + } + + public static Map> genMinels(Partie partie, GameManager manager) { + return partie.personnagesStream().collect(Collectors.toMap(Function.identity(), p -> genMinelsForPerso(partie,manager,p))); + } + + private static List genMinelsForPerso(Partie partie, GameManager manager, Personnage personnage){ + List minels = new ArrayList(); + + minels.add(new InventaireMinel(manager, personnage)); + personnage.streamEspacesPersos().map(p -> new InventaireMinel(manager, p)).forEach(m -> minels.add(m)); + + minels.add(new TextPanMinel(manager)); + + + return minels; + } + + +} diff --git a/src/main/java/com/bernard/murder/view/MurderatorMainFrame.java b/src/main/java/com/bernard/murder/view/MurderatorMainFrame.java new file mode 100644 index 0000000..e6ef16e --- /dev/null +++ b/src/main/java/com/bernard/murder/view/MurderatorMainFrame.java @@ -0,0 +1,128 @@ +package com.bernard.murder.view; + +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.io.File; +import java.util.List; +import java.util.Map; + +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; + +import com.bernard.murder.game.GameCreator; +import com.bernard.murder.game.GameManager; +import com.bernard.murder.model.Partie; +import com.bernard.murder.model.Personnage; +import com.bernard.murder.view.minel.Minel; + +public class MurderatorMainFrame extends JFrame{ + + private static final long serialVersionUID = -4512350072325470066L; + + + public MurderatorMainFrame() { + + } + + public void startFrame() { + this.setSize(700, 500); + this.setMinimumSize(new Dimension(575, 200)); + this.setLocationRelativeTo(null); + this.setDefaultCloseOperation(EXIT_ON_CLOSE); + this.setTitle("En attente d'un fichier"); + + this.setContentPane(genFirstPanel()); + this.setVisible(true); + } + + public JPanel genFirstPanel() { + JPanel globalPanel = new JPanel(); + globalPanel.setLayout(new BoxLayout(globalPanel, BoxLayout.PAGE_AXIS)); + JPanel semiPan = new JPanel(); + semiPan.setLayout(new BoxLayout(semiPan, BoxLayout.LINE_AXIS)); + JButton loadFile = new JButton("Ouvrir un fichier"); + + loadFile.addActionListener(e -> { + this.setEnabled(false); + JFileChooser chooser = new JFileChooser(); + int returnState = chooser.showOpenDialog(this); + if(returnState==JFileChooser.APPROVE_OPTION) { + File toread = chooser.getSelectedFile(); + try { + Partie partie = GameCreator.genFromFile(toread); + GameManager manager = new GameManager(partie); + Map> minelsSup = MinelsCreator.genSupMinels(partie,manager); + Map> minels = MinelsCreator.genMinels(partie,manager); + + + this.setContentPane(genGamePane(partie,manager,minelsSup,minels)); + this.getContentPane().repaint(20); + }catch(Exception ex) { + ex.printStackTrace(); + JOptionPane.showMessageDialog(this, ex.getLocalizedMessage(), "Impossible de lire le fichier", JOptionPane.ERROR_MESSAGE); + } + } + this.setEnabled(true); + }); + + semiPan.add(loadFile); + globalPanel.add(semiPan); + return globalPanel; + } + + public JPanel genGamePane(Partie partie,GameManager manager,Map> minelsSup,Map> minels) { + + JPanel globalPan = new JPanel(new BorderLayout()); + GlobalUIManager guim = new GlobalUIManager(globalPan); + + //Center Panel + CardLayout centerLayout = new CardLayout(); + JPanel centerPan = new JPanel(centerLayout); + + for(String s : minelsSup.keySet()) { + JPanel centralLocalBpanPan = new JPanel(new GridLayout(2,(minelsSup.get(s).size()+1)/2)); + minelsSup.get(s).stream().map(m -> m.genContentPane(guim)).forEach(mpan -> centralLocalBpanPan.add(mpan)); + JScrollPane centralLocalPan = new JScrollPane(centralLocalBpanPan); + centerPan.add(centralLocalPan, s); + } + for(Personnage p : minels.keySet()) { + JPanel centralLocalBpanPan = new JPanel(new GridLayout(2, (minels.get(p).size()+1)/2)); + minels.get(p).stream().map(m -> m.genContentPane(guim)).forEach(mpan -> centralLocalBpanPan.add(mpan)); + JScrollPane centralLocalPan = new JScrollPane(centralLocalBpanPan); + centerPan.add(centralLocalPan, personnageIdentifier(p)); + } + + + //Left Panel + JPanel leftPan = new JPanel(new GridLayout(minels.size() + minelsSup.size(), 1)); + + for(String s : minelsSup.keySet()) { + JButton localButton = new JButton(s); + localButton.addActionListener(e -> centerLayout.show(centerPan, s)); + leftPan.add(localButton); + } + for(Personnage p : minels.keySet()) { + JButton localButton = new JButton(p.getNom()); + localButton.addActionListener(e -> centerLayout.show(centerPan, personnageIdentifier(p))); + leftPan.add(localButton); + } + + globalPan.add(leftPan, BorderLayout.WEST); + globalPan.add(centerPan, BorderLayout.CENTER); + + return globalPan; + } + + + public String personnageIdentifier(Personnage personnage) { + return String.format("%08X",System.identityHashCode(personnage))+personnage.getNom(); + } + +} diff --git a/src/main/java/com/bernard/murder/view/minel/InventaireMinel.java b/src/main/java/com/bernard/murder/view/minel/InventaireMinel.java new file mode 100644 index 0000000..3df7ea6 --- /dev/null +++ b/src/main/java/com/bernard/murder/view/minel/InventaireMinel.java @@ -0,0 +1,58 @@ +package com.bernard.murder.view.minel; + +import java.awt.BorderLayout; + +import javax.swing.JButton; +import javax.swing.JList; +import javax.swing.JPanel; + +import com.bernard.murder.ParseUtils; +import com.bernard.murder.game.GameManager; +import com.bernard.murder.model.Inventaire; +import com.bernard.murder.model.Objet; +import com.bernard.murder.view.GlobalUIManager; + +public class InventaireMinel extends Minel { + + public InventaireMinel(GameManager manager, Inventaire inv) { + super(manager); + this.inv = inv; + } + + JList objets; + Inventaire inv; + + @Override + public JPanel genContentPane(GlobalUIManager guim) { + JPanel globalpan = new JPanel(new BorderLayout()); + + globalpan.setBackground(ParseUtils.randColor()); + + JPanel inventaire = new JPanel(); + inventaire.setBackground(ParseUtils.randColor()); + + JButton voler = new JButton("RandomItem"); + voler.addActionListener(e -> { + objets.setSelectedIndex((int) (Math.random() * objets.getModel().getSize())); + }); + + // TODO dragndrop multiple items + objets = new JList(); + objets.addMouseListener(guim); + updateObjets(); + + inventaire.add(objets); + + globalpan.add(voler, BorderLayout.SOUTH); + globalpan.add(inventaire, BorderLayout.CENTER); + + return globalpan; + } + + private void updateObjets() { + Objet[] objz = new Objet[inv.getObjects().size()]; + objz = inv.getObjects().toArray(objz); + objets.setListData(objz); + } + +} diff --git a/src/main/java/com/bernard/murder/view/minel/Minel.java b/src/main/java/com/bernard/murder/view/minel/Minel.java new file mode 100644 index 0000000..f65f999 --- /dev/null +++ b/src/main/java/com/bernard/murder/view/minel/Minel.java @@ -0,0 +1,21 @@ +package com.bernard.murder.view.minel; + +import javax.swing.JPanel; + +import com.bernard.murder.game.GameManager; +import com.bernard.murder.view.GlobalUIManager; + +public abstract class Minel{ + + GameManager manager; + + + + public Minel(GameManager manager) { + this.manager = manager; + } + + public abstract JPanel genContentPane(GlobalUIManager guim); + + +} diff --git a/src/main/java/com/bernard/murder/view/minel/TextPanMinel.java b/src/main/java/com/bernard/murder/view/minel/TextPanMinel.java new file mode 100644 index 0000000..ae3f0b7 --- /dev/null +++ b/src/main/java/com/bernard/murder/view/minel/TextPanMinel.java @@ -0,0 +1,37 @@ +package com.bernard.murder.view.minel; + +import java.awt.BorderLayout; +import java.awt.Color; + +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.border.EmptyBorder; + +import com.bernard.murder.ParseUtils; +import com.bernard.murder.game.GameManager; +import com.bernard.murder.view.GlobalUIManager; + +public class TextPanMinel extends Minel { + + + public TextPanMinel(GameManager manager) { + super(manager); + } + + @Override + public JPanel genContentPane(GlobalUIManager guim) { + JPanel globalPan = new JPanel(new BorderLayout()); + globalPan.setBackground(ParseUtils.randColor()); + JTextArea textArea = new JTextArea(); + textArea.setBorder(new EmptyBorder(23,23,23,23)); + + Color col = ParseUtils.randColor(); + textArea.setBackground(col); + textArea.setForeground(ParseUtils.getContrastColor(col)); + + globalPan.add(new JScrollPane(textArea),BorderLayout.CENTER); + return globalPan; + } + +} \ No newline at end of file diff --git a/src/main/resources/notepad.png b/src/main/resources/notepad.png new file mode 100644 index 0000000000000000000000000000000000000000..e25107d311a946dc3f1e9ea7ff07d7cbc6f6d35d GIT binary patch literal 53795 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 Mp00i_>zopr06flv#Q*>R literal 0 HcmV?d00001 diff --git a/src/test/resources/uneMurder.bernard.tmurder b/src/test/resources/uneMurder.bernard.tmurder new file mode 100644 index 0000000..7beef50 --- /dev/null +++ b/src/test/resources/uneMurder.bernard.tmurder @@ -0,0 +1,46 @@ +actions: + Doudou: 23s + Chanter: 42s + +status: + - Mort + - Paralysie + - NoKill: + onStart: true + +inventaire: + # Tout le monde en a un au départ, sera nommé Portefeuille_Bernard, Portefeuille_Jach + -"Portefeuille de %s" + +espaces: + "Cabine du capitaine": + - "Clés du bateau": 12 + - "Carte grise" + +espacesPersos: + # Un espace chacun, appelé Chambre_Jach, Chambre_Bernard + "Chambre de %s": + - "Manteau de %s" + + +joueurs: + Bernard: + actions: + DominerLeMonde: 42s + inventaire: + - "JuL'IA" + - "MasterKey" + espacePerso: + "Chambre de Bernard": + - "Pipi" + + Jach: + actions: + Python: 2h15m + status: + - "Rage du normalien" + inventaire: + - "PB ENS" + espacePerso: + - "Guide Richard" + # Par défaut, se place dans le seul espace personnel (Si il y en a deux, pas bon) \ No newline at end of file