• Login

Dear visitor, welcome to RPG Studio - Make your World real. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

  • Playm

    RPG Studio Webmaster

    You have to register first, to connect to this user.

317

Mit Qt ganz schnell das RTP des Makers laden

Rating:

by Playm, Sunday, October 15th 2017, 6:25pm

In meinem letzten Blogartikel habe ich darüber geschrieben, wie man ein RPGXP-Projekt mit seiner eigenen Anwendung öffnen kann. Darunter hat dann Josey kommentiert, dass ich ja jetzt auf die Grafiken des Projekts zugreifen kann. Soweit stimmt das. Ich komme an alle Grafiken im Projektordner. Aber da fehlt ja noch was. RPG Maker Projekte benutzen in aller Regel das Run Time Package (RTP) und an diese Grafiken wollen wir auch dran.

Zwei Aufgaben ergeben sich:
  1. Herausfinden, ob und wenn ja welche RTP das Projekt benutzt
  2. Den Ordner mit dem jeweiligen RTP auf der Festplatte finden


Die Game.ini auslesen
Die Information, welche RTPs (theoretisch kann ein Projektersteller bis zu drei RTPs verwenden) das Projekt einsetzt stehen in der Game.ini im Projektordner. Eins noch vorweg: Wir gehen fest davon aus, dass eine Game.ini existiert. Dass keine Datei mit diesem Namen im Projektordner liegt berücksichtigen wir nicht.

Eine typische Game.ini hat den folgenden Inhalt

Quoted from "Game.ini"

[Game]
Library=RGSS104E.dll
Scripts=Data\Scripts.rxdata
Title=Project Defender
RTP1=Standard
RTP2=
RTP3=


Kurzer Ausflug in die Welt der ini-Dateien. Eine Datei ist in einen oder mehrere Abschnitte aufgeteilt. Unsere ini-Datei hat nur einen Abschnitt namens "Game". In dem Abschnitt liegen mehrere Schlüssel-Wert-Paare. Links vom Gleichheitszeichen steht der Schlüssel. Rechts davon der Wert. Wir sehen das RTP2 und RTP3 leer sind und keine Werte haben. Das bedeutet, dass kein zweites und kein drittes RTP verwendet wird. Es wird nur ein RTP verwendet, nämlich das namens "Standard".

Der geübte Scripter hat sich sicher schon clevere Möglichkeiten in reinem Ruby überlegt, wie man jetzt diese Werte ausliest. Aber wir verwenden dafür eine Bibliothek und machen das nicht von Hand. In meinem Projekt setze ich bereits Qt ein und zufälligerweise stellt die Qt-Bibliothek bereits Funktionen bereit um Werte aus ini-Dateien auszulesen. Naja, wenn wir es eh schon drin haben, dann benutzen wir diese Funktionen natürlich auch.

Mit Qt::Settings eine ini-Datei auslesen
Die Klasse Qt::Settings ist dafür da, um Einstellungen die der User für eine Qt-Anwendung getätigt hat zu speichern, damit diese beim erneuten Programmstart wieder zur Verfügung stehen. Zu diesem Zweck kann es zufälligerweise ini-Dateien lesen und schreiben. Genau das was wir brauchen.

Schauen wir uns mal ein Codebeispiel an. Wir nehmen an, dass sich im aktuellen Ordner eine Game.ini-Datei befindet.

Ruby Source code

1
2
3
4
5
6
7
8
require 'Qt'
qt_ini_file = Qt::Settings.new( './Game.ini',
                                Qt::Settings::IniFormat)
rtp1 = qt_ini_file.value('Game/RTP1').toString
rtp2 = qt_ini_file.value('Game/RTP2').toString
rtp3 = qt_ini_file.value('Game/RTP3').toString
 
p( rtp1, rtp2, rtp3 )

Da der Computer nicht weiß, was für einen Datentyp wir erwarten - zum Beispiel, ob wir einen Text oder eine Zahl erwarten - müssen wir den abgefragten Wert explizit mit .toString in den gewünschten Datentyp umwandeln. In unserem Fall, möchten wir Text haben und keine Zahl.

Das war gar nicht so schwer, wenn man seine Werkzeuge kennt. Jetzt haben wir die bis zu drei RTPs, die verwendet werden. Jetzt kümmern wir uns darum, die Ordner mit den RTP-Ressourcen zu finden.

Die Registry auslesen
Wenn man sich ein RTP installiert, wird dieses bei Windows registriert. Das ist garnicht kompliziert. Man sagt Windows "Hey, wenn dich jemand nach dem RTP des RPG Makers fragt, sag demjenigen bitte diesen und jenen Dateipfad." Und Windows sagt: "Okay."

Für die Hacker unter euch, die jetzt den genauen Registrierungs-Schlüssel für das RTP haben wollen, der lautet:

Source code

1
HKEY_LOCAL_MACHINE\SOFTWARE\Enterbrain\RGSS\RTP


Ein RPG Maker Spiel kann jetzt also hingehen und sagen - oh, ich verwende das RTP namens "Standard" und Windows kann antworten: "Ja, das hat der Benutzer an Ort XY installiert."

Das macht unsere Anwendung jetzt auch. Wir lesen aus der Windowsregistry einen Wert aus. Dafür gibt es verschiedene Möglichkeiten, wir verwenden wieder Qt. Die Klasse Qt::Settings kann nämlich nicht nur ini-Dateien lesen sondern auch die Windowsregistry. Praktisch.

Ruby Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
require 'Qt'
#--------------------------------------------------------
# * Get Path to RTP from Registry
#--------------------------------------------------------
def get_rpgxp_rtp_path( rtp_name )
  common_key = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Enterbrain"
  rpgxp_subpath = "\\RGSS\\RTP"
  reg = Qt::Settings.new( common_key + rpgxp_subpath,
                          Qt::Settings::NativeFormat )
  return reg.value( rtp_name ).toString
end
#--------------------------------------------------------
#  Main
#--------------------------------------------------------
path = get_rpgxp_rtp_path( "Standard" )
print( path )


Man erkennt in Zeile 8 und 9 das bekannte Qt::Setting wieder. Diesmal wird aber keine ini-Datei, sondern das "native" Format verwendet. Native heißt in diesem Context, dass wir die Windowsregistry meinen. Das Programm gibt bei mir "C:\Programme\Gemeinsame Dateien\Enterbrain\RGSS\Standard" aus. Bei euch würde es den Pfad ausgeben, den ihr damals beim Installieren des RTPs angegen habt.

Und damit haben wir beide Aufgaben gelöst. Wir können jetzt die Lösungen zusammenführen und schon kann unsere Qt-Anwendung auch das in der Game.ini des Projekts spezifizierte RTP laden. Wir können jetzt also theoretisch eine Charset-Auswahl in "RPG Micky" einbauen. Spannend!

This article has been read 321 times.


Comments (1)

  • 1

    by Josey (Monday, October 23rd 2017, 11:58pm)

    Ich wusste tatsächlich gar nicht, dass man mehrere RTPs verwenden kann : D
    Was hat das überhaupt für Vorteile? Ist doch besser ein Game RTP-Unabhängig zu machen, damit es einfach anlaufen kann, wenn jemand zocken will.

    Das Ding findet jetzt also automatisch den Ort, an dem bei mir auf dem PC das RTP gespeichert ist, richtig?

Blog navigation

Next article

Playm träumt: Konfigurierbare Menüs

by Playm (Sunday, October 22nd 2017, 7:00am)

Previous article

Eine App schreiben, die RPG Maker Projekte öffnen kann

by Playm (Sunday, October 8th 2017, 5:10pm)