Diablo


Diablo

von Heaven_tqa » So 4. Jun 2006, 23:16
ich habe mal etwas geträumt und mal überlegt, wie ein diablo klon auf dem a8 aussehen könnte...

dabei bin ich über das generelle problem der wahrscheinlichkeit bei spielen gestoßen. wie beispielsweise generiert diablo oder world of warcraft seine "drop rates" für waffen usw...

im internet fand ich dann einige hinweise zu diablo hacks und die entsprechenden excel-tabellen für die masse an gegenständen usw... da mein studium und die stochastik schon mehr als 10 jahre zurückliegt musste ich mich heute durchbeissen...

daher habe ich mir die mule webseite http://bringerp.free.fr/RE/mule_document_en.html angeschaut, welche die regeln für mule rekonstruiert hat... auch da sind diese wahrscheinlichkeiten enthalten...

so... wie sage ich dem computer... nach dem töten eines monsters beispielsweise, wann und welchen gegenstand er "droppen" soll?

dieses generelle problem habe ich ja bei großteil der strategischen spiele, aber auch bei arkanoid mit den extras... (wann erscheint, welche... für wie lange z.b.)

so... ich habe bücher rausgekramt, mich mit binominalverteilungen usw rumgeschlagen... und dabei kam ich nun zu dieser simulation in turbo basic xl...

Code: Alles auswählen
0 CLR
1 RESTORE #DROPTAB
2 DIM DROP(10),TRANK$(10),WEAP$(10)
5 C=0
10 EXEC INITTAB
20 REPEAT
30   A=RAND(10)
35   PRINT "A=";A,
40   B=DROP(A)
50   IF B=1
51     AA=RAND(10)
52     PRINT C,TRANK$(AA+1,AA+1)
53     T=T+1
54     IF TRANK$(AA+1,AA+1)="H" THEN HT=HT+1
55     IF TRANK$(AA+1,AA+1)="M" THEN MT=MT+1
56   ENDIF
60   IF B=2
61     AA=RAND(10)
62     PRINT C,
63     W=W+1
64     IF WEAP$(AA+1,AA+1)="S" THEN SW=SW+1:PRINT "SCHWERT"
65     IF WEAP$(AA+1,AA+1)="D" THEN D=D+1:PRINT "DOLCH"
66     IF WEAP$(AA+1,AA+1)="A" THEN AX=AX+1:PRINT "AXT"
67     IF WEAP$(AA+1,AA+1)="B" THEN BO=BO+1:PRINT "BOGEN"
68   ENDIF
70   IF B=0 THEN PRINT C,"...":N=N+1
75   C=C+1
80 UNTIL C=1000
100 PRINT "TRANK:";T/C*100;"%"
105 PRINT "HEAL:";HT/T*100
106 PRINT "MANA:";MT/T*100
107 PRINT
110 PRINT "WEAPON:";W/C*100;"%"
120 PRINT "DOLCH:";D/W*100;"%"
130 PRINT "AXT  :";AX/W*100;"%"
140 PRINT "BOGEN:";BO/W*100;"%"
150 PRINT "SCHWERT:";SW/W*100;"%"
999 END
1000 # DROPTAB
1010 DATA 0,0,0,0,0,0,0,1,1,2
2000 PROC INITTAB
2005   RESTORE #DROPTAB
2010   FOR I=0 TO 9
2015     READ A
2020     DROP(I)=A
2025   NEXT I
2030   TRANK$="HHHHHHMMMM"
2035   WEAP$="DDDDDASBBB"
2099 ENDPROC


also... das programm simuliert 1000 events, d.h. beispielsweise beseitigen von monstern...

anhand der droptab schaut das programm, was als belohnung rauskommt... 7 von 10 passiert gar nichts, 2 von 10 kommt ein heiltrank und 1 von 10 eine waffe.

danach wird anhand von speziellen droptabellen geschaut, welcher heiltrank erscheint, 6 von 10 ein heiltrank, 4 von 10 ein mana trank.

bei den waffen ist die aufteilung 5 von 10 der dolch, 1 von 10 die axt, 1 von 10 das schwert und 3 von 10 der bogen...

SO... nun die Frage... ist das so richtig? oder ist das nicht korrekt, dass so zu machen? gibt es bessere wegen?

von Heaven_tqa » So 4. Jun 2006, 23:23
und die frage ist, wie kann ich anhand von dropraten, d.h. nicht über die tabellen direkt zu einem ergebnis kommen?

beispielsweise 7/10 nichts, 2/10 trank, 1/10 waffe...
wie kann ich diese tabelle 0,0,0,0,0,0,0,1,1,2 vermeiden?

also... einfacher... anhand von zufallszahlen, welcher der atari generiert (in basic über RND) direkt zu dem ergebnis nichts, trank oder waffe?

von Schmutzpuppe » Mo 5. Jun 2006, 03:23
Ich denke ein einfacher Ansatz ist tatächlich das Pokey Zufallsregister.
256 (8-bit) sind 100%, wenn nun mit 10 prozentiger Wahscheinlichkeit ein Item Fallen soll dann checkst du einfach ob der Random Wert größer 230 (oder 231, je nachdem wie man rundet) ist.
In dem Fall wird ein Item gedropt, sonst nicht.
Welches Item dann Fallen soll kannst du genau so entscheiden.
Das ist zwar recht simpel, funktioniert aber ganz gut.

von Heaven_tqa » Mo 5. Jun 2006, 09:42
schmutz.... genau so wollte ich es NICHT machen... ;)

warum?

was, wenn du mehr als 255 gegenstände hast... wie bekommst du die wahrschlichkeit hin, dass eben die billigen gegenstände öfter fallen und die "epischen" ganz selten? ohe 255 CMPs usw...

all das sollte über tabellen bzw. eben diese wahrscheinlichkeiten geregelt werden...

hier die passage aus MULE:

Probabilities of the event of the round
Each event can occur only one certain number of maximum time per part:

Event Max per game
Pest Attack 3
Ship pirate 2
Acid Rain Storm 3
Planetquake 3
Sunspot Activity 3
Strike meteorite 2
Radiation 2
Fire in Blind 2

The probability that an event occurs is equal to the number of times that the event can still occur, divided by the total number of event which can arrive.

Example 1: Initially with round # 1

Event # of time the event may occurs
until the end of the game Probability Bore
Pest Attack 3 3/20 15%
Ship pirate 2 2/20 10%
Acid Rain Storm 3 3/20 15%
Planetquake 3 3/20 15%
Sunspot Activity 3 3/20 15%
Strike meteorite 2 2/20 10%
Radiation 2 2/20 10%
Fire in Blind 2 2/20 10%
Total 20 20/20 100%

Example 2: Round # 3 (the event Acid Rain Storm and Meteorite Strike arrived at round # 1 and # 2)

Event # of time the event may occurs
until the end of the game Probability Bore
Pest Attack 3 3/18 16.67%
Ship pirate 2 2/18 11.11%
Acid Rain Storm 2 2/18 11.11%
Planetquake 3 3/18 16.67%
Sunspot Activity 3 3/18 16.67%
Strike meteorite 1 1/18 5.55%
Radiation 2 2/18 11.11%
Fire in Blind 2 2/18 11.11%
Total 18 18/18 100%

One can calculate some exact probabilities:

Event Never occurs Occurs 1x Occurs 2x Occurs 3x Occurs At least 1x
Pest Attack, Acid Rain Storm,
Planetquake, Sunspot Activity 7.37% 34.74% 43.42% 14.47% 92.63%
Ship pirate, Strike Meteorite,
Radiation, Fire in Blind 18.95% 52.10% 28.95% 0% 81.05%


ich denke, ich bin schon auf dem richtigen weg... mir fehlt nur der nächste schritt, d.h. eben aus wahrscheinlichkeiten auf das item zu schliessen...


hier aus der tabelle von Diablo:

Code: Alles auswählen
Act 1 Equip A   0.036585366
Act 1 Equip B   0.01097561
Act 1 Equip C   0.00406504
Act 2 Equip A   0.001847746
Act 2 Equip A   0.001847746
Act 2 Equip C   0.000888339
Act 3 Equip A   0.000772469
Act 3 Equip B   0.000718576
...


wie man sieht, nehmen die wahrscheinlichkeiten ab, je besser die Axt wird...

also, ich finde sowas gerade spannend...

von Heaven_tqa » Mo 5. Jun 2006, 11:54
ok.ok.... es scheint doch mit diesen grenzabfragen zu gehen...

ich habe mir das mit würfeln vorgestellt... hier ein anderes
programm

Code: Alles auswählen
10 CLR
20 C=0
100 REPEAT
120   A=RAND(100)
130   IF A<90
140     N=N+1:PRINT "..."
150   ELSE
160     A=RAND(100)
170     IF A<=50 THEN PRINT "TRANK":T=T+1
180     IF A>50 AND A<=90 THEN PRINT "WAFFE":W=W+1
190     IF A>=90 THEN PRINT "RUESTUNG":R=R+1
200   ENDIF
890   C=C+1
900 UNTIL C=1000
910 PRINT "NICHTS:";N
920 PRINT "TRANK:";T
930 PRINT "WAFFE:";W
940 PRINT "RUESTUNG:";R


die regeln hier sind

90% kein drop, 10% drop

danach nochmal würfeln, was droppt

50% trank, 40% waffe, 10% rüstung...

von Schmutzpuppe » Mo 5. Jun 2006, 16:38
Ja, so habe ich mir das gedacht.
Ich würde für die Wahrscheinlichkeinen der Gegenstände schon Tabellen anlegen aber man kann die dann recht kurz halten.

Heaven_tqa hat geschrieben:ok.ok.... es scheint doch mit diesen grenzabfragen zu gehen...

ich habe mir das mit würfeln vorgestellt... hier ein anderes
programm

Code: Alles auswählen
10 CLR
20 C=0
100 REPEAT
120   A=RAND(100)
130   IF A<90
140     N=N+1:PRINT "..."
150   ELSE
160     A=RAND(100)
170     IF A<=50 THEN PRINT "TRANK":T=T+1
180     IF A>50 AND A<=90 THEN PRINT "WAFFE":W=W+1
190     IF A>=90 THEN PRINT "RUESTUNG":R=R+1
200   ENDIF
890   C=C+1
900 UNTIL C=1000
910 PRINT "NICHTS:";N
920 PRINT "TRANK:";T
930 PRINT "WAFFE:";W
940 PRINT "RUESTUNG:";R


die regeln hier sind

90% kein drop, 10% drop

danach nochmal würfeln, was droppt

50% trank, 40% waffe, 10% rüstung...

von Heaven_tqa » Mo 5. Jun 2006, 17:46
so... hier die etwas ausführlichere variante...

Code: Alles auswählen
10 CLR
11 DIM T1$(16),T2$(16)
15 DIM ITAB(2,30)
20 C=0
90 EXEC TABINIT
100 REPEAT
120   A=RAND(100)
130   IF A<60
131     N=N+1
135     PRINT
140   ELSE
145     IF A<80
150       GG=RAND(100):PRINT "GOLD ";GG
152       GO=GO+GG
155     ELSE
160       IF A<100
166         EXEC DROP
170         IT=IT+1
175       ENDIF
176     ENDIF
177   ENDIF
890   C=C+1
900 UNTIL C=1000
905 PRINT :PRINT
910 PRINT "NICHTS:";N
915 PRINT "ITEMS:";IT;" UND DAVON:"
920 PRINT "TRANK:";TR
940 PRINT "RUESTUNG:";R
950 PRINT "WAFFE:";W
999 END
1000 PROC TABINIT
1005   RESTORE #ITEMS
1010   FOR J=0 TO 29
1020     FOR I=0 TO 2
1025       READ WERT
1026       PRINT WERT
1030       ITAB(I,J)=WERT
1040     NEXT I
1045     PRINT
1050   NEXT J
1170 ENDPROC
2000 # ITEMS
2010 REM TRANK
2015 REM DATA KLASSE,UNTERKL,GRENZE
2020 DATA 1,0,30
2030 DATA 1,1,45
2040 DATA 1,2,50
2050 DATA 2,0,80
2055 DATA 2,1,95
2060 DATA 2,2,99
2100 DATA 3,0,15
2110 DATA 3,1,23
2120 DATA 3,2,28
2130 DATA 3,3,29
2140 DATA 4,0,49
2150 DATA 4,1,57
2160 DATA 4,2,62
2170 DATA 4,3,63
2180 DATA 5,0,86
2190 DATA 5,1,94
2200 DATA 5,2,97
2210 DATA 5,3,99
2300 DATA 6,0,15
2310 DATA 6,1,23
2320 DATA 6,2,28
2330 DATA 6,3,29
2340 DATA 7,0,49
2350 DATA 7,1,57
2360 DATA 7,2,62
2370 DATA 7,3,63
2380 DATA 8,0,86
2390 DATA 8,1,94
2400 DATA 8,2,97
2410 DATA 8,3,99
3000 PROC DROP
3010   D=RAND(100)
3020   IF D<50
3030     A=RAND(100)
3035     FOR I=0 TO 5
3040       IF A<ITAB(2,I)
3042         TR=TR+1
3045         EXEC OUTPUT_TRANK
3046         EXIT
3050       ENDIF
3055     NEXT I
3060   ELSE
3070     IF D<70
3080       A=RAND(100)
3090       FOR I=6 TO 17
3100         IF A<ITAB(2,I)
3110           R=R+1
3120           EXEC OUTPUT_RUE
3130           EXIT
3140         ENDIF
3150       NEXT I
3160     ELSE
3170       IF D<100
3175         A=RAND(100)
3176         FOR I=18 TO 29
3180           IF A<ITAB(2,I)
3190             W=W+1
3200             EXEC OUTPUT_RUE
3205             IF ITAB(1,I)=4 THEN STOP
3210             EXIT
3220           ENDIF
3230         NEXT I
3240       ENDIF
3250     ENDIF
3260   ENDIF
3999 ENDPROC
4000 PROC OUTPUT_TRANK
4010   RESTORE 10000+ITAB(0,I)*10
4020   READ T1$
4030   RESTORE 11000+ITAB(1,I)*10
4040   READ T2$
4050   PRINT T1$;" ";T2$
4060 ENDPROC
4100 PROC OUTPUT_RUE
4110   RESTORE 10000+ITAB(0,I)*10
4120   READ T1$
4130   RESTORE 11100+ITAB(1,I)*10
4140   READ T2$
4150   PRINT T1$;" ";T2$
4160 ENDPROC
9999 REM TEXT STRINGS
10010 DATA HEILTRANK
10020 DATA MANATRANK
10030 DATA HELM
10040 DATA BRUST
10050 DATA BEIN
10060 DATA SCHWERT
10070 DATA AXT
10080 DATA BOGEN
11000 DATA SCHWACH
11010 DATA MITTEL
11020 DATA STARK
11100 DATA LEDER
11110 DATA EISEN
11120 DATA PLATTE
11130 DATA MAGISCH


mit tabellen, wer will, kann von mir die excel tabelle haben.

das mit den text$ in atari basic ist ja eine qual... aber ich habe es mit dem variablen bzw. dynamischen restore befehl gelöst...

warum kann ich hier nichts anhängen? da würde ich es euch gleich als ATR geben...

von Heaven_tqa » Mo 5. Jun 2006, 17:48
wichtig ist, dass die wahrscheinlichkeiten aufkummuliert abgelegt sind, dann lassen sich die abfragen nacheinander abhandeln und dies würde auch schnell in assembler gehen...

huj... habe ich da assembler gesagt? mal schauen, was da kommt... ;)

von cas » Mo 5. Jun 2006, 18:35
Hallo,

das hört sich genau wie die Regeln an, die man in (Bleistift und papier) Rollenspieleregelwerken findet (Diabolo ist genau das, nur das der Spielleiter mehr oder weniger interlligent durch den Computer ersetzt wird).

Wenn Du mehr asl 255 Gegenstände hast, dann "würfle" mit 16 Bit Werten. Modulo Berechnung hilft hierbei auch.

Bei solchen Spielen muss man meist die Spielbalance manuell finetunen.

Ciao

Carsten

von cas » Mo 5. Jun 2006, 18:42
16 Bit werte aus dem Pokey

0-65536

0-127 Schwerter
0-64 einfaches Schwert
65-96 besseres Schwert
97-104 gutes Schwert
105-113 sehr gutes Schwert
104-118 Bi-Händer
119-122 Zweihänder
123-125 Drachenklinge
126 magisches Schwert 1
127 magisches Schwert 2

128-255 Schilde
.....

usw.

Wenn man es geschickt aufteilt, kann man die Warscheinlichkeit berechnen und benötigt keine Tabellen.

Ciao

Carsten

P.S.: Ich habe heute wenig Zeit, sonst käme mehr.....

von Heaven_tqa » Mo 5. Jun 2006, 19:22
prinzip verstanden...

;) mehr dazu im atariageforum...

von Heaven_tqa » Di 6. Jun 2006, 11:14
die frage nun...

welche grafikmodus soll ich nehmen?

gr.0 oder gr.12?

die monster soll man ja unterscheiden können... und a la gauntlet in einem 8x8 4 farb pixelgebilde weiss ich nicht so recht...

von Ghost » Di 6. Jun 2006, 13:56
Heaven_tqa hat geschrieben:die frage nun...

welche grafikmodus soll ich nehmen?

gr.0 oder gr.12?

die monster soll man ja unterscheiden können... und a la gauntlet in einem 8x8 4 farb pixelgebilde weiss ich nicht so recht...


Mir schein Antic 4 (sollte doch graphics 12 sein) geeignet. Mit mehreren
Zeichensaetzen und den
Playern kann man bestimmt noch ein bissl tricksen.
Hat vielleicht einer hier im Forum schonmal
Software Sprites in Antic Mode 4 programmiert, bei denen der
Hintergrund durchschein und die pixelweise bewegt werden koennen
(Evtl. auch noch mit Scrolling des Hintergrunds)? Jaja, ich weiss
duerfte wohl ziemlich schwer sein :roll:

Gruss
-/\/\artin

von Heaven_tqa » Di 6. Jun 2006, 14:51
mir schwebt momemtan ein etwas auf diablo getrimmtes gauntlet vor, d.h. random generierte dungeons, paar monster, paar items...

vor...

aber wenn man http://www.lurkerlounge.com/diablo/jarulf/jarulf162.pdf liest, kann es ja einen angst und bange werden... ;)

aber die kunst wird sein, paar wesentliche elemente zu übernehmen bzw anzupassen und dann zu schauen, wie es sich anfühlt...

von Ghost » Di 6. Jun 2006, 15:48
Heaven_tqa hat geschrieben:mir schwebt momemtan ein etwas auf diablo getrimmtes gauntlet vor, d.h. random generierte dungeons, paar monster, paar items...

vor...

aber wenn man http://www.lurkerlounge.com/diablo/jarulf/jarulf162.pdf liest, kann es ja einen angst und bange werden... ;)

aber die kunst wird sein, paar wesentliche elemente zu übernehmen bzw anzupassen und dann zu schauen, wie es sich anfühlt...


Stimmt, ein schoenes Pamphlet..da bleibt vor lauter Logik
gar kein Speicher mehr frei fuer die Graphik ;-)
Gauntlet bewegt doch die Monsterchen im 8x8 Raster..was
aber auch nicht besonders stoert.. Mit Playern koennte man dann
die Hintergrundgraphik etwas aufpeppen.
Ansonsten hoert sich ein Diablo/
Gauntlet gut an...evtl. auch mit zwei++ Spielern, hehe

Gruesslis
-/\/\artin

von Mathy » Di 6. Jun 2006, 16:14
Hallo Leute

Kenne mich mit Diablo nicht aus, Gauntlet hab' ich aber auf Modul. Und als ich dann Martin's...

evtl. auch mit zwei++ Spielern


gelesen habe, ist mir folgende Frage eingefallen:

Könnte man von so einem Spiel nicht auch eine MultiLink-version machen? Wobei dan mehrere Spieler gleichzeitig spielen, alle auf ihre eigene Rechner, und alle in der gleichen Dungeon. Die Gegner (oder Helfer) währen dann nicht immer Computergesteuert.

Tschüß

Mathy