❤ 0 Ce tuto est supposé fonctionner sur VX Ace. Cependant, il est possible que ça ne s'applique pas sur XP, VX et MV (car je modifie des scripts RGSS3). Je pense néanmoins que ça puisse fonctionner quand même, à condition de convertir ça en RGSS1/2.
Définition du concept
L’arbre de compétences est un élément de gameplay qu’on retrouve sur de nombreux jeux, qu’ils soient des RPG ou pas. Cet arbre fonctionne comme une toile d’araignée: vous vous déplacez de fil en fil, tout en dépensant des points/de l’argent/etc. pour booster votre joueur.
Arbre de compétences de Super Smash Bros Ultimate (2018). Tous les renforcements s’appliqueront à votre combattant, quel qu’il soit. (Image prise de https://www.ssbwiki.com)
Créer la map de l'arbre de compétences
Il existe un moyen de reproduire un arbre de compétences.
Cet arbre se fera sur une nouvelle map de votre projet. Vous êtes assez libres sur la présentation de celle-ci, tant que les fils de votre toile soient un chemin praticable.
Voici l’ébauche de l’arbre de compétences que j’utilise pour Sorcelleria. Le personnage arrive et repart via le centre de la map (de dimensions 25x25). Au fil du chemin, des hexagrammes (cherchez dans vos charsets) proposeront des améliorations.
Créer l'événement qui nous emmènera sur cette map
L’étape la moins complexe. Un PNJ se présente face à vous et vous propose de vous emmener sur l’arbre de compétences.
Le \n<Voyante> est une possibilité offerte par un script de Yanfly permettant de rajouter une petite fenêtre de nom au-dessus de votre message. Si vous n’avez pas ce script, enlevez ça.
Un choix est proposé: dépenser les PB (Points Boost) ou ne rien faire. Si vous avez décidé de dépenser les PB, vos informations de localisation (map, position X et position Y) seront retenues sous les variables 3 à 5. Ces variables serviront à retourner sur la map principale, au même endroit qu’avant. J’ai désactivé l’accès au menu et les sauvegardes car selon moi l’accès à l’arbre est un menu secondaire.
Créer l'événement de retour
Sur mon arbre, l’événement de retour n’a pas d’apparence mais il est posé sur un tile différent des autres pour pouvoir le mettre en évidence. Le déclenchement "Contact avec l’événement" et l’affichage "Au-dessous du héros" sont essentiels. L’événement s’activera dès lors que vous marcherez dessus.
Cette fois-ci, prêtez attention à l’action de la téléportation: j’ai exploité les variables 3 à 5 qui retenaient la position du joueur. Si j’ai fait ça, c’est que je compte proposer à plusieurs reprises la possibilité de partir vers l’arbre: les coordonnées ne sont donc pas fixes. Réactivez l’accès au menu et les sauvegardes s’ils ont été désactivés précédemment.
Créer le script affichant les PB
Attention, nous arrivons dans la partie la plus compliquée du tuto, car nous allons mettre nos mains dans le Ruby.
J’ai précédemment parlé de PB, mais aucune information ne permet actuellement de déterminer le nombre de PB possédés.
En fait, nous prévoyons d’imiter le script Window_Gold qui affiche une petite fenêtre en haut à gauche de l’écran avec l’argent que vous possédez (testez une auberge pour constater).
Le script reste néanmoins presque le même. Copiez et collez sous Materials et nommez-le Window_Boost.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
| #==============================================================================
# ** Window_Boost
#------------------------------------------------------------------------------
# This window displays the party's PB.
#==============================================================================
class Window_Boost < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 0, window_width, fitting_height(1))
refresh
end
#--------------------------------------------------------------------------
# * Get Window Width
#--------------------------------------------------------------------------
def window_width
return 160
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
contents.clear
draw_boost_value(value, "PB", 4, 0, contents.width - 8)
end
#--
# Draw value
#--
def draw_boost_value(value, unit, x, y, width)
cx = text_size(unit).width
change_color(normal_color)
draw_text(x, y, width - cx - 2, line_height, value, 2)
change_color(system_color)
draw_text(x, y, width, line_height, unit, 2)
end
#--------------------------------------------------------------------------
# * Get Party PB
#--------------------------------------------------------------------------
def value
$game_variables[2]
end
#--------------------------------------------------------------------------
# * Open Window
#--------------------------------------------------------------------------
def open
refresh
super
end
end |
Les modifications sont :
- Mettez bien class Window_Boost > Window_Base ; sinon vous ne pourrez pas initialiser la fenêtre (c’est-à-dire préparer son affichage)
- À la méthode refresh, j’appelle une nouvelle méthode draw_boost_value avec comme arguments value, "PB", 4, 0, contents.width – 8
Remarque: c’est presque la même chose que pour Window_Gold, seul le deuxième argument change. Au lieu d’afficher le nom de la monnaie de votre projet, j’affiche une chaîne de caractères fixe
- La méthode draw_boost_value qui est une reproduction identique de la méthode draw_currency_value: seul le nom est différent !
- La méthode value récupère le nombre de PB actuels. J’ai recouru à la variable 2 pour stocker cette information. Libre à vous de remplacer ce nombre par un autre, si cette variable 2 a déjà été utilisée.
Accéder et modifier indirectement la base de données
Je vais vous faire une révélation importante : les valeurs que vous avez définies en base de données ne sont pas forcément figées ! Il existe une façon de modifier indirectement ces valeurs avec quelques lignes de RGSS.
Pourquoi je vous parle de ça ? Les améliorations qui peuvent par exemple être appliquées avec un peu de RGSS sont:
- Augmenter l’esquive de votre équipe
- Augmenter l’argent laissé par les ennemis
- Affaiblir les boss (moins d’attaque ou de défense)
- Diminuer les prix
Dans le script DataManager, vous pouvez voir $data__[]. C’est sous cette variable que vous pouvez accéder à toutes les informations stockées en base de données.
Faites un test: sur un événement, appelez un script et mettez msgbox_p($data_classes[1]). Une fois l’événement interagi, une petite fenêtre devrait s’afficher avec toutes les informations concernant la classe 1.
Quel charabia ! Comment extraire les informations utiles de ça ? En fait, si vous comparez avec votre classe en base de données, vous verrez assez vite les correspondances. Le "Sorcière" est le nom de votre classe. La partie learnings représente toutes les compétences apprises par la classe. La classe a une précision de 95%, une esquive de 5%, un critique de 4% ; ces valeurs sont représentées sous forme de nombre décimal (0.95 = 95%).
Ensuite, essayez d’accéder aux params (= statistiques, tout en bas de la pop-up) de votre classe. En Ruby (et comme plein d’autres langages), on accède à une sous-propriété via un point. Même si c’est un tableau, vous pouvez tout de même y accéder.
Remplacez $data_classes par $data_skills, $data_items, $data_weapons, $data_armors, ou $data_monsters (il n’est pas vraiment pertinent d’accéder aux onglets suivants). D’autres informations seront affichées.
Événement proposant l'amélioration
Voici la page 1 de l’événement type. Au tout début, mettez dans un script @boost_window = Window_Boost.new. C’est ce qui affichera votre fenêtre. Affichez ensuite un choix. Si vous décidez de dépenser le nombre de PB demandé, vérifiez via une condition si vous en avez assez. Si ce n’est pas le cas, dites que le joueur n’a pas assez de PB et faites-lui rebrousser chemin. Si c’est le cas, retirez le nombre de PB (comme cette amélioration coûte 1 PB, j’ai enlevé 1 PB à la variable 2) et mettez un script permettant d’appliquer votre amélioration (exemple : augmenter l’esquive de 1%).
Ce script est très complexe, mais je vous expliquerai après le principe (et je vous donnerai le code sans les msgbox_p et les lignes commentées qui traînent).
Après l’application de votre amélioration, activez l’interrupteur local A pour ne plus proposer de l’appliquer.
Fin de l’événement: si le choix est annulé (touche Echap), faites la même chose que si le joueur n’avait pas assez d’argent.
Important: les @boost_window.dispose présents au début de chaque choix sont essentiels car ils permettent de faire disparaître la fenêtre de l’écran.
La page 2 s’applique dès que l’interrupteur local A est activé. Un événement classique : aucune apparence, aucune commande exécutée.
Exemples d'améliorations programmables
Voici 3 exemples d’améliorations déjà programmées et fonctionnelles:
Augmenter l'esquive de 1%
1
2
3
4
5
6
7
8
9
10
11
12
13
| i = 0
for char in $data_classes
if (i == 0)
i += 1
next
end
classParam = char.features
for param in classParam
if param.data_id == 1 and param.code == 22
param.value = (param.value + 0.01).round(2)
end
end
end |
Une subtilité est présente: contrairement à javascript, PHP et autres, un tableau ne commence pas à l’index 0 mais à l’index 1. Si vous tentez de faire msgbox_p(char[0].class) juste en-dessous de la boucle for, vous constaterez la valeur NilClass, donc une erreur sur la prochaine instruction. La condition permet de "sauter" la valeur 0.
La condition if param.data_id == 1 and param.code == 22 permet d’accéder clairement à la valeur de l’esquive. Si vous omettez la première partie de cette condition, vous aurez plusieurs correspondances. (La précision, l’esquive et le critique ont tous les 3 un param.code de 22, le param.data_id différenciera ces paramètres)
Ensuite, vous modifierez cette valeur via un calcul. Le round(2) permet d’éviter des approximations d’arrondis en arrondissant à deux chiffres après la virgule (essayez de faire 0.05 + 0.01, vous n’obtiendrez pas 0.06 mais 0.06000000005 de mémoire).
La boucle for char in $data_classes vous permettra de parcourir l’ensemble des classes de votre base de données, en prenant la valeur char à chaque passage.
Augmenter l'argent des monstres de 3%
1
2
3
4
5
6
7
8
| i = 0
for enemy in $data_enemies
if (i == 0)
i += 1
next
end
enemy.gold = (enemy.gold * 1.03).round()
end |
C’est un peu la même chose. Cette fois-ci, nous parcourons la partie des monstres et altérons leur propriété gold. Le round() arrondit à l’entier le plus proche.
Réduire la force des boss de 10 points
1
2
3
4
5
6
7
8
| bossId = [6, 12]
for id in bossId
if ($data_enemies[id].params[2] > 10)
$data_enemies[id].params[2] = $data_enemies[id].params[2] - 10
else
$data_enemies[id].params[2] = 1
end
end |
Comme cette amélioration ne s’applique pas sur tous les monstres, une boucle sur l’ensemble des éléments serait inutile.
La variable bossId contient les numéros des boss.
La condition permet d’éviter d’avoir une attaque négative (9 – 10 = -1).
La propriété .params[2] permet d’accéder à l’attaque du monstre. Si vous voulez modifier plutôt la défense, remplacez juste le 2 par un 3.
Conclusion
Si vous désirez créer de nouvelles améliorations, ne sous-estimez pas le msgbox_p ! Si vous voulez vous assurer du bon fonctionnement de votre amélioration, ajoutez-en un avant votre calcul, puis après. Si les valeurs sont différentes, c'est que ça a peut-être marché. Enlevez-les une fois que le résultat est satisfaisant.
|