❤ 2Nemau prettyheartbreak Custom Menu System - Trucs et Astuces (Maniacs)
Niveau : Avancé.
Il faut connaître l'utilisation des variables et des interrupteurs, et avoir des notions pour faire un cms.
Il faut bien connaître l'affichage des images sur rm2003.
Il faut savoir ou avoir installé le patch correspondant.
Prérequis :
Ce tutoriel n'est valable que pour la version Steam de RPG Maker 2003.
Ce tutoriel est prévu pour le patch Maniacs, cependant, certaines astuces sont utilisables sans, et d'autres sont adaptables.
Vous pouvez trouver plus d'informations sur le patch ici.
Veillez à avoir activé le menu de variables avancées dans Option -> Use new 'Control Variables' pour plus de facilité dans les calculs.
Installer l'add on TPC est un VERITABLE plus. Le TPC est un addon du patch Maniacs qui permet d'éditer les commandes événementielles sous forme de texte. Certaines commandes du patch Maniacs ne sont disponibles que depuis cette fenêtre, accessible par F2 ou F3. Sans lui pas de String Variable, pas de possibilité de remplacer certaines conditions "constantes" par des variables. Par exemple, avec TPC on peut faire en sorte que la condition "Le héros XXX est dans l'équipe" soit gérée par une variable. C'est-à-dire que le XXX prend la valeur d'une variable.
Je parle parfois d'index dans les astuces. Ce sont les numéros d'identification de chaque élément.
Par exemple, l'index d'un héros, c'est son numéro à côté de son nom dans la BDD. Pour les Variables / Switchs. Attention, RM2003 a deux départs différents : 1 (pour tout ce qui est issu de la BDD, comme Héros, Objets, Sorts, etc) et 0 (pour le reste, comme les membres de l'équipe).
Introduction
Cet article contient un certain nombre de trucs et astuces pour faire un CMS avec le patch Maniacs.
Comme dit dans le prérequis, le patch n'est pas obligatoire, les astuces sont presque toutes faisables sans, cependant, le patch vous simplifiera énormément la vie.
Voilà la liste des astuces :
- Utilisation de String Picture et String Variable
- Déclenchement du menu : pourquoi utiliser le Processus Parallèle ET le Démarrage Automatique ?
- Lecture d'un fichier .txt pour récupérer les informations complémentaires des Objets / Compétences (Effets / Coûts /...)
- Astuces pour les Equipements
- Affichage des listes (Objets / Compétences) en respectant l'ordre original
- Menu d'Option
- Comment gérer les Sous Menu ?
- Programme d'extraction des données de la BDD
- Autres infos sans détails
Aucune démo n'est présente pour avoir un aperçu de comment faire.
Cependant, toute ces astuces ont été utilisées dans ma version de Croix Célestes DX, donc n'hésitez pas à DL la démo pour voir comment ça marche, et à poser vos question ici ou en MP.
String Picture / String Variable
Voilà l'un des points les plus importants du patch Maniacs concernant la création de CMS : la possibilité d'écrire à la volée des Strings (du texte) avec des Pictures.
Cette commande se trouve à la page 4 des events :
Concernant les String Variables, comme dit précédemment, TPC est obligatoire pour l'instant.
Comment ça marche ?
C'est très simple, il suffit de faire F3 dans un event pour ouvrir TPC.
Si j'appuie sur F3 ici, je vais ouvrir TPC pour créer une nouvelle commande au-dessus de celle sélectionnée.
Si je fais F2, je vais éditer la commande sélectionnée.
Maintenant que TPC est ouvert, c'est quoi les commandes pour les String Variables ?
C'est assez simple pour ceux qui ont déjà fait de la programmation :
T[X], c'est la variable qui va être utilisée. C'est exactement le même principe que les Switchs ou les Variables (normales) de RM, il suffit de remplacer X par l'index de la String Variable voulue.
.COM, c'est la commande à faire. La liste est plutôt longue, elle est disponible en Japonais sur le site du patch. (Je montre comment la trouver un peu plus bas.)
Pour commencer simplement, la commande d'affectation (Le = dans pour les Switch / Variables) est .asg.
ARG, c'est la liste des arguments de la commande. Là, c'est du cas par cas, ça peut être une constantes (Valeur entre double quote : "Ma Valeur"), d'autres String Variables (T[X]), des Variables normales (V[X]), ...
Par exemple, pour affecter la valeur "Aze" à la variable 1, il suffit de faire :
Si je veux récupérer le nom du héros 1 de la BDD :
1
| T[1] .asg .actor[1].name |
Petite info, vous pouvez mettre un V[X] pour remplacer un Entier. Par exemple :
1
| T[V[1]] .asg .actor[V[2]].name |
Va enregistrer dans la String Variable dont l'index est égale à la valeur de la variable 1, la valeur du nom du héros dont l'index dans la BDD est la valeur de la variable 2.
Pour s'en servir, rien de plus il suffit de faire\T[X], ça marche dans les messages, mais aussi les Show String Pictures !
Si vous mettez le \T[X] sans passer par TPC, il ne prendra JAMAIS en compte les "commandes" spéciales des Strings. ( Les Exfonts par exemples : $A / $B / ... )
Pour ça, il suffit de faire F2 sur la commande Show String Picture :
A gauche, on voit les ". Les commandes spé ne marcheront pas. Il faut donc les enlever, comme à droite
Voilà où trouver toutes les commandes :
Spoiler (cliquez pour afficher)
Déclenchement du menu, pourquoi utiliser le Processus Parrellel ET le Démarrage Automatique ?
Pourquoi donc utiliser un PP (Processus Parallèle), ET un DA (Démarrage Automatique) ?
Et bien c'est assez simple, vous ne pouvez pas avoir plusieurs events automatiques lus en même temps. Pareil, un event en DA ne peut pas se déclencher si un autre event est déjà déclenché, tant que son déclencheur n'est pas en PP. En revanche, un (ou plusieurs) événement en PP peut tourner avec un événement en DA.
C'est donc très pratique pour empêcher l'ouverture du menu pendant une cinématique, un dialogue avec un PNJ, l'ouverture d'un coffre,...
Et donc, comment faire ?
Voici un exemple :
Event en PP
Event en DA
Personnellement, j'utilise une boucle dans mon event en DA pour pouvoir gérer l'ouverture et la fermeture dans le même event. C'est pas obligatoire, mais je trouve ça plus pratique.
Lecture d'un fichier .txt
A quoi ça peut bien servir de lire un fichier .txt ?
C'est très simple, il y a deux raisons :
1) On ne peut pas encore lire toutes les infos de la BDD (Coût en PM d'une compétence, Effet d'un objet,...)
2) Pour des utilisations bien plus complexes, comme un journal de quête automatisé.
Dans ces astuces, je ne m'occuperai que de la partie 1. Cependant, dans ma version DX de Croix Célestes je me sers de cette technique pour un système de forge.
De plus, cette partie utilise encore TPC, et donc le patch est quasi obligatoire. Cependant, si vous ne voulez pas utiliser le patch, vous pouvez toujours hardcoder toute les infos sans passer par des fichiers .txt. C'est juste un enfer à faire, mais ça marche.
Du coup, comment faire ?
Encore une fois, on va se servir de TPC.
1
| T[1] .asg .file "Items", .utf8 |
Ici, on va donc enregistrer tout le contenu du fichier Items.txt dans la String Variable T[1].
Ce fichier .txt doit se trouve dans un dossier "Text" à la racine du projet (à côté de Charsets/Chipsets/...)
Maintenant, c'est à vous de voir comment vous voulez faire la suite.
Soit vous pouvez créer un fichier par entrée (donc chaque objet a son propre fichier .txt), soit comme moi avoir tous les objets dans un seul fichier Items.txt.
Pour cet exemple, je vais vouloir récupérer le coût en MP d'une compétence.
Mon fichier s'appelle "skills_cost.txt", et chaque ligne contient juste le coût en MP du sort. (Première ligne le coût du sort d'index 1, deuxième ligne le coût du sort d'index 2, ... )
La commande pour lire un fichier .txt est la suivante :
Cet event commun est une "fonction". En gros, quand j'ai besoin de récupérer le coût en PM d'un sort, j'initialise ma variable 259, et j'appelle cet event. Et après l'appel de cet event, la variable 263 contiendra le coût en PM.
Voilà un petit exemple de comment faire un appel de cette fonction.
Astuces pour les Equipements
Dans cette astuce, on va voir deux choses :
1) Comment récupérer la prévisualisation des stats avant un changement d'équipement.
2) Comment vérifier si un objet est équipable.
1) C'est assez simple, il suffit d'enregistrer dans des variables le contenu des équipements actuels, de changer l'équipement pour celui dont on veut avoir la prévisualisation, stocker les nouvelles stats dans d'autres variables, puis enfin rééquiper les bons équipements.
De la même manière que pour le coût en PM, cet event est aussi une fonction.
Il utilise la variable 262 comme étant l'ID du héros dont on veut avoir les stats, et la variable 313 est l'index du nouvel équipement à essayer.
2) Et bien, maintenant qu'on a vu comment prévisualiser les stats sur un nouvel équipement, c'est assez simple, puisque c'est le même principe !
Et ensuite, il faut bien penser à rééquiper les objets originaux :
Vous l'aurez compris, c'est le même principe que pour la prévisualisation.
Et encore une fois, c'est une fonction, la variable 262 est encore l'index du héros à équiper, la variable 291 est l'index de l'objet à tester, et l'interrupteur 333 permet de savoir si oui ou non l'objet est équipable.
Affichage des listes (Objets / Compétences) en respectant l'ordre original
Ça peut paraitre compliqué de respecter l'ordre d'affichage de base des objets dans le menu, mais en vrai, c'est assez simple.
Voilà le code pour que vous voyiez un peu mieux les différentes utilisations de TPC :
Spoiler (cliquez pour afficher)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
| @> Comment: On commence par initialiser nos String Variable 1 et 6.
: : La String Variable 1 contiendra la liste de TOUS les objets possédés par le joueur.
: : La String Variable 6 contiendra la liste du nombre d'objets possédés par le joueur.
: : Et les String Variables 2/3/7/5/8 sont des variables temporaires.
: :
: : On commence donc par faire une boucle de 400 tours.
: : Ici, j'ai pris 400 car c'est le nombre d'objets qu'il y a dans ma BDD, à vous
: : d'adapter selon votre BDD.
@> Control String Variables: T[0001], Assign,
@> Control String Variables: T[0006], Assign,
@> Loop: 400 Times -> V[0162:Loop]
@> Comment: La variable 162 est l'index du tour de boucle.
: : Comme il commence à 0, et que l'index des objets commence à 1,
: : on lui ajoute 1.
@> Control Variables: V[0162:Loop] += 1
@> Comment: Dans la variable 257, on stock le nombre d'objet d'index V[162] que le joueur
: : a dans son inventaire.
@> Control Variables: V[0257:ItemsTmp] = Item[V[0162:Loop]] in Inventory
@> Conditional Branch: V[0257:ItemsTmp] > 0
@> Comment: Ici, on associe la String Variable 2 au nombre d'objets courants possédés par le joueur.
@> Control String Variables: T[0002], Assign, V[0257:ItemsTmp]
@> Comment: Puis on "ajoute" T[2] à notre String Variable T[6]
: : Le code exact est :
: : t[6] .asg .cat t[6], t[2], "
: : "
: : .cat permet la concaténation entre t[6], t[2], et le retour à la ligne.
: :
: : (Le retour à la ligne est là pour faire n'avoir qu'un seul élément par ligne)
@> Control String Variables: T[0006], Assign, T[0006] + T[0002] +
@> Comment: Idem, mais pour le nom de l'objet.
@> Control String Variables: T[0002], Assign, Item[V[0162:Loop]]'s Name
@> Control String Variables: T[0001], Assign, T[0001] + T[0002] +
@>
: Branch End
@>
: Repeat Above
@> Comment: Maintenant, on se retrouve avec la liste de TOUS les objets possédés par le joueur.
: : Vous pouvez vous arrêter là, la suite permet seulement d'en afficher qu'un certain
: : nombre.
: :
: : Pour ce faire, on va faire sauter autant de lignes que besoin.
: : Ma variable 256 correspond au "décalage" de ma fenêtre.
: :
: : Par exemple, si je ne peux afficher que 10 objets en même temps (ce qui est le cas ici),
: : mais que je veux afficher les objets 2 à 11, ma variable 256 sera égale à 1.
: : Si je veux afficher les objets 21 à 30, elle sera égale à 10.
@> Loop: V[0256:ItemsDisplay] Times -> V[0162:Loop]
@> Control String Variables: T[0001], Pop Line -> T[0004]
@> Control String Variables: T[0006], Pop Line -> T[0004]
@>
: Repeat Above
@> Comment: Bon, là on, a retiré tout ce qui était au-dessus, il nous faut encore
: : retirer ce qui est en-dessous des objets voulus.
: : (En gros, là on va afficher les objets de 2 à 999)
: :
: : Pour faire ça, c'est assez simple, on va juste faire sauter les 10 prochains
: : objets.
@> Control String Variables: T[0003], Assign,
@> Control String Variables: T[0007], Assign,
@> Loop: 10 Times -> V[0162:Loop]
@> Control String Variables: T[0001], Pop Line -> T[0004]
@> Control String Variables: T[0003], Assign, T[0004] +
+ T[0003]
@> Control String Variables: T[0006], Pop Line -> T[0004]
@> Control String Variables: T[0007], Assign, T[0004] +
+ T[0007]
@>
: Repeat Above
@> Comment: Voilà, maintenant on affiche que les 10 objets voulus.
: : Problème, ils ne sont plus dans le bon sens !
: :
: : Pour régler ça, rien de plus simple, il faut juste refaire "sauter" chaque liste dans
: : une autre pour inverser l'ordre !
@> Control String Variables: T[0005], Assign,
@> Control String Variables: T[0008], Assign,
@> Loop: 10 Times
@> Control String Variables: T[0003], Pop Line -> T[0004]
@> Control String Variables: T[0005], Assign, T[0004] +
+ T[0005]
@> Control String Variables: T[0007], Pop Line -> T[0004]
@> Control String Variables: T[0008], Assign, T[0004] +
+ T[0008]
@>
: Repeat Above
@> Comment: Et voilà, nos String Variables 7 et 8 contiennent la liste des noms et leur nombre
: : de tous les objets possédés par le joueur !
: : Il ne reste plus qu'à les afficher avec un Show String Picture !
@> Show String Picture: 602, Top-Left(132, 35), T[0005]
@> Show String Picture: 603, Top-Left(292, 35), T[0008] |
(Dites-vous bien qu'à chaque saut de ligne dans un .cat, un T[1] .cat T[2] "
" T[3] se trouve en FIN de ligne, et un en DEBUT de ligne suivante ! )
Menu d'Options
Certaines nouvelles commandes permettent de faire un semblant de menu d'options.
Je pense notamment à la commande Set Game Option, qui permet de faire que le jeu reste actif quand la fenêtre n'est pas au premier plan, la commande Toggle Fullscreen Mode pour mettre en plein écran, ou la commande Open Video Option pour ouvrir la fenêtre F5.
Comment gérer les Sous-Menus ?
C'est assez simple, je gère mes sous-menus comme je gère mon menu principal :
On garde donc l'idée de la boucle infinie, avec un wait 1 frame, et d'un Switch pour sortir de la boucle.
Cet event est sans condition d'appel (Trigger), il suffit de l'appeler avec la commande Call Event.
Evidemment, dans l'exemple je garde le même Switch que pour la fermeture du menu principal, mais vous pouvez très bien en utiliser un autre pour pouvoir complètement fermer le menu et les sous-menu en appuyant sur une seule touche.
Programme d'extraction des données de la BDD
Comme je l'ai expliqué, il existe une astuce pour extraire n'importe quelle donnée de la BDD de RM2k3.
Voici un petit programme qui permet notamment d'extraire une partie de la BDD :
https://www.mediafire.com/file/oyu82x5mqhlwha6/CMS_Old.rar/file
Voici la liste des données extraites :
- Item : Est maudit ? ( 0 pas maudit, 1 objet maudit )
- Item : Description
- Item : Toute la team ? ( 0 pas maudit, 1 objet maudit )
- Item : Soin HP
- Item : Soin HP%
- Item : Utilisable seulement sur les morts ? ( 0 pas maudit, 1 objet maudit )
- Item : Soin SP
- Item : Soin SP%
- Item : Type
- Skill : Cout en SP
- Skill : Coup en SP%
- Skill : Description
- Skill : Type
Version Mise à jour :
https://www.mediafire.com/file/gegeg745l9zyq5a/CMS.rar/file
Avec tout ça en plus :
Spoiler (cliquez pour afficher)
- Actor : ClassID
- Actor : Expérience : Acceleration
- Actor : Expérience : Extra
- Actor : Expérience : Basic
- Actor : Faceset
- Actor : Nickname
- Enemy : Gold
- Item : Parameter Modifiers : Agi
- Item : Parameter Modifiers : Atk
- Item : Parameter Modifiers : Def
- Item : Parameter Modifiers : Max HP
- Item : Parameter Modifiers : Max MP
- Item : Parameter Modifiers : Mnd
- Item : Weapon Animation ID ( marche pour tout les types d'items, il faut juste switcher l'arme en Weapon, changer l'animation, er remettre le bon type )
- Item : Consumption Limit
- Item : Entire Party
- Item : HP Recovery
- Item : HP Recovery %
- Item : MP Recovery
- Item MP Recovery %
- Item : Scope
- Item : Skill ID ( Comme les Weapons Animations. Il suffit de prendre un book / Special )
- Item : State Recovery
- Item : Switch ID
- Item : Usable in Battle
- Item : Weapon Animation ID ( Là c'est l'animation qui se joue sur le héros. )
- Skill : Attribute Effect
- Skill : Inflict States ( Detecte si le sort inflige ou retire un status )
- Skill : Magical Rate
- Skill : Physical Rate
- Skill : Power
- Skill : Scope
- Skill : States
- State : Restricted Magical
- State : Restricted Physical
- State : Type ( Termine après un combat ou pas )
Selon les demandes, je mettrais surement à jour ce programme.
Les fichiers doivent être placés à la racine du projet (à côté des dossier Charset/Chipset/..., et les sources sont disponibles dans le dossier Sources si vous voulez extraire des données en plus).
Pour extraire les données, c'est assez simple, lancez le programme "extract.bat", il vous sortira tout les fichiers dans le dossier "Text".
Une dernière petite chose, le programme "extract.bat" va rajouter un fichier "RPG_RT.edb" c'est le fichier XML qui contient l'intégralité de la BDD de votre projet.
N'oubliez pas de le retirer si vous ne voulez pas qu'on connaisse à l'avance le contenu
Autres infos sans détails
- Vous pouvez modifier le programme du paragraphe du dessus pour extraire les effets des items, comme ça vous n'êtes pas obligé d'hardcoder l'utilisation des objets.
- Idem pour les sorts.
- J'ai montré comment afficher une listes d'objets, mais pas comment retrouver l'ID de l'objet sélectionné. Grosso modo ça marche comme pour l'affichage, on parcourt la BDD en respectant les même conditions que pour l'affichage, et quand on a parcouru X objets possédés (X étant l'index du curseur de sélection), on renvoie l'ID de l'item (donc la variable qui à servi à parcourir la BDD).
- Comme déjà dit, on peut se servir de la lecture de fichier pour toutes sortes d'autres trucs, système de forge, de journal de quêtes, de bestiaire...
- L'astuce pour les menus / sous-menus peut être utilisée pour autre chose qu'un CMS, comme simplement un PNJ avec un menu de forge.
Mot de la fin
Voilà voilà, je pense avoir fait le tour de toutes les astuces que je peux donner pour faire un CMS avec le patch Maniacs !
Une des raisons qu'il n'y a pas de démo ( en dehors de la flemme ), c'est que je déconseille quiconque de bêtement appliquer ce que je dis ici. Prenez le temps d'essayer de comprendre pourquoi je fais comme ça, ça sera bien plus intéressant pour vous, et peut-être même que vous aurez de meilleurs idées que moi.
Encore une fois, n'hésitez pas à poster vos questions ici, ou en MP si je ne réponds pas ( ), ou même vos propres trucs et astuces !
Merci à Gari pour la relecture et la correction des fautes dans le tuto .
|