commit 3897fafc01becbd8f4f45168568b35943a22a6cf Author: Mysaa Date: Wed May 26 22:02:07 2021 +0200 Premier commit - Introduction au système git 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 0000000..e25107d Binary files /dev/null and b/src/main/resources/notepad.png differ 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