Ich hab mir gedacht, dass es langsam Zeit wird auch mal ein Script zu veröffentlichen =P Mein Scriptordner ist voll von irgendwelchen Scripten, die ich auf Anfragen im Rubyforum geschrieben hab. Allerdings ist keines in einem Zustand, den ich als fertig ausgearbeitetes Script bezeichnen würde. Also hab ich meinen Scriptordner nach dem erstbesten, vielversprechenden Script durchsucht und es etwas ausgebessert.
Was kann er?
Der Ressourcenzähler kann nach Ressourcen innerhalb eines Projektes suchen. Er kann nach importierten Ressourcen Ausschau halten, aber er stellt auch fest, welche Ressourcen aus dem RTP stammen, welche Ressourcen genutzt werden und welche ungenutzt im Projektordner vergammeln. Gerade letzteres stellt die Hauptfunktion des Scriptes dar. Es kommt oft genug vor, dass man neue Grafiken oder Musikdateien importiert, die man am Ende aber gar nicht verwendet. Dadurch bläht sich das Projekt auf, was den armen Modemnutzern nachher auf die Füße fällt.
Der Ressourcenzähler kann überprüfen, ob es im Projekt ungenutzte Ressourcen gibt und diese aus dem Projekt entfernen. Dies geschieht, in dem er alle Mapdateien und die Database genau analysiert.
Neben dieser Hauptfunktion beherrscht der Ressourcenzähler noch einige weitere Features. Er kann Logdateien erzeugen und so eine genaue Übersicht über die verwendeten Ressourcen geben. Er kann aber auch Ressourcen von einem Projekt ins andere kopieren oder verschieben. Er kann die Dateigröße eurer Ressourcen feststellen und vieles mehr.
Der Ressourcenzähler bietet ein umfangreiches Management über eure Ressourcen. Weitere denkbare Anwendungsgebiete wären beispielsweise, diejenigen Ressourcen aus dem RTP ins eigene Projekt zu kopieren, die das Projekt verwendet (auf diese Weise wird das Projekt unabhängig von RTP-Grafiken/Sounddateien).
Was kann er nicht?
Der Ressourcenzähler kann Ressourcen, die Umlaute enthalten, nicht erkennen. Er hat desweiteren Probleme wenn ein Projekt in einem Pfad, der Umlaute enthält, liegt. Diese Einschränkungen hab ich ~16 Stunden lang zu umgehen versucht (klappte auch teilweise. Nur mit dem Pfad, dass hab ich net hingekriegt), bis ich aufgegeben habe. Meines Erachtens sollte man Dateien/Ordnern keine Umlaute als Namen geben. Das führt spätestens dann zu Problemen, wenn sie von Ausländern genutzt werden (ich wollte mal ein polnisches Rm2k Spiel spielen - keine Chance! Es ließ sich wegen den Sonderzeichen nicht ausführen). Aus dem Grund gilt: Entweder ihr lasst eure Umlaute weg, oder ihr könnt das Script nicht nutzen.
Wie verwendet man ihn, ohne Rubykenntnisse zu haben?
Das Script besteht aus zwei Teilen, die nacheinander in ein leeres Script an eine belebige Stelle des Scripteditors eingefügt werden müssen. Wichtig ist nur, dass der erste Teil über dem Zweiten eingefügt wird.
Um das Script zu starten, ruft man in einem CallRubyScript die Codezeile
auf. Daraufhin werden die grundlegensten Funktionen des Scriptes in eurem Projekt ausgeführt. Diese sind:
Loggen aller verwendeten Ressourcen
Loggen aller importierten, aber ungenutzten Ressourcen
Verschieben der ungenutzten Ressourcen in einen externen Ordner
(Anmerkung: Das Script löscht grundsätzlich keine Dateien. Aus dem Grund werden ungenutzte Dateien nur verschoben. Sie können dann manuell gelöscht werden. Dies ist aus Sicherheitsgründen, damit niemand versehentlich seine Dateien löscht)
Wer diese Features noch konfigurieren will, kann das im zweiten Teil des Scriptes tun. Dort gibt es weit oben eine Sektion, welche die Überschrift "Konstanten" hat. Dort stehen verschiedene Konstanten und deren Wert. Alles was unter "#Konstanten für den Automatik-Vorgang" steht kann verändert werden.
LOGGEN wenn man true hinschreibt, werden die genutzten Ressourcen geloggt. Will man dies nicht, so schreibt man false hin.
MULTI_FILE Schreibt man hier true hin, dann wird für jeden Ressourcentyp (Picture, BGM, Characters usw.) eine eigene Textdatei angelegt. Dies ist nur zu empfehlen, wenn man wirklich sehr viele Ressourcen im Projektordner hat. Ansonsten schreibt man false hin.
LOG_UNUSED Hier wird festgelegt, ob ungenutzte Ressourcen geloggt werden sollen. true für ja, false für nein.
LOESCHEN wenn hier true steht, werden ungenutzte Ressourcen in einen Lösch-Ordner verschoben. Ansonsten false,
EXIT Wenn hier true steht, wird das Programm nach Ausführen des Ressourcenscriptes beendet. Ansonsten false.
LOG_ORDNER Hier schreibt man in Anführungszeichen den Ordnernamen des Ordners, wo die Logdateien der genutzten Ressourcen rein sollen.
UNUSEDNAME Das gleiche nochmal, nur für die ungenutzten Dateien.
Man kann auch die Standard-Einstellungen lassen. Diese loggt alles in eine Textdatei und verschiebt keine Ressourcen.
Wie verwendet man ihn, mit einfachen Rubykenntnissen?
Der Automatik-Vorgang dient nur dazu, ohne Scherereien die grundlegenden Funktionen des Scriptes nutzen zu können. Wer das Script aber weitreichender nutzen will, sollte zumindest einige wenige Rubykenntnisse haben, oder wenigstens etwas Gefühl für das Scripten.
Erzeugen eines Ressourcenobjektes:
Als erstes erzeugt man ein Ressourcenobjekt über die new Methode oder über Konstruktoren.
Damit erzeugt man ein leeres Ressourcenobjekt im Projektordner. Da man mit einem leeren Ressourcenobjekt wenig anfangen kann, ist es sinnvoll gleich einige Konstruktormethoden zu nutzen. Alle Methoden die innerhalb der Sektion "Konstruktormethoden" stehen, kann man nutzen. Es gibt folgende zur Auswahl:
genutzte_ressourcen --> Erzeugt ein Ressourcenobjekt aus allen Ressourcen, die man benutzt hat (auch genutzte RTP-Dateien)
importierte_ressourcen --> Erzeugt ein Ressourcenobjekt aus allen Ressourcen, die im Projektordner vorkommen (ohne RTP)
ungenutzte_ressourcen --> Erzeugt ein Ressourcenobjekt aus allen Ressourcen, die sich im Projektordner befinden, im Spiel aber keine Verwendung finden
Die weiteren Konstruktoren finden seltener Gebrauch, daher zähl ich sie nur kurz auf. durchsuche_map(pfad_zur_map) sucht nach Ressourcen, die innerhalb einer Map (mitsamt ihren Events) genutzt werden. durchsuche_maps sucht in allen Maps. durchsuche_database zählt alle Ressourcen auf, die in der Database festgelegt sind und noch einige andere, die man selbst im Script nachlesen kann (die aber eher für interne Funktionen genutzt werden).
Man kann desweiteren als Parameter den Projektpfad angeben. So ist es möglich, auch die Ressourcen anderer Projekte aufzusuchen oder sogar das RTP zu durchsuchen.
Wird kein Projektpfad angegeben, so wird automatisch das Projekt, in dem das Script ausgeführt wird, verwendet.
Bearbeiten eines Ressourcenobjektes:
Man kann Konstruktoren auch nutzen, um bestehende Ressourcendateien zu erweitern.
(In diesem Fall hätte man ein Ressourcenobjekt, welches alle Ressourcen der Maps 2 und 5 enthält)
Neue Ressourcen lassen sich auch manuell hinzufügen (was aber nicht empfohlen wird!). Hierfür nutzt man die Syntax ressourcenobjekt.ressourcentyp.add(dateiname)
Genauso lassen sich auch Ressourcen wieder entfernen, mit delete.
Man kann Ressourcenobjekte untereinander addieren (concat), subtrahieren (drop) und gemeinsame Dateien erfassen (compare).
In Zeile drei haben wir ein neues Ressourcenobjekt erzeugt, welches aus den Ressourcen besteht, die sowohl im Projekt, als auch in der RTP vorkommen. In Zeile 4 haben wir alle Ressourcen aus dem RTP aus unseren Projektressourcen entfernt (nützlich zum Loggen, damit man weiß, welche Ressourcen auch wirklich importiert und genutzt werden).
Abfragen von Daten eines Ressourcenobjektes:
Mit ressourcenobjekt.typ kann man alle Dateien eines typs auslesen. Mit ressourcen.metaordner lassen sich alle Ressourcen eines Metaordners auslesen. Hierzu muss gesagt werden, dass Typen im Script die Unterordner (Pictures, BGM, Titles usw.) sind. Metaordner sind die Oberordner wie Graphics und Audio.
Mit ressourcen.printable_size wird die Dateigröße aller Ressourcen als String ausgegeben. Will man nur einen bestimmten Ressourcentyp haben, gibt man diesen als Parameter an.
Anmerkung: Viele Abfragemethoden lassen sich nur für Ressourcen nutzen, die sich auch wirklich im Projektordner befinden. RTP-Dateien beispielsweise sind davon nicht betroffen und werden einfach ignoriert. Will man auch die Dateigröße verwendeter RTP-Dateien überprüfen, kann man die bereits besprochenen Hilfsmittel nutzen:
Will man den Dateipfad einer Datei haben, nutzt man die Path Methode.
Der Ressourcenzähler nutzt den Mixin Enumerable und ist daher in der Lage, seine Elemente zu iterieren/sortieren etc. Eine Besonderheit ist, dass man der each-Methode als Parameter einen Metaordner oder Typ zuweisen kann, um nur bestimmte Elemente zu iterieren. Kopieren/Verschieben und Loggen von Daten eines Ressourcenobjektes:
Jetzt wirds wieder interessant =P
Mit den Methoden verschiebe und kopiere kann man Ressourcen zwischen Projekten austauschen. Als Parameter gibt man den Zielpfad an.
Auf diese Weise lassen sich alle RTP-Dateien, die man im Projekt nutzt, ins Projekt kopieren.
Anmerkung: Mit root ruft man den Projektordner des Ressourcenobjektes auf
Verschieben funktioniert praktisch identisch (wird aber sicherlich seltener gebraucht).
Mit loggen und loggen_one kann man Logdateien für ein Ressourcenobjekt erstellen. loggen erstellt für jeden Typ eine eigene Textdatei, loggen_one schreibt alles in eine Textdatei.
Schreibt eine Textdatei, die alle Ressourcen des RTPs enthält.
Erweitern des Ressourcenzählers:
Der Ressourcenzähler ist so geschrieben, dass er sioch problemlos erweitern lässt. Solltet ihr also andere Rubyscripte einfügen, welche euch neue Datentypen ermöglichen, so lässt sich der Ressourcenzähler entsprechend anpassen.
In der Sektion "Erzeugt Dateiendungen" kann man neue Dateiendungen hinzufügen. Dies funktioniert über die Syntax
Untere Zeile ermöglicht z.B. dem Script, auch gif-Dateien für Animations zuzulassen. Für typ kann auch ein Metaordner angegeben werden.
Neue Metaordner lassen sich bei Attribute erstellen:
Wäre beispielsweise der Code, um ein Metaordner "Movie" mit den unterordnern "intro", "outro" und "cutscenes" hinzuzufügen.
Neue Metaordner müssen über der Zeile "TYPEN = METADIRECTORY.values.flatten" festgelegt werden!
Natürlich kann die Methode genutzte_ressourcen nicht feststellen, ob ihr irgendwelche Videodateien in eurem Projekt benutzt. Ihr könnt das Script aber entsprechend erweitern.
Die Methode durchsuche_script überprüft die Call-Script Befehle. Die Methode durchsuche_message durchsucht die Show Text Befehle und durchsuche_comment durchsucht die Kommentare in euren Events.
Beispiel für das UMS (Universal Message System):
Das Universal-Message System nutzt Facesets (die aber als Picture importiert werden). In den Messages werden Facesets mit dem Befehl
angezeigt. Daher schreibt man die durchsuche_message Methode um:
Man kann das Faceset aber auch über ein CallScript ändern, mit $game_system.face_graphic = "t1_11"
Daher ändert man auch noch die Methode durchsuche_script
Wer Probleme damit hat, das Script an andere Scripte anzupassen, kann mir auch eine PM schreiben.
Credits
Normalerweise nutzt der Autor eines Makerspiels dieses Script, nicht der Spieler. Daher kann ich eh nicht nachprüfen, wer das Script benutzt hat. Im Grunde genommen ist es mir auch nicht so wichtig. Ich freue mich, wenn es Makerer gibt, denen das Script gefällt. Ob sie das über einen Creditseintrag, oder einen Post in diesem Thread zum Ausdruck bringen, ist mir eigentlich relativ egal ^^
Nun aber zum eigentlichen Script. Da es nicht unwahrscheinlich ist, dass ich einige Fehler übersehen habe, würde ich mich freuen wenn Bugs mitsamt Fehlermeldung und Codezeile gepostet werden.
1. !!!
Gutes Skript, auch wenn ich den Zweck nicht verstanden habe!
Ich würde sowieso nur die beiden Großskripte verwenden, denn es ist ziemlich mühsam, die schlappen 10 Einzelteile an verschiedenen Stellen einzufügen!
Die Einzelteile sind nur Beispiele wie man das Script verwendet. Das eigentliche Script sind die beiden unteren Codeblöcke im zweiten Post.
Der Zweck: Das Script durchsucht dein Projekt nach Dateien, die nicht verwendet werden. Beispielsweise du hast 40 Character-Sets importiert, in deinem Projekt werden aber nur 30 verschiedene genutzt. Dann befinden sich 10 Character-Dateien in deinen Projektordner, die überhaupt nicht gebraucht werden, aber 'ne Menge Platz wegnehmen (okay, bei Characters ist das wohl weniger gravierend. Anders dagegen bei Mp3-Dateien). Wenn du das Script einsetzt (und bei löschen true angibst) werden diese überflüssigen Dateien aus deinem Projekt entfernt.
Ansonsten kann das Projekt noch einige andere Sachen machen, beispielsweise kannst du alle Ressourcen von einem Projekt in ein anderes kopieren. Oder du kannst auch alle RTP-Dateien, die dein Projekt verwendet, in dein Projekt kopieren, um es unabhängig von der RTP zu machen usw.
Sieht sehr vielversprechend aus, werds auf jeden fall benutzen... bei dem Chaos das in meinem Projekt herrscht, mit den ganzen vergammelnden zeug in meinem Makerchaos... und so...
Sehr schönes Script und soweit ich dass auf den ersten Blick beurteilen kann ist es sehr aufgeräumt und gut kommentiert.
Ich werde es auf jeden Fall benutzen. Danke dir vielmals für diese gelungene Arbeit.