Home (autres pages) Léa Linux TrustOn Me OpenVPN French Linux Doc Project Livre d'OR

Le projet sans nom : serveur de jeu de stratégie

Dernière mise à jour : 20/12/04
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
. tant que Vérité possèdé une première ligne, les ranged attacks restent en seconde ligne

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
Me contacter | ©2004 Raum
Livre d'OR