jeudi 23 septembre 2010

14 - Level Up après ouverture d'un coffre

Comme je l'ai dit dans mon billet précédent, le score du Héros augmente de 1 chaque fois qu'il s'empare du trésor situé à l'extrême gauche de l'étage.
Si le score du Héros dépasse un certain seuil, son niveau augmente et il apprend un nouveau sort :

mardi 21 septembre 2010

13 - Sauvegarde Automatique - Changement d'Étage

Souvenez-vous : Il y a quelques semaines, lorsque je me suis lancé dans la programmation de ce jeu, ma première action a consisté à mettre au point les fichiers de sauvegarde.
Maintenant que les stats et l'inventaire du Héros peuvent être modifiés grâce aux trésors, il est temps que je mette à profit l'existence de ces fichiers afin de garder une trace de toutes ces modifications.
J'ai donc créé une fonction "autoSave" qui est appelée à chaque fois que le Héros ramasse un trésor et qui garde en mémoire la majorité des variables du jeu (stats, inventaire, High Score... ).

Je me suis ensuite occupé du changement d'étage : Quand le Héros s'empare du contenu du coffre situé à l'extrême gauche de l'étage, son score augmente de 1 et il est téléporté à l'entrée de l'étage suivant ; si son nouveau score est supérieur au High Score, je met ce dernier à jour et effectue une sauvegarde automatique.

lundi 20 septembre 2010

12 - Fenêtres de Textes - Modification de l'Inventaire - Choix

Une fois que le contenu du trésor a été tiré au sort, il faut transmettre cette information au joueur ; pour ce faire, j'utilise une fenêtre de texte au design une fois de plus rétro (texte blanc sur fond noir, cadre blanc pixelisé). À l'intérieur du Clip "fenêtre de texte" se trouve un objet "Texte dynamique", c'est à dire un texte que je peux modifier en fonction du message que je souhaite afficher.

Au moment d'effectuer mes recherches graphiques, j'ai opté pour une typo pixelisée appelée "Small Fonts" ; le problème c'est que cette typo est au format .fon, alors que SWISH Max utilise le format .ttf : J'ai donc dû chercher une typo TrueType qui, une fois l'option "police pixelisée" activée, ressemblerait suffisamment à "Small Fonts". Et fort heureusement parmi toutes les polices installées sur mon ordi il y en a une qui répond à ce critère : "Franklin Gothic Medium". La seule différence notable est la présence d'une barre sous le 1.

J'ai donc utilisé cette typo pour l'affichage des stats. Et je comptais bien l'utiliser aussi pour afficher les divers messages du jeu, sauf que...


Il est possible d'intégrer des balises HTML au sein d'un objet "texte dynamique" en activant l'option adéquate. Cela permet de modifier l'apparence de certains éléments du texte (mots en gras, en italique, soulignés, changement de taille ou de couleur), et de mettre ainsi certains mots en avant.
Il se trouve que j'ai justement envie que, lorsque le joueur reçoit le message "Vous avez trouvé une Épée +50 ATT, voulez-vous l'équiper ?", l'expression "Épée +50 ATT" ne soit pas écrite en blanc mais en bleu.

Le changement de couleur se fait à l'aide de la balise <font color ="#B0BCF9"></font>, sauf que je ne peux pas utiliser de guillemets tels quels car ils servent à marquer le début et la fin d'une chaîne de caractères ; je suis donc obligé d'utiliser le code ASCII du caractère guillemet à la place : chr(34).

message = "Le début est en blanc <font color=" add chr(34) add "#B0BCF9" add chr(34) add ">puis en bleu</font> et de nouveau en blanc !";
monTexteDynamique.text = message;

edit : suite à une remarque judicieuse de Fitz (voir les commentaires), j'ai découvert une autre façon d'intégrer des guillemets à ma chaîne sans pour autant passer par le code ASCII : Il me suffit juste de marquer le début et la fin de la chaîne avec des apostrophes et non des guillemets !
Le code ci-dessus aurait en fait pu être remplacé par :
message = 'Le début est en blanc <font color="#B0BCF9">puis en bleu</font> et de nouveau en blanc !';
monTexteDynamique.text = message;


Pour me simplifier la vie, je me suis créé une variable "bleu" et une variable "blanc" qui me permettent de changer de couleur facilement ; la variable "bleu" correspond en fait à la balise d'ouverture <font color ="#B0BCF9"> tandis que la variable "blanc" correspond à la balise de fermeture </font> :

bleu = "<font color=" add chr(34) add "#B0BCF9" add chr(34) add ">";
blanc = "</font>";
message = "Le début est en blanc " add bleu add "puis en bleu" add blanc add " et de nouveau en blanc !";
monTexteDynamique.text = message;

Le problème, c'est que l'activation des balises HTML a pour conséquence la désactivation de l'option "typo pixelisée" : Mon texte est certes multicolore, mais devient par la même occasion tout lisse !

J'ai donc dû me mettre en quête d'une typo qui soit pixelisée d'origine afin de pouvoir utiliser les balises HTML sans risque de lissage. Et mon choix s'est porté sur Apple ][ (une typo gratuite créée par Ivan Rood), même si l'espacement entre les caractères est plus important ; j'apprécie le fait que chaque caractère occupe un espace de taille identique, ça fait encore plus "vieux jeu 8-bits".

J'ai donc ma fenêtre de texte et ma typo, il me suffit juste d'afficher tout ça au moment adéquat et de modifier mon texte dynamique en fonction du message que je souhaite afficher ; cela donne à peu près ceci :

Une simple pression sur "Entrée" ferme la fenêtre de texte et permet au jeu de reprendre son cours.

Évidemment ce n'est pas tout de dire qu'une Potion+30 a été trouvée : Il faut aussi que l'inventaire soit modifié en conséquence, et que l'affichage soit actualisé pour témoigner de cette modification (ce qui est le cas sur le screen ci-dessus).


Pour les objets que le Héros peut équiper, les choses sont légèrement différentes : Le joueur a le choix entre équiper l'objet trouvé et jeter l'ancien, ou garder l'ancien et jeter le nouveau.
Ce choix s'effectue via un curseur qui se déplace lorsqu'on appuie sur les touches "Gauche" ou "Droite" et qui sélectionne deux cadres ("Yes" et "No") ; par défaut le curseur pointe sur la réponse qui privilégie le bonus de stat le plus important : Si le Héros ramasse une Épée +10 alors qu'il a une Épée +30, c'est la réponse "No" qui sera sélectionnée dès le départ.

Dans l'exemple de la capture d'écran ci-dessus, si le joueur appuie sur "Entrée", la stat "Attaque" (représentée par l'icone Épée) passera de 8 à 9 et l'Épée +8 sera jetée : Le coût en pièces d'or de cette Épée jetée sera ajoutée au "Junk" (l'icone Poubelle en haut à droite du cadre ITEMS) ; le Héros pourra par la suite convertir son Junk en pièces d'or s'il rencontre un marchand qui lui rachète ses objets inutiles.

samedi 18 septembre 2010

11 - Contenu des Trésors

Le contenu des trésors est différent selon qu'il s'agit d'une bourse ou d'un coffre :
  • Bourse : 50% de chances d'obtenir un équipement de puissance faible, 20% de chances de trouver une petite somme d'argent, 30% de chances de trouver un objet de soin (viande ou potion) ;
  • Coffre en bois : 75% de chances d'obtenir un équipement de puissance moyenne, 25% de chances de trouver une grosse somme d'argent ;
  • Coffre en métal rouge et or : 100% de chances d'obtenir un équipement de puissance supérieure.
À partir de ces pourcentages j'ai créé plusieurs variables de type "tableau": À chaque fois que le Héros entre en contact avec un trésor, on tire au sort une case du tableau correspondant afin de déterminer le contenu du trésor.

Exemple : La variable _global.contenuBourse est un tableau à 100 cases : 50 cases ont pour contenu la chaîne de caractères "Equipment", 20 cases ont pour contenu "Gold" et les 30 dernières ont pour contenu "Item". Si le Héros ramasse une bourse, je tire un nombre entre 1 et 100 * et je regarde le contenu de la case portant ce numéro.
( * : En réalité la première case d'une variable de type Array (tableau) a pour indice 0 ; en toute rigueur ce n'est donc pas un nombre entre 1 et 100 qui est tiré, mais un nombre entre 0 et 99. )

Si le trésor est de type "Equipment", il faut effectuer un nouveau tirage au sort afin de déterminer la nature de l'équipement (Épée, Armure, Bottes... ).
Le taux d'obtention de chaque type d'équipement est lié à l'élément de départ du Héros ; ainsi le Fire Knight (Chevalier de Feu) aura 24% de chances de trouver une Épée, 16% de chances de trouver un Anneau, 10% de trouver un Bouclier, etc.
Ces pourcentages sont eux aussi mis sous forme de tableau à 100 cases.

Une fois la nature du trésor déterminée, un dernier tirage au sort permet d'en déterminer la puissance ; ce tirage au sort s'effectue entre 2 valeurs, liées à l'étage où se trouve le Héros : Une Épée trouvée à l'étage -18 donnera entre +12 et +22 Attaque, tandis qu'une Épée trouvée à l'étage -180910 donnera entre +63 et +79 Attaque.

vendredi 17 septembre 2010

10 - Génération des Trésors

Au moment de la génération du Donjon, un trésor peut être créé dans chacune des salles qui composent l'étage.
Il y a forcément un coffre dans la salle la plus à gauche de l'étage (probabilité de 100%) ; en revanche dans la salle suivante la probabilité d'apparition d'un trésor est nulle.
Pour les autres salles, la probabilité d'apparition d'un trésor est liée à la position de la salle : Plus on s'approche du bord droit de l'écran, plus cette probabilité est faible (50% au mieux, 25% au minimum).
En fonction de ces diverses probabilités, je détermine pour chacune des salles si oui ou non un trésor va être généré. Si c'est le cas, je fais la liste des positions potentielles en fonction du type de salle (exactement comme je l'ai fait pour les monstres, en pensant à exclure la position du Héros de la liste) et j'en tire une au sort.

L'apparence du trésor est liée à sa position : Le trésor situé à l'extrême gauche est représenté par un coffre en bois, les trésors des autres salles sont représentés par des bourses ; l'apparence du trésor détermine la qualité des objets que l'on peut trouver dedans (les objets trouvés dans des coffres en bois sont plus puissants que ceux trouvés dans des bourses). Il parait même qu'il existe des coffres en métal rouges renfermant des objets prodigieux...

De plus, à chaque fois qu'un étage est généré, il y a une chance sur 3 pour qu'une des bourses de l'étage soit remplacée par un marchand.

Dans le cercle rouge : Le coffre en bois situé à l'extrême gauche de l'étage.
Dans les cercles verts : Des bourses.
Dans le cercle jaune : Un marchand (qui a remplacé une des bourses après tirage au sort).

Normalement je m'occuperai du contenu des trésors demain ; en attendant, j'ai ajouté un mode "pause" à mon jeu : Une simple pression sur la touche "Entrée" interrompt le mouvement des personnages (Héros et monstres), et une seconde pression permet au jeu de reprendre son cours.