Rajouter les fonctionnalités dans RPG Maker

Démarré par SaniOKh, 03 Février 2009 à 19:46

0 Membres et 1 Invité sur ce sujet

Salut tout le monde, ça fait un bail ^^.
Avec Stareclain Quest encore une fois mis en suspend faute de temps, et, quand j'en ai, de la motivation (ça s'applique pas seulement au jeu, mais aussi à tout le reste, à la fin de la journée ou les WE, quand je bosse pas, je suis tellement crevé que tout ce que je peux faire, c'est mater la télé allongé sur le lit; ce qui n'empêche pas que je reviens dessus de temps à autre, un nouveau build est en préparation... le fait d'être passé à Linux n'aide pas beaucoup non plus :P ) , je commence pas mal à m'intéresser à l'outil RM2K lui-même.
Parmi ceux qui font du RPG Maker, certains préfèrent RM2K3, voire RM2K, et d'autres sont plutôt fans de RMXP ou RMVX. Je comprends bien les derniers, avec le langage de scriptage, pas mal de choses deviennent possibles. Mais les fans des anciennes versions (sauf RM95, excusez-moi, mais je ne vois pas comment on peut aimer ce logiciel) ne chôment pas non plus: il y a des années, un certain Ineluki nous avait sorti un patch permettant d'utiliser toutes les touches du clavier, ainsi que la souris.
En observant un peu les fichiers du patch, je me suis rendu compte que l'application du patch (qui se fait toute seule quand on l'installe) consiste en fait à substituer le fichier Harmony.dll par un fichier différent, lui-même faisant référence à l'ancien Harmony.dll (qui, lui, était renommé en oldharmony.dll, quelque chose de ce genre).
Pour ceux qui ne connaissent pas ce patch, regardez ici, dans le tuto que j'avais commencé mais que je n'ai pas fini à ce jour: http://forums.zelda-solarus.com/index.php/topic,11512.0.html .

Il m'est venu à l'esprit l'idée de créer une nouvelle DLL, qui pourrait, par exemple, tout comme le fait Ineluki's Key Patch avec les appuis sur les boutons, relever le temps réel, la date, et pourquoi pas, lire et écrire des fichiers (mais avec une grosse limitation: celle de ne pouvoir exploiter que des nombres entiers).

Le gros souci, hormis le manque de temps :) , est de ne pas connaître de logiciel qui me permettrait de faire de l'introspection sur une DLL (en gros: lister toutes les fonctions comprises dans la DLL) . En bref, ce qu'il me faut, c'est:

  • Un logiciel d'introspection, si quelqu'un en connaît (je n'en ai pas trouvé)
    OU
  • Savoir en quel langage RM2K(3) a été écrit et un décompilateur
Il me faudra étudier un peu la composition de la DLL avant de me lancer dans l'écriture des nouvelles fonctions.

Tiens, SaniOKh, le grand retour :D
Alors, faute de pouvoir t'aider dans ton problème, je tiens quand même à te dire que tu as eu une très bonne initiative là-dessus. Faire un truc pour RM, ça pourra aider, parceque dans son état actuel, il est vraiment trop limité, alors on ne crachera pas sur quelques fonctionnalités supplémentaires :P
À part Inekuki, il y avait aussi eu PowerMode2003 pour RM2k3 il y a un moment, il me semble. JohnT avait fait un topic là-dessus.

Enfin bref, si tu fais ton propre patch, c'est déjà très bien. Si tu réussis à trouver ce que tu cherches, donne-nous quand même des nouvelles. (Et oublie pas Stareclain de temps à autres, hein ? :ninja:)

Ben bon courage en tout cas ;)

Tu peux tenter ta chance avec ceci ?

Resource Hacker

Bon courage ça pourrait être vraiment intéressant comme projet !


J'ai juste besoin de savoir en détail quelles fonctions sont incluses dans Harmony.dll . La nouvelle DLL sera codée par moi-même.

Oui mais je trouve que ça n'a aucun intérêt de bidouiller RPG Maker de la sorte. Autant coder soi-même son propre moteur qui sera de toute manière bien plus performant et intéressant (quoique tout dépend comment tu codes).

03 Février 2009 à 22:29 #6 Dernière édition: 03 Février 2009 à 22:50 par SaniOKh
Citationtout dépend comment tu codes
Le voilà le problème :P .
En plus, en ce moment, je ne pense vraiment pas avoir le temps nécessaire pour me lancer dans des gros projets :) . Enfin, dans un gros projet de plus. Mon jeu RPG Maker (même si je code en C, C++ et Java :P , je reste fidèle à mon projet RM2K) est déjà un gros projet que je veux terminer.

EDIT: j'ai eu pas mal de chance: je suis tombé sur Harmony.dll décompilé. Non seulement maintenant j'ai enfin les en-têtes des fonctions que je cherchais, j'ai aussi découvert, dans un commentaire laissé par le décompilateur, le langage dans lequel la DLL a été écrite: Delphi. Je vais donc chercher le décompilateur pour avoir de meilleurs résultats, parce que le code source que j'ai trouvé, c'est pas que je n'ai pas confiance, mais... quoique si, je n'ai pas confiance.

Ouais, ça peut se comprendre, vu ton projet et la quantité de travail que tu as fourni, que tu ne veuilles pas tout recommencer et finir au moins sur ce support :P

Après d'un oeil extérieur, c'est vrai que ça fait bizarre de voir quelqu'un founir autant d'efforts pour upgrader un logiciel de daube alors que finalement il pourrait mettre ses compétences à l'oeuvre dans un vrai projet maison :P

Hmm, je suis ton projet à suivre SaniOKh. Je ne sais pas la part des fonctions de RM incluses dans ces DLL, mais qui sait- on pourrait pê se démerder pour "extraire" le code du moteur lui même et recoder quelque chose par dessus.

C'est vrai que c'est pas mal de boulot sur un logiciel de daube, mais ça serait intéressant.


(et rebienvenue Sani! (tu as un Mp d'ailleurs :D) :P)

Après avoir exploré la DLL, j'en conclus: c'est une dll responsable uniquement de la musique et des sons. Mais comme une des fonctions, HarmonyMidiTick (qui retourne le temps écoulé depuis le début de la musique, on trouve la fonction RM correspondante tout à la fin de la fenêtre où on donne une valeur à une variable) a tendance à être ignorée par les makers dans 99,99% des cas, on dispose donc d'une fonction dont on peut faire ce qu'on veut, pourvu qu'elle ne prenne pas de paramètres en entrée et retourne un entier (parfait pour la détection de la date et de l'heure). Théoriquement, le seul obstacle qui me reste est de savoir comment je vais faire pour passer en douce un entier ou deux à cette fonction pour qu'elle puisse être un minimum polyvalente. Ineluki l'avait fait grâce aux scripts sauvegardés dans le dossier des sons avec extension ".script.wav". Je n'aime pas vraiment cette façon de faire, mais si je n'ai pas le choix, je ferai de même.

Y'a moyen de faire des accès en mémoire centrale direct avec Delphi?

04 Février 2009 à 19:54 #11 Dernière édition: 04 Février 2009 à 19:57 par SaniOKh
Aucune idée. Et je n'en ai pas vraiment besoin: je ne fais pas une DLL modifiée, je crée une DLL qui, elle, fait appel à Harmony.dll (je fais ma DLL en C, au fait, mais je vais certainement passer à C++). La plupart des fonctions de la DLL sont directement passées à Harmony.dll, mais je pourrai rajouter quelques "effets secondaires" à certaines fonctions, et une d'elles, comme je l'ai déjà dit, sera complètement changée :) . Je ne sais toujours pas exactement comment je vais passer des paramètres à HarmonyGetMidiTick(), mais je pense qu'il y a moyen de passer par des variables globales.

Maintenant que j'ai les en-têtes des fonctions qu'il me faut, j'essaye de créer une DLL qui se contente tout simplement de passer les commandes à Harmony.dll. Quand je me serai assuré qu'elle fonctionne, je ferai les changements prévus.

Ce soir, j'ai fait un gros pas en avant :) .
Un petit programme trouvé sur le net permettant de générer le code source pour une DLL proxy m'a enfin permis de substituer la fonction HarmonyGetMidiTick().
Pour ceux qui ne savent pas ce qu'est une DLL proxy, c'est une DLL qui remplace la DLL d'origine, mais transmet à cette dernière tous les appels qu'elle reçoit... sauf ceux qui doivent être remplacés.
Pour l'instant ce n'est pas super impressionnant, ni super pratique à utiliser: la DLL que j'ai générée et complétée permet de récupérer la date et l'heure quand on utilise la commande RM2K "Changer Variable" en lui attribuant la valeur "Position du Midi" plusieurs fois d'affilée:

  • Au premier appel elle renvoie le jour.
  • Au deuxième appel elle renvoie le mois (1-Janvier, 12-Décembre)
  • Au troisième appel elle renvoie l'année
  • Au quatrième appel elle renvoie le jour de la semaine (0-dimanche, 6-samedi)
  • Au cinquième appel elle renvoie les secondes
  • Au sixième appel elle renvoie les minutes
  • Au septième appel elle renvoie les heures
  • Au huitième appel elle renvoie 0 si on est en heure d'hiver, 1 si on est en heure d'été et -1 si vous êtes dans un pays où le changement d'heure ne se pratique pas
  • Au neuvième appel elle renvoie la valeur retournée par la vraie fonction HarmonyGetMidiTick()
  • Et le cycle recommence...
Ceux qui connaissent le langage C reconnaîtront les composants de la structure "tm" que retourne la fonction localtime(), c'est normal :) . C'est celle que j'ai utilisée, en bricolant un peu les valeurs.

En tant que preuve, ces quelques screenshots:




Je ne mets pas la DLL en ligne pour l'instant, je considère encore qu'elle est à retravailler.