Le projet sans nom : serveur de jeu de stratégie
20/12/04: ajout d'un exemple d'un bataille et d'un binaire de tests
- Résumé
- Architecture Client / Serveur ???
- Sur TCP/IP ???
- Qu'est ce qui est fait et que reste t'il à faire ???
- Les bâtiments
- Les créatures
- Les Races
- Les Combats
- Difficultés
- Participation, Débats
- Exemple d'une bataille
Le projet sans nom : serveur de jeu de stratégie
Le but est de créer un jeu de stratégie utilisant une architecture client/serveur sur réseaux TCP/IP. Ce jeu n'est pas un jeu en tant réel tel que WarCraft, ni même un jeu au tour par tour tel que Heroes of Might and Magic. Il s'agit plutôt d'un jeu à mi-chemin entre Héroes3 et Civilisation.
Pour être franc, ce projet date pas mal maintenant. La première fois que j'ai commencé à coder, c'était il y a 5 ou 6 ans. Régulièrement, je l'abandonne puis je le reprends quelques mois (voir plusieurs années) pour le remettre à jour. Les dernières modifications concernent la réimplémentation du serveur sous FreePascal, en utilisant les librairies SDL pour gérer la couche réseau.
Architecture Client / Serveur ???
Le serveur est la machine qui possède toutes les informations sur le monde et les joueurs. En fait le client vient se connecter au serveur et pose des requêtes comme déplacer un héros, produire une ressource, etc... La requête est validée puis éxécutée ensuite le résultat est retourné au client.
Pour limiter la triche, à aucun moment le client ne possède plus d'informations que ce dont il doit avoir connaissance. Il ne calcule rien et reste passif dans l'éxécution du jeu. Si une personne tente de modifier des valeurs envoyées à son client, cela n'a aucun effet du côté serveur.
Sur TCP/IP ???
C'est simplement pour dire que ce jeu peut être utilisé dans un réseau local utilisant la "pile TCP/IP" sous Windows ou encore, si le serveur est ouvert au public, il doit pouvoir fonctionner de manière plus globale sur l'internet.
Qu'est ce qui est fait et que reste t'il à faire ???
Ce jeu est constitué de 2 programmes distincts :
- le serveur
- le client
Ce qui est géré en ce moment :
- différents types de ressources : on peut créer autant de ressources que l'on veut (or, bois ou or, bois, nourriture, mana ou ....)
- différents types de terrains : un terrain est définit par les ressources dont il peut disposer et de la quantité de mouvement qu'il faut pour le traverser
- une carte, définit par une grille de carrés disposant d'un nombre limité de ressources selon son type de terrain (les héxagones sont un peu plus difficiles à gérer mais pourquoi plus tard ?)
- des bâtiments : encore une fois, on n'est pas limité par le nombre de batiments
- des créatures : comme pour les bâtiments
- des héros
- des attributs pour héros, créatures et bâtiments
- un système de races & de classes
Pour l'instant chaque joueur n'a qu'un héros, tout codé en dur parce qu'il n'y a pas encore d'attribution de héros pour un nouveau joueur, etc...
Le joueur peut déplacer son héros sur la carte et découvrir du terrain
Le joueur peut créer un village ainsi que différents bâtiments dépendants en fonction des ressources dont il dispose.
Selon les bâtiments, les ressources du terrain sont exploitées
Le joueur peut "construire" des créatures dans le village
Le joueur peut assigner les créatures à un héros
Les bâtiments
On peut imposer un ordre de construction et surtout un graphe de construction. Par exemple, on peut construire un église que si l'on a construit un marché, un château et un temple. Mais on ne peut construire un marché que si l'on a construit au préalable une scierie, un une carrière de pierre, etc... C'est pas une arborescence simple car il peut y avoir des boucles, donc c'est une graphe ;)
On peut ensuite définir les ressources nécessaires à sa construction et le nombre de tours. On peut ensuite définir les ressources qu'il transforme. Par exemple il peut prendre des ressources du terrain et créditer le compte du joueur de ces ressources. Ou encore il peut prendre des ressources du compte du joueur pour les transformer en un autre ressource (exemple un marchand de bois après la scirie peut convertir le bois en or)
Ce bâtiment peut aussi produire des créatures définient dans un autre fichier.
Enfin ces bâtiments peuvent posséder des attributs. Un attribut peut être n'importe quoi comme par exemple le fait d'être défensif ou offensif, etc...
Par exemple, construire une garnison peut procurer un bonus défensif à toutes les troupes se trouvant dans ce village, construire une tour de guet augmente le champ de vision, etc... On peut aussi imaginer plusieurs type d'attributs
exemple :
exploitation : permet d'agrandir ou diminuer la zone d'exploitation ainsi un village aurait par défaut exploitation à +1 et si l'on construit un château, si celui-ci à exploitation à +1 on aura finalement exploitation à +2 et on pourra exploiter 8 cases au lieu de 1.
+---+---+---+ | | | | x = village ou chateau +---+---+---+ | | X | | +---+---+---+ | | | | +---+---+---+
attaque, defense : permet d'ajouter un bonus offensif ou défensif aux troupes mises en place
population : permet de dire quel est le pourcentage d'augmentation de la population tous les ans (si on définit un système d'an)
vision : permet d'agrandir ou de réduire le champ de vision ou le rayonnement d'une cité
frontiere : permet d'agrandir ou de réduire la frontière (si l'on construit juste des tour de guet sans village, on peut définir une région sous contrôle, enfin concept à creseur peut être)
rgdattaque : permet au bâtiment d'attaquer des créatures volantes et d'utiliser ainsi son bonus offensif plutôt que de l'ajouter.
Tous ces attributs et bien d'autres peuvent exister mais nécessitent à chaque fois un codage spécifique, un peu comme pour un mud.
Les créatures
Le systèmes est plus simple que pour les bâtiments, ils possèdent des attributs et
nécessitent certaines ressources pour être "recrutées". Les attributs peuvent être :
- attaque, défense, point de vie, vitesse pour les caracts de base (vitesse servant à déterminer l'initiative ou l'ordre d'attaque)
- volant, première attaque, empoissonné, etc... pour les autres
Les créatures sont crées par troupes de n et nécessitent un certain nombre de tours.
Par exemple, on créé des halbardiers par paquet de 100 unités en 10 tours.
Les héros
C'est un peu comme les créatures, ils disposent d'attributs dont une quantité de mouvement
Les Races
En fait il s'agit de différencier les joueurs par ce dont ils ont envie d'être. Là encore on peut très bien imaginer 3 races ou 10...
Les bâtiments sont restreints à une certaine race. Par exemple une cathédrale est réservée au humain alors qu'une arène de vorchkax (euh c'est joli nom non ???) est plutôt réservée aux gogors, de la race des gaures.
Néanmoins !!!! Si un gaure arrive à assiéger une cité humaine et s'il ne détruit pas tout !!! Alors il pourra recruter des paladins. Mais là encore on peut coder des choses pour restreindre, etc...
A la base, on peut imaginer un système de race simple :
- les noirs : annihilation
- les blancs : justice
- les verts : nature
- les bleus : magie
- les jaunes : marchand
- les rouges : destruction
Mais on peut aussi laisser libre court à l'imagination et inventer une race de rangers, de troopers, d'insectoïdes, etc...
Les Combats
Alors, à la base on peut mettre en place un système assez complet pour permettre aux joueurs d'imaginer de vraies tactiques. Un système avec trois lignes de créatures pour permettre au moins trois tours d'affrontement. Euh compliqué ? alors prenons un exemple...
Le Chevalier Vérité a choisit les groupements suivants :
1er ligne : 1000 chevaliers, 800 paladins, 3000 halbardiers
2eme ligne : 5000 archers, 150 crusaders
3eme ligne : 200 catapultes
L'arrogant Melkior a choisit :
1er ligne : 20 dragons noirs
2eme ligne : 3000 ogres
3eme ligne : 20000 gobelins
Si l'on a créé les divers attributs pour ces créatures on peut avoir un déroulement comme :
PREMIER TOUR :
- Les dragons attaques la première ligne de Vérité qui ne peut pas riposter ==> sanction 300 chevaliers, 500 paladins, 1000 halbardiers
- la deuxième ligne de Vérité a un attribut qui lui permet de taper la première ligne de Melkior (Ranged Attack & First Line Attack, en anglais c'est plus court ;) ) ==> 5 dragons
- les catapultes tirent sur la troisième ligne de Melkior (Long Ranged Attack) ==> 8000 gobelins
DEUXIEME TOUR :
- la seconde ligne de Melkior attaque mais cette fois-ci la première ligne de vérité riposte ==> 2500 ogres, 100 chevaliers, etc...
- la deuxième ligne de Vérité attaque ==> 6 dragons
- les crusaders n'ont pas d'attributs pour rester en seconde ligne, donc ils montent en première et là carnage, a pu ogres
- les catapultes tirent,
... etc... Bon c'est pas encore codé mais voilà comment on peut voir un système intéressant. Là cela permet vraiment d'imaginer de vraies tactiques !
Difficultés
Outre la difficulté de coder tout cela (tout seul), il faut surtout penser au monde qui va être créé par ce système de races, de bâtiments, etc... Il faut réfléchir à toutes les créatures pour ne pas défavoriser une race par rapport à une autre et en fait la principale difficulté est de "balancer" correctement ce monde !
Participation, Débats
On peut débattre sur tout ! :) On peut prévoir tout autre chose, rien n'est statique, il faut pouvoir disctuer de tout même de ce qui parait pas correct.
Exemple d'une bataille
RETURN LOG Attaquant : anna:57170 Defendant : raum:31385 DEBUT TOUR ARMEE DE anna 3: 2:40 paladin 80 griffon 100 epeiste 150 archer 1:45 griffon 500 halebardier ------------------------------------ ARMEE DE raum 1:35 cavalier 35 cavalier 75 griffon 75 epeiste 2:100 moine 3: moine (raum) --> griffon (anna) dommage: 2812 45 morts Unite morte: griffon (anna) archer (anna) --> griffon (raum) dommage: 1518 60 morts cavalier (raum) --> halebardier (anna) dommage: 2268 226 morts cavalier (raum) --> halebardier (anna) dommage: 2268 227 morts griffon (raum) --> halebardier (anna) dommage: 363 36 morts epeiste (raum) --> halebardier (anna) dommage: 2535 11 morts Unite morte: halebardier (anna) DEBUT TOUR ARMEE DE anna 3: 2:150 archer 1:100 epeiste 40 paladin 80 griffon ------------------------------------ ARMEE DE raum 1:35 cavalier 35 cavalier 15 griffon 75 epeiste 2:100 moine 3: moine (raum) --> paladin (anna) dommage: 1125 5 morts archer (anna) --> epeiste (raum) dommage: 1012 28 morts cavalier (raum) --> griffon (anna) dommage: 1417 56 morts cavalier (raum) --> griffon (anna) dommage: 1417 24 morts Unite morte: griffon (anna) griffon (raum) --> epeiste (anna) dommage: 151 4 morts epeiste (anna) --> cavalier (raum) dommage: 1081 10 morts paladin (anna) --> cavalier (raum) dommage: 1234 12 morts epeiste (raum) --> epeiste (anna) dommage: 661 19 morts DEBUT TOUR ARMEE DE anna 3: 2: 1:77 epeiste 35 paladin 150 archer ------------------------------------ ARMEE DE raum 1:23 cavalier 25 cavalier 15 griffon 47 epeiste 2:100 moine 3: moine (raum) --> archer (anna) dommage: 7500 150 morts Unite morte: archer (anna) cavalier (raum) --> epeiste (anna) dommage: 621 17 morts cavalier (raum) --> epeiste (anna) dommage: 675 20 morts griffon (raum) --> epeiste (anna) dommage: 151 4 morts epeiste (anna) --> griffon (raum) dommage: 760 15 morts Unite morte: griffon (raum) paladin (anna) --> cavalier (raum) dommage: 1234 13 morts epeiste (raum) --> epeiste (anna) dommage: 661 19 morts DEBUT TOUR ARMEE DE anna 3: 2: 1:17 epeiste 35 paladin ------------------------------------ ARMEE DE raum 1:23 cavalier 12 cavalier 47 epeiste 2:100 moine 3: moine (raum) --> paladin (anna) dommage: 1125 6 morts cavalier (raum) --> epeiste (anna) dommage: 621 17 morts Unite morte: epeiste (anna) cavalier (raum) --> paladin (anna) dommage: 194 1 morts paladin (anna) --> cavalier (raum) dommage: 987 10 morts epeiste (raum) --> paladin (anna) dommage: 397 2 morts DEBUT TOUR ARMEE DE anna 3: 2: 1:26 paladin ------------------------------------ ARMEE DE raum 1:13 cavalier 12 cavalier 47 epeiste 2:100 moine 3: moine (raum) --> paladin (anna) dommage: 1125 5 morts paladin (anna) --> epeiste (raum) dommage: 925 27 morts cavalier (raum) --> paladin (anna) dommage: 210 1 morts cavalier (raum) --> paladin (anna) dommage: 194 1 morts epeiste (raum) --> paladin (anna) dommage: 169 1 morts DEBUT TOUR ARMEE DE anna 3: 2: 1:18 paladin ------------------------------------ ARMEE DE raum 1:13 cavalier 12 cavalier 20 epeiste 2:100 moine 3: moine (raum) --> paladin (anna) dommage: 1125 6 morts paladin (anna) --> cavalier (raum) dommage: 423 4 morts cavalier (raum) --> paladin (anna) dommage: 145 1 morts cavalier (raum) --> paladin (anna) dommage: 194 1 morts epeiste (raum) --> paladin (anna) dommage: 169 0 morts DEBUT TOUR ARMEE DE anna 3: 2: 1:10 paladin ------------------------------------ ARMEE DE raum 1:9 cavalier 12 cavalier 20 epeiste 2:100 moine 3: moine (raum) --> paladin (anna) dommage: 1125 6 morts paladin (anna) --> epeiste (raum) dommage: 176 5 morts cavalier (raum) --> paladin (anna) dommage: 145 1 morts cavalier (raum) --> paladin (anna) dommage: 194 1 morts epeiste (raum) --> paladin (anna) dommage: 126 0 morts DEBUT TOUR ARMEE DE anna 3: 2: 1:2 paladin ------------------------------------ ARMEE DE raum 1:9 cavalier 12 cavalier 15 epeiste 2:100 moine 3: moine (raum) --> paladin (anna) dommage: 1125 2 morts Unite morte: paladin (anna) cavalier n'a rien a taper ! cavalier n'a rien a taper ! epeiste n'a rien a taper ! DEBUT TOUR ARMEE DE anna 3: 2: 1: ------------------------------------ ARMEE DE raum 1:9 cavalier 12 cavalier 15 epeiste 2:100 moine 3: Deplacement de meatgrumble : 8,8 -> 7,7