Skip to content

Commit

Permalink
version 1.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
jytou committed Apr 16, 2018
1 parent 508f262 commit 2c3e126
Show file tree
Hide file tree
Showing 14 changed files with 684 additions and 321 deletions.
28 changes: 25 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ L'utilisation est simple :
- un autre programme se charge d'afficher des statistiques en comparant potentiellement plusieurs parties (idéalement avec les mêmes joueurs dans différentes monnaies).

L'accent est mis sur la rapidité d'utilisation avec des boutons accessibles (les actions sont également accessibles via des menus) et surtout des raccourcis clavier permettant d'effectuer les actions rapidement (un simple remboursement d'intérêts se fait en une touche, un nouveau crédit par défaut en 2 touches).
Le tout est sauvegardé en temps réel dans une base de données locale en cas de crash et est exportable en XML (il serait aussi facile d'exporter du CSV pour les inconditionnels d'imports dans des tableurs).
Le tout est sauvegardé en temps réel dans une base de données locale en cas de crash et est exportable en XML (il serait aussi facile d'exporter du CSV pour les inconditionnels d'imports dans des tableurs). Il est donc possible de quitter le programme sans crainte en cours de partie, tout est sauvegardé en temps réel sur votre disque dur !

# Lancement du programme

Expand Down Expand Up @@ -183,7 +183,7 @@ Il vous suffit ensuite de suivre l'usage affiché par cette commande pour l'util

# Note pour les programmeurs

Ce programme est écrit en java et swing de bout en bout, pas vraiment de patterns/frameworks vu sa simplicité, j'ai fait au plus simple et au plus vite. Les seules librairies utilisées sont :
Ce programme est écrit en Java et Swing de bout en bout, pas vraiment de patterns/frameworks vu sa simplicité, j'ai fait au plus simple et au plus vite. Les seules librairies utilisées sont :

- h2 pour la persistance (ce qui pourrait aisément être changé),
- eclipselink pour la persistance en base,
Expand All @@ -205,7 +205,7 @@ La couche métier est séparée (elle est utilisée par le programme principal,

N'hésitez pas à faire des *issues*.

# Nouvelle version
# Nouvelle version 0.9.1

Comme je n'ai pas le temps de mettre à jour ce fichier ce soir, voici quelques améliorations dans la version d'aujourd'hui :

Expand All @@ -219,3 +219,25 @@ Comme je n'ai pas le temps de mettre à jour ce fichier ce soir, voici quelques
- il est possible de saisir une valeur négative lors de la mise à jour de la masse monétaire suite à un événement imprévu,
- l'affichage de l'écart-type dans les stats va maintenant jusqu'à 150%, j'espère que ça sera suffisant,
- un nouveau graphique avec la version « corrigée » (-8 cartes pour les joueurs et -7 en monnaie libre).

# Nouvelle version 1.0.0

Suite au jeu à Saint-Clair du Rhône le 14/04/2018, quelques améliorations :

- la boîte de dialogue de choix de partie a été retouchée pour être un peu plus ergonomique,
- ajout d'un champ pour définir la relation entre la valeur de la monnaie et celle les cartes. En d'autres termes, si une carte vaut 1 ou 2 unités monétaires en monnaie-dette (en monnaie libre c'est 3 ou 6),
- le changement de nom des joueurs ne se fait plus dans le tableau car cela posait de nombreux problèmes, c'est maintenant accessible par un menu ou la touche F2,
- les statistiques finales sont directement accessibles soit par un menu dans l'application principale, soit par un bouton dans la boîte de dialogue de choix de partie,
- correction d'un bug qui faisait que les statistiques standards n'étaient pas affichées lorsqu'on sélectionnait uniquement une partie en monnaie libre,
- correction du bug lorsqu'on voulait annuler un changement de couleurs de billet dans la fenêtre de rotation des billets en monnaie libre,
- les champs sont sélectionnés dans la saisie de valeurs lorsqu'ils ont le focus pour qu'on saisisse la valeur en supprimant le 0 d'origine (laisser un 0 dans le champ était plutôt agaçant),
- l'affichage corrigé ne prenait pas en compte l'ajustement des cartes pour la monnaie libre,
- l'affichage du nombre de tours commence maintenant à 0, et indique donc le nombre de tours « passés », du coup l'indication du nombre de tours prévus est le nombre de tours exact (alors qu'il fallait ajouter 1 précédemment),
- un nouveau graphique de masse monétaire en monnaie libre a été ajouté, il est presque tout plat et n'apporte aucune information supplémentaire, mais permet au public de réaliser visuellement la différence entre les variations de masse monétaire en monnaie libre et en monnaie dette,
- les joueurs non actifs (ont quitté la partie en cours de route) ne sont plus candidats à la mort…
- les morts suggérés ont une marque visible dans le tableau des joueurs,
- un indicateur a été ajouté pour montrer la proportion de « pauvres » (60% de la médiane) dans les graphiques de statistiques qui ont été légèrement améliorés,
- on peut supprimer n'importe quelle série d'événements en appuyant sur « suppr » après avoir sélectionné des lignes dans la table des événements (pour les plus téméraires uniquement !), et changer la date d'un événement (F2).

Cette version est déjà totalement opérationnelle, même si elle mériterait d'être améliorée pour les « non habitués ». N'hésitez pas à faire des issues pour qu'on voie ce qui est le plus urgent dans le futur.

Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ else if ("new".equals(command))
final String curDate = args[1];
final String location = args[2];
em.getTransaction().begin();
final Game game = new Game(Game.MONEY_DEBT, 10, "jytou", "[email protected]", "", curDate, location);
final Game game = new Game(Game.MONEY_DEBT, 10, "jytou", "[email protected]", "", curDate, location, 1);
em.persist(game);
em.getTransaction().commit();
System.out.println("Created new game " + game.toString());
Expand Down
2 changes: 1 addition & 1 deletion jyt.geconomicus.helper/res/META-INF/persistence.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<class>jyt.geconomicus.helper.Event</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:~/geco.h2" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:~/geco2.h2" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="" />

Expand Down
19 changes: 18 additions & 1 deletion jyt.geconomicus.helper/src/jyt/geconomicus/helper/Event.java
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ public void applyEvent()
// and then it's just like quitting
case QUIT:
case DEATH:
game.changeMoneyMass(-interest-principal);
game.changeMoneyMass(-interest-principal-(weakCoins + 2 * mediumCoins + 4 * strongCoins) * game.getMoneyCardsFactor());
if (EventType.REIMB_CREDIT.equals(evt))
{
player.setCurDebt(player.getCurDebt() - principal);
Expand All @@ -210,6 +210,9 @@ public void applyEvent()
player.setCurInterest(0);
}
player.setVisitedBank(true);
if ((game.getMoneySystem() == Game.MONEY_LIBRE) && EventType.DEATH.equals(evt))
// adjust money mass
game.changeMoneyMass(8 * game.getMoneyCardsFactor());
break;
case INTEREST_ONLY:
game.gainInterest(interest);
Expand All @@ -227,12 +230,26 @@ public void applyEvent()
break;
case JOIN:
player.setActive(true);
if (game.getMoneySystem() == Game.MONEY_LIBRE)
// Add player's DU to money mass
game.changeMoneyMass(7 * game.getMoneyCardsFactor());
break;
case TURN:
for (Player player : game.getPlayers())
if (player.getCurDebt() > 0)
player.setVisitedBank(false);
game.incTurnNumber();
if (game.getMoneySystem() == Game.MONEY_LIBRE)
// the money mass is going towards the average
{
int nbPlayers = 0;
for (Player player : game.getPlayers())
if (player.isActive())
nbPlayers++;
final int target = 7 * game.getMoneyCardsFactor() * nbPlayers;
final int currentMM = game.getMoneyMass();
game.changeMoneyMass((target - currentMM) / 2);
}
break;
case END:
case XTECHNOLOGICAL_BREAKTHROUGH:
Expand Down
24 changes: 19 additions & 5 deletions jyt.geconomicus.helper/src/jyt/geconomicus/helper/Game.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ public class Game implements Serializable
private int interestGained;
private int cardsInvestBank;
private int moneyInvestBank;
private Integer moneyCardsFactor;
@XmlID
private String curdate;
private String location;
Expand All @@ -72,7 +73,7 @@ private Game()
super();
}

public Game(int pMoneySystem, int pNbTurnsPlanned, String pAnimatorPseudo, String pAnimatorEmail, String pDescription, String pCurDate, String pLocation)
public Game(int pMoneySystem, int pNbTurnsPlanned, String pAnimatorPseudo, String pAnimatorEmail, String pDescription, String pCurDate, String pLocation, int pMoneyCardsFactor)
{
super();
moneySystem = pMoneySystem;
Expand All @@ -82,7 +83,8 @@ public Game(int pMoneySystem, int pNbTurnsPlanned, String pAnimatorPseudo, Strin
description = pDescription;
curdate = pCurDate;
location = pLocation;
turnNumber = 1;
turnNumber = 0;
moneyCardsFactor = pMoneyCardsFactor;
}

@XmlTransient
Expand Down Expand Up @@ -218,7 +220,7 @@ public void recomputeAll(IEventListener pEventListener)
interestGained = 0;
moneyMass = 0;
seizedValues = 0;
turnNumber = 1;
turnNumber = 0;
for (Event event : events)
{
event.applyEvent();
Expand Down Expand Up @@ -257,10 +259,11 @@ public void setMoneyInvestBank(int pMoneyInvestBank)
moneyInvestBank = pMoneyInvestBank;
}

public void removeEvent(Event pToUndo)
public void removeEvent(Event pToUndo, boolean pRecompute)
{
events.remove(pToUndo);
recomputeAll(null);
if (pRecompute)
recomputeAll(null);
}

public void investMoney(int pPrincipal)
Expand All @@ -276,6 +279,13 @@ public void investCards(int pTotal)
seizedValues -= pTotal;
}

public int getMoneyCardsFactor()
{
if (moneyCardsFactor == null)
moneyCardsFactor = 1;// default
return moneyCardsFactor;
}

// These are only for JAXB
public void setAnimatorEmail(String pAnimatorEmail)
{
Expand Down Expand Up @@ -319,4 +329,8 @@ public void removePlayer(Player pPlayer)
{
players.remove(pPlayer);
}
public void setMoneyCardsFactor(int pMoneyCardsFactor)
{
moneyCardsFactor = pMoneyCardsFactor;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public void testCreateGame()
EntityManagerFactory factory = Persistence.createEntityManagerFactory("geco");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Game game = new Game(Game.MONEY_DEBT, 10, "toto", "[email protected]", "", "today", "Here");
Game game = new Game(Game.MONEY_DEBT, 10, "toto", "[email protected]", "", "today", "Here", 1);
Player player1 = new Player(game, "Player1");
Player player2 = new Player(game, "Player2");
Event event1 = new Event(game, EventType.JOIN, player1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public class AddPlayerDialog extends JDialog
private class CancelAction extends AbstractAction implements ActionListener
{
@Override
public void actionPerformed(ActionEvent pE)
public void actionPerformed(ActionEvent pEvent)
{
setVisible(false);
}
Expand All @@ -44,19 +44,34 @@ private AddAction(JTextField pNameTF)
public void actionPerformed(ActionEvent pEvent)
{
mEntityManager.getTransaction().begin();
mNewPlayer = new Player(mGame, mNameTF.getText());
if (mPlayer == null)
mPlayer = new Player(mGame, mNameTF.getText());
else
mPlayer.setName(mNameTF.getText());
mEntityManager.getTransaction().commit();
setVisible(false);
}
}

private EntityManager mEntityManager;
private Game mGame;
private Player mNewPlayer = null;
private Player mPlayer = null;

public AddPlayerDialog(final JFrame pParent, final Game pGame, final EntityManager pEntityManager, Player pExistingPlayer)
{
super(pParent, "Renommer un joueur");
mPlayer = pExistingPlayer;
initWindow(pGame, pEntityManager);
}

public AddPlayerDialog(final JFrame pParent, final Game pGame, final EntityManager pEntityManager)
{
super(pParent, "Ajouter un joueur");
initWindow(pGame, pEntityManager);
}

public void initWindow(final Game pGame, final EntityManager pEntityManager)
{
mGame = pGame;
mEntityManager = pEntityManager;
setSize(500, 300);
Expand All @@ -65,13 +80,15 @@ public AddPlayerDialog(final JFrame pParent, final Game pGame, final EntityManag
final JPanel mainPanel = new JPanel(new GridBagLayout());
mainPanel.add(new JLabel("Nom"), new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
final JTextField nameTF = new JTextField(50);
if (mPlayer != null)
nameTF.setText(mPlayer.getName());
mainPanel.add(nameTF, new GridBagConstraints(1, 0, 1, 1, 1, 0, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
nameTF.getInputMap().put(KeyStroke.getKeyStroke((char)10), "enter");
nameTF.getActionMap().put("enter", new AddAction(nameTF));
nameTF.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "escape");
nameTF.getActionMap().put("escape", new CancelAction());
final JPanel buttonsPanel = new JPanel(new FlowLayout());
final JButton addButton = new JButton("Ajouter");
final JButton addButton = new JButton(mPlayer != null ? "Renommer" : "Ajouter");
buttonsPanel.add(addButton);
addButton.addActionListener(new AddAction(nameTF));
final JButton cancelButton = new JButton("Annuler");
Expand All @@ -96,6 +113,6 @@ public void focusGained(FocusEvent pE)

public Player getNewPlayer()
{
return mNewPlayer;
return mPlayer;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package jyt.geconomicus.helper;

import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.persistence.EntityManager;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

public class ChangeEventDateDialog extends JDialog
{
private class CancelAction extends AbstractAction implements ActionListener
{
@Override
public void actionPerformed(ActionEvent pEvent)
{
setVisible(false);
}
}

private class AddAction extends AbstractAction implements ActionListener
{
private final JTextField mDateTF;

private AddAction(JTextField pDateTF)
{
mDateTF = pDateTF;
}

@Override
public void actionPerformed(ActionEvent pEvent)
{
Date date;
try
{
date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse(mDateTF.getText());
}
catch (ParseException e)
{
JOptionPane.showMessageDialog(ChangeEventDateDialog.this, "La date doit être au format 2018/04/15 22:30:27", "Date incorrecte", JOptionPane.ERROR_MESSAGE);
return;
}
mEntityManager.getTransaction().begin();
mEvent.setTstamp(date);
mEntityManager.getTransaction().commit();
setVisible(false);
}
}

private EntityManager mEntityManager;
private Event mEvent;

public ChangeEventDateDialog(final JFrame pParent, final EntityManager pEntityManager, final Event pEvent)
{
super(pParent, "Changer la date d'un événement");
mEvent = pEvent;
mEntityManager = pEntityManager;
setSize(500, 300);
setLocation(200, 200);
setModal(true);
final JPanel mainPanel = new JPanel(new GridBagLayout());
mainPanel.add(new JLabel("Date"), new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
final JTextField dateTF = new JTextField(50);
dateTF.setText(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(mEvent.getTstamp()));
mainPanel.add(dateTF, new GridBagConstraints(1, 0, 1, 1, 1, 0, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
dateTF.getInputMap().put(KeyStroke.getKeyStroke((char)10), "enter");
dateTF.getActionMap().put("enter", new AddAction(dateTF));
dateTF.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "escape");
dateTF.getActionMap().put("escape", new CancelAction());
final JPanel buttonsPanel = new JPanel(new FlowLayout());
final JButton applyButton = new JButton("Changer la date !");
buttonsPanel.add(applyButton);
applyButton.addActionListener(new AddAction(dateTF));
final JButton cancelButton = new JButton("Annuler");
buttonsPanel.add(cancelButton);
cancelButton.addActionListener(new CancelAction());
mainPanel.add(buttonsPanel, new GridBagConstraints(0, 10, 2, 1, 1, 0, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
getContentPane().add(mainPanel);
addFocusListener(new FocusListener()
{
@Override
public void focusLost(FocusEvent pE)
{
}

@Override
public void focusGained(FocusEvent pE)
{
dateTF.requestFocus();
}
});
}
}
Loading

0 comments on commit 2c3e126

Please sign in to comment.