PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zerstörte Fork



Stoep
16.12.2007, 20:36
Hi,
also heute habe ich mich mal wieder grün und blau geärgert mit meinem
RPG-Maker 2000. Aus irgendeinem Grund hatte ich in meinem Menü
plötzlich einen gravierenden Fehler ohne wirklich zu wissen woher dieser
stammen könnte. Erst nach Stunden des herumprobierens habe ich mich
dann mal dazu durchgerungen den ewig langen Code von oben bis unten
genaustens zu inspizieren. Dabei bin ich auf folgende Kuriosität gestoßen:

http://mitglied.lycos.de/stoepdreipunkte/Fork-Screen-1.png

Dem ein oder anderen erfahrenen Makerer wird hier sofort auffallen, dass
eigentlich der Gesamte Inhalt einer Fork-Case blau dargestellt werden
sollte wenn man diese mit der Maus anklickt. Bei mir war das an dieser
Stelle aus irgendeinem Grund nicht der Fall. Das selbe hatte ich auch bei
drei weiteren Forks direkt über dieser.

http://mitglied.lycos.de/stoepdreipunkte/Fork-Screen-2.png

Etwas weiter unten dann dieser Befehl. Den Befehl "Do Nothing" kannte ich
bis dato garnicht O_o

So wie es ausieht hat der Maker wohl einfach meine Fork "zerlegt". Ich habe
die "befallenen" Forks dann "einfach" gelöscht und sie nochmal neu erstellt.
Das Problem ist jetzt zwar wieder behoben aber dennoch würde ich gerne
wissen wie es zu solch einem Fehler kommen kann?

Kennt jemand das Problem? Weiß einer wo es herkommt oder was ich
schlimmes angestellt habe das mir das passiert?

Gruß
Stoep

Greyce
16.12.2007, 21:32
Könntest du uns sagen welche Version des RM2k du nutzt?
Gibt ja einige davon.

Sowas ist mir wirklich noch nie untergekommen, ich kann mir das nur mit einer
fehlerhaften Makerversion erklären, aber warum sollte es dann funktionieren
wenn du die fork löscht und exakt dasselbe nochmals machst.

Wie lang war denn dein Makercode?
Hab mal von einem Freund gehört, dass da ziemlich kuriose Dinge passieren können wenn der Code zu lange wird ^^

Stoep
16.12.2007, 22:01
Ich benutze die Version 1.85 (zumindestens laut > Help > About)

Leider weiß ich jetzt nicht wie ich die Länge des Codes in Worte fassen soll.
Aber er ist schon kacke lang^^ Dummerweise habe ich aber mehrere lange
Codes. Der "befallene" Code ist dabei glaube ich noch nichtmal der längste.
Könntest du die "kuriosen Dinge" mal genauer beschreiben bzw. deinen
Freund dazu befragen. Wäre schon recht interessant für mich zu erfahren
was denn da scheinbar alles passieren kann damit ich mich darauf gefasst
machen kann^_-

Gruß
Stoep

Caine Luveno
16.12.2007, 23:39
Hmhmhm... vielleicht ein Fehler beim speichern der Database?

Sind ja alles im Endeffekt nur Offsets in einer Datei... beim fehlerhaften speichern eines Event Offsets bzw. einer If Abfrage kommt vielleicht das dabei raus.

Kuriose Theorie... aber naja... der Fehler ist glaube ich absolut neu.

Cherry
20.12.2007, 12:32
Ich nehme mal an, dass das ein Bug beim Speichern/Laden des Events ist, der nur unter bestimmten (sehr seltenen) Bedingungen auftreten kann.

Erklären kann ich mir das so:

der Maker speichert die Befehle ungefähr so ab (nur ein Beispiel, nicht wirklich genau so):

Change Variable [0014] += 50

0x780E000132000000
AABBBBCCDDDDDDDD

A = Change Variable
B = Variable 000Eh = 14
C = Add
D = Wert 00000032h = 50

Dieser Befehl ist dann 8 Bytes lang.

nehmen wir nun an, 0x79 als A sei Wait. Und das braucht nur ein Argument.

Wait 2.5 s

0x791900
AABBBB

A = Wait
B = 1/10 Sekunden x 0019h = 25

Dieser Befehl wäre somit nur 3 Bytes lang.

wenn nun aus irgendeinem Grund bei dem oben erwähnten Change Variable statt 0x78 nun 0x79 gespeichert würde, ergibt sich folgendes:


0x790E000132000000
AABBBBXXXXXXXXXX

A = Wait (!)
B = 1/10 Sekunden x 000Eh = 14
X = Neuer Befehl. 0x01 in diesem Fall. Zumindest wird das X dann als neuer Befehl gesehen, weil der Befehl 0x79 im Gegensatz zu 0x78 ja nur 3 statt 8 Bytes lang ist, die restlichen 5 Bytes also als neuer Befehl gesehen werden.

Hat jetzt wahrscheinlich kein Mensch verstanden. Aber egal.

mfG Cherry

Caine Luveno
20.12.2007, 12:42
Ich nehme mal an, dass das ein Bug beim Speichern/Laden des Events ist, der nur unter bestimmten (sehr seltenen) Bedingungen auftreten kann.

Erklären kann ich mir das so:

der Maker speichert die Befehle ungefähr so ab (nur ein Beispiel, nicht wirklich genau so):

Change Variable [0014] += 50

0x780E000132000000
AABBBBCCDDDDDDDD

A = Change Variable
B = Variable 000Eh = 14
C = Add
D = Wert 00000032h = 50

Dieser Befehl ist dann 8 Bytes lang.

nehmen wir nun an, 0x79 als A sei Wait. Und das braucht nur ein Argument.

Wait 2.5 s

0x791900
AABBBB

A = Wait
B = 1/10 Sekunden x 0019h = 25

Dieser Befehl wäre somit nur 3 Bytes lang.

wenn nun aus irgendeinem Grund bei dem oben erwähnten Change Variable statt 0x78 nun 0x79 gespeichert würde, ergibt sich folgendes:


0x790E000132000000
AABBBBXXXXXXXXXX

A = Wait (!)
B = 1/10 Sekunden x 000Eh = 14
X = Neuer Befehl. 0x01 in diesem Fall. Zumindest wird das X dann als neuer Befehl gesehen, weil der Befehl 0x79 im Gegensatz zu 0x78 ja nur 3 statt 8 Bytes lang ist, die restlichen 5 Bytes also als neuer Befehl gesehen werden.

Hat jetzt wahrscheinlich kein Mensch verstanden. Aber egal.

mfG Cherry

Ich habs verstanden und das ist die komplizierte Ausführung von dem was ich gemeint hab ^^

Stoep
20.12.2007, 17:22
So richtig verstanden habe ich euch beide glaube ich noch nicht. Ihr seid
wohl der Meinung das sich der Maker in in seinem Konstrukt aus Bits und
Bytes wohl irgendwie verhaspelt hat und deswegen die Else-Case als neuen
Befehlt ansieht.

Sollte an dieser These etwas dran sein dann bräuchte ich mir wenigstens
keine Sorgen zu machen das meine Maker mir jetzt zukünftig weiter fleißig
meine Forks zerlegt. Schließlich sollte die Chance für so einen Fehler ja
doch sehr gering sein^_^

In diesem Sinne mal danke, sollte der Fehler wieder auftauchen melde ich
mich wieder oder sollten euch noch mehr kuriose Theorien einfallen dann
postet die ruhig^_-

Gruß
Stoep

Caine Luveno
20.12.2007, 17:50
So richtig verstanden habe ich euch beide glaube ich noch nicht. Ihr seid
wohl der Meinung das sich der Maker in in seinem Konstrukt aus Bits und
Bytes wohl irgendwie verhaspelt hat und deswegen die Else-Case als neuen
Befehlt ansieht.

Sollte an dieser These etwas dran sein dann bräuchte ich mir wenigstens
keine Sorgen zu machen das meine Maker mir jetzt zukünftig weiter fleißig
meine Forks zerlegt. Schließlich sollte die Chance für so einen Fehler ja
doch sehr gering sein^_^

In diesem Sinne mal danke, sollte der Fehler wieder auftauchen melde ich
mich wieder oder sollten euch noch mehr kuriose Theorien einfallen dann
postet die ruhig^_-

Gruß
Stoep

Nja... ich versuchs nochmal einfacher zu erklären ^^

- Jedes Event wird in einer Datei gespeichert.

- Jeder Befehl, benötigt je nach Art unterschiedlich viele Bytes in der Datei.

- Wir nehmen an das beim Speichern/Laden der Datei ein Fehler passiert ist.

- Das heißt quasi das der Fork Befehl nicht komplett gespeichert oder geladen wurde

- In Folge von dem weiss der Maker nicht, was er mit den verbleibenden Befehlsstücken zu tun hat.

Ein einfaches Beispiel: Eine 8 Byte lange Fork. Der Maker erwartet beim Auslesen nun genau 8 Byte wovon jedes mit entsprechenden Werten gefüllt sein muss. Wenn nun z.B. beim Speichern ein Fehler auftritt und der Befehl bei 7 Byte abgeschnitten wird, steht beim 8ten Byte für den eigentlichen Befehl schon der nächste Befehl. Das verwirrt den Maker weil das 8te Byte ja noch zu der Fork gehören sollte anstatt zu dem nächsten Befehl.



Die Fork
ABBBBBBE

Fehlerhaft gespeichert:
ABBBBBBA

A ist jeweils der Befehlsanfang und E das Ende. Wenn der Maker nun anstelle des Ende von der Fork wieder ein A für den nächsten Befehl findet, kommt es zu einem Fehler.


Ein weiteres Beispiel: Es wird ein Change Variable gespeichert mit einer Länge von 8 Byte. Anstatt das im ersten Byte der Index für Change Variable steht, steht nun anstelle dessen z.B. der Index für einen Wait dort welcher nur 3 Bytes lang ist. Der Maker interpretiert die Folgenden Bytes also als Wait, die 5 weiteren die dort noch kommen das es ja eigentlich ein 8 Byte Befehl war werden vom Maker nun als neuer Befehl gesehen oder komplett Fehlinterpretiert.

Das Beispiel ist nun nicht wirklich Praxisnah. Aber um es einfach zu verdeutlichen was Cherry meinte sollte es denke ich genügen ^^

Es tät in jedem Fall passen. Ich könnt mir vorstellen das dieses "Do nothing" Quasi die Fehlerüberbrückung von Enterbrain ist damit nicht der gesamte Maker oder das Spiel aufgrund eines einfachen Speichern/Laden Fehlers crasht.

Ich hoffe das ist etwas einfacher und verständlicher ^^ Wenn es in der Praxis doch viel komplexer zugeht.

Stoep
20.12.2007, 22:01
@Caine Luveno: Wirklich gut erklärt. Das habe ich jetzt nämlich sogar
geblickt^_-

Gruß
Stoep