[RPG-MAKER.FR] Oniromancie: tout l'univers de RPG Maker en français - Tutoriels - [VX Ace] Arbre de compétences

Oniromancie: Tutoriels - [VX Ace] Arbre de compétences


Comment ça marche?

Aëdemphia
Par Sylvanor

Fighting Robots Quest
Par Boulon

Geex
Par roys

Inexistence
Par Falco

La Légende d'Ibabou
Par Zaitan

Nylu
Par NanakyTim

Sarcia
Par Kaëlar

Super Mario RPG - Lost Souls
Par Omegabowser

Tutos: [VX Ace] Arbre de compétences / Jeux: Superstar Hero / News: Le samedi, c'est best of des (...) / Jeux: Tales of Lhaluna / News: Le samedi, c'est best of des (...) /

Chat  (70 connectés)

Bienvenue
visiteur !






Statistiques

Liste des
membres


Contact

Mentions légales

68 connectés actuellement

9981753 visiteurs
depuis l'ouverture

797 visiteurs
aujourd'hui

Groupe Facebook

Barre de séparation

Partenaires






TOP
GAMEMAKING


Les 5 plus
visités

Akademiya RPG Maker

Alex d'Or

Blog of Chaos17

BloGecko

ConsoleFun

Au hasard

RPG Maker VX

RitoJS Blog

Lumen

Les deux derniers

Zarok

Akademiya RPG Maker

Nos autres partenaires

Devenir
partenaire


Barre de séparation

Un site du réseau
War Paradise

Annuaires référenceurs




[VX Ace] Arbre de compétences
Ecrit par Fflo

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.
image
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.
image
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.
image
Le \n 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
image
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.

Portion de code : Tout sélectionner

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.
image
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
image
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.
image

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%

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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%

Portion de code : Tout sélectionner

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

Portion de code : Tout sélectionner

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.

Aucun commentaire n'a été posté pour le moment.

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site:

Activité: Accueil | News | Forum | Flash-news | Chat | Commentaires | Galerie | Blogs | Screen de la semaine | Sorties | Articles perso | Palmarès | Livre d'or | Recherche
Télécharger: Programmes | Scripts | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Index jeux séparés | Top Classiques | Top Originaux | Les autres | Collection Oniro | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Jeux complets | Proposer
Rubriques: Le Wiki | Tutoriels | Guides | Gaming-Live | Tests | Making-of | Interviews | Articles perso | OST | L'Annuaire | Divers
Hébergés: Aëdemphia | Fighting Robots Quest | Geex | Inexistence | La Légende d'Ibabou | Nylu | Sarcia | Super Mario RPG - Lost Souls
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis