Skip to content
This repository has been archived by the owner on Dec 13, 2020. It is now read-only.

Commit

Permalink
Quick fixes and doc
Browse files Browse the repository at this point in the history
  • Loading branch information
LimeiloN committed Jun 3, 2019
1 parent f62c7c6 commit 3db5fb3
Show file tree
Hide file tree
Showing 16 changed files with 188 additions and 135 deletions.
242 changes: 121 additions & 121 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,121 +1,121 @@
# Project: TBT

#### Inspirations
Librement inspiré de :
- Xcom
- Dofus
- Age of Empires (NDS)

### Livrables et évaluation
Les livrables attendus du projet sont :
1. Un cahier des charges de votre programme, explicitant votre choix de projet, votre organisation en équipe (qui fait quoi, quand ?) et le comportement attendu de votre programme. Ce livrable est attendu pour la fin de la première séance (deux pages maximum).
2. Le programme dans sa version finale, attendu pour la dernière séance. Une attention particulière sera portée aux points suivants :
- Le programme se compile et s’exécute de manière normale,
- Le programme réalise les fonctions décrites par le cahier des charges
- Le code source du programme est lisible, respecte les conventions de codage et est commenté.
3. Le diagramme UML de votre projet, attendu pour la dernière séance.

Une soutenance sera organisée lors de la dernière séance du semestre, où vous présenterez tous vos livrables et plus particulièrement votre programme. Cette soutenance durera 15 minutes, avec 8 minutes de présentation et 6 minutes de questions de la part de votre enseignant. Tous les livrables devront être envoyés par mail à votre enseignant, préalablement à cette soutenance. Le mini-projet sera évalué sur la base de la qualité des livrables, la complexité du projet, votre soutenance et le comportement de l’équipe durant les séances.

### Cahier des charges

1. Choix du projet
Nous avons choisi le sujet *Jeu de Plateau* car il est assez vaste et complexe, aussi, il nous laisse une grande liberté dans la direction que nous voulions prendre et aux fonctionnalités à ajouter. De plus, nous avons tous joué à ce genre de jeux étant petits, d'où nos [inspirations](#inspirations).
2. Fonctionnalités et comportement attendu du programme
- Fonctions de base
- Splashscreen au lancement
- Menu avec possibilité de choisir la carte, choix du nombre de joueurs et choix des personnages de chaque joueur et d'une couleur permettant de différencier les joueurs sur le plateau
- Lancement de la partie, à tour de rôle, chaque joueur se déplace sur le terrain puis lance (ou non) un sort avec l'un de ses personnages
- Affichage
- Affichage dans le terminal avec couleurs (voir [détails techniques](#Détails techniques))
- **Bonus***: ajout d'un affichage graphique
- Contenu disponible
- Des cartes et des personnages par défaut (ainsi que leurs sorts respectifs) seront disponibles.
- Il sera néanmoins possible de créer et d'importer dans le jeu soit même des cartes / personnages / sorts en créant des fichiers à l'extérieur du jar, en respectant un certain format
- **Bonus***: ajout d'une IA (Bot / Ordinateur) simple
- **Bonus***: ajout de types d'attaques et d'altérations (personnage en feu, empoisonné, étourdi, etc...)
- Cartes (terrain / plateau de jeu)
- 5 cartes disponibles par défaut
- une dizaine de types de terrain disponibles (roche, sable, lave, terre, arbre, etc...), pratiquables ou non

\* seront réalisés si le temps nous le permet.
3. oRgAnIsAtIoN eN éQuIpe


Un cahier des charges de votre programme, explicitant votre choix de projet, votre organisation en équipe (qui fait quoi, quand ?) et le comportement attendu de votre programme. Ce livrable est attendu pour la fin de la première séance (deux pages maximum). **Faudra l'écrire pour mercredi**

### Cadre du projet
Nous avons choisi le 5ème problème, le jeu de plateau, où l'objectif
est de simuler un combat entre deux entités.

La rédaction du cahier des charges, la planification du développement
et le développent lui-même s'étaleront sur une période d'un mois,
du 13 Avril au 13 Mai 2019, date de rendu.

---

## Principe du jeu
Le jeu proposé s'appuie sur des mécaniques tirées de Tactical-RPG et
de combats au tour-par-tour.

Sur une grande grille, chaque joueur contrôle le déplacement de ses
personnages: à chaque tour, un joueur prend le contrôle de l'un de ses
personnages (dans un ordre choisi avant la partie),
et réalise l'une des actions suivantes:

- Se déplacer
- Se déplacer puis lancer un sort (attaque, protection, etc...)

Les joueurs s'engagent dans un combat qui ne peut avoir que deux issues: la défaite ou la
retraite de tous leurs adversaires.

Gagne le joueur qui parvient à vaincre en premier tous les
personnages contrôlés par son adversaire ou à provoquer sa reddition.

La carte du jeu sera choisie au préalable parmi celles prédéfinies.
Le joueur aura aussi la possibilité de ramasser des items au sol afin
de lui donner un avantage.

Un mode Joueur vs IA est envisagé.

---

### Détails techniques
Nous nous limiterons à l'interface de commande.

Nous utiliserons la bibliothèque [JLine3](https://github.com/jline/jline3)
qui, sans rentrer dans les détails, nous permettra de gérer la console
dans les détails, comme la couleur ou la position du curseur.

Nous utiliserons aussi la bibliothèque [Gson](https://github.com/google/gson)
afin de faciliter la lecture des fichiers JSON utilisés pour la
configuration.

---

### Compilation
Ce projet utilise [Gradle](https://gradle.org/ "Site web de Gradle")
pour gérer toutes les tâches relatives à la compilation et aux librairies.
Par conséquent, il est nécessaire d'avoir la dernière version de gradle
installée ou d'utiliser le gradle wrapper fourni.

Test du jeu :
```bash
$ gradlew play
```

Création du jar exécutable du jeu et des scripts de lancement :
```bash
$ gradlew bundle
```

### Note sur la compatibilité
Sera compatible tout système supporté par JLine3, ce qui inclus :
- Windows
- Linux
- OS X
- Solaris
- FreeBSD

D'une manière générale, tout système doté d'une console supportant les
caractères de contrôle ANSI (VT100) est compatible.
# Project: TBT

#### Inspirations
Librement inspiré de :
- Xcom
- Dofus
- Age of Empires (NDS)

### Livrables et évaluation
Les livrables attendus du projet sont :
1. Un cahier des charges de votre programme, explicitant votre choix de projet, votre organisation en équipe (qui fait quoi, quand ?) et le comportement attendu de votre programme. Ce livrable est attendu pour la fin de la première séance (deux pages maximum).
2. Le programme dans sa version finale, attendu pour la dernière séance. Une attention particulière sera portée aux points suivants :
- Le programme se compile et s’exécute de manière normale,
- Le programme réalise les fonctions décrites par le cahier des charges
- Le code source du programme est lisible, respecte les conventions de codage et est commenté.
3. Le diagramme UML de votre projet, attendu pour la dernière séance.

Une soutenance sera organisée lors de la dernière séance du semestre, où vous présenterez tous vos livrables et plus particulièrement votre programme. Cette soutenance durera 15 minutes, avec 8 minutes de présentation et 6 minutes de questions de la part de votre enseignant. Tous les livrables devront être envoyés par mail à votre enseignant, préalablement à cette soutenance. Le mini-projet sera évalué sur la base de la qualité des livrables, la complexité du projet, votre soutenance et le comportement de l’équipe durant les séances.

### Cahier des charges

1. Choix du projet
Nous avons choisi le sujet *Jeu de Plateau* car il est assez vaste et complexe, aussi, il nous laisse une grande liberté dans la direction que nous voulions prendre et aux fonctionnalités à ajouter. De plus, nous avons tous joué à ce genre de jeux étant petits, d'où nos [inspirations](#inspirations).
2. Fonctionnalités et comportement attendu du programme
- Fonctions de base
- Splashscreen au lancement
- Menu avec possibilité de choisir la carte, choix du nombre de joueurs et choix des personnages de chaque joueur et d'une couleur permettant de différencier les joueurs sur le plateau
- Lancement de la partie, à tour de rôle, chaque joueur se déplace sur le terrain puis lance (ou non) un sort avec l'un de ses personnages
- Affichage
- Affichage dans le terminal avec couleurs (voir [détails techniques](#Détails techniques))
- **Bonus***: ajout d'un affichage graphique
- Contenu disponible
- Des cartes et des personnages par défaut (ainsi que leurs sorts respectifs) seront disponibles.
- Il sera néanmoins possible de créer et d'importer dans le jeu soit même des cartes / personnages / sorts en créant des fichiers à l'extérieur du jar, en respectant un certain format
- **Bonus***: ajout d'une IA (Bot / Ordinateur) simple
- **Bonus***: ajout de types d'attaques et d'altérations (personnage en feu, empoisonné, étourdi, etc...)
- Cartes (terrain / plateau de jeu)
- 5 cartes disponibles par défaut
- une dizaine de types de terrain disponibles (roche, sable, lave, terre, arbre, etc...), pratiquables ou non

\* seront réalisés si le temps nous le permet.
3. oRgAnIsAtIoN eN éQuIpe


Un cahier des charges de votre programme, explicitant votre choix de projet, votre organisation en équipe (qui fait quoi, quand ?) et le comportement attendu de votre programme. Ce livrable est attendu pour la fin de la première séance (deux pages maximum). **Faudra l'écrire pour mercredi**

### Cadre du projet
Nous avons choisi le 5ème problème, le jeu de plateau, où l'objectif
est de simuler un combat entre deux entités.

La rédaction du cahier des charges, la planification du développement
et le développent lui-même s'étaleront sur une période d'un mois,
du 13 Avril au 13 Mai 2019, date de rendu.

---

## Principe du jeu
Le jeu proposé s'appuie sur des mécaniques tirées de Tactical-RPG et
de combats au tour-par-tour.

Sur une grande grille, chaque joueur contrôle le déplacement de ses
personnages: à chaque tour, un joueur prend le contrôle de l'un de ses
personnages (dans un ordre choisi avant la partie),
et réalise l'une des actions suivantes:

- Se déplacer
- Se déplacer puis lancer un sort (attaque, protection, etc...)

Les joueurs s'engagent dans un combat qui ne peut avoir que deux issues: la défaite ou la
retraite de tous leurs adversaires.

Gagne le joueur qui parvient à vaincre en premier tous les
personnages contrôlés par son adversaire ou à provoquer sa reddition.

La carte du jeu sera choisie au préalable parmi celles prédéfinies.
Le joueur aura aussi la possibilité de ramasser des items au sol afin
de lui donner un avantage.

Un mode Joueur vs IA est envisagé.

---

### Détails techniques
Nous nous limiterons à l'interface de commande.

Nous utiliserons la bibliothèque [JLine3](https://github.com/jline/jline3)
qui, sans rentrer dans les détails, nous permettra de gérer la console
dans les détails, comme la couleur ou la position du curseur.

Nous utiliserons aussi la bibliothèque [Gson](https://github.com/google/gson)
afin de faciliter la lecture des fichiers JSON utilisés pour la
configuration.

---

### Compilation
Ce projet utilise [Gradle](https://gradle.org/ "Site web de Gradle")
pour gérer toutes les tâches relatives à la compilation et aux librairies.
Par conséquent, il est nécessaire d'avoir la dernière version de gradle
installée ou d'utiliser le gradle wrapper fourni.

Test du jeu :
```bash
$ gradlew play
```

Création du jar exécutable du jeu et des scripts de lancement :
```bash
$ gradlew shadowJar
```

### Note sur la compatibilité
Sera compatible tout système supporté par JLine3, ce qui inclus :
- Windows
- Linux
- OS X
- Solaris
- FreeBSD

D'une manière générale, tout système doté d'une console supportant les
caractères de contrôle ANSI (VT100) est compatible.
Binary file removed project-tbt.zip
Binary file not shown.
14 changes: 14 additions & 0 deletions src/main/java/lorganisation/projecttbt/Game.java
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,9 @@ public static void handleSignal(Terminal.Signal sig) {
}
}

/**
* Permet de quitter correctement le programme
*/
public static void shutdownGracefully() {

TerminalUtils.clearTerm();
Expand Down Expand Up @@ -472,6 +475,12 @@ public int getNumTurn() {
return numTurn;
}

/**
* @param x
* @param y
*
* @return true si la position donnée est libre (sans joueur)
*/
public boolean isTileFree(int x, int y) {

for (AbstractPlayer p : players)
Expand All @@ -482,6 +491,11 @@ public boolean isTileFree(int x, int y) {
return true;
}

/**
* @param pos
*
* @return true si la position donnée est libre (sans joueur)
*/
public boolean isTileFree(Coords pos) {

return isTileFree(pos.getX(), pos.getY());
Expand Down
18 changes: 12 additions & 6 deletions src/main/java/lorganisation/projecttbt/TerminalGameRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,9 @@ public void render(Game g, int x, int y, Utils.Align align) {
Coords coords = TerminalUtils.coordinatesOfAlignedObject(y, x, g.getMap().getWidth(), align, terminal.getWidth());

// On affiche la map
TerminalUtils.writeAt(coords.getX(), coords.getY(), g.getMap().visual().replaceAll("\n", "\n" + Anscapes.moveRight(coords.getX())));
TerminalUtils.writeAt(coords.getX(),
coords.getY(),
g.getMap().visual().replaceAll("\n", "\n" + Anscapes.moveRight(coords.getX())));

// On affiche la distance d'attaque du personnage
// Lorsque le personnage est en phase d'attaque
Expand All @@ -66,10 +68,14 @@ public void render(Game g, int x, int y, Utils.Align align) {
List<Coords> toHighlight = atk.getReachableTiles(currPlayingCharacter);
for (Coords tile : toHighlight)
if (g.getMap().isInBounds(tile.getX(), tile.getY()))
TerminalUtils.writeAt(coords.getX() + tile.getX(), coords.getY() + tile.getY(), Anscapes.Colors.BLUE_BRIGHT.bg() + " ");

for(Coords impact : atk.getHitTiles(currPlayingCharacter.getAimingAt())) {
TerminalUtils.writeAt(coords.getX() + impact.getX(), coords.getY() + impact.getY(), Anscapes.Colors.BLUE.bg() + " ");
TerminalUtils.writeAt(coords.getX() + tile.getX(),
coords.getY() + tile.getY(),
Anscapes.Colors.BLUE_BRIGHT.bg() + " ");

for (Coords impact : atk.getHitTiles(currPlayingCharacter.getAimingAt())) {
TerminalUtils.writeAt(coords.getX() + impact.getX(),
coords.getY() + impact.getY(),
Anscapes.Colors.BLUE.bg() + " ");
}
}

Expand All @@ -92,7 +98,7 @@ public void render(Game g, int x, int y, Utils.Align align) {
Coords aim = currPlayingCharacter.getAimingAt();
Tile aimedTile = g.getMap().getTileAt(aim.getX(), aim.getY());

TerminalUtils.writeAt(coords.getX() + aim.getX(), coords.getY() + aim.getY(), Anscapes.Colors.RED_BRIGHT.fg() + Anscapes.Colors.BLUE.bg() + "×");
TerminalUtils.writeAt(coords.getX() + aim.getX(), coords.getY() + aim.getY(), Anscapes.Colors.RED_BRIGHT.fg() + Anscapes.Colors.BLUE.bg() + "×");
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/lorganisation/projecttbt/map/LevelMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import java.util.regex.Pattern;

/**
* Represent a game level where the players can move and fight.
* Représente une carte du jeu
*/
public class LevelMap {

Expand Down
3 changes: 3 additions & 0 deletions src/main/java/lorganisation/projecttbt/map/Tile.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package lorganisation.projecttbt.map;

/**
* Représente une case d'une carte
*/
public interface Tile {

boolean canStepOn();
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/lorganisation/projecttbt/map/Tiles.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import static com.limelion.anscapes.Anscapes.Colors;

/**
* Représente une case d'une map. Le joueur peut ou non la traverser. TODO changer vers une vraie classe Tiles,
* permettant une customisation approfondie de chaque Tiles
* Un set de Tile par défaut. Le joueur peut ou non la traverser. TODO changer vers une vraie classe Tiles, permettant
* une customisation approfondie de chaque Tiles
*/
public enum Tiles implements Tile {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@ public AbstractPlayer(String name, AnsiColor c) {
this.status = Status.IDLE;
}

/**
* La méthode appelée pour demandeer au joueur de jouer
*
* @param game
* @param character
*
* @return l'action à jouer
*/
public abstract ActionType play(Game game, Character character);

public abstract boolean isBot();
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/lorganisation/projecttbt/player/Character.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
import java.util.ArrayList;
import java.util.List;

/**
* Un personnage du jeu, représenté par son icone et ses attributs
*/
public class Character {

// Position
Expand Down Expand Up @@ -63,7 +66,6 @@ public Character(CharacterTemplate template, AbstractPlayer owner) {
this.attacks = new CyclicList<>();
*/

turnReset();
}

Expand Down Expand Up @@ -219,7 +221,6 @@ public void consumeActionPoints(int cost) {

public List<StyledString> getDescription() {


List<StyledString> desc = new ArrayList<>();
desc.add(new StyledString("Type: " + type + " (" + icon + ")"));
desc.add(new StyledString("Action: " + actionPoints + " / " + maxActionPoints));
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/lorganisation/projecttbt/player/Player.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@

import javax.swing.KeyStroke;

/**
* Un vrai joueur du jeu
*/
public class Player extends AbstractPlayer {

public Player(String name, AnsiColor c) {
Expand Down
Loading

0 comments on commit 3db5fb3

Please sign in to comment.