A.R.S.E.N.A.L Extended Power / Tactical Soft / 2001-2003
Ayant été le seul programmeur chez Tactical Soft à part le patron, cet emploi m'a permis d'enrichir énormément mes connaissances car j'ai du toucher et m'auto-former à nombre de domaines différents.

A.R.S.E.N.A.L. Extended Power pour Windows (95 à XP) et Linux est un jeu de stratégie style Alerte rouge. Ca c'est pour l'idée de base, car la ressemblance s'arrête là. ARSENAL est concu sur le principe du multi-joueurs. Ce n'est pas le principe du joueur contre l'ordinateur, mais le joueur contre plusieurs adversaires (ou alliés) qui peuvent être éventuellement des IA. ARSENAL vise à créer une communauté virtuelle en ligne. Divers moyens de communications et d'échanges au sein de cette communauté sont les highscore mondiaux, le forum, le partage des cartes crées par les utilisateurs via le serveur, les parties en réseau local ou via Internet... De plus, autre différence: chaque joueur évolue et pas au cours d'une simple partie, mais pendant toute sa vie; en plus d'un grade en fonction de ses performances, selon la facon dont le joueur traite ses ennemis ou alliés il obtient une réputation qui peut aller de traitre à héros... Cette réputation est très importante, car les autres joueurs (et surtout les IA) en tiennent compte avant d'accepter une alliance.

Ca c'était pour la présentation du jeu et je vais maintenant vous présenter mon travail. J'ai eu à travailler sur 4 parties différentes du projet:
  • Le client qui gère la license (identifie au serveur l'unique machine enregistrée pour la license, transfère la license sur une nouvelle machine, met-à-jour le jeu ou télécharge des add-on, lance ce dernier en version complète ou démo selon les cas...)
  • Le jeu en lui-même.
  • Une interface de monitoring à distance temps réel du serveur.
  • Le serveur à tout faire qui consiste en un programme C++ tournant 24h/24 sur une machine Linux (paiement, licenses, scores, mise-à-jour, add-on, cartes utilisateurs, forum...)

Dans cette section contrairement aux autres, vous ne verrez que peu de détails techniques surtout concernant le serveur. En effet, je dois faire attention à ne pas rendre publique une information qui pourrait servir à un éventuel piratage. Vous ne verrez pas non plus de screenshots. Pourquoi? Dans la majorité des cas, j'ai surtout travaillé sur des algorithmes et des choses cachées. L'intérêt des screenshots serait assez limité du style "regardez le jeu affiche sous Linux", "regardez le jeu se connecte au serveur" ou encore "regardez le jeu joue des MP3 ou du MIDI" (sans blague?). Toutefois, la démo est fournie en bas de page et vous pourrez donc essayer (la totalité des fonctionnalités décrites ne sera accessible que si vous achetez le jeu).

Le client:
  • Le client consiste en une interface MFC multi-langues (3 langues actuellement: anglais, francais et allemand) destinée à gérer la license du joueur. Après avoir joué la démo, le joueur a juste à cliquer sur le bouton "Acheter". Le client identifie alors sa machine de facon unique auprès du serveur. Le joueur se voit alors proposer le choix de payer directement en ligne par carte de crédit et de télécharger sa license tout-de-suite (conversions des différentes monnaies du monde affichées), ou alors d'imprimer un formulaire à envoyer par voie postale avec son chèque. Après réception, il recevra par email des instructions pour télécharger sa license.
  • Une fois la license téléchargée, le client rappelle à l'utilisateur de faire des sauvegardes de sa license à intervalles réguliers. Ce dernier peut alors jouer la version complète du jeu et avoir accès aux autres fonctions fournies par l'interface client: enregistrer son score dans la liste des meilleurs scores au monde, écrire des messages sur le forum et surtout télécharger les mises-à-jour et add-on du jeu.
  • La license est accordée pour l'utilisation sur 1 machine. Si l'interface client détecte qu'elle a été lancée sur un ordinateur différent, elle affiche un message offrant à l'utilisateur le choix de transférer sa license sur son nouvel ordinateur (et il n'a plus le droit de jouer avec l'autre), ou d'acheter une nouvelle license. Si après un transfert l'utilisateur continue de jouer sur son ancienne machine, le serveur sanctionne alors ce dernier en suspendant temporairement sa license, le privant ainsi de tous les services offerts aux utilisateurs enregistrés: il retombe avec une version démo. Un message est affiché par le client et informe l'utilisateur qu'il a violé la license, lui donnant même tous les détails (license enregistrée pour tel ordi à telle date, utilisée sur tel autre ordi à telle date...) et l'invitant poliment à se mettre dans la légalité pour que sa license soit réactivée. J'ai même réalisé du code pour prendre une capture de l'écran de l'ordinateur de l'utilisateur lors de la violation de la licence, compresser l'image en JPEG et ainsi l'envoyer discrètement par Internet. Toutefois ce code n'est pas utilisé car à de très rares exceptions près, les gens qui se font avoir ne créent pas de problèmes et la très grande majorité d'entre eux achètent alors une 2ème license pour l'ordinateur violateur, ce qui leur est demandé afin de réactiver la license originelle.
Grâce à cet ingénieux système innovateur de protection (Microsoft semble d'ailleurs avoir choisi un système de protection/gestion de licenses similaire pour son dernier système d'exploitation Windows XP sous le nom de TCPA/Palladium), nous évitons que la même license serve sur tous les ordinateurs de la maison ou chez tous les ordis des copains, scénarios habituels chez les adolescents et parfois les plus âgés.

Le jeu:
Concernant le jeu, j'ai travaillé sur quelques modules, le jeu en lui-même étant déjà réalisé quand je suis arrivé.

Monitoring du serveur:
J'ai donc réalisé une application de monitoring du serveur en temps réel. Cette application permet de:
  • afficher en direct les noms des utilisateurs connectés au serveur et leur adresse IP ainsi que ce qu'ils étaient en train de faire (score, forum, transfert de fichier, achat, paiement...)
  • faire un backup des fichiers du serveur (fichiers d'informations sur chaque utilisateur leur permettant ou pas d'utiliser les services du serveur): il s'agit d'un backup incrémental et donc très rapide malgré la quantité énorme d'informations gérées (les historiques comprenant toutes les actions effectuées par plus de 10000 clients).
  • afficher des informations sur un utilisateur ainsi que son historique (liste chronologique de toutes ses actions sur le serveur): c'est un simple affichage formatté des fichiers de l'utilisateur récupéré par le backup
  • rechercher des utilisateurs selon des critères (nom, pays, license activée...): il s'agit d'une recherche sur les fichiers locaux récupérés par le backup.
  • et enfin, afficher la liste complète des utilisateurs et permettre de la trier par différents critères (date, nom, ville, pays...): j'ai réalisé cette fonctionnalité alors que nous avions déjà plus de 10000 clients enregistrés. J'ai donc du frapper fort dès le début en implémentant une version itérative du meilleur algorithme de tri existant à ce jour: le tri par tas. Le tri alphanumérique sur plus de 10000 clients ne dure que 2 secondes sur une machine à 400MHz. De plus cette algorithme a une complexité logarithmique: plus il y a d'informations, moins l'algorithme prend de temps supplémentaire. C'est le meilleur type d'algorithme existant. Par exemple, le jour où il y aura 20000 clients, le tri prendra non pas 4 secondes, mais moins de 4 secondes.

Le serveur:
Sur le serveur j'ai eu à réaliser les pendants des diverses fonctionnalités citées ci-dessus, bref le code qui répond au client dans le cadre de l'achat, de la license, du téléchargement de fichiers, de l'enregistrement des scores, du backup incrémental... Dans ce cadre, j'ai également amélioré le format et la gestion des paquets ARSENAL circulant sur le réseau, en effet cette gestion comportait quelques bugs à mon arrivée, des paquets pouvant être mal lus ou oubliés dans certains cas.

Je n'ai donc pas grand chose à redire là-dessus. Le but étant d'avoir un serveur C++ tournant 24h/24, la programmation se devait d'être extrêmement propre. Outre l'absence de bugs, il fallait éviter les fuites de mémoire, cause principale des plantages des serveurs tournant en permanence. Divers tests ont été effectués pour s'assurer de l'absence de telles fuites. Depuis bientôt 1 an et demie, ce serveur tourne en permanence 24h/24 et sans aucun problème ou plantage logiciel (je ne peux rien contre les pannes de courant...). Par souci de fiabilité un 2ème processus serveur "veille" sur la même machine sur un autre port. Cela permet aux clients de continuer d'accéder aux services ARSENAL si jamais le programme serveur principal est indisponible. Ca évite donc que tous les services soient indisponibles le temps de relancer le serveur principal. Ce serait donc utile en cas de plantage du programme serveur principal (même si ca n'arrive pas). Par contre, c'est très utile lors de la recompilation du serveur (mises-à-jour). On recompile, on tue et relance le serveur principal (si un client arrive en même temps, il se connecte de facon totalement transparente au serveur secondaire), et ensuite on tue puis relance le serveur secondaire.


En conclusion, je peux dire que cette expérience difficile m'a beaucoup appris dans les domaines du multimédia et des réseaux, et surtout m'a appris à être totalement autonome, recherchant moi-même les documents ou informations dont j'avais besoin.

A.R.S.E.N.A.L Extended Power 2.9, version démo anglais/francais/allemand (version Locale / CD du site)
(version du 24 octobre 2003, qui comprend donc mon dernier travail sur les mp3. A l'heure où je publie cette page, c'est toujours la dernière version, mais pour voir si il en existe des nouvelles, allez sur: www.tacticalsoft.com)