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