[RM2K/RM2K3]SaniOKh's Patch

Démarré par SaniOKh, 13 Avril 2009 à 23:12

0 Membres et 1 Invité sur ce sujet

13 Avril 2009 à 23:12 Dernière édition: 03 Mai 2009 à 15:14 par SaniOKh
Certains d'entre vous ont déjà fait le tour ici:
http://forums.zelda-solarus.com/index.php/topic,19952.msg369810.html#msg369810

J'ai commencé, depuis un certain moment, un projet d'ajout de fonctionnalités dans RPG Maker 2000. En m'inspirant du Ineluki Key Patch, mon choix s'est porté (pour l'instant) sur la création d'une DLL qui remplacerait Harmony.dll.

Pour info: Harmony.dll est une DLL qui gère le son de RPG Maker et comporte une fonction dont personne à ma connaissance ne s'est servi, celle de retourner la position courante dans le fichier Midi qui est en lecture.

Pour l'instant, la modification que j'ai faite permet de récupérer dans le jeu RPG Maker 2000/2003 (vu que la DLL est identique d'une version à l'autre) la date et l'heure en cours. Ce qui permettrait, par exemple, de créer des jeux qui utilisent l'heure réelle pour leur système de jour/nuit, un peu comme dans Pokémon Or/Argent/Cristal.



Comment l'installer


Téléchargez ceci: http://rapidshare.com/files/220966484/harmony_dt.zip
Après, renommez le Harmony.dll déjà présent dans votre jeu en RealHarmony.dll et recopiez le Harmony.dll contenu dans le zip dans votre projet. Les autres fichiers (fichiers vides en .wav) vont dans le dossier des sons.
Le patch peut être utilisé en même temps que Ineluki Key Patch :) .


Comment l'utiliser


Pour récupérer une valeur, il faut jouer un des faux sons téléchargés avec le patch, puis attribuer à une variable la valeur "Position Midi"(tout en bas de la fenêtre "Changer Variable", dernier choix dans la liste déroulante) . L'effet d'un "son" reste jusqu'à ce qu'un autre faux son soit joué.
Les "sons" proposés sont:

  • _DLL_default - la variable reçoit la valeur que retournerait le jeu sans le patch (ou alors la valeur normalement retournée par Ineluki Key Patch). Comportement du patch par défaut.
  • _DLL_day - la variable reçoit le jour du mois
  • _DLL_wday - la variable reçoit le jour de la semaine (0 pour dimanche, 6 pour samedi, vous imaginez pour le reste)
  • _DLL_month - la variable reçoit le mois (1 pour janvier, 12 pour décembre, vous imaginez pour le reste)
  • _DLL_year - la variable reçoit l'année
  • _DLL_sec - la variable reçoit les secondes sur l'horloge de votre ordinateur
  • _DLL_min - la variable reçoit les minutes
  • _DLL_hour - la variable reçoit les heures
  • _DLL_isdst - la variable devient nulle si vous êtes en heure d'hiver, supérieure à 0 si vous êtes en heure d'été et inférieure à 0 si vous êtes dans une région où le changement d'heure ne se pratique pas


Et après?


Et après... je ne sais pas :) . Pour l'instant, je vous mets cette DLL pour que vous puissiez la tester. Je ne l'ai pas testée sur RM2K3, mais je suppose que ça marchera comme sur RM2K.
Je continuerai à chercher d'autres fonctions que je pourrai rajouter à ce patch. Je pourrai aussi sortir le code source un peu plus tard.

Ces screenshots ont été faits avec une version précédente de la DLL, mais j'ai réussi à réproduire les mêmes écrans avec la version courante:




Attention: évitez d'utiliser la DLL directement dans vos projets (pour l'instant, elle est en phase de test). Créez plutôt des petits projets bidon pour la tester. Je ne suis pas responsable si cette DLL ruine vos jeux (il y a peu de chance qu'elle le fasse, mais je préfère le dire :) ).

Et bien que dire. Ça ne fait pas grand-chose pour le moment, c'est sûr, mais ce qui est bien, c'est de voir qu'au moins, tu as réussi à modifier ce fichier au final, et que le résultat marche :)
En tout cas, grâce à ce début de patch, tu vas créer la première génération de jeux RM qui ne marchent que si on les lance la nuit, et donc créer entre autres un gros tas de jeunes nouveaux geeks qui se lèveront au milieu de la nuit pour pouvoir jouer à leur jeu amateur favori :linkXD:

Nan, sérieux, c'est bien que tu sois arrivé à faire ne serait-ce que, au moins, ça montre que tu as réussi à modifier le code à ton avantage, et donc que tu pourras sûrement faire d'autres trucs plus intéressants par la suite ;)
Maintenant, on n'a plus qu'à attendre voir ce qui va venir ensuite, mais bon, puisque c'est toi, j'ai confiance Sani' :D

Merci ;) .
Je prévois dans un avenir assez proche de développer un système de variables qu'on pourrait écrire dans un fichier. Certes, ce sera difficile à manipuler (imaginez que vous avez un tableau de variables, et tout ce que vous pouvez faire dessus comme opération, c'est passer d'une variable à une variable voisine, ajouter 1 ou soustraire 1 de la variable, et, bien sûr, retourner les valeurs, énregistrer les variables dans un fichier et les lire), mais ça aura un intérêt énorme. Vous pourrez, par exemple, faire de sorte qu'une fois un joueur débloque un bonus, toutes les autres parties en tirent profit; créer un système d'échange d'objets entre sauvegardes; proposer une option supplémentaire au début d'une nouvelle partie si le jeu a déjà été terminé au moins une fois...
Les fonctions qui n'acceptent rien en entrée et retournent un entier, ça ne laisse pas beaucoup de liberté, en effet, mais on peut toujours se débrouiller :) .

Il doit bien y avoir un moyen de passer des informations à la fonction autrement qu'en les passant en paramètre non ?
Chaîne Twitch : diffusion en direct de sessions de développement de Solarus, de création de jeux, de parties de jeux vidéo.
Chaîne YouTube : replays des diffusions en direct, tutos Solarus
Compte Twitter : pour être au courant des nouveautés
Chat Discord : pour discuter en direct avec la communauté Solarus

... je ne vois pas exactement ce que tu veux dire.

01 Mai 2009 à 20:14 #5 Dernière édition: 01 Mai 2009 à 20:46 par SaniOKh
Nouvelle version!

Télécharger une démo (qui inclut la DLL et les fichiers .wav nécessaires) ici: http://rapidshare.com/files/227988727/dll_test.zip

La grande nouveauté... voir un de mes posts précédents:
Citation de: SaniOKh le 14 Avril 2009 à 21:26
Merci ;) .
Je prévois dans un avenir assez proche de développer un système de variables qu'on pourrait écrire dans un fichier. Certes, ce sera difficile à manipuler (imaginez que vous avez un tableau de variables, et tout ce que vous pouvez faire dessus comme opération, c'est passer d'une variable à une variable voisine, ajouter 1 ou soustraire 1 de la variable, et, bien sûr, retourner les valeurs, énregistrer les variables dans un fichier et les lire), mais ça aura un intérêt énorme. Vous pourrez, par exemple, faire de sorte qu'une fois un joueur débloque un bonus, toutes les autres parties en tirent profit; créer un système d'échange d'objets entre sauvegardes; proposer une option supplémentaire au début d'une nouvelle partie si le jeu a déjà été terminé au moins une fois...
Les fonctions qui n'acceptent rien en entrée et retournent un entier, ça ne laisse pas beaucoup de liberté, en effet, mais on peut toujours se débrouiller :) .

Voilà, vous avez à votre disposition un tableau de 16 variables. Leurs numéros vont de 0 à 15. Leurs valeurs vont de -999999 à 999999 (valeurs minimales et maximales gérées par RPG Maker).

Les nouveaux "sons" ont les effets suivants:

Ouverture/fermeture des fichiers
Pour les utiliser, il suffit de jouer le "son" correspondant. La fonction "Position Midi" retourne le numéro de la variable courante, mais il n'est pas nécessaire de la lancer pour utiliser ces fonctions.

  • _DLL_var_read.wav - Lit les variables dans le fichier. A faire avant chaque opération sur les variables. Si le fichier n'existe pas, il sera créé et toutes les variables seront initialisées à 0.
  • _DLL_var_write.wav - Ecrit les variables dans le fichier. A faire après chaque opération sur les variables.

Navigation entre variables
Pour les utiliser, il suffit de jouer le "son" correspondant. La fonction "Position Midi" retourne le numéro de la variable courante, mais il n'est pas nécessaire de la lancer pour utiliser ces fonctions.

  • _DLL_var_goto_first.wav - La première variable du tableau (numéro 0) devient la variable courante.
  • _DLL_var_goto_last.wav - La dernière variable du tableau (numéro 15) devient la variable courante.
  • _DLL_var_goto_next.wav - Passer à la variable suivante. Si la dernière variable du tableau est la variable courante, cette opération est sans effet .
  • _DLL_var_goto_previous.wav - Passer à la variable précédente. Si la première variable du tableau est la variable courante, cette opération est sans effet .

Manipulation des variables
Pour les utiliser, il suffit de jouer le "son" correspondant. La fonction "Position Midi" retourne la valeur de la variable courante, mais il n'est pas nécessaire de la lancer pour utiliser ces fonctions.

  • _DLL_var_increment.wav - Ajouter 1 à la variable courante. Si elle est égale à 999999, cette opération est sans effet.
  • _DLL_var_decrement.wav - Soustraire 1 de la variable courante. Si elle est égale à -999999, cette opération est sans effet.
  • _DLL_var_nullify.wav - Mettre la valeur de la variable courante à 0.

Lecture seule
Parfois, quand il vous faut seulement le numéro ou la valeur de la variable et que vous ne voulez pas faire d'opérations dessus, utilisez ces deux "sons".
  • _DLL_var_getrang.wav - La fonction "Position Midi" retourne le numéro de la variable courante.
  • _DLL_var_getvalue.wav - La fonction "Position Midi" retourne la valeur de la variable courante.

Améliorations prévues pour les prochaines versions:

  • Faire de sorte qu'il soit possible de supprimer tous les faux sons une fois le développement du jeu terminé (c'est pour ça qu'ils ont des noms aussi voyants, pour qu'on puisse facilement le supprimer tous d'un coup avant de distribuer le jeu).
  • Peut-être d'autres fonctions de manipulation des variables.
  • Mêmes fonctions que pour les variables, mais avec les booléens (intéressant, parce que je pourrai en caser beaucoup plus que de variables).
  • Support de plusieurs fichiers de variables et de booléens.
  • Peut-être, l'accès à d'autres variables système, si je trouve d'autres variables intéressantes.
  • Partager la DLL en plusieurs DLL pour rendre le tout plus performant (si on ne se sert pas de la lecture des fichiers, on peut choisir de ne pas inclure cette fonction du tout, par exemple) et extensible.

J'ai réussi à diviser le patch en plusieurs fichiers DLL.
http://rapidshare.com/files/228633845/patch1.0.zip
(inclut les DLL et les WAV nécessaires)

Désormais, la DLL principale ne contient que le traitement de "_DLL_default.wav" (retourne la valeur que retournerait la fonction "Position Midi" sans le patch).
Les autres fonctions sont désormais dans les plug-ins (DLL supplémentaires contenues dans un nouveau dossier "Extra").
Pout installer un plug-in, il suffit juste de recopier la DLL dans le dossier "Extra" du projet et les "sons" nécessaires dans le dossier "Sound".
Le dossier "Extra" doit exister et contenir le fichier "RealHarmony.dll" (le "Harmony.dll" d'origine).

Pour ceux qui s'intéressent à ce projet, vous pouvez désormais contribuer en écrivant des plug-ins. Pour vous donner un exemple, voici le code source (langage C, license LGPL) du plug-in qui retourne la date et l'heure:
http://rapidshare.com/files/228636486/datedll.source.zip
A compiler avec DevC++ en utilisant la commande:
$(CC) -o DateHarmony.dll datedll.c -shared datedll.def

Chaque plug-in contient quatre fonctions:

  • int isOperation(char *) - retourne 1 si le nom d'un son est associé à une fonction du plug-in, 0 sinon.
  • void onSoundPlay(char *, char *) - recopie le nom du son dans une variable globale. Aussi, si vous voulez qu'une action se passe quand on joue un son, c'est ici que ça se passe.
  • int onMidiTick(char *) - Retourne un entier en fonction du dernier son joué.
  • void init() - Si vous avez besoin d'initialiser une variable globale exprès pour ce plug-in, créer un fichier etc, c'est ici que ça se passe.

A part ça, les "sons" qui font retourner la date et l'heure sont désormais préfixés de "_DLL_date_" au lieu de "_DLL_", et deux "sons" ont été ajoutés:

  • _DLL_date_hour12.wav - retourne les heures en mode "AM/PM", de 1 à 12.
  • _DLL_date_pm.wav - Entre midi et 11 heure sdu soir retourne 1, sinon 0 (pour gérer l'heure en "AM/PM").

C'est vraiment sympa tout ça, on voit que tu t'impliques :).
C'est un bon outil pour les utilisateur de RM03, j'espère que tu va pouvoir pousser plus loin les limites, encore une fois ^^.

    







Bien que je n'ai pas fait de download cette fois, j'ai une bonne nouvelle à vous annoncer.
Dans la version en préparation, on peut supprimer les faux sons après avoir fini le développement du jeu, histoire de ne pas encombrer le dossier "Sound". Pendant le jeu, si le patch reconnaît le son à jouer comme une des fonctions du patch, il se contente de l'exécuter et ne vérifie pas si le fichier existe.
Aussi, j'ai fait un petit utilitaire qui analyse les plug-ins et crée automatiquement les faux sons nécessaires.