❤ 2Nemau prettyheartbreak Niveau : Avancé, voir très Avancé.
Ce tutoriel n'abordera PAS les bases du C# ( et plus précisément du .NET Framework ), ni même du XML (ou alors très peu).
Je pense cependant qu'avec un peu de logique et de jugeotte, en suivant ce tutoriel presque n'importe qui peut s'en sortir, tant qu'il s'y connait un minimum en programmation orientée objet (mais vraiment un minimum, tant qu'il comprend les boucles, les variables, et les objets, ça devrait aller).
Prérequis :
Ce tutoriel est prévu pour le patch Maniacs, et donc la version Steam de RPGMaker 2003, cependant, comme on se contente de sortir des fichiers textes, vous pouvez tout à fait vous en servir pour d'autres programmes.
Gardez en tête cependant que l'on ne peut exporter que la BDD de RPGMaker 2003.
Ce tutoriel fait suite à ce tutoriel pour aider à la création d'un CMS.
Vous pouvez trouver plus d'informations sur le patch Maniacs ici.
Je tiens a rappeler que ce programme utilise une base de EasyRPG qui permet de sortir la BDD de RM2k3 sous forme de fichier .XML
Introduction
Comme dit précédemment, ce tutoriel a pour but de compléter avec les informations que vous voulez extraire de la BDD mon programme Parser disponible ici.
Les sources sont disponibles dans le dossier "Sources".
Vous aurez besoin d'un IDE (Environnement de Développement Intégré), qui est le programme qui va permettre d'éditer le code de notre programme, ainsi que de l'exporter sous la forme d'un .exe.
Pour ma part j'utilise Microsoft Visual Studio 2019, si vous choisissez d'utiliser celui-ci, sachez qu'il vous suffit d'ouvrir le fichier Parser.sln dans le dossier "Sources" pour ouvrir les sources directement Microsoft Visual Studio 2019.
On peut aussi choisir d'utiliser Visual Studio Code, mais dans ce cas, ça risque d'être plus compliqué. J'expliquerai comment installer les deux, mais je recommande fortement Microsoft Visual Studio, malgré qu'un compte Microsoft soit obligatoire.
De plus, comme dit précédemment, j'ai choisi de passer par de la Programmation Orientée Objet.
C'est à dire que chaque "chapitre" de la BDD (objets, compétences, héros,...) ont (ou auront selon ce que vous faites) leurs propres "Classes". Chaque "Classe" peut être imaginée comme un tableau, la Classe est donc l'entête du tableau (ses colonnes), et chaque objet de la classe représente ses lignes.
Par exemple, la classe Skills est l'entête d'un tableau avec pour colonnes : id, cost, sp_percent, typeSk, et desc.
Et pour cette classe nous aurons des "Objets" qui seront les lignes d'un tableau !
Si vous avez bien lu, je parle d'entête de tableau, et de ligne de tableau. A aucun moment je n'ai dit que ces 2 éléments formaient un tableau : en effet, pour l'instant la classe et l'objet ne sont pas reliés, on a donc d'un côté la forme du tableau (la classe), et de l'autre les lignes d'un tableau (les objets). Je montrerai plus tard comment créer un tableau à partir de ces deux éléments.
De base, les Classes Items et Skills sont déjà présentes, je vais vous montrer comment ajouter une information à une classe déjà existante (nous allons rajouter le "Scope" des Compétences, c'est-à-dire le type de cible qu'elles ont).
Et ensuite nous verrons comment créer une nouvelle classe, et y ajouter nos données (nous ferons la classe Actor, et nous sortir dans un fichier texte le nom des faceset de chaque héros, un par ligne).
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 de votre jeu.
De plus, c'est un fichier .XML (malgré son nom), n'hésitez pas à l'ouvrir dans un éditeur de texte comme le Bloc Note de Windows, ou bien Notepad++ (Notepad++ c'est mieux quand même ).
Une fois le Parser.exe généré et placé dans le dossier "Text/", je tiens à rappeler de ne JAMAIS le lancer tout seul. Il faut TOUJOURS lancer le "extract.bat".
Installation de Microsoft Visual Studio
Voilà où télécharger Microsoft Visual Studio
Choisissez la version Community (version gratuite).
Une fois lancé, acceptez les conditions et tout le bordel, vous arriverez sur un écran vous laissant choisir des addons à installer.
Choisissez bien "Développement .Net Desktop" :
Une fois l'installation terminée, connectez vous avec un compte Microsoft, et voilà, c'est terminé !
Installation de Visual Studio Code
Comme dit plus haut, je déconseille d'utiliser ce logiciel-là.
Ce n'est pas la version que j'utilise, et malgré que j'aie réussi l'installation (et encore, je n'en suis pas parfaitement sûr), elle est plus chiante, et plus compliquée.
De plus l'intégralité du tutoriel a été écrit pour Microsoft Visual Studio, les écrans seront donc légèrement différents si vous utilisez cette version, de même que certaines manipulations.
(Comme la manipulation pour créer de nouvelles classes.)
Voilà où télécharger Visual Studio Code.
C'est le même logiciel que la partie précédente, mais sans l'obligation d'avoir un compte Microsoft.
Donc, une fois l'exécutable téléchargé, exécutez-le, et allez jusqu'au bout.
Une fois l'installation finie, exécutez Visual Studio Code, vous devriez arriver sur cet écran :
Cet écran, ou n'importe quel écran de page d'accueil.
Faites "Files/Open Folder" :
Et choisissez le dossier Parser dans le dossier CMS/Sources.
(Par exemple, j'ai placé le dossier télécharger dans D/Downloads/CMS.
Voila le chemin d'accès que je vais devoir ouvrir : D:\Downloads\CMS\Sources\Parser )
Un message vous demandant si vous voulez faire confiance aux auteurs du projets à ouvrir va apparaitre. Faites "Yes, I trust ..." pour ouvrir les sources de mon programme.
Donc vous allez arriver sur un écran comme ça :
Commencez par cliquer sur la flèche entourée en rouge, puis sur le bouton en vert.
Un message d'erreur vous indiquant que vous n'avez pas de quoi compiler le C# va apparaître :
Choisissez la version entourée en rouge, puis appuyez sur le bouton en vert, chez vous ça sera surement "Install" et non "Installing".
Il faut maintenant télécharger le Runtime de .Net : https://dotnet.microsoft.com/en-us/download/visual-studio-sdks
Choisissez selon votre PC. Mais y a de forte chance que vous deviez télécharger la x64
Une fois installé, retournez sur Visual Studio Code, et faites "create a launch.json file" :
Et choisissez la ligne entourée en vert.
La partie suivante sera utile lorsque vous voudrez générer le .exe !
Vous pouvez donc la sauter pour l'instant, et y revenir plus tard.
Maintenant, c'est là où ça se gâte.
Sur deux installations de Visual Studio Code, la méthode pour générer le .exe n'a pas été la même pour moi.
Donc voilà deux "possibles solutions" :
- Premièrement, cliquez sur :
Un message d'erreur peut apparaitre, forcez le débugage (Debug Anyway) :
Un autre message d'erreur devrait apparaître :
Si vous avez de la chance, le .exe sera généré dans "CMS\Sources\Parser\bin\Debug".
Sinon, voici la deuxième solution :
- Commencer par faire Terminal/New Terminal :
En bas, tapez la commande :
Dans la console, un message d'erreur va apparaître, MAIS le .exe sera correctement généré.
Cette partie est aussi utile pour plus tard, elle sert à créer une nouvelle classe.
Commencez par taper le code écrit en rouge :
Une petite icône devrait apparaître sur la gauche de la ligne, entourée en vert. Cliquez dessus, et sélectionnez "Générer le type... dans un nouveau fichier" entouré en bleu.
Et voilà, c'est (enfin) terminé.
Extraction de la cible des sorts
Bon, maintenant on va commencer à rentrer un peu plus dans le dur.
Comme déjà dit, notre premier but va être de faire que notre programme sorte un fichier
skills_scope.txt, où chaque ligne contiendra le type de cible (Single Enemy, All Enemies,...).
On va donc commencer par ouvrir le fichier Skill.cs :
On peut donc voir que ma classe "Skill" a plusieurs variable associées : id, cost, sp_percent, typeSk, desc, ainsi qu'une fonction de déclaration :
Toute nos classes devront avoir cette fonction, qui sera identique sauf son nom (public Item(int i) pour les objets par exemple).
Donc, nous ce qu'on veut c'est rajouter le "Scope" de nos sorts.
Pour savoir ce qu'on va lire dans la BDD, on va commencer par ouvrir le fichier RPG_RT.edb dans Notepad++.
En cherchant un peu, on va finir par tomber sur une "Rubrique" qui s'appelle "skills". Evidement, c'est là-dedans qu'on va devoir chercher.
En cherchant un peu plus, on voit :
Au niveau de la flèche rouge.
On sait donc maintenant que nous aurons besoin de chercher le mot clef "scope" (Attention, je pense que la casse est importante !).
On retourne sur Visual Studio, et toujours dans Skill.cs, nous allons rajouter une variable de type int (entier), qui s'appelera "scope" :
Maintenant on ouvre Program.cs :
En rouge, c'est le fichier à ouvrir.
La partie bleue, n'y touchez dans aucun cas, sauf si vous savez parfaitement ce que vous faites !
Pour information, c'est ici qu'on va lire notre fichier "RPG_RT.edb".
Tout à l'heure j'ai dit que pour l'instant, nos classes et nos objets ne formaient pas un tableau. Et bien ce sont les lignes en vert qui vont faire le lien entre les deux, et former nos tableaux.
Pour faire court, la ligne :
1
| ArrayList skills = new ArrayList(); |
Va créer un tableau à 1 dimension (Voyez ça comme un tableau Excel à 1 seule colonne, mais avec un nombre de lignes extensibles, on peut créer une nouvelles lignes dès que besoin !), contenant toute nos "lignes" correspondant à nos sorts.
Ici, on se contente donc de le créer, mais pour l'instant, il est vide.
Il va donc falloir le remplir, mais comment ?
Pour faire simple, la partie jaune correspond à l'onglet dans la BDD. Sur l'exemple, on voit que c'est "items". Ça aurait pu être "troops", ou "actors".
Comment trouver celui dont nous avons besoin ? Il faut regarder dans le fichier XML.
C'est globalement les mêmes que dans l'interface de RM, donc vous devriez pas avoir de mal à trouver celui que vous cherchez.
Dans notre cas, on veut l'onglet skills. Comme déjà on se contente de rajouter une information, il existe donc forcément une ligne identique à celle en jaune, mais avec écrit "skills" à la place de "items" :
Effectivement, on retrouve la ligne en jaune.
Comme avant les lignes bleues, évitez de trop y toucher, c'est la qu'on va lire chaque sous partie du fichier XML.
On peut voir en vert qu'il y un "sp_percent". Si vous vous souvenez bien, c'est une des informations que l'on a DEJA récupérées.
Pour en récupérer une nouvelle, il suffit de copier coller toute la partie en verte, puis d'y changer certaines parties :
En jaune j'ai donc remplacé par "scope", comme ça on lira l'entrée scope du fichier XML.
La flèche rouge permet de lire la valeur de cette entrée (c'est-à-dire ce qu'il y a entre les <scope>X</scope>, ici le . Vous n'aurez que très peu à y toucher, seulement si vous voulez changer le type de donnée stockée (ici on stocke un entier, mais on pourrait vouloir stocker une chaîne de caractères).
En bleu, on peut voir que j'ai remplacé "e.cost" par "e.scope".
En gros, "e" fait référence à une entrée de notre tableau des Skills. A la ligne en cours si vous préférez.
(Cette histoire de ligne en cours sera détaillée pour la seconde partie.)
Voilà, avec ça, on se retrouve donc avec la liste (le tableau à 1 dimension si vous préférez) de tout nos objets de la classe Skill.
1
2
3
4
5
| if (no3.Name == "scope")
{
int n = int.Parse(no3.InnerText);
e.scope = n;
} |
Maintenant on va juste chercher à les lire depuis la liste, puis les écrire dans un fichier .txt.
Pour cela, continuez à parcourir "Program.cs" jusqu'à trouver :
La partie jaune. Cette partie concerne l'écriture de tout les fichiers textes spécifiques aux Sorts.
Nous, on va se contenter de copier coller la partie verte et de la transformer en la partie bleu !
Donc on peut voir que les différences sont :
- Souligné en rouge on récupère la variable scope de notre objet de classe Skill.
- Souligné en orange le nom du fichier texte qui sera créé.
1
2
3
4
5
6
7
| text = "";
foreach (Skill s in skills)
{
int n = s.scope;
text += n + "\n";
}
File.WriteAllText("Text/skills_scope.txt", text, Encoding.UTF8); |
Et voilà !
Il ne reste plus qu'à compiler notre programme et le placer dans le bon dossier !
Pour ça :
Il suffit d'aller dans Générer/Générer la solution, ou de faire CTRL + Maj + B
Et voilà notre programme compilé !
Il ne reste plus qu'à aller le chercher dans le dossier : "Sources/Parser/bin/Debug", et de le déplacer dans le dossier "Text".
Si vous relancer le programme extract.bat, le fichier skills_scope sera lui aussi généré, maintenant.
Extraire les données d'une nouvelle "classe"
Dans cette partie, je serai bien plus bref, je me contenterai de développer juste les parties que nous n'avons pas vu pour parvenir à nos fins.
Donc, là, qu'est-ce qu'on veut faire ? On veut simplement se retrouver avec un fichier texte actors_faceset.txt contenant sur chaque ligne : le nom du faceset de notre héros + son index.
Cette fois, nous allons donc mettre DEUX informations sur chaque ligne !
Si vous utilisez Visual Studio Code (la version que je déconseille), remplacez les étapes suivantes (jusqu'au prochain ) par la dernière étape dans la partie "Installation de Visual Studio Code".
Pour cela, nous allons commencer par créer une nouvelle classe, en faisant Projet/ Ajouter une classe, puis en double cliquant sur "Classe" :
Puis :
On veut arriver à ce résultat :
Pour commencer, on va renommer notre classe en "Actor".
C'est la partie soulignée en rouge, ainsi que la flèche rouge.
Ensuite, on va lui rajouter 3 variables :
- int id, qui sera son index
- String face_name, qui sera le nom du fichier texte
- int face_index, qui sera le numéro d'index dans le fichier (sa position, 0 pour l'image en haut à gauche, 1 pour celle juste à droite,...)
C'est la partie entourée en jaune.
Si vous utilisez Visual Studio Code, reprenez ici.
Voilà le code complet :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Parser
{
class Actor
{
public int id;
public String face_name;
public int face_index;
public Actor(int i)
{
id = i;
}
}
} |
Maintenant que notre classe est créée, on va retourner dans Program.cs :
On va donc rajouter la ligne en rouge (on crée notre liste qui contiendra tous nos objets de classe Actor), et toute la grosse partie en vert.
C'est grossièrement un copier-coller du bloc "Items".
Les grosses différences sont :
- La partie bleue, on va créer un nouvel objet de type Actor, en remplissant son ID
- La partie jaune, c'est exactement la même chose que dans le chapitre précédent, juste la partie entourée en rose permet de stocker une chaîne de caractères.
(On change juste le int n en String n, et on retire le int.Parse)
- Et la petite partie en orange, qui permet de remplir la liste actors avec notre nouvelle entrée.
- En gris, le else n'est pas obligatoire. C'est mieux de le mettre, mais il n'est pas obligatoire.
Voila le code complet :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| if (no2.Name == "Actor")
{
if (no2.Attributes[0] != null)
{
int i = int.Parse(no2.Attributes[0].Value);
Actor e = new Actor(i);
foreach (XmlNode no3 in no2.ChildNodes)
{
if (no3.Name == "face_index")
{
int n = int.Parse(no3.InnerText);
e.face_index = n;
}
if (no3.Name == "face_name")
{
String n = no3.InnerText;
e.face_name = n;
}
}
actors.Add(e);
}
} |
Bon, la moitié de fait !
Il ne nous reste plus qu'à créer et remplir le fichier actors_faceset.txt !
Pour ça, comme à la fin de la première partie, trouvez la partie en jaune sur ce Screen :
La partie verte est le code que l'on va rajouter.
En rose, faites bien attention à retirer le String, sinon vous aurez une erreur ! (Sinon, vous pouvez le mettre au dessus du bloc "Items".)
En bleu, c'est notre boucle principale, qui va permettre de parcourir la liste actors.
Les deux lignes en orange sont nos variables à récupérer. Cette fois nous en prenons 2, puisque nous voulons 2 informations sur la même ligne.
En rouge, c'est la concaténation (on "fusionne" nos 2 variables) de nos deux variables, avec le caractères / entre les deux.
Et en gris, c'est le nom de notre fichier.
Et voilà le code correspondant :
1
2
3
4
5
6
7
8
9
10
11
12
13
| /*
* Actors
*/
String text = "";
foreach (Actor s in actors)
{
String n = s.face_name;
int i = s.face_index;
text += n + "/" + i + "\n";
}
File.WriteAllText("Text/actors_faceset.txt", text, Encoding.UTF8);
|
Mot de la fin
Voilà, cette fois vous devriez être capable de modifier un petit peu mon programme, pour y ajouter vos données à extraire !
Encore une fois, n'hésitez pas à poster en dessous de ce sujet, ou par MP (l'avantage de le faire ici, c'est que ça permettra aux autres de pas avoir de nouveau la même incompréhension) si vous avez des problèmes.
Je tiens à dire un grand merci à Gari pour l'habituelle correction de mes tutoriels, et à Zam qui a pris le temps de tester avec moi ce tutoriel !
|