Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

imakemygame

Treue Seele

  • »imakemygame« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Hamburg

Beruf: Fachinformatiker // Service Techniker

  • Private Nachricht senden

1

09.10.2013, 21:37

Random Items wie bei Diablo 2

Hallo,
ich dachte das ganze ist etwas trivialer. Zwar könnte ich das Problem mit viel statischem Codemist umsetzen, das ganze wäre dann aber nicht ganz so wie ich es gerne hätte. Viele von euch kennen ja sicher Diablo 2. Dort gibt es Gegenstände mit verschiedenem Item Lvl und verschiedener Qualität. Diese dann auch auf verschiedenen Slots wie Kopf, Fuß, Brust etc. Je nach Lvl, Qualität und Slot können die Gegenstände dann zufällige Eigenschaften in zufälliger Höhe haben.

Zum Beispiel ein Helm kann Gesundheit +10 bis +50 haben
Eine Brustrüstung kann Mana +20 bis +80 haben aber niemals Gesundheit
Eine Waffe kann sowohl Gesundheit als auch Mana haben etc...

Ich glaube ihr wisst was ich meine. Wie kann man das jetzt bewerkstelligen.

Meine Idee war erstmal die mögliche Anzahl der Attribute aus Item Lvl und Qualität zu errechnen. Dann müsste man irgendwie noch die Attribute einordnen, da gewisse starke Attribute auf keinen Fall schon bei niedrig leveligen Items zu finden sein dürfen.

Das Problem ist jedoch, dass wie gesagt, dass ganze sich dann nochmal von Slot zu Slot unterscheidet. Ich kann also nicht einfach 3 Gruppen erstellen
- schlechte Attribute
- mittlere Attribute
- gute Attribute
und diese dann zufällig verteilen

auch sollen hochlevelige Items ja weiterhin eine Chance auf schlechte Attribute haben

Ich hoffe ihr habt kleine Denkanstöße für mich, möchte das ganze nicht komplett mit einem Haufen Code umsetzen :dash:

Edit: was mir gerade einfällt - eine Gruppierung der Attribute pro Slot wäre eine Idee - hat jemand noch etwas besseres? Das wäre ja fast schon gut oder nicht?

Pilzschaf

Frischling

Beiträge: 43

Wohnort: Freiburg

  • Private Nachricht senden

2

09.10.2013, 21:59

Ich würde eine Funktion erstellen, die dir das dann für das gewünschte Item macht, der kannst du dann zum Beispiel den aktuellen Level übergeben. Diese Funktion überprüft dann, um was für ein Item es sich handelt. Eventuell mit Switch Case. Dann wird mithilfe eines Zufallgenerators einen Wert für Das jeweilige Attribut berechnen. Je nach Levelsystem könnte man diese Berechnungen auch noch etwas von dem Level abhängig machen. Ob man nun zum Beispiel die Grenzen für den Zufallsgenerator in Variablen packt und je nach Level verändert bleibt dir Überlassen. Sicherlich gibt es dort auch besse er Lösungen
MfG Pilzschaf :)

Zitat

"Der Code ist schon schlecht."
"Ist doch Geschmackssache."
"Naja, es sind GOTOs drin."
"Oh."

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

09.10.2013, 22:19

Sollen bestimmte Gegner bestimmte Items fallen lassen oder soll das nur vom Level abhängen?
Für die Erzeugung der Items schlage ich Prototypen vor, die in der Klasse, die die Itemgruppen verwaltet kopiert und angepasst werden.
Sollte ersteres der Fall sein kannst du dem Gegner einfach eine Gruppe mit diesen Items und deren Dropwahrscheinlichkeit geben.
Wenn es vom Level abhängt kannst du einfach jedem Levelbereich seine Items und die Dropwahrscheinlichkeit geben.
Switch-Case ist in beiden Fällen die falsche Lösung.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

4

09.10.2013, 23:15

Ich würde mir anhand des Lvls der Gegner oder dem Item lvl, eine Formel basteln, die mir Min und Max Werte ausrechnet und dann eben einen rnd Number davon ziehen.
Die Verschiedenen Attribute würde ich mir als bit enmu (also jedes bit ein anderes Attribut) basteln und mir diese für jede Item Klasse setzen (was drauf sein darf und was nicht). Entweder dynamisch auslesen oder halt hardcoded.
Wie viele Attribute auf dem Item vorhanden sein sollen würde ich dann vom Item lvl Abhängig machen.
Um gewisse hardcoded Elemente wirst du nicht herum kommen, aber so im großen und ganzen fände ich obiges Designe ganz passabel.
Welcher Gegner was dropt ließe sich ja dann eigentlich auch ganz gut zusammen basteln.

imakemygame

Treue Seele

  • »imakemygame« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Hamburg

Beruf: Fachinformatiker // Service Techniker

  • Private Nachricht senden

5

10.10.2013, 06:31

Hallo ihr Lieben, danke für eure Denkanstöße.
Das mit den Prototypen ist eine gute Idee. So in der Art wollte ich das für meine Set und Unique Gegenstände machen, die nicht soviele Random Attribute haben, sondern nur Random Values von den Attributen. Ich weiß nur nicht ob für die normalen Gegenstände mit nur Random Attributen das ganze ohne zuviel Aufwand für die Erstellung der Prototypen machbar ist. (Kommt wahrscheinlich darauf an, wie grob bzw. detailliert man diese erstellt).

Das mit dem Bit Enum habe ich gerade schon halb umgesetzt. Das ist nämlich das was mir gestern Abend kurz nach dem Posten auch in den Sinn gekommen ist. Nur das ich das nicht mit Bit Enum, sondern mit Int Array :D skizziert habe. Hier mal das was mir so eingefallen ist:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Tatsächliche Attribute auf dem Item - Wenn Val == 0 - Dann ist dieses Attribut auf dem Item nicht vorhanden
public var attributesArr = new int[13];

//Beispiel Attribute
public var incMasteryDmgInPercent : float;      //0
public var incDmgAllInPercent : float;          //1
public var incMaxLife : float;                  //2

//In diese Arrays wird jeweils nur der Index der Attribute gespeichert, die auf dem Slot verteilt werden sollen/dürfen
//z.B. grp1Low[0] = 1 - Für incDmgAllInPercent
//dann wird die grp1Low beim Attribute ausrollen benutzt, da dann der gespeicherte Wert als Index für das attributesArr verwendet werden kann
//z.B. attributesArr[grp1Low[0]] = randomVal;
public var grp1Low = new int[3];
public var grp1Mid = new int[3];
public var grp1High = new int[3];


Dann fehlt nur noch das Errechnen der Anzahl der Attribute für die einzelnen Gruppen Low/Mid/High und deren zufällige Vergabe, sowie die Randomvalues.

Noch jemand Anregungen? Danke erstmal

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

10.10.2013, 06:52

Bei Diablo sind das so weit ich weiß für jeden Slot, jede Güte und jedes Item-Level riesige DB-Tabellen wo drin steht, welche und wie viele Attribute mit welchen min/max-Werten auftauchen können. Daraus dann entsprechende Randoms zu generieren ist kein Akt, nur das Erstellen dieser Tabellen ist natürlich mühselig, kann aber sicher auch durch Generierung mit linearen Gleichungen erledigt werden.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

10.10.2013, 09:33

Vielleicht wäre ein Entscheidungsgraph/baum sinnvoll. Jeder Pfad im Graphen hat dann verschiedene Bedingungen und Wahrscheinlichkeiten. Um weitere Möglichkeiten hinzuzufügen, musst Du dann nur neue Knoten einbauen.

8

10.10.2013, 09:44

Warum machst du das denn so komisch mit einem int array? o.O
Bitwerte sind doch genau das, was du benötigst, mit wesentlich weniger overhead.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

10.10.2013, 12:18

Ich würde mir die ganzen Daten einfach in eine Datei schreiben. Mit XML oder JSON verpacken und dann einfach vom Code einlesen. Im Prinzip eine Variante von BlueCobolds Vorschlag. Du kannst ja auch erst mal kleiner anfangen. Mach ein System bei welchem jedes Item gleiche Eigenschaften kriegen kann. Weniger Attribute und und und. Dann arbeitest du dich langsam aber sicher zu deinem Ziel hin. Dann kannst du es vernünftig testen und beim entwickeln noch eingreifen um das System gegebenenfalls umzuschreiben.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Tobiking

1x Rätselkönig

  • Private Nachricht senden

10

10.10.2013, 12:49

Die Gegenstände bei Diablo sind gar nicht so variabel wie man denken könnte. Die Gegenstände bekommen je nach Qualität eine bestimmte Zahl an Affixe (genauer Prefixe und Suffixe). Ein Affix ist dabei sowas wie "+2 auf Stärke" (bei Diablo 3 sind es Wertebereiche ala "+[2-4] auf Stärke", die zufällig bestimmt werden und etwas mehr Variabilität rein bringen). Die Werte sind dabei aber grundsätzlich durch den Affix selbst festgelegt.

Zudem hat jedes Affix ein Mindestlevel und eine Kategorie. Damit wird festgelegt ab wann ein Affix vorkommen kann, auf welchen Slots und zusätzliche Bedingungen (z.B. nur ein Affix aus der Kategorie +x auf Skills). Ansonsten können Affixe grundsätzlich auch mehrfach vorkommen. Man kennt ja die Gegenstände wo z.B. massenhaft von einem Stat drauf ist und sonst nichts.

Die Affixe werden in D2 auch stumpf durch eine große Tabelle mit Spalten für jeden möglichen Wert beschrieben. "+2 auf Stärke" hätte entsprechend bei Stärke eine 2 und dann ganz viele 0 Einträge. Die Eigenschaften des Gegenstands lässt sich dann ganz einfach ermitteln wenn man die Werte der Affixe summiert und die 0 Spalten ignoriert.

Werbeanzeige