• Herzlich Willkommen!

    Nach der Schließung von inDiablo.de wurden die Inhalte und eure Accounts in dieses Forum konvertiert. Ihr könnt euch hier mit eurem alten Account weiterhin einloggen, müsst euch dafür allerdings über die "Passwort vergessen" Funktion ein neues Passwort setzen lassen.

    Solltet ihr keinen Zugriff mehr auf die mit eurem Account verknüpfte Emailadresse haben, so könnt ihr euch unter Angabe eures Accountnamens, eurer alten Emailadresse sowie eurer gewünschten neuen Emailadresse an einen Administrator wenden.

[D2 technisch] Zufallszahlen, Quellenwerte uvm ...

Status
Für weitere Antworten geschlossen.

nookiestar

Ex-Staffmember, Champion
Ex-Staffmember
Registriert
15 Januar 2002
Beiträge
5.937
Punkte Reaktionen
0
Tag zusammen.

Vorwort:

Wie ich bereits im ersten Thread angedeutet habe, gab es vor wenigen Wochen eine sehr interessante Diskussion über einige technische Grundlagen bezüglich der Generierung von Items und deren Speicherung.

Wer den Thread im Original lesen möchte, kann dies hier tun. (Update: Der Thread wurde bereits vor geraumer Zeit gelöscht.) Für all jene, deren Englischkenntnisse vielleicht nicht ganz so gut sind, habe ich mich mal hingesetzt und eine (tlw. kommentierte) Übersetzung bzw. Zusammenfassung angefertigt.

Vorgeschichte:

Die Übersetzung des ersten Teils der Diskussion habe ich bereits vor ein paar Tagen angefertigt, ihr findet ihn hier. Die Lektüre der dort erfolgten Erklärungen ist zum Verständnis dieses Threads vielleicht nicht zwingend erforderlich, aber doch sehr ratsam.

Wer sind die Protagonisten:

Es folgt in dem besagten Thread nach den einleitenden Erläuterungen im ersten Teil von Ruvanal zunächst eine längere Zusammenstellung an Gedanken von Jarulf. Abschließend folgt nochmal ein ergänzender Kommentar von Ruvanal.

Beide gehören zu den Koryphäen der diabolischen Code-Exegese und haben schon unzählige Male aufklärende Studien über verschiedenste technische Sachverhalte geführt und die Ergebnisse ersterer dann der breiten (und oftmals unwissenden ^^) Öffentlichkeit präsentiert.

Anlass:

Aufhänger für die späteren Erklärungen ist der folgende Beitrag des Users NervousTwitch.

Er bezieht sich auf die Aussage von Ruvanal, dass bei einer Range von über 18 Quintillion verschiedenen möglichen Zufallszahlen eine Kollision von zwei identischen Quellenwerten sehr unwahrscheinlich ist.

Hier der Beitrag:

------------------------------------------------------------------------------------
Originally posted by NervousTwitch:

1.) Die Algorithmen zur Generierung von Zufallszahlen unterliegen einem inneren Widerspruch. Es ist unmöglich, eine absolut zufällige Zahl mit einem System vorgegebener Regeln zu bestimmen. In der Praxis sieht man nämlich, dass ein Großteil der angeblich möglichen Nummern beim Anwenden des Algorithmusses niemals ausgewählt würden, so dass die Liste der "möglichen" Zahlen in Wirklichkeit viel kleiner ist als du beschreibst.

2.) Wenn die Quellenwerte dazu verwendet werden, Informationen über jedes Item zu speichern, so wie du es sagst, dann sollte das Programm dazu in der Lage sein, die Eigenschaften des Gegenstandes einzig und allein aus der Nummer, die das Item erhielt, zu bestimmen.

Wenn du aber in der Lage bist, Informationen in diesen Nummern zu speichern, um dieses Informationen später wieder herausziehen zu können, dann kann man diese Nummer ja schlecht "Zufallszahl" nennen. Eine Zahl, die schlicht und ergreifend nur als ID-Nummer fungiert, hat eine weitaus größere "Freiheit" bei der zufälligen Generierung als eine Zahl, die Daten enthalten soll.

Warum ist das so wichtig? Nun, die Tatsache, dass die Zahl Informationen enthalten soll, limitiert die Anzahl der möglichen Zufallszahlen in deinem Algorithmus erneut. Man kann die Anzahl der möglichen Kombinationen mit Hilfe einiger Manipulationstechniken zwar nochmal erhöhen, allerdings nur in begrenztem Ausmaß.

Fazit: Die Chance, dass zwei Items mit identischen IDs erstellt werden, ist viel höher. Und deshalb ist das Scannen nach Dupes auch weitaus schwieriger, weil das Risiko, dabei versehentlich legit Items ebenfalls zu löschen, steigt.

Es gibt aber eine Lösung für dieses ganze Problem: Bezeichnet die IDs nicht als Zufallszahlen, das sind sie nicht (und sollten sie womöglich auch nie sein).

Originally posted by NervousTwitch.
------------------------------------------------------------------------------------

Daraufhin folgt eine persönliche Theorie, wie Blizzard das Ganze eventuell ganz anders gelöst hat. Das basiert aber alles nur auf Vermutungen und ist auch falsch, wie sich später herausstellt. Ich verzichte deshalb an dieser Stelle auf die Übersetzung.

Kleiner Zusatz zum Problem der Generierung von Zufallszahlen dann noch im nächsten Post vom User shadowfist:

------------------------------------------------------------------------------------
Originally posted by shadowfist:

Die Wahrscheinlichkeit zwei identische Nummern zu generieren, ist weitaus größer als man denkt.

Beispiel Geburtstagsphänomen:

Wie viele Personen braucht man, um garantieren zu können, dass mindestens zwei von ihnen am selben Tag Geburtstag haben? Antwort: 367.

Wie viele Personen braucht man, um eine 50-prozentige Chance zu haben, dass zwei von ihnen am selben Tag Geburtstag haben? Die genaue Zahl weiß ich nicht mehr, aber es war irgendwas zwischen 20 und 30.

Ja, die Dimensionen in Diablo2 sind weitaus größer, aber das Prinzip ist das gleiche.

Originally posted by shadowfist.
------------------------------------------------------------------------------------

Das also waren die zur Diskussion gestellten Thesen. Es folgt nun eine (ausführliche!) Darstellung der beiden Experten, viel Spaß beim Lesen.
 
Es spricht Jarulf.

------------------------------------------------------------------------------------
Originally posted by Jarulf:

(in Bezug auf Behauptung 1., dass viele der theoretisch möglichen Zufallswerte eh nie angenommen werden)

Also, abhängig davon welchen Wert man als Startwert nimmt und welchen Algorithmus man verwendet, ist es _durchaus_ möglich, alle Werte innerhalb der gegebenen Spanne zu erhalten.

Ein guter Algorithmus wird alle möglichen Werte mindestens einmal durchlaufen. Die erzielten Zufallswerte werden dann, falls der Algorithmus gut ist, gut verteilt und mit keinem erkennbaren Muster in der vorgegebenen Reichweite liegen.

Weiterhin ist es wichtig sicherzustellen, dass zum Beispiel beim Erstellen eines Spieles (wobei ebenfalls eine Reihe von Zufallszahlen generiert wird), immer wieder andere Startwerte gewählt werden. Ein gängige Methode, das Ganze auf PCs zu realisieren ist, den Startwert auf der aktuellen Systemzeit zu basieren. So ist es auch bei Diablo2.

Sorry, wenn dir das alles längst bekannt ist, aber ich versuche sicherzustellen, dass auch andere Leute uns folgen können.

Nun, man könnte zum Beispiel die Präzision der verwendeten Zeit variieren, Diablo 1 benutzte beispielsweise nur eine Präzision von ganzen Sekunden. Das bedeutete, dass zwei verschiedene Games, die gleichzeitig (mit einer Präzision von 1 Sekunde) erstellt wurden, absolut identisch aufgebaut wurden.

Diablo 2 benutzt meiner Meinung nach eine Präzision von einer Millisekunde. Weiterhin modifiziert es den Startwert erneut, indem es diesen Wert mit dem aktuellen Tickcount (Anzahl der durchgeführten Takte seit der PC eingeschaltet wurde) multipliziert. Das führt dazu, dass selbst zwei Games, die zu exakt der selben Zeit erstellt wurden, höchstwahrscheinlich verschieden aufgebaut werden.

Schließlich sollte man beachten, dass selbst wenn der ausgewählte Startwert (i.d.F. die Systemzeit) nur sehr gering variiert, je nachdem wie man den Startwert bestimmt, die ausgewählten Zufallswerte sich stark unterscheiden werden.

Und: Der Zufallszahlen-Generator und die Methode wie er eingesetzt wird sind ziemlich gut (ganz im Gegensatz zu den diversen Fehlern, die der damalige in Diablo 1 hatte) - also das ist nicht das Problem.

Wenn man das alles im Hinterkopf hat, wird man sehen, dass das Game einen ausreichend guten Output an Zufallszahlen hat. [...]

Da der Startwert hinreichend zufällig ausgewählt wurde, der Algorithmus hinreichend gut ist, und er richtig angewandt wird, können wir davon ausgehen, dass die bestimmten Quellenwerte bei der Erstellung eines Items hinreichend zufällig sind, und wir damit nicht die von dir geschilderten Beschränkungen haben.

Nun zum Punkt 2., der - kurz zusammengefasst - die Behauptung beinhaltet, dass bei einer gezielten Speicherung von Daten das erstellte Item ja keineswegs mehr zufällig ist, da es für jede Kombination ja ein daraus abgeleiteter Mix aus Eigenschaften geben muss:

Ich kann deiner Argumentation nicht folgen. Wie willst du denn das Game "zufällige" Items erstellen lassen??? Prinzipiell erhält das Item einen Quellenwert, danach werden einige Entscheidungen basierend auf spezifischen Regeln zur Generierung von Items durchgeführt. Da der Startwert aber zufällig ist, wie wir bereits oben festgestellt haben, wird auch das erstellte Item "zufällig" sein.

(Nochmal mit anderen Worten von mir, da der Abschnitt wohl etwas schwieriger zu verstehen ist: Jarulf sagt, dass es nie der Sinn der Sache war, ein zufälliges Item zu generieren, sondern nur aus den zufällig generierten Startwerten ein Item zu erstellten... das Item selbst ist natürlich nicht zufällig ... genaueres folgt im nächsten Abschnitt).

Das Prinzip der Erstellung von Zufallszahlen auf Computern ist ja, dass wir mit exakt dem selben Startwert immer an der selben Stelle enden. Das heißt, dass mit einem spezifischen Quellenwert das letztendlich erstellte Item immer exakt das selbe sein wird. (Neben dem Quellenwert verwendet das Game auch andere Werte wie das ilvl oder die Qualität.)

Also ist einzig und allein (neben den Zusatzinformationen wie ilvl, Qualität etc.) der Quellenwert ausreichend um ein Item zu spezifizieren. Nochmal: Offensichtlich wird das Game aus einem identischen Quellenwert nie zwei verschiedene Items erstellen, dieser Prozess ist nicht zufällig. Zufällig ist einzig und allein die Auswahl der Startwerte.

Wenn man ein Item abspeichert, kann man zwei verschiedene Wege einschlagen. Man kann die Eigenschaften explizit abspeichern (also welche Qualität, welche Affixe ausgewählt wurden, die genauen Eigenschaften der Affixwerte etc). Oder man speichert einfach den Quellenwert (plus einiger Zusatzwerte wie dem ilvl).

Nun, der zweite Weg ist normalerweise weitaus platzsparender, und da Blizzard Tonnen an Charakteren mit Tonnen an Items auf den Servern speichern muss, hat es sich auch für diesen Weg entschieden. Prinzipiell haben sie einen Mittelweg gewählt, einige Eigenschaften werden explizit gespeichert, der Rest wird aus dem Quellenwert in jedem Spiel rekonstruiert.

Da die Quellenwerte relativ lang sind (4 Bytes jeweils) und Blizzard versucht, die Datenmenge möglichst klein zu halten, werden einfache Items auf Bit-Level-Niveau (in 3 Bits) abspeichert (das heißt, diese Werte können nur einen Wert von 0-5 annehmen), anstatt sie in die "großen" Quellenwerte zu packen. Das ist die kompakte Form der Speicherung, die Ruvanal bereits erwähnte. (siehe auch Erläuterungen dazu im ersten Thread)

Wie gesagt, das Problem bei der vollständigen Rekonstruktion des Items aus den Quellenwerten ist, dass man nichts am Prozess der Generierung manipulieren kann. Man kann die Regeln nicht ändern, da man dann nicht wieder das selbe Item erhalten würde, auch wenn der Startwert der selbe war/ist. Deshalb ist es auch so schwer, damit Bugs zu fixen oder neue Features einzubauen.

Stell dir vor, du willst Anweisungen dafür geben, wie du einen bestimmen Platz erreichen kannst und hast nur den Startpunkt gegeben. Du wirst versuchen einen genauen Plan zu machen, wie du durch die Straßen zu gehen hast, wo du abbiegen musst (zum Beispiel in der zweiten Querstraße) usw. . Wenn du immer an der selben Stelle beginnst, und die selben Anweisungen ausführst, wirst du auch immer an der selben Stell enden AUSSER jemand verändert den Straßenplan!

Nun noch zu der Behauptung, dass der Freiheitsgrad der Zufallszahlen sehr eingeschränkt ist, da die Quellenwerte ja Daten enthalten müssen. (Achtung, wichtig zum Verständnis!)

Inwiefern? Beachte, dass du nicht ein paar Werte erstellst und diese dann in die Quellenwerte verpackst, sondern umgekehrt, du hast den Quellenwert aus dem du dann die Eigenschaften generierst. (Aha! Mehr dazu gleich.)

Wenn die Anzahl der möglichen Zufallswerte ausreichend größer ist als die Anzahl der möglichen verschiedenen Items und die Regeln bzgl. einer "guten" Zufallszahlen-Generierung erfüllt sind (siehe oben), dann ist das alles was wir brauchen.

Originally posted by Jarulf.
------------------------------------------------------------------------------------
 
Es spricht Ruvanal.

------------------------------------------------------------------------------------
Originally posted by Ruvanal:

Die Generierung von Zufallszahlen (RNG - Random Number Generating) auf Computern ist in Wirklichkeit nur eine "Pseudo-Generierung" (PRNG – Pseudo Random Number Generating). Und da die Zahlen nicht wirklich zufällig sind, müssen sie nur gut genug sein für den Job, den sie erfüllen sollen. Im Übrigen ist es für Spiele-Entwickler sogar von Vorteil, dass sie nicht zufällig sind. (dazu später mehr)

Was man von Algorithmen zur RNG will ist, dass sie lange Zyklen haben, um eine Ausbildung von "Strukturen" so lange wie möglich zu vermeiden. Des weiteren will man gar nicht garantieren, dass alle Zahlen ausgewählt werden können ODER es einen Ausschluss von Zahlen gibt, die gar nicht ausgewählt werden sollen.

Das heißt, man versucht den Großteil der möglichen Werte mindestens 1x zu durchlaufen, um die Anzahl der möglichen Endwerte so nah wie möglich an die Gesamt-Range heranzubringen.

Offensichtlich sind nicht alle theoretisch möglichen Werte wirklich realisierbar, aber man erreicht zum Beispiel mit dem Einfluss der Systemzeit auf die Erstellung der Quellenwerte, dass viele der theoretisch möglichen Werte dann auch tatsächlich eine vernünftige Chance haben, realisiert zu werden.

Wie bereits gesagt wurde, wird jedem Item ein zufällig generierter Quellenwert zugeordnet. Dieser Quellenwert wird anschließend dazu verwendet, in einer vorher festgelegten Art und Weise die "zufälligen" Eigenschaften des Items festzulegen (bzw. bei jedem weiteren Mal in genau der selben Form zu rekonstruieren). Ein Beispiel dafür wäre die genaue Prozentzahl des erhöhten Schadens beim "Cruel"-Präfix.

Nochmal: Das Spiel versucht nicht, eine bestimmte vorher ausgewählte Serie an Eigenschaften in den Quellenwert "hineinzucoden" (das würde die CPU stundenlang beschäftigen), sondern es geschieht umgekehrt.

Das gleiche Prinzip der zufälligen, aber reproduzierbaren Generierung ermöglicht es übrigens überhaupt erst, dass Diablo 2, Age of Empires und andere Spiele über das Internet gespielt werden können. Ohne Ausnutzung dieses Effektes der PRNG wäre es unmöglich, genügend Daten in kurzer Zeit zu übertragen, um allen Spielern die gleichen Karten, Monster etc. zur selben Zeit zur Verfügung zu stellen.

Um das zu verdeutlichen, schauen wir uns mal an, wie das Game eine Karte erstellt. Es wird zunächst einen Zufallswert erstellen, um daraus das Layout der Karte zu konstruieren. Wenn dieser Wert (2 DWORDs) nun an alle Spieler gesendet wird, wird jeder Computer daraus exakt die selbe Karte generieren können.
Tausende DWORDs wären hingegen nötig, wenn man das Grund-Layout eines Gebietes wie dem Feld der Steine ausführlich übermitteln müsste, ganz zu schweigen von einem ganzen Akt.

Anschließend erstellt das Game Quellenwerte für die Verteilung der Monster auf den Karten. Erneut verbraucht die Übermittlung dieser Quellenwerte viel weniger Platz als wenn man alle Informationen über Monster und zufällige Objekte wie Truhen, Schreine usw. komplett übertragen müsste.

Also: Wenn man die Eigenschaften des PRNG geschickt ausnutzt, ist das viel mehr wert als wenn man wirkliches RNG hat.

Und schließlich noch zum "Geburtstags-Parado" (siehe ganz oben).

Du unterschätzt die Anzahl der möglichen Kombinationen. Für das "Geburtstags-Paradox" braucht man, wenn man ein 365-Tage-Jahr unterstellt, 22 Personen, um eine etwas größer als 50-prozentige Chance auf einen doppelten Geburtstag zu haben.

Wenn man eine Größe von 4 Bytes wählt (DWORD: 0 bis 4.294.967.295), hat man selbst nach 40.000 Exemplaren des selben Itemtyps nur eine ~17 %ige Chance, dass zwei Exemplare die selbe ID haben. Das wären also zum Beispiel 40.000 Windforces, die in ein Spiel kommen und dieses wieder verlassen.

Vergessen wir nicht, dass nicht ALLE Item-Daten im Quellenwert stecken, der Itemtyp und die Qualität (unique, rare, magisch, etc) stecken in anderen Teilen der Datenstruktur. Und ein Dupescanner würde ALLE diese Daten checken. Du könntest zum Beispiel einen Charm und einen Tarnhelm mit identischem Quellenwert besitzen, und der Dupescanner würde nicht anschlagen.

Nun, die 17 Prozent mögen viel erscheinen, aber bedenke, dass der Quellenwert nicht aus einem DWORD besteht, sondern aus zweien. Das würde die Chance auf eine Kollision nochmal auf ein 4-Milliardstel von 17 Prozent drücken. Die Chance auf eine Kollision erscheinen mir also nicht sehr wahrscheinlich, auch wenn du ein anderes Item wie zum Beispiel einen Charm oder ein Juwel nimmst (bei denen die Suche nach Dupes nochmal ein Vielfaches mehr Rechenleistung kosten würden).

Zu der Behauptung, dass zwei Items mit identischen Eigenschaften automatisch auch identische Quellenwerte besitzen müssen:

Nicht notwendigerweise. Natürlich nimmt die Chance darauf mit der Anzahl der identischen Eigenschaften zu, aber bei einem magischen Item (diese haben höchstens 6-8 zu spezifizierende Eigenschaften .. meist sogar weniger), gibt es eine sehr große Menge an verschiedenen möglichen Quellenwerte, bei rare Items natürlich weniger.

Originally posted by Ruvanal.
------------------------------------------------------------------------------------

Nachwort:

Ein wie ich finde sehr interessanter Einblick in die technischen Gegebenheiten, die hinter dem sturen Monster-töten-Item-sammeln-Alltag stecken. Ich hoffe, meine kommentierende Übersetzung ist einigermaßen verständlich und trotz der recht großen Länge auch vernünftig lesbar.

Für inhaltliche Fragen versuche ich euch zur Verfügung zu stehen - eine Garantie auf kompetente Antworten bekommt ihr natürlich nur bei den Urhebern selbst. :)

Edit (8. April 2003): Leichte Überarbeitung sowie kleinere Korrekturen.

Edit (9. September 2005): Erneute Überarbeitung mit kleineren Korrekturen.
 
habs mal überflogen, hört sich sehr intressant an :top:
morgen werd ichs dann in ruhe lesen können :)
 
:top:
aber näheres über den PRNG (z.b. methode? linear? additiv? etc) weißt du aber auch nicht, oder? [bin zu faul mir heute noch einen englischen text über zahlentheorieen und algorithmen anzutun ;)]
 
:eek: ufff *überfordertsei* klingt ganz interessant bin jetzt aber schon bisschen müde, werd mir das morgn nochmal zu gemüte führen...
thx 4 arbeitmach :kiss:
 
:top: interessant :)

berni, meinst du nicht diese threads sollten nach ner weile im archiv landen damit sie erhalten bleiben ?


Mfg
Tub
 
Tub schrieb:
:top: interessant :)

berni, meinst du nicht diese threads sollten nach ner weile im archiv landen damit sie erhalten bleiben ?


Mfg
Tub

Mmh, die Frage ist obs im Archiv überhaupt einer liest (hab leichte Zweifel). Ich fixiere erstmal bis auf weiteres und verschieb vielleicht was älteres ins Archiv. Irgendwann muss sowieso mal reingemacht werden hier...
 
Tub schrieb:
:top: interessant :)

berni, meinst du nicht diese threads sollten nach ner weile im archiv landen damit sie erhalten bleiben ?


Mfg
Tub

Das hab ich mich auch schon öfters gefragt, bei gewissen Threads, ohne das jetzt allzu kritisch anmerken zu wollen.

@ Nookiestar :top: Das kann ich mir erst komplett reinziehen, wenn ich mich nicht mehr fühle, als hätte mich ein Autobus überfahren. Übles Wochenende...
 
>>>Interessant zu lesen, dankeschön. :)

In zwei Minuten durchgelesen? Ein Schelm wer böses dabei denkt.^^

>>>aber näheres über den PRNG (z.b. methode? linear? additiv?
>>>etc) weißt du aber auch nicht, oder?

Nein, ich habe den ganzen Thread auch mehrmals überflogen um etwas genaueres über den PRNG von D2 zu finden, aber auch Jarulf schreibt nur dass der Algorithmus "hinreichend gut" ist.

Ob er ihn etwas genauer kennt, weiß ich auch nicht.

>>>Ich fixiere erstmal bis auf weiteres

k

Das Problem ist, dass der erste Thread eigentlich Vorraussetzung für diesen ist, da man sonst nur die Hälfte versteht.

Vielleicht ist es ja möglich beide Threads, bevor man ins Archiv verschiebt, zusammenzulegen.

cu
 
kannst auch einfach den ersten post editieren und n link zum vorherigen thread rein tun, würd auch funktionieren ;)
 
>>>kannst auch einfach den ersten post editieren und n link zum
>>>vorherigen thread rein tun, würd auch funktionieren ;)

Jep, hab ich ja. (ganz oben)

Allerdings bringt ein Link ja nix, wenn der erste Thread nach nem halben Jahr gelöscht wird.

Alternative: beide ins Archiv.

Eleganter wäre da wohl eher ein Zusammenlegen ... aber ich denke ihr findet da ne Lösung.:)

Edit:

Wobei ... wenn ich mir das so recht überlege, wäre ein Zusammenlegen doch nicht so toll.

Die angeschnittenen Themen unterscheiden sich ja doch recht stark, der erste ist auch für technisch weniger interessierte Spieler sehr aufschlussreich (gibt ja ständig Diskussionen über Dupescanner und IDs).

Dieser hier ist dann doch ziemlich technisch und nur was für wirklich Interessierte.

Mein Vorschlag wäre also: Threads nicht zusammenlegen und wenn sie nicht allzu viel Platz wegnehmen, später beide getrennt ins Archiv.

cu
 
sauber nookie, machst deiner blauen schrift alle ehre :)
hab noch paar möglicherweise dumme fragen zum thema:
was genau wird bei der erstellung des spiels dann festgelegt von den items? 6 stats pro item, und dann wird je nach mf das item eben weiss, blau, gelb oder grün/gold?
wird die art des items vorher festgelegt?
wenn man den einfluss der erstellzeit auf die drops kennt, könnte man dann möglicherweise die drops durch getimetes erstellen des spieles beeinflussen? klar, ist komplex, aber die berechnung und erstellung könnte man dann ja zB einem script überlassen (nicht, das dies "legit" wäre, aber die theoretische durchführbarkeit interessiert mich schon - ich werd auch garantiert nix derartiges coden^^).
 
@ Amber

danke dass du mich auf den Tread hingewiesen hast...

@ Nookie

sehr gut gemacht und auch sehr gut zu lesen.... wenn mir jetzt noch jemand sagt wann am besten vortex schilder droppen gibts extra :keks:

So long

noc
 
>>>was genau wird bei der erstellung des spiels dann festgelegt
>>>von den items?

Ich nehme an, du meinst bei der Erstellung des Items.

Also, sobald vom Game festgestellt wird, dass ein Item gedroppt wird (gibt ja auch die Möglichkeit des NoDrops), passiert u.a. folgendes:
  • Quellenwerte werden festgelegt
  • Itemtyp wird festgelegt (z.B. Kurzschwert, Charm, eine bestimmte Rune, Gold etc.)
  • internes Level wird zugeordnet
  • Qualität wird festgelegt
  • Affixlevel werden bestimmt und Affixe "ausgesucht"
  • und zusätzlich wohl noch ein paar zusätzliche Daten gespeichert.
Und ich _meine_, dass das auch genau in dieser Reihenfolge passiert.

Zunächst kommen die Quellenwerte. Diese werden mit dem PRNG bestimmt. Es ist hierbei noch völlig wurscht was später für ein Item rauskommt. Es enthält zunächst einfach erstmal eine "Nummer".

Anschließend wird festgelegt, was für ein Itemtyp entsteht und abgespeichert. Das geschieht anhand der Treasure Classes, die dem Monster/der Kiste/etc. aus dem der Gegenstand droppt, zugeordnet sind. (black_spy kennt sich übrigens imho damit ein wenig besser aus)

Nun wird das interne Level festgelegt (entspricht mlvl bei Monsterdrops und area_lvl bei Kistendrops) und abgespeichert.

Anschließend wird die Qualität des Item festgelegt (u.a. anhand des MF-Wertes des Spielers der für den Kill/das Öffnen der Kiste verantwortlich ist). Auf die genaue Vorgehensweise (unique -> set -> rare -> magic -> ...) will ich hier nicht nochmal eingehen, das findet man ja an anderer Stelle zur Genüge. Achtung: Das ilvl spielt hierfür schon eine Rolle, es muss also vorher festgelegt worden sein!!!

Schließlich wird aus all den gesammelten Daten (qlvl, ilvl, ggf. mag_lvl) das Affixlevel bestimmt.

Und jetzt der Knüller: Imho gehören zu den verwerteten Daten zur Affixlevelbestimmung AUCH die Quellenwerte. So werden nämlich zwangsläufig, wie Ruvanal sehr gut erklärt hat, bei jedem Spieler _immer_ die selben Affixe generiert.

>>>wenn man den einfluss der erstellzeit auf die drops kennt,
>>>könnte man dann möglicherweise die drops durch getimetes
>>>erstellen des spieles beeinflussen?

Nunja, es wird ja nicht nur die genaue Systemzeit herangezogen, sondern höchstwahrscheinlich viele, viele andere Faktoren (u.a. der Tickcount ... und erstell mal zwei Games mit 2 Computern, die exakt die selbe Anzahl an bis dahin abgearbeiteten Takten aufweisen ... bei Frequenzen von >1 GHZ ^^), die keiner (noch nichtmal Jarulf) kennt.

Wie gesagt, ein guter Algorithmus zur RNG bei einer derart großen Spanne muss ja zwangsläufig unglaublich komplex und schwer zu überlisten sein. Bin da aber wirklich kein Experte für.:/

>>>klar, ist komplex, aber die berechnung und erstellung könnte
>>>man dann ja zB einem script überlassen

Erste Vorraussetzung: Kauf zwei PC mit exakt der selben Taktfrequenz (geringe Schwankungen letzterer aufgrund Produktionsunregelmässigkeiten ausgeschlossen^^), schalte sie in exakt der selben Nanosekunde ein, erstell in exakt der selben Nanosekunde ein Game und wir gucken weiter.:D

cu
 
>>>aber näheres über den PRNG (z.b. methode? linear? additiv?
>>>etc) weißt du aber auch nicht, oder?

Jetzt schon.

Ich habe Jarulf gebeten, in dieser Frage nochmal etwas ins Detail zu gehen.

Für all jene, die die genaue Funktionsweise des D2'schen PRNG interessiert, hier ist der Link.

Übersetzen werde ich das allerdings nicht da es wirklich nur was für Programmier-Freaks ist, und diese des Englischen eh mächtig sein sollten.

cu
 
Danke, werde mir das mal bei Gelegenheit (also nach den Feiertagen) mal ganz durchlesen.
 
Vielen Dank Nookie für die Arbeit in deinen beiden Threads :)
habe mir die Erklärung von Jarulf durchgelesen, weiss jetzt - noch-ein bisschen mehr, obwohl ich es nicht in allen Einzelheiten verstehe ( programmiere nicht).

Zum Dupescan:

In meinem ungebrochenen Optimismus sehe ich durchaus eine Möglichkeit, den Dupes Herr zu werden

Dem Spiel ist es ja egal , welche Quellenwerte es ausliest :)
Jarulf und jetzt wohl auch Ruvanal gehen beide davon aus, dass die Wahrscheinlichkeit auf den selben Quellenwert vin Items insgesamt extrem gering, wenn auch nicht ausgeschlossen ist.

Angenommen, wir haben ein paar )tausend oder millionen)accounts mit jeweils pro char (mules) 30 Items drauf und Blizz käme auf die Idee, die Quellenwerte der Items auszulesen. Die Quellenwerte der bereits auf den Chars befindlichen Items liegt ja fest :) ( ~ ID)

Wenn - so stelle ich mir das vor, auf dem Server eine Tabelle erstellt wird, die ein paar Millionen dieser Quellenwerte speichert und dann bei Abgleich dieser Tabelle festgestellt wird, dass es mehr als zwei - oder 5 - identische Quellenwerte gibt, wird diese(r) Quellenwert(e) in eine Blacklist genommen. Bei jeder Spieleerstellung bzw. Spielebeendigung werden die Quellenwerte mit dieser Blacklist abgeglichen und die dadurch definierten Items voila :D gelöscht.
Dadurch, dass man die Zahl der benötigten identischen Quellenwerte auf mehr als 1, z.B. 2 oder 5 legt, schließt man "legit" Items von der Vernichtung weitgehend aus. Man könnte dieses System weiter verfeinern, indem man der Blacklist nur eine begrenzte Gültigkeit ( 2 Tage, zwei Wochen etc.) zuweist und sie dann neu generiert. Das Auslesen von vielleicht 10.000 oder mehr chars mit jeweils 30 Items dürfte nicht soo viel Serverleistung in Anspruch nehmen und müsste dann ja auch nicht jedesmal erfolgen.


Damit bekäme man zwar nicht alle Dupes unter Kontrolle, aber wenigstens die, die mindestens z.B. 4x gedupt worden sind - was wohl einige der begehrteren Gegenstände betreffen würde wie Windi, Opa, mf-charms etc.

Nun weiß ich nicht, ob man diese Quellenwerte nur in einem geöffneten Spiel auslesen kann oder ob das auch innerhalb der gespeicherten Daten auf dem Server erfolgen kann, was besser wäre. (Löschung oder Ersatz durch eine el-rune inbegriffen :D)

Ganze Mules, die plötzlich leer sind :angel:


Habe ich da irgendwo einen Denkfehler?

DV
 
es sind mehr alt 10 K chars auf den Servern, und es wird mehr als ne million quellenwerte brauchen. die "blacklist" wird nur ein paar hundert Werte enthalten, aber die Vergleichsliste wird gross.

Theoretisch wäre es eine möglichkeit die Server mal ne Weile runterzufahren und solange einen dupe-scanner über die Char-files laufen zu lassen, nur: das dauert

die vergleichswerte als liste anzulegen dauert lange beim vergleichen, die werte als sortierten baum anzulegen geht schnell, aber braucht viel speicher.

Ich denke schon dass blizz was machen könnte (z.B. mal alle dupes entfernen die sich auf dem selben char befinden, das wäre einfach), aber alle dupes auf einen schlag löschen wird wohl ein traum bleiben.


Mfg
Tub
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben