Celà fait longtemps que je veux réaliser un jeu du royaume, c'est à dire un jeu où l'on gère un domaine quelconque (oui, c'est le nom originel de ce genre de jeux). Eh bon, après environ 25 ans, me voilà à l'ouvrage.

samedi 11 février 2012

Multiples terrains de base

Woah, allez...

Je sais bien que ce n'est pas primordial, et que j'avais dit vouloir me limiter, pour commencer, à ce qui est réellement nécessaire au jeu pour terminer, mais avouez qu'un jeu du royaume avec un seul terrain, c'est triste.
Alors voilà :



Les "nouveaux terrains

Comme vous pouvez le constater, il y a sur terre maintenant huit terrains différents. Les arbres de la forêt sont suffisamment espacés pour permettre au terrain d'être bien vu au travers.

Maintenant, le principal problème, c'est qu'avec le code actuel de Ratsodie il n'est pas possible pour un moddeur de mettre plus de terrains de base que prévu directement dans le code, parce que leur nombre est limité par la quantité de "if else" disponible.

J'ai réfléchi au problème, et en ai déduit que placer les terrains dans un tableau permettrait de résoudre le problème : Un tableau se remplit à volonté, et le code n'y prend que ce qui l'intéresse.

Première chose, lister les terrains dont j'ai (moddeur) besoin :

// Liste des terrains de base
var ter_image = new Array();
ter_image[11]="glace";
ter_image[12]="toundra";
ter_image[13]="taiga";
ter_image[14]="lande";
ter_image[15]="oceanique";
ter_image[16]="steppe";
ter_image[17]="desert";
ter_image[18]="tropical";
ter_image[1]="cote";
ter_image[2]="mer";
ter_image[3]="ocean";
ter_image[4]="lac";
ter_image[5]="lave";

Les valeurs entre crochets désignent le numéro d'identification que je veux donner à chaque terrain. Ce sont ces numéros que j'utilise dans le tableau de cartes :

// Carte du monde. Un terrain de base.
   table1 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
   table2 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
   table3 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
   table4 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
   table5 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
   table6 = new Array(11,11,11,12,04,04,04,14,14,15,15,16,16,17,17,18,18);
   table7 = new Array(11,11,11,04,04,13,13,14,14,15,15,16,16,17,17,18,18);
   table8 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
   table9 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
table10 = new Array(11,01,01,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
table11 = new Array(01,01,11,12,12,13,13,14,14,15,15,16,16,05,05,05,18);
table12 = new Array(11,11,11,12,12,13,01,14,14,15,15,16,16,17,05,05,18);
table13 = new Array(11,01,01,01,01,01,01,01,01,01,15,16,16,17,17,18,18);
table14 = new Array(01,01,02,02,02,02,02,02,02,02,01,01,16,17,17,18,18);
table15 = new Array(01,02,02,02,02,03,03,03,03,02,02,02,01,01,01,18,18);

Vous remarquerez que j'ai enlevé les guillemets qui entouraient les valeurs : Il m'est apparu que, puisque ce seront toujours des nombres, ils ne servaient à rien.

Puisque je place les terrains dans un tableau, je peux en faire autant de la variable "mer". En effet, elle était définie jusque là dans la série de "if" définissant également l'image de terrain à afficher.
Comme çà, plus besoin de ces "if" du tout.

Je vous rappelle que, pour le moment, une case ayant plus de 0 n'affiche ni les fleuves, ni les forêts sur cette case, même si leurs tables respectives disent le contraire.

// Liste des terrains étant considérés comme une "mer". 1 est de l'eau classique, 2 de la lave. D'autres valeurs peuvent indiquer des types "aquatiques" différents.
var ter_mer = new Array();
ter_mer[1]=1;
ter_mer[2]=1;
ter_mer[3]=1;
ter_mer[4]=1;
ter_mer[5]=2;

Pendant que j'y étais, j'ai également enlevé les guillemets autour des valeurs de la carte des forêts.  C'est toujours ça de gagné.

// Carte des forêts. 1=Oui, 0=Non. La variable "mer" a priorité sur ce tableau.
foret1 = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
foret2 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret3 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret4 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret5 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret6 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret7 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1);
foret8 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret9 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret10 = new Array(1,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret11 = new Array(0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret12 = new Array(0,0,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0);
foret13 = new Array(0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0);
foret14 = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
foret15 = new Array(0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0);
Voilà pour la partie "mod" du script.

Ensuite, pour la partie "code", ce sera plus simple.

D'abord,

        var mer=0;

disparait. Je n'en ai plus besoin, après tout.

Ensuite, les lignes

  if (table[i][j]=="18") { ncase = "nom_de_mon_terrain.svg"; }

disparaissent également, puisque le jeu sait déjà à quelle image correspond une valeur de case donnée.
Elles sont remplacées par la ligne suivante :

ncase = "terrain_"+ter_image[table[i][j]]+"_1.svg";    

Cette ligne reconstruit le nom du fichier d'image voulu et le place dans la variable "ncase".

Enfin, le "if" d'affichage des fleuves prend en compte maintenant "ter_mer" et non plus "mer", évidemment. Même chose pour la forêt :

        if (fleuve.indexOf(fleuve_element) != -1 && !ter_mer[table[i][j]])
        if (foret[i][j]==1 && !ter_mer[table[i][j]])


Le résultat :

- Je peux maintenant faire une carte avec autant de terrains de base que je le veux.
- Le jeu me semble plus rapide, probablement gràce à la suppression de tous ces "if else".


Ah oui : Pour que celà marche, il faut suivre une nomenclature précise pour les images. Exemple :

terrain_nomdemonterrain_1.svg

Pour un désert, on mettra "terrain_desert_1.svg"

"Terrain" pour signifier que c'est un terrain (de base). Pour le moment, il n'a pas d'autre intérêt que de mieux répérer les images de terrain dans le répertoire.

La valeur à la fin sera utilisée pour autoriser les graphismes multiples pour un terrain (je verrais ça plus tard).

Pour le "svg", je verrais également plus tard si l'extension de l'image doit être indiquée dans le mod ou directement cherchée par le script. Je ne sais pas encore.








Aucun commentaire:

Enregistrer un commentaire