PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Marshal.load



WangXu
18.03.2009, 10:33
[GELÖST]
Was mache ich falsch, daß mir


objekt = File.open("./data/armors.rvdata", "rb") {|io| Marshal.load(io)}
print objekt

und

data = load_data("Data/armors.rvdata")
print data

nur

nil
#<RPG::Weapon:0x3581ff0>
#<RPG::Weapon:0x3581d80>
#<RPG::Weapon:0x3581cc0>
.
.
.

ausgibt, und nicht den gesamten Inhalt *.rvdata?

Gruß,
WangXu

Shining Advances
18.03.2009, 12:54
was stellst du dir denn unter gesammten inhalt vor?
das IST nämlich der gesammte inhalt.
ist nen array mit RPG::Weapon objekten (aba ka wieso weapon...wo du doch armors.rvdata lädst)

WangXu
18.03.2009, 13:08
Die Datei ist wahlweise austauschbar. Weapons hatte ich nur als letztes versucht zu laden. Der Array enthält neben dem was ich vorher zitiert habe noch eine ganze Reihe von Instanzvariablen, die der eigentliche Inhalt der *.rvdata sind.

Das ist der gesamte Inhalt.
#<RPG::Weapon:0x3a37d58>@agi0@critical_bonusfalse@descriptionA simple wooden club.@nameClub@dual_attackfalse@spi0@icon_index14@price40@fast_attackfalse@def0@hit95@animation_id19@two_handedfalse@atk0@note@state_set@element_set4@id1#<RPG::Weapon:0x3a37ae8>@agi0@critical_bonusfalse@descriptionA typical mass-produced longsword.@nameLong Sword@dual_attackfalse@spi0@icon_index2@price70@fast_attackfalse@def0@hit95@animation_id7@two_handedfalse@atk5@note@state_set@element_set2@id2#<RPG::Weapon:0x3a37a28>@agi0@critical_bonusfalse@descriptionA typical mass-produced spear.@nameLong Spear@dual_attackfalse@spi0@icon_index4@price110@fast_attackfalse@def0@hit95@animation_id13@two_handedtrue@atk6@note@state_set@element_set3@id3#<RPG::Weapon:0x3a37968>@agi0@critical_bonusfalse@descriptionA typical mass-produced bow.@nameLong Bow@dual_attackfalse@spi0@icon_index16@price220@fast_attackfalse@def0@hit97@animation_id13@two_handedtrue@atk8@note@state_set@element_set5@id4#<RPG::Weapon:0x3a378a8>@agi0@critical_bonusfalse@descriptionA whip made from strips of tanned animal skin.@nameLeather Whip@dual_attackfalse@spi0@icon_index12@price250@fast_attackfalse@def0@hit95@animation_id19@two_handedfalse@atk9@note@state_set@element_set6@id5#<RPG::Weapon:0x3a377e8>@agi0@critical_bonusfalse@descriptionAn ordinary broadsword.@nameBroad Sword@dual_attackfalse@spi0@icon_index2@price290@fast_attackfalse@def0@hit95@animation_id7@two_handedfalse@atk10@note@state_set@element_set2@id6#<RPG::Weapon:0x3a37728>@agi0@critical_bonusfalse@descriptionFighting claws made from steel.@nameIron Claw@dual_attackfalse@spi0@icon_index11@price350@fast_attackfalse@def0@hit95@animation_id1@two_handedtrue@atk10@note@state_set@element_set1@id7#<RPG::Weapon:0x3a37668>@agi0@critical_bonusfalse@descriptionA simple striking weapon made of metal.@nameMace@dual_attackfalse@spi0@icon_index18@price460@fast_attackfalse@def0@hit95@animation_id19@two_handedfalse@atk12@note@state_set@element_set4@id8#<RPG::Weapon:0x3a375a8>@agi0@critical_bonusfalse@descriptionA three-pronged weapon created from a farming tool.@nameTrident@dual_attackfalse@spi0@icon_index5@price670@fast_attackfalse@def0@hit95@animation_id13@two_handedtrue@atk15@note@state_set@element_set3@id9#<RPG::Weapon:0x3a374e8>@agi0@critical_bonusfalse@descriptionThis two-handed sword is rather easy to use.@nameBastard Sword@dual_attackfalse@spi0@icon_index2@price920@fast_attackfalse@def0@hit95@animation_id7@two_handedtrue@atk18@note@state_set@element_set2@id10#<RPG::Weapon:0x3a37428>@agi0@critical_bonusfalse@descriptionA bow made of reinforced animal sinews.@nameWrapped Bow@dual_attackfalse@spi0@icon_index16@price1200@fast_attackfalse@def0@hit97@animation_id13@two_handedtrue@atk20@note@state_set@element_set5@id11#<RPG::Weapon:0x3a37368>@agi0@critical_bonusfalse@descriptionAn ancestor of this battle axe was used for chopping wood.@nameBattle Axe@dual_attackfalse@spi0@icon_index6@price1700@fast_attackfalse@def0@hit95@animation_id7@two_handedfalse@atk22@note@state_set@element_set2@id12#<RPG::Weapon:0x3a372a8>@agi0@critical_bonusfalse@descriptionA two-handed sword made with an emphasis on cutting down enemies.@nameClaymore@dual_attackfalse@spi0@icon_index2@price2100@fast_attackfalse@def0@hit95@animation_id7@two_handedtrue@atk26@note@state_set@element_set2@id13#<RPG::Weapon:0x3a371e8>@agi0@critical_bonusfalse@descriptionThis spear can be used for both piercing and hitting enemies.@nameHalberd@dual_attackfalse@spi0@icon_index4@price2800@fast_attackfalse@def0@hit95@animation_id13@two_handedtrue@atk28@note@state_set@element_set23@id14#<RPG::Weapon:0x3a37128>@agi0@critical_bonusfalse@descriptionA striking weapon consisting of an iron ball attached to a rod with a length of chain.@nameFlail@dual_attackfalse@spi0@icon_index15@price3800@fast_attackfalse@def0@hit95@animation_id19@two_handedfalse@atk28@note@state_set@element_set4@id15#<RPG::Weapon:0x3a37068>@agi0@critical_bonusfalse@descriptionA two-handed sword with a blade that waves like a flame.@nameFlamberge@dual_attackfalse@spi0@icon_index2@price4700@fast_attackfalse@def0@hit95@animation_id7@two_handedtrue@atk34@note@state_set@element_set2@id16#<RPG::Weapon:0x3a36fa8>@agi0@critical_bonusfalse@descriptionA weapon that can shoot arrows more powerful than other bows.@nameCrossbow@dual_attackfalse@spi0@icon_index24@price6000@fast_attackfalse@def0@hit97@animation_id13@two_handedtrue@atk42@note@state_set@element_set5@id17#<RPG::Weapon:0x3a36ee8>@agi0@critical_bonusfalse@descriptionA mace with a spiked ball on its end.@nameMorning star@dual_attackfalse@spi0@icon_index18@price7800@fast_attackfalse@def0@hit95@animation_id19@two_handedfalse@atk44@note@state_set@element_set4@id18#<RPG::Weapon:0x3a36e28>@agi0@critical_bonusfalse@descriptionClaws made of the magical metal known as mithril silver.@nameMithril Claw@dual_attackfalse@spi0@icon_index11@price9000@fast_attackfalse@def0@hit95@animation_id1@two_handedtrue@atk50@note@state_set@element_set1@id19#<RPG::Weapon:0x3a36d68>@agi0@critical_bonusfalse@descriptionA spear made of the magical metal known as mithril silver.@nameMithril Spear@dual_attackfalse@spi0@icon_index4@price9900@fast_attackfalse@def0@hit95@animation_id13@two_handedtrue@atk56@note@state_set@element_set3@id20#<RPG::Weapon:0x3a36ca8>@agi0@critical_bonusfalse@descriptionA one-handed sword made of the magical metal known as mithril silver.@nameMithril Blade@dual_attackfalse@spi0@icon_index2@price12000@fast_attackfalse@def0@hit95@animation_id7@two_handedfalse@atk60@note@state_set@element_set2@id21#<RPG::Weapon:0x3a36be8>@agi0@critical_bonusfalse@descriptionA magic staff that emits a golden glow.@nameGolden Staff@dual_attackfalse@spi0@icon_index20@price16000@fast_attackfalse@def0@hit95@animation_id19@two_handedfalse@atk58@note@state_set@element_set@id22#<RPG::Weapon:0x3a36b28>@agi0@critical_bonusfalse@descriptionA powerful battle axe with a long handle.@nameGreat Axe@dual_attackfalse@spi0@icon_index6@price15000@fast_attackfalse@def0@hit95@animation_id7@two_handedfalse@atk68@note@state_set@element_set2@id23#<RPG::Weapon:0x3a36a68>@agi0@critical_bonusfalse@descriptionA more advanced and easier-to-use crossbow.@nameGreat Crossbow@dual_attackfalse@spi0@icon_index24@price20000@fast_attackfalse@def0@hit97@animation_id13@two_handedtrue@atk76@note@state_set@element_set5@id24#<RPG::Weapon:0x3a369a8>@agi0@critical_bonusfalse@descriptionThe magic encased in this staff generates powerful shockwaves.@nameWizard Rod@dual_attackfalse@spi0@icon_index21@price25000@fast_attackfalse@def0@hit95@animation_id19@two_handedfalse@atk77@note@state_set@element_set@id25#<RPG::Weapon:0x3a368e8>@agi0@critical_bonusfalse@descriptionA whip made from dragon whiskers.@nameDragon Whip@dual_attackfalse@spi0@icon_index12@price22000@fast_attackfalse@def0@hit95@animation_id19@two_handedfalse@atk85@note@state_set@element_set6@id26#<RPG::Weapon:0x3a36828>@agi0@critical_bonusfalse@descriptionA spear made from dragon scales.@nameDragon Spear@dual_attackfalse@spi0@icon_index4@price24000@fast_attackfalse@def0@hit95@animation_id13@two_handedtrue@atk90@note@state_set@element_set3@id27#<RPG::Weapon:0x3a36768>@agi0@critical_bonusfalse@descriptionA martial artist's weapon made from dragon claws.@nameDragon Claw@dual_attackfalse@spi0@icon_index11@price28000@fast_attackfalse@def0@hit95@animation_id1@two_handedtrue@atk92@note@state_set@element_set1@id28#<RPG::Weapon:0x3a366a8>@agi0@critical_bonusfalse@descriptionA one-handed sword made from dragon scales.@nameDragon Sword@dual_attackfalse@spi0@icon_index2@price30000@fast_attackfalse@def0@hit95@animation_id7@two_handedfalse@atk100@note@state_set@element_set2@id29#<RPG::Weapon:0x3a365e8>@agi0@critical_bonusfalse@descriptionA legendary sword that only a true hero can wield.@nameKing's Sword@dual_attackfalse@spi0@icon_index26@price65000@fast_attackfalse@def0@hit95@animation_id7@two_handedfalse@atk120@note@state_set@element_set2@id30#<RPG::Weapon:0x3a36528>@critical_bonusfalse@agi0@description@dual_attackfalse@name@spi0@icon_index0@fast_attackfalse@price0@def0@hit95@animation_id0@two_handedfalse@atk0@note@state_set@element_set@id31#<RPG::Weapon:0x3a36468>@critical_bonusfalse@agi0@descriptionStandard 10mm semi-auto pistol@dual_attackfalse@nameFEN 603@spi0@icon_index27@fast_attackfalse@price650@def0@hit95@animation_id5@two_handedfalse@atk0@note@state_set@element_set@id32#<RPG::Weapon:0x3a363a8>@critical_bonusfalse@agi0@description@dual_attackfalse@name@spi0@icon_index0@fast_attackfalse@price0@def0@hit95@animation_id0@two_handedfalse@atk0@note@state_set@element_set@id33#<RPG::Weapon:0x3a362e8>@critical_bonusfalse@agi0@description@dual_attackfalse@name@spi0@icon_index0@fast_attackfalse@price0@def0@hit95@animation_id0@two_handedfalse@atk0@note@state_set@element_set@id34#<RPG::Weapon:0x3a36228>@critical_bonusfalse@agi0@description@dual_attackfalse@name@spi0@icon_index0@fast_attackfalse@price0@def0@hit95@animation_id0@two_handedfalse@atk0@note@state_set@element_set@id35

Manchmal druckt mir der print Befehl dies aus und manchmal das, was ich vorher schrieb. Ich möchte verstehen, was den Unterschied macht, daß einmal dies und einmal das andere ausgegben wird.

Gruß,
WangXu

Shining Advances
18.03.2009, 13:37
das is recht einfach.
es gibt 2 versionen von print
einmal eben print und die andere ist p
bei

p $data_weapons
bekommst du diese ausfürliche ausgabe mit objekten und deren variablen während

print $data_weapons nur die objekte ausgibt.

WangXu
18.03.2009, 14:26
Jetzt sage mir bitte noch, wie ich das übersehen konnte... :confused:

Ich dachte, daß der Unterschied zwischen p und print nur darin
läge, die Anführungszeichen bei Strings zu verbergen oder anzuzeigen.
Wieder was gelernt.

Danke und Gruß,
WangXu

-KD-
18.03.2009, 18:52
Bei print werden Objekte mit der to_s Methode in Strings umgewandelt. Diese Methode soll möglichst "schöne" Strings erzeugen.
Bei p werden Objekte mit der inspect Methode in Strings umgewandelt. Diese Methode soll möglichst "informative" Strings erzeugen.

p ist zum debuggen da. print soll für Bildschirmausgaben sein. Da es im Maker keine Bildschirmausgaben gibt (gibt ja kein Konsolenfenster) ist die normale print Methode eigentlich sinnlos. Die kommt erst wieder zum Tragen, wenn man nicht auf dem Bildschirm eine Ausgabe machen will, sondern in eine Datei.

WangXu
18.03.2009, 20:46
Verstehe. Danke für die Vertiefung.

Ach ja: wie kann ich den ausführlichen Inhalt der rvdata in einer Textdatei ablegen? Ich habe es bisher nur immer wieder geschafft die objekte ohne die
Variablen zu übertragen. Nach dem was du gerade schriebst nehme ich an mit der inspect Methode?

Gruß,
WangXu

Edit: Update des Problems: Ich habe per Ruby den Inhalt auslesen und anschließend in einer Textdatei ablegen können. Wie leite ich Ruby dazu an das *.txt in UTF-8 zu kodieren?

-KD-
19.03.2009, 16:01
Hm, eigentlich müsste das schon in UTF8 kodiert sein.

Leider ist die alte Ruby 1.8 Version noch nicht in der Lage, selbstständig Strings in verschiedene Kodierungen hin und her zu konvertieren. Mit der neuen Ruby 1.9 geht das, aber die verwendet der Maker nicht.

So schert sich Ruby nicht um die Kodierung und verwendet die Kodierung, die auch für im Programmtext verwendet wird. Und das ist im Maker afair schon UTF8.

WangXu
20.03.2009, 00:50
Scheint leider nicht so zu sein. Selbst wenn ich die Datei vorher manuell in UTF-8 Kodierung speichere und dann die Daten reinschreibe wird wieder eine ANSI draus. Es gibt wohl eine Lösung (character-encodings von Nikolai Weibull), aber wenn ich versuche den gem zu installieren, bekomme ich einen buffer error. :(
Die andere Methode, die ich mir aber noch genauer ansehen muss, ist iconv.

So viel zu tun und so wenig Zeit...

Gruß,
WangXu

-KD-
20.03.2009, 02:16
Unter Windows? Das kennt iconv afair nicht einmal. d.h. du müsstest es erst auf Windows installieren, und das ist vom Maker aus nicht möglich. Der kann nämlich leider keine C-Extensions einbinden.

Aber nochmal: Meines Wissens sind alle Strings im Maker im UTF8 Format. Beim Serialisieren dürfte sich da nichts dran ändern. Solltest du vorher mit save_data gearbeitet haben, kannst du ja mal die Lösung mit Marshal.dump ausprobieren. Afair speichert save_data den Datenstrom im binären Format ab. Ich weiß aber nicht was das bedeutet. Dieser komische Binärkram ist (mal wieder) eine Windowseigenheit.

WangXu
20.03.2009, 19:36
Ich werde das mal ausprobieren und dann die Ergebnisse posten.

Gruß,
WangXu

Edit:
Also: ich habe jetzt alle Kombinationen ausprobiert, die mir eingefallen sind. Aber leider kommt immer der gleiche
Datenschrott dabei raus.
Ich arbeite übrigens parallel mit dem Maker und Ruby. Wenn ich also mit Ruby eine Möglichkeit finde eine lesbare Textdatei zu erzeugen kann ich die damit auch wieder in das rvdata Format konvertieren. (scite erkennt zumindest, daß es sich um utf-8 handelt, kann die Zeichen aber nicht darstellen; schreddert mir aber nicht sofort die Daten, sondern erst, wenn sie in das Textfile geschrieben werden.)

The_Burrito
23.03.2009, 20:29
Nur damit ich das richtig verstehe. Du willst mit Marshal.dump ein Objekt in eine Datei schreiben, und diese dann mit einem Texteditor auslesen?

WangXu
24.03.2009, 09:52
Genau. Bzw. die Langform: Ich möchte den Inhalt der rvdata in eine Textdatei verfrachten, dort editieren und wieder in eine rvdata zurück konvertieren können. Dieser Aufwand dient dazu eine zusätzliche rvdata einzubinden, die Informationen für eine zusätzliche Ausrüstungskategorie enthalten soll, die ich separat ansteuern kann.

Gruß,
WangXu

The_Burrito
24.03.2009, 20:30
Dann bringt dir Marshal.dump rein gar nichts. Marshal.dump ist dafür da, Objekte in einen Datenstrom zu speichern, um sie z.B. in einer Datei abzuspeichern oder übers Netzwerk zu verschicken. Der Sinn dahinter war nie, das ganze in einer für Menschen lesbaren Form darzustellen.
Um das zu erreichen müsstest du die Objekte schon selber in ein Format wie csv oder xml bringen, und sie dann abspeichern und wieder auslesen.

WangXu
24.03.2009, 21:37
*argh* man soll keine fünf Sachen gleichzeitig tun. Genau anders herum wäre richtig gewesen: Mit Marshal.load die Objekte aus dem Datenstrom herauslesen und in eine Textdatei speichern. Editieren und wieder dumpen.
Kannst du mir unter dieser Prämisse weiterhelfen?

Gruß,
WangXu

The_Burrito
25.03.2009, 10:14
Ich hab mir mal für mein eigenes Projekt eine Klasse geschrieben mit der ich Daten aus einer Datei lesen kann, da ich selber ein paar zusätzliche Stats für Items und Ausrüstung gebraucht habe.



class ValueReader
def initialize(filename, delimiter = $;)
@filename = filename
@delimiter = delimiter
end

def read
File.open(@filename) do |file|
lines = file.readlines.select{|line| line.strip.size > 0 && line.lstrip[0, 1] != '#'}
lines.each do |line|
values = line.strip.split(@delimiter)
values.each {|v| v.strip!}
yield values
end
end
rescue Exception => ex
print ex.message
end
end


Die read Methode geht dabei alle Zeilen einer Klasse durch, die nicht leer sind, oder nicht # als erstes Zeichen, welches kein Leerzeichen ist, enthält, und gibt sie an einen Block weiter.

Angenommen du hast nun ein zusätzliches Stat für Waffen, namens stat1, in deinem Spiel, könnte die Verwendung in etwa so aussehen:



vr = ValueReader.new('dateiname')
vr.read {|id, stat1| $data_weapons[id].stat1 = stat1}


Dazu bräuchtest du dann nur eine Datei, welche pro Zeile eine Waffe enthält, und jeweils ID und den Wert von Stat1 durch ein Whitespace getrennt beinhaltet. Das Trennzeichen kann man auch im Konstruktor als 2. Parameter bestimmen.
Natürlich sind auch mehr als nur 2 Werte möglich.
Das ist zwar nicht ganz, das was du wolltest, aber die Notwendigkeit alle Stats in eine Datei zu schreiben, nur um ein paar davon zu ändern, sehe ich eigentlich eh nicht wirklich.

WangXu
27.03.2009, 17:58
Danke. Ich werde mir das, wenn ich wieder etwas freie Zeit habe mal genauer anschauen.

Gruß,
WangXu