# GrandTabernacleAutoVI
Un super jeu by popstar inc. Jeu online avec un serveur nodejs. Plus sérieusement c'est un projet dans le cadre du "Projet Web" de 3MIC à l'INSA Toulouse.

## Arborescence
* Le site se situe dans le répertoire "public_html", c'est en réalité un Client (car seulement du JS, HTML et CSS, il est dynamique car connecté a un serveur nodejs (connection internet requise).
* dans le répertoire "server" se trouve le serveur node.
* dans le répertoire tools se trouve un tools qui a partir d'une map, permet de générer le json contenant les collisions de cette map, ensuite il y a dans ce même répertoire un tool de parsing qui permet à partir de ce json de générer les variables js qui seront dans le code (à l'emplacement "public_html/js/global.js"). Ce sont des tool de dev qui ne sont absolument pas nécessaires pour faire tourner le projet.

## Explication du code côté client
En réalité tout le code se trouve côté client, ce qui n'est absolument pas idéal pour gérer la triche, mais beaucoup plus fun à coder !
Ce qu'il se passe c'est que la quasi totalité des requêtes envoyés au serveur via websocket sont broadcast à tous les joueurs.
Dans le repertoire "public_html" on retrouve la page html contenant le canvas mais également le code HTML du téléphone.
Dans le repertoire public_html/js on retrouve le code du jeu.
* global.js contient toutes les variables globales, en gros on instancies toutes les classes : le joueurs en local, un tableau contenant les autres joueurs, la connection au serveur, les portails (de tp), les voitures, les PNJ, les tableaux de collitions (mapXCircles et mapXSquares), les maps, et les fonctions globales traitant les nouveaux kills, les ajout et updates des joueurs.
* class.js contient les classes (et donc les structures) de tous les éléments : les joueurs, les voitures, les PNJ, les balles, les maps, les portails. Ce fichier contient donc naturellement tous les prototypes de ces classes (qui gère les collisions, déplacement...).
* cookies.js est juste un bout de code pris sur Open Classroom permettant d'aller chercher le nom du joueur pris dans les cookies.
* game.js est le corp du programme, il contient la boucle principale permettant de gérer chaque itérations et l'ordre d'appel des fonctions globales et de parcours des joueurs par exemple.
* input.js contient une classe qui gère les input au clavier et à la souris.
* leaderboard.js contient une classe qui gère le leaderboard et son affichage sur le canvas.
* network.js contient une classe qui gère la communication avec le websocket.
* phone.js contient une classe qui gère le téléphone (donc de l'app de message et qui gère les autres app comme des webview).
* render.js contient une classe qui gère l'affichage sur le canvas.
* sound.js contient une classe qui gère les sons.


## Spec du serveur

| Nom de la commande | Entrée                                            | Sortie                                               |
| ------------------ | ------------------------------------------------- | ---------------------------------------------------- |
| ping               |                                                   | Répond "pong" au websocket emetteur                  |
| update             | Information de son joueur(position, direction...) | Broadcast aux autres joueurs                         |
| newBullet          | Info d'une nouvelle balle (position, direction...)| Broadcast aux autres joueurs                         |
| died               | Identifiant du Killeur et du killé                | Broadcast aux autres joueurs + update du joueur tué  |
| message            | Message envoyé via concorde                       | Broadcast aux autres joueurs                         |

* le ping est une commande de débug.
* update est émis à chaque modification de direction, à chaque tp ou prise de dégats. Le serveur emet de lui même un update dès qu'un joueur meurt afin de faire respawn le joueur(en vrai il se fait juste TP au moment ou il meurt).
* newBullet est émis a chaque fois que quelqu'un tire.
* died est émis par un joueur lorsqu'il meurt (côté client chacun check s'il a des collisions avec les balles et dès qu'il n'a plus de vie emet un "died").
* message est fait pour broadcast des messages dans le chat in game (via l'application "Concord" accessible via le téléphone (press "P"))

## Pistes d'amélioration
* ammo non infini 
* coder des perks (speed, shield)