RPG-Maker Quartier

Hier dreht sich alles um die RPG-Maker-Reihe von ASCII/Enterbrain. Der RPG-Maker ist ein Tool, mit dem du dir dein eigenes kleines Rollenspiel erstellen kannst. Du findest hier alles, was du dazu brauchst. Aber natürlich umfasst die Community noch mehr!
Aktuelle Zeit: Fr Sep 20, 2019 20:27

Alle Zeiten sind UTC + 1 Stunde



Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht

 Betreff des Beitrags: Skript zum Text auslesen
BeitragVerfasst: Sa Jun 05, 2010 2:45 
Zitat:
"...solltest du besser auf deine Rechtschreibung Achten."

"Der einzige Grund, sich dieses Spiel zu laden, ist, sich über die schlechte Rechtschreibung kaputt zu lachen."

"Entweder du arbeitest also an Rechtschreibung ..., oder du wirst nur sehr wenige Spieler ... bekommen,"

Wer es vermeiden will, solche oder ähnliche Sätze zu seinem Spiel zu hören, muss entweder den Duden gefressen haben oder seine Texte einer Rechtschreibprüfung unterziehen.
Da bei größeren Projekten oftmals in die Dialoge hinein editiert werden muss, und nicht jeder Lust hat auch den kleinsten Text-Fusel per copy-past hin und herzuschicken, für den hab ich vielleicht eine akzeptable Lösung parat.

Version: 1.0

Das Skript liest alle Texte, aller Events auf allen Maps aus und kopiert sie in eine einzige Text-Datei.
Eine Funktion zum wieder einlesen fehlt noch, trage ich evtl. nach, wenn ich wieder Zeit und Lust hab.

Code:
class Textreader
  def self.get_map_name(id)
    # füge fehlende Nullen hinzu
    str = id.to_s
    while str.size < 3
      str.insert(0, "0")
    end
    return ("Data/Map" + str + ".rxdata")
  end
  def self.read_all_text
    mapinfo = load_data("Data/Mapinfos.rxdata")
    file = File.open("Game-Text.txt", "w")
    text = "" # additiver Text
    for i in 1..mapinfo.size
      map_name = get_map_name(i)
      map = load_data(map_name)
      file.write("\n---------- " + mapinfo[i].name + ": ----------\n")
      for ev in map.events.values
        text = "\n-" + ev.name + ":\n"
        for p in ev.pages
          for c in p.list
            # Code enthält Text
            if c.code == 101 or c.code == 401
              file.write(text + c.parameters[0] + "\n")
              text = ""
            end
            if c.code == 102 # Choise
              file.write(text + "-Auswahl:\n")
              for j in 0..c.parameters[0].size - 1
                file.write((j+1).to_s + ". " + c.parameters[0][j] + "\n")
                text = ""
              end
            end
          end
        end
      end
    end
    file.close
  end
end


Funktion:
Folgenden Code am besten in oder über der Main-Funktion einfügen. Auf jeden Fall unter dem Skript.
Code:
Textreader.read_all_text


Anschließend sollte im Game-Ordner eine Datei namens "Game-Text.txt" vorhanden sein.


Nach oben
  
Mit Zitat antworten  
Offline
Official Oldschool
Official Oldschool
Benutzeravatar
Beiträge: 8917
Alter: 30
Wohnort: BRD, Thüringen
 Betreff des Beitrags: Re: Skript zum Text auslesen
BeitragVerfasst: Sa Jun 05, 2010 13:45 
TheWhiteShadow hat geschrieben:
Eine Funktion zum wieder einlesen fehlt noch, trage ich evtl. nach, wenn ich wieder Zeit und Lust hab.
Das ist die eigentlich schwierige Sache. Denn im schlimmsten Fall ändert der Spieler sein Projekt zwischendurch noch, so dass die ausgelesenen Texte nicht mehr aktuell sind. Dann wird das mergen eine extrem schwierige Aufgabe. Einfacher wäre es sicherlich, man untersagt dies dem Spieler einfach. Aber auch dann kann es zu Problemen kommen. Wenn der Spieler z.B. einen Text ausbessert und dieser dadurch länger wird, passt er nicht mehr in eine Textmessage rein. Wenn man dann noch ein Messagesystem wie UMS oder Hermes nutzt, in dem am Anfang der Textnachricht Steuerzeichen für die komplette Message eingebracht werden, so darf man ja nicht mal einfach eine neue Message einfügen. Selbiges gilt auch, wenn man z.B. Choices und Messages zusammenbringen will. Ich denke mal das wird noch recht aufwendig das umzusetzen.

Aber schöne Sache, das du dich diesem Problem annimmst.

Vielleicht noch ein paar Anmerkungen zum Code:

Code:
str = id.to_s
while str.size < 3
   str.insert(0, "0")
end

Es gibt eine Methode zum Formatieren von Strings und Daten (Integers, Floats, Strings etc.). Damit kannst du so Sachen wie führende 0en, Anzahl der Vor- und Nachkommastellen usw. festlegen.
Code:
str = "Data/Map%03d.rxdata" % id
#oder (macht dasselbe)
str = sprintf("Data/Map%03d.rxdata", id)

Das %03d bedeutet:
% => Beginn eines Datenelements
0 => soll führende 0en haben
3 => soll 3 Ziffern lang sein
d => ist eine Integerzahl

Für eine genauere Dokumentation für diese Funktion, kannst du dir die RubyDoc anschauen.

sprintf ist eine sehr nützliche Funktion. In diesem Fall hast du sie mit der While-Schleife ja geschickt ersetzt, aber bei komplexeren Ausgaben (z.B. der Gestaltung einer Tabelle in Textform) ist diese Funktion unerlässlich. Sie ist auf jeden Fall mal einen Blick wert.

Code:
file = File.open("Game-Text.txt", "w")
...
file.close

Ist unüblich in Ruby und manchmal auch etwas "gefährlich". Wenn innerhalb deines Codes plötzlich ein Fehler auftritt, wird der Code abgebrochen und es kommt nie zum Ausführen von file.close. Das ist in vielen Fällen nicht schlimm, weil am Ende des Programms alle geöffneten Dateien vom Betriebssystem wieder geschlossen werden. Aber falls du die Exception abfängst und das Programm wieder weiterläuft, bleibt die Datei bis zum Ende des Programms geöffnet. Mit der Konsequenz das du sie kein zweites Mal zum Schreiben öffnen kannst.

Was man stattdessen macht ist folgendes:
Code:
File.open("Game-Text.txt", "w") do |file|
  ...
end

Jetzt kannst du normal das file beschreiben, ohne die Gefahr, dass das File evtl. nicht geschlossen wird. Es wird IMMER geschlossen. Selbst wenn in deinem Code es zum Absturz kommt.

Auch hier wieder: Ist kein Fehler, du kannst es auch so lassen wie du es gemacht hast. Es ist halt nur sauberer.

Code:
file.write(text + "-Auswahl:\n")

Es gibt in IO auch die Methoden print (macht dasselbe wie write) und puts (macht dasselbe wie print(s + "\n")). Letzteres könntest du hier nutzen und dir dadurch das "\n" am Ende sparen. Statt einString + einAndererString kannst du die etwas schnellere Schreibweise "#{einString}-Auswahl:" nutzen.
Code:
file.puts("#{text}-Auswahl:")



Code:
file.write(text + "-Auswahl:\n")
for j in 0..c.parameters[0].size - 1
  file.write((j+1).to_s + ". " + c.parameters[0][j] + "\n")
  text = ""
end

For-Schleifen sind in Ruby auch unüblich. Ich würde jedem raten keine For-Schleifen in Ruby zu verwenden, aber da gibts auch viele gegensätzliche Meinungen. In dem Fall finde ich folgendes hübscher:
Code:
file.puts("#{text}-Auswahl:")
text= ""
parameters[0].each_with_index do |choice, index|
  file.puts "#{index}. #{choice}"
end

_________________


Nach oben
 Profil ICQ  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de