# Shapetory
## Index
- [Vocabulaire](#Vocabulaire)
- [La carte](#La-carte)
- [Système de progression](#Système-de-progression)
- [Idée de travail sur Shape](#Idée-de-travail-sur-Shape)
- [Système d'acheminement](#Système-d'acheminement)
- [Autre](#Autre)
- [Fin de partie](#Fin-de-partie)
- [Auteurs](#Auteurs)
Le but est de créer une usine qui, a partir de matières premières minées, crée des matières avancées à travers des acheminement compliqués.
Grandement inspiré de [Shapez.io](https://shapez.io/).
## Vocabulaire
Les Shapes sont des ressources dans le jeu que l'on devra miner.
## La carte
Sur la carte se situe des points où l'on peut trouver des gisements de matière première.
La matière première sera par exemple un Shape rond.
Le QG est déjà présent sur la carte. C'est l'endroit où l'on doit amener des shapes pour la progression.
## Système de progression
Pour progresser dans le jeu, on doit créer des Shapes de plus en plus avancés
- Chapitre 1
- 50 ronds
- 10 Carrés
- Débloque le découpage
- Chapitre 2
- 30 Demi-ronds
- 10 Rectangles (carré coupé)
- Débloque le fusionnage
Etc.
## Idée de travail sur Shape
Découpage

Fusionnage

Coloriage

Tourner--
Découpeuse à blueprint

Stockage
Et des améliorations de vitesse (des tapis roulants plus rapide, des mineurs plus rapides, etc)
## Système d'acheminement
Afin d'acheminer les Shapes jusqu'aux différentes machines et au QG, il faudra commencer par les miner.
Il faudra donc y installer un mineur et des tapis roulants.
Les tapis roulants pourront être connectés entre-eux et connecter différentes machines (afin d'apporter les ressources minées aux machines, et de la sortie des machines jusqu'au QG).

(image prise de [Shapez.io](https://shapez.io/))
## Autre
Il est possible d'imaginer des machines qui fonctionne "au charbon". Il faudra donc les alimenter en Shape (par exemple une Shape ronde noire) afin de les faire fonctionner.
## Fin de partie
Il y aura un certain nombre de Chapitres. Une fois le dernier chapitre atteind, la fin de la partie sera annoncé. Le jeu est donc de type campagne et non pas highscore.
# Cahier des charges
## Mode de jeu
Un seul mode de jeu, campagne solo, ou il faut progresser à travers des palliers afin de débloquer des nouvelles machines pour creer de plus grandes usines faisant des shape plus complexe.
## Objectifs principaux
* Interfaces
* Menu d'accueil (lancer nouvelle partie, charger une partie sauvgardée et options?)
* Interface de jeu
* Interface de sauvegarde de partie
* Création d'une carte de base (une carte fixe)
* Scrolling et zooming
* Placement de components d'usine
* Animations de déplacement de shape
* Placement de tapis roulant à l'aide de la souris (déplacer la souris => les tapis sont posés derrière)
* Mise en place d'un système de progression
* Débloquage de machine
## Objectifs secondaires
* sond et musique (sond quand un objet est placé, musique d'arrière-plan, etc)
* Carte générée au démarrage (map procédurale)
## Points chauds
* Interface graphique avec grid
* Optimisations (threads)
* Déplacement des shape (animations)
* Placement intiuitive de tapis roulant (que le tapis tourne tout seul en fonction de ses voisins afin de ce connecter)
# Spécifications détaillées
## Le grid de jeu
Pour l'interface graphique, il y aura un grid permetant de placer des objets dessus. Il est important car nous voulons faire la cration d'usine de maniére symétrique pour des raison ergonomique. Au point 0.0 on trouvera le QG comme mentionné en dessus. Ici le joueur sera demandé de ramener un ceratin nombre de shape spécifique. Le QG aura donc moyen d'accepter des shapes et puis de les ajouter a la progression. Si le shape amené n'est pas nécessaire a la progrssion, le shape sera juste suprimée.
## Placement
Il sera possible de placer dans chaque carré de la grille une machine.
Certaines machine font plusieurs carrés (par exemple 2x1)

Chaque machine aura un fonctionnement différent, mais héritera de la même classe parent Machine.
Cette classe possède les coordonnées, le nombre d'inputs, le nombre d'outputs ainsi que leur positions.
En détails, chaque Machine possède :
- 1 coordonnée
- une liste d'inputs, avec leur position associée (ex. (3;4)N => le bloc en (3;4) possède un input au Nord)
- une liste d'outputs, avec leur position associée (comme ci-dessus)
à chaque output sera associé une machine. Par défaut c'est un nullptr, mais une fois une connection faite, par exemple en collant une découpeuse à une mine, le pointeur de l'output de la mine pointera sur la découpeuse.
- dans le cas ou la machine fait plusieurs carrés de long, il y aura aussi un pointeur
## Tapis roulant
Pour placer un tapis roulant il faudra faire spécialment attention à l'orientation. Voici un exemple:

Pour placer le tapis vert, on doit vérifier les 4 carrés adjacent et voir si une combinason ferme le circuit.
Chaque tapis roulant à un coté input qui est pointé par un carré adjacent (si la "case d'avant" est pleine) et puis un output qui pointe sur un des 3 carré restant, (si la "case d'après" est pleine). Avec cette information, nous savons dans quelle sens les shapes doivent bouger.
## Liens
https://mkyong.com/swing/java-swing-draw-shapes-dynamically-example/
## Auteurs
- [Boegli Lenny](@lenny.boegli)
- [Girardin Jarod](@jarod.girardin)