Laureline's Wiki

Laureline's Wiki

Ars Tactica: Rapport Intermédiaire

Ars Tactica: Rapport Intermédiaire

Ars Tactica est un jeu de stratégie au tour par tour qui oppose deux ou plusieurs joueurs dont l’objectif est de détruire la base de leur adversaire(s).

Fonctionnement

Le jeu oppose deux camps (1v1 ou 2v2) dans un match à mort pour la destruction de tous les bâtiments affectés à une équipe, ceci en tour par tour. Chaque joueur contrôle un bâtiment principal qui lui sert de point de départ pour produire des unités de combat ainsi que des bâtiments collecteurs de ressources qui lui permettent d’augmenter sa production d’unités. Le joueur devra aussi investir des ressources dans des technologies qui lui débloqueront l’accès à des différents types d’unité.

Déroulement d'une partie

Chaque joueur commence la partie avec un bâtiment principal permettant de créer des unités. Un joueur est éliminé de la partie lorsque tous ses bâtiments sont détruits. L'ordre de passage des joueurs est déterminé aléatoirement lors du début de la partie.

Au début du tour d'un joueur, toutes les unités en cours de production dont le temps de production restant arrive à zero sont placés sur la carte le plus proche possible de leur bâtiment producteur. Le joueur peut ensuite déplacer et controller ses unités sur la carte. Chaque unité peut être déplacée une fois par tour et peut attaquer une autre unité/bâtiment un nombre de fois par tour correspondant à sa valeur Spd (Vitesse). Un joueur peut aussi demander la production d'unités par ses bâtiments (chaque bâtiment possède un certain nombre de modules de production parallèles spécifiés par sa valeur Prod). Lorsque le joueur à terminé ses actions, il passe alors sont tour au joueur suivant dans l'ordre de passage.

Archétypes

Nom Paramètres Description
Actor Type, Hp, Cost Archétype de base pour toute entité active dans la partie (unités, bâtiments)
Movable Mov Permet à l'entité de se déplacer sur la carte
Attacker Atk, Spd Permet à l'entité d'attaquer d'autre entités.
Spawner Types, Queue Permet à l'entité de produire des Actor
Carrier Size Permet à l'entité de contenir d'autres entités (ex: transport)
Caster Spells[] Permet à l'entité d'utiliser des capacités spéciales (ex: construction, bombardement, …)

Unités

Une unité est un type d'entité possédant les archétypes Actor, Movable et Attacker. Il leur est aussi possible de posséder l'archétype Caster, Carrier ou Spawner.

Nom Type Hp Cost Mov Atk Spd
Tank Heavy 2 5 1 15 3
Soldier Light 1 2 1 5 1

Bâtiments

Un bâtiment est un type d'acteur possédant l'archétypes Actor. Il ne peut pas être déplacé mais peut posséder les archétypes Spawner, Carrier et Attacker.

Nom Hp. Archétypes
Base 20 Spawner of [Light, Heavy], Queue: 5

Responsabilités

Le jeu fonctionne selon une architecture client-serveur avec le serveur servant d’autorité pour la connexion, le matchmaking et le déroulement des parties. Les deux parties utilisent la libraire Netty pour faciliter l’échange des données sur le réseau. Une interface d'administration externe permet aux administateurs de gérer les joueurs.

Serveur de Jeu

Le serveur de jeu permet au client d'établir une session ce qui leur permet d'entrer dans la file d'attente pour participer à une partie de jeu. Lorsque suffisament de joueurs sont prêts, le serveur notifie les clients qu'ils sont placés dans un Lobby. Chaque joueur doit alors éventuellement sélectionner ses paramètres de jeu (future proofing). Lorsqu'ils sont prêts, les clients le signalent alors au serveur. Le Lobby possède aussi un timer interne qui empêche un client malveillant d'empêcher le départ de la partie. Une fois que tous les clients ont déclaré qu’ils sont prêts à démarrer la partie le serveur crée alors une session de jeu (partie) avec les paramètres spécifiés dans le lobby et notifie les clients du début de la partie. La création d'une session de jeu consiste à construire l’ECS représentant l’état de jeu et tirer au sort l’ordre de passage des joueurs. Lorsqu’un client demande d’effectuer une action, le serveur tente de l’appliquer à l’ECS. Si l’action est un succès tous les joueurs sont notifiés des changements à l’état de jeu, dans le cas contraire, seul le joueur ayant initié l’action est notifié.

Client

Le client est composé d’un écran de login, d’un menu ainsi que d’une interface de jeu. Lorsqu’il est démarré, le client affiche l’interface de login, qui donne accès au Lobby sur le serveur. Une fois connecté, une interface menu permet de se déconnecter ou d’indiquer que l’on est prêt à commencer la partie. Le client entre alors en phase d’attente d’une partie de la part du serveur. Une fois la partie reçue, l’interface de jeu est alors affichée, la carte, la base et les unités éventuelles sont présentes (voir annexe 1). Chaque action faite par le client est vérifiée par le serveur. Une réponse de la part du serveur est reçue dans tous les cas (valide ou non-valide).

Administration

La base de données de l'application peut être gérée à l'aide d'une interface web par les administrateurs.

Technologies Utilisées

Le système utilise Netty 4.1 comme librarie réseau client-serveur qui offre une gestion robuste du pipeline d'encodage/décodage des données à travers le réseau. La librarie Google Guava est utilisée pour son mécanisme de services et son bus de message. La librarie Ashley est utilisée pour la gestion de l'état de jeu à l'aide d'un ECS.

Le client utilise libGDX comme moteur d'affichage. Cette librarie fournit de nombreuses abstractions au dessus de OpenGL qui permettent de facilement manipuler de nombreux éléments graphiques sans impact de performance.

Le tout est programmé dans le language Kotlin.

Cas d'utilisation

<uml title=“UseCase”>

Anonymous –> (Create Account)

Player –> (Play a Game) (Play a Game) ..> (Queue up for a Game) : <include> (Queue up for a Game) ..> (Log in to the Client) : <include>

Player <|– Administrator

Administrator –> (Ban Account) (Ban Account) ..> (Login in to the Admin)

Administrator <|– :System Administrator: :System Administrator: –> (Start Server)

</uml>

Acteurs

Nom Description
Anonymous Utilisateur ne possédant pas de compte
Player Utilisateur possédant un compte
Administrator Rôle permettant d’administrer le système

Rôles

Nom Description
Create Account Un utilisateur peut créer un compte
Login to the Game Un utilisateur peut s’authentifier auprès du serveur et récupérer une session
Queue up for a Game Un utilisateur peut entrer dans la file d’attente pour une partie
Play a Game Un utilisateur peut participer à une partie
Login to the Admin Un administrateur peut se connecter à l’interface d’administration
Ban Account Un administrateur peut bannir un joueur
Start Server Un administrateur système peut démarrer le serveur de jeu

Scénarios

Create Account

Prérequis: Le client doit être lancé

  1. Le jeu présente l'écran de création de compte
  2. L'utilisateur remplis le formulaire
  3. L'utilisateur soumet le formulaire
  4. Le client envoie une demande de création de compte au serveur
  5. Le serveur crée le compte (LoginSystem)
  6. Le serveur répond favorablement au jeu
  7. Le jeu présente l'écran de connexion
Scénarios Alternatifs
  • Le compte existe déjà
    1. Le nom d'utilisateur est déjà pris
    2. Le serveur répond de manière négative
    3. Le jeu présente un message d'erreur à l'utilisateur

Login to the Game

Prérequis: Le client doit être lancé, L'utilisateur doit avoir crée un compte

  1. Le jeu présente l'écran de connexion
  2. L'utilisateur saisit ses credentials (username, password)
  3. Le client envoie une demand de connexion au serveur
  4. Le serveur authentifie l'utilisateur (LoginSystem)
  5. Le serveur répond favorablement à la connexion
  6. Le jeu présente le menu principal
Scénarios Alternatifs
  • Les credentials de l'utilisateur ne sont pas valides
    1. Le serveur répond de manière négative
    2. Le jeu présente un message d'erreur à l'utilisateur

Queue up for a Game

Prérequis: L'utilisateur doit être authentifié auprès du serveur

  1. L'utilisateur sélectionne la file d'attente de son choix (1v1, …)
  2. Le jeu envoie une notification au serveur
  3. Le serveur place le joueur dans la file d'attente
  4. Le serveur attend que suffisament de joueurs soient dans la file d'attente (2 joueurs pour du 1v1, 4 joueurs pour du 2v2, etc)
  5. Le serveur crée le lobby et y place les joueurs
  6. Le serveur notifie les clients de la création d'un Lobby
  7. Le jeu affiche l'écran de Lobby
  8. L'utilisateur signale qu'il est prêt
  9. Le jeu envoie une notification au serveur
  10. Le serveur attend que tous les joueurs soient prêts (ou que le timer interne soit échu)
  11. Le serveur crée une partie et y place les joueurs
  12. Le serveur notifie les clients du début de la partie
  13. Le jeu affiche l'écran de jeu
Scénarios Alternatifs
  • Le timer du lobby expire
    1. Le serveur notifie les clients que le lobby est fermé
    2. Le jeu affiche le menu principal
    3. Le jeu affiche un message d'erreur

Play a Game

Prérequis: Le joueur doit être dans une partie

  1. Le serveur notifie les clients qu'ils sont entrés dans une partie
  2. Le jeu affiche l'écran de jeu
  3. Le serveur crée l'état de jeu original
  4. Le serveur détermine l'ordre de passage des joueurs
  5. A effectuer tant qu'il reste plus d'un joueur
    1. Le serveur informe les clients du joueur en cours
    2. Tant que le joueur peut effectuer une action
      1. Le joueur effectue une action (déplacement, attaque, …)
      2. Le serveur valide l'action et l'applique à l'état de jeu
      3. Le serveur informe les clients des changements dans l'état de jeu
      4. Si un joueur à été éliminé
        1. Informer tous les joueurs du joueur éliminé
    3. Le joueur termine son tour
    4. Le serveur sélectionne le prochain joueur dans l'ordre de passage
  6. La serveur notifie de la fin de la partie
  7. Le jeu affiche le menu principal
Scénarios Alternatifs
  • La connexion est interrompue lors d'une partie
    1. Si un joueur met plus d'un certain temps à ne rien faire durant son tour il est éliminé
  • Si un joueur est éliminé
    1. Le jeu affiche une notification “Vous avez perdu”
    2. Le jeu affiche le menu principal

Login to the Admin

  1. L'administrateur ouvre son navigateur à l'adresse de la console d'administration
  2. L'administrateur entre ses credentials pour se connecter
  3. La console d'administration vérifie la validité des credentials
  4. La console d'administration affiche son menu de gestion

Ban Account

Prérequis: Connexion à la console d'administration

  1. L'administrateur sélectionne un compte utilisateur
  2. L'administrateur ajoute un banissement

Start Server

  1. L'administrateur système se connecte au serveur
  2. L'administrateur système lance l'application serveur
 

Protocole

Authentification

<uml title=“Authentication Packets”> hide empty methods hide empty fields

abstract class Packet {

+ id: long

}

Packet <|– ResponsePacket abstract class ResponsePacket {

+ responseTo: long

}

Packet <|– LoginRequest class LoginRequest «(P,Salmon)» {

+ username: String
+ password: String <i>hashed</i>

}

ResponsePacket <|– LoginResponse abstract class LoginResponse

LoginResponse <|– LoginSuccess class LoginSuccess «(P,Salmon)» {

+ sessionId: String
+ user: User

}

LoginResponse <|– LoginFailure class LoginFailure «(P,Salmon)» {

+ message: String

} </uml>

Authentification

<uml title=“Authentication Network Exchange”> Client → Server: LoginRequest(username, password) Server –> UserManager: authenticate(username) Server ←- UserManager: «success» Server → Client: LoginSuccess(user, sessionId) alt Failure Server ←- UserManager: «failure» Server → Client: LoginFailure(reason) end </uml>

<uml title=“Authentication Workflow”> title authenticate(user) start if (user in database?) then (no)

:LoginFailure;

elseif (password matches?) then (no)

:LoginFailure;

elseif (banned?) then (yes)

:LoginFailure;

else

:create session id;
:LoginSuccess;

endif stop </uml>

Création de Compte

<uml title=“Account Creation Network Exchange”> Client → Server: CreateAccount(username, …) Server –> UserManager: createAccount(…) Server ←- UserManager: «success» Client ← Server: CreateSuccess() alt Failue Server ←- UserManager: «failure» Client ← Server: CreateFailure() end </uml>

Matchmaking

<uml title=“Matchmaking Packets”> hide empty methods hide empty fields

enum QueueType {

1v1
2v2
3v3

}

Packet <|– EnterQueue EnterQueue – QueueType : type

Packet <|– EnterLobby class EnterLobby «(P,Salmon)» {

+ lobby: Lobby

}

Packet <|– PlayerReady class PlayerReady «(P,Salmon)» {

+ player: User

}

Packet <|– EnterGame class EnterGame «(P,Salmon)» {

+ gameId: long

} </uml>

<uml title=“Matchmaking Workflow”> actor ClientA actor ClientB box “Server Software” participant Server participant “1v1 Queue” as Queue participant “Lobby #1” as Lobby participant “Game #1” as Game end box note over Queue: is empty

ClientA → Server: EnterQueue(1v1) Server –> Queue: enterQueue(ClientA, 1v1) activate Queue

ClientB → Server: EnterQueue(1v1) Server –> Queue: enterQueue(ClientB, 1v1)

Queue –> Lobby: «new» deactivate Queue activate Lobby

ClientA ← Lobby: EnterLobby(#1) ClientB ← Lobby: EnterLobby(#1)

ClientA → Lobby: PlayerReady(ClientA) hnote over Lobby broadcast PlayerReady(ClientA) endnote

ClientB → Lobby: PlayerReady(ClientB) hnote over Lobby broadcast PlayerReady(ClientB) endnote

Lobby –> Game: «new» activate Game Lobby –> Game: start() deactivate Lobby

ClientA ← Game: EnterGame(#1) ClientB ← Game: EnterGame(#1) deactivate Game </uml>

Partie de Jeu

<uml title=“Game Packets”> hide empty methods hide empty fields

abstract class Packet {

+id: long

}

Packet <|– EnterGame class EnterGame «(P,Salmon)» {

+gameId: long

}

Packet <|– EndGame class EndGame «(P,Salmon)» {

+winner: PlayerRef

}

Packet <|– MoveTurn class MoveTurn «(P,Salmon)» {

+nextPlayer: PlayerRef

}

Packet <|– SyncGameState class SyncGameState «(P,Salmon)» {

+gameWorld: GameWorld

}

Packet <|– SyncEntityState class SyncEntityState «(P,Salmon)» {

+entityId: long
+components: Component[]

} </uml>

<uml title=“Game Workflow”> actor Player box “Server Software” participant GameHandler participant TurnHandler participant StateHandler participant ActionFactory participant Action participant GameWorld end box

Start of Game

Player ← GameHandler: EnterGame(#1)

GameHandler –> TurnHandler: initialize() activate TurnHandler GameHandler ←- TurnHandler: «done» deactivate TurnHandler GameHandler –> StateHandler: initialize() activate StateHandler StateHandler –> GameWorld: construct() activate GameWorld StateHandler ←- GameWorld: «done» deactivate GameWorld GameHandler ←- StateHandler: «done» deactivate StateHandler Player ← GameHandler: SyncGameState(world)

Player Turn

Player –> Player: Select Actor Player –> Player: Request Action Player → GameHandler: PerformAction(entity, action) GameHandler –> TurnHandler: isTurnOf activate TurnHandler alt Out of Turn GameHandler ←- TurnHandler: «false» Player ← GameHandler: Error(“Out of Turn”) end GameHandler ←- TurnHandler: «true» deactivate TurnHandler GameHandler –> StateHandler: performAction() activate StateHandler

StateHandler –> ActionFactory: getAction() activate ActionFactory ActionFactory –> Action: «create» activate Action StateHandler ←- ActionFactory: «return Action» deactivate ActionFactory

StateHandler –> Action: isValid? note left: Checks if the entity is able to perform the action

StateHandler –> GameWorld: beginAction() activate GameWorld #LightBlue note left: Tracks changes to entities

StateHandler –> Action: apply() activate Action #DarkSalmon Action –> GameWorld: «changes» StateHandler ←- Action: «done» deactivate Action deactivate Action

StateHandler ←- GameWorld: getChanges() deactivate GameWorld

hnote over StateHandler broadcast SyncEntityState(changes) endnote

StateHandler –> StateHandler: checkVictory()

alt Player Wins hnote over StateHandler broadcast GameEnd(victor) endnote end

GameHandler ←- StateHandler: «done» deactivate StateHandler

… Passing Turn …

Player → GameHandler: EndTurn() GameHandler –> TurnHandler: nextTurn() activate TurnHandler GameHandler ←- TurnHandler: «new player» deactivate TurnHandler hnote over GameHandler broadcast MoveTurn(new player) endnote

</uml>

 

Modèle de Domaine

Jeu

<uml title=“Game Domain Model”> hide empty members

class Partie class Carte class Acteur class Bâtiment class Unité class Joueur class Equipe

Acteur <|– Bâtiment Acteur <|– Unité

Partie *– “*” Carte Partie *- “*” Equipe Equipe *– “*” Joueur

Joueur *- “*” Acteur

</uml>

Client

<uml title=“Client Domain Model”> hide empty fields hide empty methods hide class circle hide interface circle

package “Networking” { interface NetworkService

LoginService ←- NetworkService LobbyService ←- NetworkService GameService ←- NetworkService

NetworkService <.d.> Netty

class Netty «(L,lightblue)» }

package “Display” { LoginScreen —> LoginService

LoginScreen <.r.> MenuScreen

MenuScreen —> LobbyService

MenuScreen <.r.> GameScreen

}

GameScreen –> Interactor Interactor –> GameState Interactor —> GameService

</uml>

Notes

Ecrans

libGDX permet la gestion des écrans (Screen). Un écran occupe toute la surface de rendu et permet de rapidement changer la présentation.

Chaque écran agit à la fois comme un Contrôlleur et une Vue. Il est chargé d'afficher sa Vue dans sa méthode render().

Services Réseau

Les services réseau servent à abstraire l'interaction avec le réseau.

Interacteur

Permet d'abstraire les interactions avec l'état de jeu à travers le réseau. Il notifie des modifications effectuées à l'état aux observateurs pour qu'ils puissent les afficher.

Serveur

<uml title=“Server Domain Model”> hide empty members hide empty fields hide class circle hide interface circle

package “Networking” { class Netty class NetworkHandler } class GameHandler class LoginHandler class MatchmakingHandler package “Login” { class User «Model» class Session class SessionManager «Singleton» } package “Matchmaking” { class MatchmakingManager «Service» class Queue } package “Game” { class GameSession class GameState class StateHandler class TurnHandler class ActionFactory }

SessionManager *– “*” Session Session *- User

Netty <..> NetworkHandler

note as N1 Packets are dispatched to the correct handler as defined by the user session endnote

NetworkHandler ..> N1 Session .r.> N1 N1 ..> MatchmakingHandler N1 ..> LoginHandler N1 ..> GameHandler

Session <.. LoginHandler: creates

MatchmakingHandler — MatchmakingManager

MatchmakingManager – Queue

GameHandler – GameSession

GameSession *– TurnHandler GameSession *–o StateHandler GameSession *– GameState StateHandler *– ActionFactory

</uml>

Notes

Session (de Connexion)

Une session est crée à l'établissement d'une connexion au serveur et persiste jusqu'à la déconnexion du client. La session permet de gérer l'état d'authentification ainsi que la cible des paquets.

Matchmaking

Le matchmaking s'effectue en plaçant les sessions dans des files d'attente. Une fois qu'une file d'attente à atteint le nombre requis de joueurs en fonction de sa configuration. Une session de jeu est crée en y ajoutant les joueurs.

Session de Jeu

Lorsqu'une session de jeu est crée elle est initialisée avec ses paramètres de jeu (joueurs, carte, …). Elle transmet ensuite l'état de jeu initial les joueurs du début de partie et les notifie qu'elle est prête à recevoir les interactions des joueurs.

  • GameState: Contient l'état de la partie. Toutes les unités en jeu ainsi qu'une représentation de la carte.
  • StateHandler: Effectue les opérations de modification sur le GameState et garde trace des changements pour pouvoir effectuer les mises à jour différentielles.
    • ActionFactor: Mécanisme générique de gestion des actions sur l'état de jeu.
  • TurnHandler: Gère le turn order pour la partie.
 

Base de Données

<uml title=“Data Model”> hide methods

class User «(E,lightblue)» {

+username
+password <i>hashed</i>
+rating

}

class Game «(E,lightblue)» {

+startedAt
+length

}

class Stats «(E,lightblue» {

+isWinner
+rating <i>At time of game</i>
+score

}

class Role «(E,lightblue)» {

+name

}

class Ban «(E,lightblue)» {

+start
+end
+reason

}

Player “1” -d- “*” Role: roles Player “1” -r- “*” Ban: bans Game “*” -l- “1” Player (Game, Player) .. Stats </uml>

Notes

La base de données sert à répertorier les joueurs et garder trace des parties jouées pour déterminer le rating d'un joueur.

La trace des banissements des joueurs est aussi inscrite dans la base de données afin de leur refuser l'accès au jeu.

Entité Description
User Utilisateur de l'application, peut se connecter via le client
Role Permet de déterminer les actions auquels à droit un utilisateur
Ban Historique de banissement des joueurs
Game Partie joué
Stats Statistiques de la partie pour un joueur
 

Gestion du Projet

Rôles

Rôle des participants au sein du groupe de développement

Role Laureline Yves Samuel Christophe
Project Manager Primary Assistant
Software Architect Primary
Analyst Primary
Game Designer Assistant Primary
Documentalist Primary Assistant Assistant Assistant
Implementer Server Server Client Client
Tester Server Server Client Client

Plan d'Iterations

Le plan d'itérations considère les semaines du Jeudi au Mercredi suivant. Ceci est pour permettre d'avoir une réunion lors des séances de Laboratoire le Jeudi après-midi.

Equipes de Travail
  • Client
    • Samuel
    • Christophe
  • Serveur
    • Laureline
    • Yves
Travail déjà Réalisé
  • Squelette de projet
  • Mise en place du gestionnaire de paquets Netty

Iteration 1

<columns 100% 50% 50%> Dates 14 Avril - 20 Avril

Charge de Travail 4h30 par personne (total 18h)

Objectifs
  • Réaliser Log in to the Client (logique client)
  • Réaliser Create Account (logique client)
  • Réaliser Log in to the Client (logique serveur)
  • Réaliser Create Account (logique serveur)

<newcolumn>

Implémentation
Client
  • Mise en place des écrans (stubs) LoginScreen, MenuScreen, LobbyScreen et GameScreen.
  • Implémenter la logique du LoginScreen
  • Utilisation de service dummy pour la gestion du réseau.
Serveur
  • Gestionnaire de Réseau NetworkHandler (Module Partagé)
    • Enregistrer un handler de réponse
    • Enregistrer un handler pour un type de paquet (Pour Client)
    • Notification lors d'une réponse à un paquet
  • Mise en place du LoginHandler
  • Mise en place de base de données utilisateur

</columns>

Bilan

<columns 100% 50% 50%> Avancement des Objectifs: 100%

Révision des Itérations: Les itérations suivantes ont été déplacées d'une semaine vers l'avant en éliminant l'itération tampon. Ceci nous calque sur le programme “normal”.

Améliorations Possibles: Optimiser la répartition des tâches entre les membres du groupe. Ceci est difficile principalement à cause du manque d'expérience avec des “gros” projets de cerains membres du groupe.

<newcolumn>

Laureline (~6h)
  • Effectué la mise en place du NetworkHandler.
Samuel (~15h)
  • Création des dummy classes pour les tests
  • Création du LoginScreen, LobbyScreen, CreateScreen, MainMenu
  • Implémentation partielle de la logique du LobbyScreen
Yves (10h)
  • Création de la base de donnée
  • Mise en place du LoginHandler

L'effort prévu ne prenait pas en compte le manque de connaissance vis à vis du language. C'était la perte de temps la plus importante, les itérations futures ne subiront normalement pas cela.

Christophe (6h)
  • Aide à l'implémentation du LobbyScreen

Malheureusement j'ai perdu beaucoup de temps à cause du langage et de la compréhension globale de la structure du projet. Le partage du travail ne s'est pas fait équitablement au final, ce qui est dommage car certains ont travaillé plus que d'autres. Avec la génération de la map je vais pouvoir plus m'impliquer. </columns>

Iteration 2

<columns 100% 50% 50%> Dates 28 Avril - 4 Mai

Charge de Travail 4h30 par personne (total 18h)

Objectifs

Pouvoir effectuer une demande de matchmaking, entrer dans un lobby et “lancer” une partie une fois que tous les joueurs sont prêts

  • Intégrer la communication client/serveur
  • Réaliser Queue up for a Game
  • Réaliser Log in to the Admin

<newcolumn>

Implémentation
Client
  • Mettre en place le NetworkManager utilisant le réseau
  • Implémenter la logique du MenuScreen et LobbyScreen
Serveur
  • Mise en place du LobbyHandler
  • Mise en place du système de Matchmaking
Admin
  • Mettre en place l'application web
  • Se connecter à la base de données du jeu

</columns>

Bilan

<columns 100% 50% 50%> Avancement des Objectifs: Client (70%), Serveur (70%), Admin (70%)

Explication du Retard: Mauvaise gestion du temps par rapport aux autre projets et laboratoires en cours.

Révision des Itérations: Les itérations ne vont pas être replanifiées le ratrd peut être rattrapé.

<newcolumn>

Laureline (~6h)
  • Création du LobbyHandler
  • Mise en place du sytème de matchmaking

Les modules ont été mis en place, mais ils n'ont pas pu être testés car le client n'était pas implémenté.

Samuel (3h)
  • Avancement dans la logique du Lobby Screen
Yves (0h)
  • Rien fait…
Christophe (0h)
  • Rien fait…

</columns>

Iteration 3

<columns 100% 50% 50%> Dates 5 Mai - 11 Mai

Charge de Travail 4h30 par personne (total 18h)

Objectifs

Initialiser l'état de jeu côté serveur et le transmettre au client.

  • Réaliser Play a Game (initialisation)
  • Réaliser Ban Account (admin side)

<newcolumn>

Implémentation
Client
  • Recevoir l'état de jeu
  • Afficher la carte
  • Afficher les acteurs (bâtiments, unités)
Serveur
  • Initialiser l'état de jeu
    • Charger la carte
    • Définir le Turn Order
    • Placer les Bases
  • Le transmettre au client
Admin
  • Mettre en place une interface pour bannir un joueur

</columns>

Bilan

<columns 100% 50% 50%> Avancement des Objectifs: Client (0%), Serveur (0%), Admin (0%)

Explication du Retard: Mauvaise gestion du temps par rapport aux autre projets et laboratoires en cours.

Révision des Itérations: Les itérations ne vont pas être replanifiées le retard peut être rattrapé.

Révision Itération 2: Le match making a été partiellement implémenté, et présentait un bug non-directement résolvable. Il a donc été choisi que cet élément, non-indispensable au fonctionnement du jeu, serait supprimé de l'implémentation finale. Ceci permettra de rattraper le retard accumulé lors de cette itération (itération 3).

<newcolumn>

Laureline (~6h)
  • Création d'un client de débug

La création d'un client de débug permet de tester les changements dans le serveur sans attendre que le client fasse ces modifications ce qui permet d'accélérer le développement du serveur.

Samuel (0h)
  • Hum…
Yves (0h)
  • Rien fait…
Christophe (3h)
  • Tests et tuto libgdx avec Tiled

</columns>

Iteration 4

<columns 100% 50% 50%> Dates 12 Mai - 18 Mai

Charge de Travail 6h00 par personne (total 24h)

Objectifs

Gérer le passage de tours entre les joueurs.

  • Réaliser Play a Game (initialisation)(passage de tours)
  • Réaliser Ban Account (admin side)(server side)

<newcolumn>

Implémentation
Client
  • Afficher la carte (données de test)
  • Afficher les acteurs (bâtiments, unités) (données de test)
  • Gérer l'affichage des tours (données de test)
    • Afficher le joueur en cours
    • Afficher le bouton “End Turn” pour terminer son tour
    • Cacher le bouton “End Turn” hors tour
Serveur
  • Initialiser l'état de jeu
    • Charger la carte
    • Placer les Bases
    • Définir le Turn Order
  • Gérer le passage de tour entre les joueurs
    • Envoyer les paquets
    • Assurer que seul le posséseur du jeton de tour peut terminer son tour
  • Gérer les joueurs bannis dans le login manager
Admin
  • Compléter l'admin (Login admin, bannir et lister les joueurs)

</columns>

Bilan

<columns 100% 50% 50%> Avancement des Objectifs: Client (90%), Serveur (90%), Admin (100%)

Explication du Retard: Le retard se situe seulement au niveau de la gestion des tours côté client et serveur. Ce n'est pas terminé, mais fini à 80% de chaque côté.

Révision des Itérations: La gestion des tours est presque terminée et sera rattrapée durant l'Itération suivante. Il reste environ 1h de travail partagée entre chaque côté, pour terminer cela.

Avance: La gestion du déplacement des unités a été implémentée, côté client, dans cette Itération au lieu de l'itération 5, ceci pour effectuer des tests sur la gestion de la carte. Cette étape est donc presque terminée du côté client.

<newcolumn>

Laureline (6h)
  • Initialisation de l'état de jeu
  • Correction de bugs divers
Samuel (2h)
  • Correction sur le MainMenu
  • Test du LoginScreen
Yves (~4h)
  • Création de l'interface d'administration (4h)
Christophe (6h)
  • Chargement d'un écran de jeu (map) avec tests de chargement de différentes sprite (base, unité)
  • Test de gestion de la souris, clic, drag and drop
  • Test de gestion des entrées clavier

</columns>

Iteration 5

<columns 100% 50% 50%> Dates 19 Mai - 25 Mai

Charge de Travail 5h00 par personne (total 20h)

Objectifs
  • Réaliser Play a Game (gras = fait)
    1. Le serveur notifie les clients qu'ils sont entrés dans une partie
    2. Le jeu affiche l'écran de jeu
    3. Le serveur crée l'état de jeu original
    4. Le serveur détermine l'ordre de passage des joueurs
    5. A effectuer tant qu'il reste plus d'un joueur
      1. Le serveur informe les clients du joueur en cours
      2. Tant que le joueur peut effectuer une action
        1. Le joueur effectue une action (déplacement, attaque, …)
        2. Le serveur valide l'action et l'applique à l'état de jeu (retard)
        3. Le serveur informe les clients des changements dans l'état de jeu (retard)
        4. Si un joueur à été éliminé
          1. Informer tous les joueurs du joueur éliminé
      3. Le joueur termine son tour
      4. Le serveur sélectionne le prochain joueur dans l'ordre de passage
    6. La serveur notifie de la fin de la partie
    7. Le jeu affiche le menu principal

<newcolumn>

Implémentation
Client (10h - Samuel et Christophe)
  • Recevoir l'état de jeu
  • Sélection d'unité à l'aide de la souris (70% done)
  • Requète de déplacement lors d'un clic droit (70% done)
  • Afficher un message lors d'un refus du serveur
  • Déplacement d'une unité lors d'un message du serveur (70% done)
Serveur (10h - Laureline et Yves)
  • Transmettre l'état de jeu au client
  • Gestion de la requête de déplacement
    • Broadcast si succès
    • Reply si échec
Admin (1h - Yves)
  • Afficher l'historique des parties dans l'admin

</columns>

Bilan

<columns 100% 50% 50%> Avancement des Objectifs: Client (40%), Serveur (50%), Admin (100%)

Révision des Itérations: La gestion du déplacement d'une unité côté client a été implémentée en partie dans l'itération 4.

Explication du retard:

  • Les transferts réseaux entre le client et le serveur demandent que l'on puisse sérializer les objets ciblés (carte, unités, etc.). Ceci a pour impact de devoir implémenter un serializer, car l'ECS (Entity Component System) Ashley n'est pas compatible avec l'interface serializable.
  • L'interactor est un objet complexe, qui permet de synchroniser l'état de jeu et la gestion graphique du jeu (clic souris, etc.). Il a besoin de l'intégration du réseau notamment, nous avons donc pris du retard là dessus.

Améliorations Possibles: Prévoir ce que les tâches (transfert, etc.) vont devoir utiliser en background, le serializer par exemple.

<newcolumn>

Laureline (8h)

La transmission de l'état de jeu nécéssite l'implémentation d'une serialisation personnalisée pour pouvoir effectuer les synchronisations différentielles.

L'implémentation malheureusement pris plus de temps que prévu et n'est toujours pas terminé. Le retard est du à plusieurs tentatives de solutions qui n'ont pas abouti.

Samuel (4h)
  • Création de l'Interactor (Mise à jour du GameState à partir des informations provenant du serveur).
  • Mise en place de la logique de mise à jour de l'interface graphique.
Yves (1h)
  • Création de la page statistiques (historique des parties) déjà implémentée dans l'itération 4 (avance).
Christophe (4h)
  • Implémentation Requête de déplacement (70% avance étape 4)
  • Ajout de la gestion d'objets graphique par cellule (et non plus par pixel)

</columns>

Iteration 6

<columns 100% 50% 50%> Dates 26 Mai - 01 Juin

Charge de Travail 5h par personne (total 20h)

Objectifs

Gestion des actions (dépendantes des archétypes) des acteurs

  • Réaliser Play a Game en entier
    1. Le serveur notifie les clients qu'ils sont entrés dans une partie
    2. Le jeu affiche l'écran de jeu
    3. Le serveur crée l'état de jeu original
    4. Le serveur détermine l'ordre de passage des joueurs
    5. A effectuer tant qu'il reste plus d'un joueur
      1. Le serveur informe les clients du joueur en cours
      2. Tant que le joueur peut effectuer une action
        1. Le joueur effectue une action (déplacement, attaque, …)
        2. Le serveur valide l'action et l'applique à l'état de jeu
        3. Le serveur informe les clients des changements dans l'état de jeu
        4. Si un joueur à été éliminé
          1. Informer tous les joueurs du joueur éliminé
      3. Le joueur termine son tour
      4. Le serveur sélectionne le prochain joueur dans l'ordre de passage
    6. La serveur notifie de la fin de la partie
    7. Le jeu affiche le menu principal

<newcolumn>

Implémentation
Client (10h) Christiophe et Samuel
  • Synchronisation état de jeu et gui (Interactor) (50%)
  • Afficher un panneau d'actions pour l'unité/bâtiment sélectionné
  • Requète d'action au serveur
  • Afficher un message lors d'un refus du serveur
  • Mettre à jours l'affichage lors du succès
Serveur (10h) Yves et Laureline
  • Terminer le serializer (50%)
  • Gestion des requètes d'action

</columns>

Bilan

<columns 100% 50% 50%> Avancement des Objectifs: Client (10%), Serveur (10%)

Révision des Itérations: La synchronization de l'état de jeu avec la gui (Interactor) et le serializer ont en partie été implémentés durant l'itération précédente, mais n'ont pas été terminés. Ils sont donc à terminer dans cette itération-ci.

Cette itération a été complètement déplacée dans l'itération 7. Ceci est dû à une mauvaise gestion du temps du Projet de semestre (PRO) qui nous a pris énormément de temps cette dernière semaine afin de le terminer. Ce projet a aussi ces propres problèmes poru la gestion du temps, laissant cette itération-ci impossible à réaliser.

Améliorations Possibles: Eviter de prévoir des charges de travail trop grandes lors de la finalisation de projets concurrents.

<newcolumn>

Laureline (0h)
  • Rien
Samuel (4h)
  • Interactor
Yves (0h)
  • Rien
Christophe (0h)
  • Rien

</columns>

Iteration 7

<columns 100% 50% 50%>

Dates 02 Juin - 08 Juin

Charge de Travail 8h00 par personne (total 32h)

Objectifs

  • Terminer le scénario Play a Game
  • Finaliser la documentation du projet

<newcolumn>

Implémentation
Client (12h) Christiophe et Samuel
  • Synchronisation état de jeu et gui (Interactor) (50%)
  • Afficher un panneau d'actions pour l'unité/bâtiment sélectionné
  • Requète d'action au serveur
  • Afficher un message lors d'un refus du serveur
  • Mettre à jours l'affichage lors du succès
Serveur (8h) Laureline
  • Terminer le serializer (50%)
  • Gestion des requêtes d'action
Documentation 12h (8h Yves / 2h Samuel / 2h Christophe)
  • Finaliser la documentation

</columns>

Bilan

<columns 100% 50% 50%> Avancement des Objectifs: Client (90%), Serveur (90%)

Révision des Itérations: L'itération 6 a été complètement déplacée dans cette itération. (voir bilan itération 6 pour plus de précision)

L'implémentation des “actions” d'unités est à compléter sur le serveur (créer, attaquer). L'implémentation des “actions” d'unités est à compléter sur le client (créer, attaquer, bouger). Déplacement dans l'itération 8.

Améliorations Possibles:

<newcolumn>

Laureline (10h)
  • Terminé le serializer
  • Implémenté la gestion des actions
    • Fonctionne en théorie ;)
  • Implémentation de la gestion du jeu (fin de partie)
Samuel (4h)
  • Terminer l'interacteur
Yves (4h)
  • Documentation
Christophe (2h)
  • Avancement du client

</columns>

Iteration 8

<columns 100% 50% 50%>

Dates 09 Juin - 15 Juin

Charge de Travail 5h00 par personne (total 20h)

Objectifs

  • Terminer le client
  • Terminer la documentation
  • Préparation de la présentation

<newcolumn>

Implémentation
Client (5h) Christiophe et Samuel
Serveur (4h) Laureline
Documentation (5h Yves et 2h les autres)
  • Finaliser la documentation

</columns>

Bilan

<columns 100% 50% 50%> Avancement des Objectifs: Client (???%), Serveur (???%)

Révision des Itérations: Rattrapage des derniers problèmes de fonctionnement du client et serveur (itération 7).

Améliorations Possibles:

<newcolumn>

Laureline (???h)
Samuel (???h)
Yves (???h)
  • Documentation
Christophe (???h)

</columns>

16 Juin 2016

Rendu du projet et Présentation.