Seite 1 von 1

Wie programmiert man eine diskrete Seltenheit?

Verfasst: 02.12.2025, 13:31
von Finnian87
Hallo Team!

Ich bin gerade dabei, das Design meines Beutesystems fertigzustellen, und suche nach einer Lösung, um die subtile Seltenheit bestimmter Gegenstände zu verwalten.
Meine Idee ist es, Gegenstände zu erstellen, die auf den ersten Blick sehr gewöhnlich erscheinen (sie haben einen Standardnennwert), deren wahre Seltenheit jedoch in einem ganz bestimmten internen Attribut liegt (ihrem „Prägejahr” oder ihrer „Werkstatt”). Ich möchte, dass nur erfahrene Spieler diese limitierte Serie sofort als die begehrteste erkennen können.

Hat jemand von euch schon einmal ein bedingtes Glückssystem programmiert, bei dem eine extrem niedrige Drop-Rate für eine Variante eines gewöhnlichen Gegenstands gilt?

Re: Wie programmiert man eine diskrete Seltenheit?

Verfasst: 02.12.2025, 14:08
von xTr1m
Ich kenne mich deterministischem Zufall aus.
Ohne geneauere Details zu deinem Projekt zu kennnen, kann ich zu bedingtem Glück folgendes sagen:
Zunächst sollte man mit einer einzigen RNG Instanz arbeiten, welche man mit einem Seed initialisieren kann. Dadurch hat man schon mal Determinismus.
Wenns um Drops aus einer Loot-Table geht, würde ich erstmals ermitteln wieviele Items enthalten sind, und dann für jedes Item mit dem RNG ein Index würfeln lassen. Damit weiß man schon, welche Items aus der Loot-Table gedroppt wurden.
Jetzt kann es pro Item eine gewisse Chance c geben, dass das Item anders ist. Sobald so ein Item-Index vom RNG gewürfelt wurde, lässt man den RNG nochmal würfeln, aber diesmal soll er eine reelle Zahl p zw. 0 und 1 erstellen. Da reicht es wenn man mit einem einfachen if prüft, ob p<=c ist, und modifiziert daraufhin das Item, bevor es mit dem Würfeln der anderen Indices weiter geht.

Re: Wie programmiert man eine diskrete Seltenheit?

Verfasst: 02.12.2025, 19:45
von Lord Delvin
Das ist ein reines UI-Problem. Deine interne Zustandsverwaltung musst du ja nicht komplett auf dem UI exponieren.

Re: Wie programmiert man eine diskrete Seltenheit?

Verfasst: 03.12.2025, 06:54
von joeydee
Wie du die Seltenheit dem Spieler gegenüber vermittelst (Prägejahr, ...), ist reine Designsache.

Auf Programmierseite kann sowas ungefähr so aussehen (wenn du z.B. die Items mit eindeutigen IDs verwaltest):

bool subtileSeltenheit(uint uniqueID,double chance){ return pseudorandom(seed=uniqueID,lower=0,upper=1)<=chance;}

Wobei pseudorandom() hier eine determinierte Zufallszahl auf Basis eines Seeds liefert. Wenn chance z.B. 1/100 ist (==0.01), liegt im Schnitt jede hundertste Pseudorandom-Zahl unter diesem Schwellwert und liefert "true". Macht Sinn für Ressourcen, die on-the-fly quasi endlos erzeugt werden müssen, weil der Wert erst auf Abruf erzeugt wird und nicht als Eigenschaft gespeichert werden muss. Z.B. Ressourcen in Open-World-Games. Da kann man auch den Seed aus der initialen Spawnposition "hashen", so mache ich das i.d.R.
In meinem letztjährigen ZFX-Action-Beitrag wurden so z.B. Hagebutten-Ressourcen in der Landschaft verteilt, welche lediglich "besondere" Büsche mit bestimmtem Seltenheitswert waren.

Wenn es eine feste Anzahl Items im Spiel gibt, kann man stattdessen auch einfach eine Liste von 990 "normalen" und 10 "besonderen" Items erzeugen und diese Liste durchmischen.

Re: Wie programmiert man eine diskrete Seltenheit?

Verfasst: 03.12.2025, 09:25
von Jonathan
joeydee hat geschrieben: Gestern, 06:54
Wenn es eine feste Anzahl Items im Spiel gibt, kann man stattdessen auch einfach eine Liste von 990 "normalen" und 10 "besonderen" Items erzeugen und diese Liste durchmischen.
Ja, genau. Die Frage ist, will man wirklich kompletten Zufall? Vielleicht ist es netter, wenn garantiert ist, dass man innerhalb von 10 Stunden spielen mindestens einen guten Gegenstand findet.

Man kann die Verteilung sogar noch mehr anpassen. Man generiert die Wahrscheinlichkeiten für die nächsten 10.000 Drops (reicht für alle Gegner die man die nächsten 10 Stunden killt) und würfelt dann zufällig die Position des besonderen Gegenstandes. Um es noch besser zu machen, kann die Position auch erst bei 5.000 losgehen, d.h. am Anfang des Spiels kriegt man auch mit Glück noch keinen total übermächtigen Gegenstand. Man kann auch die Position zwischen 5000 und 10000 Würfel und dann nochmal um einen zufälligen Wert zwischen 0 und 2000 nach vorne schieben. Damit verschiebt sich die Wahrscheinlichkeitsverteilung, es gibt eine sehr geringe Chance etwas gutes schon nach 3000 kills zu finden, aber davon ausgehen, dass man wirklich etwas findet, kann man erst ab 5000. Außerdem ist es unwahrscheinlich, aber nicht ausgeschlossen, das man bis ganz ans Ende warten muss.

Kurzum: Eine Normalverteilung mag das mathematisch zufälligste sein, aber nicht unbedingt das beste Spieldesign. Man muss sich erst überlegen, welche Verteilung am besten zum Spieldesign passen würde und dann, wie man diese modelliert (der zweite Teil ist aber der leichtere).

Wenn nicht klar ist, was "Wahrscheinlichkeitsverteilung" oder "Probability-Density-Function" genau bedeutet, wäre jetzt btw. ein guter Zeitpunkt sich diese Konzepte mal ranzuschaffen.

Re: Wie programmiert man eine diskrete Seltenheit?

Verfasst: 03.12.2025, 09:30
von Alexander Kornrumpf
Ich war erst verwirrt, weil ich dachte, es geht um diskret im Gegensatz zu kontinuierlich, so wie in "diskrete Verteilung".