• Howdy, Freund! Du scheinst neu hier zu sein. Warum erstellst du dir nicht einen Forenaccount, um mitdiskutieren zu können? Du kannst dich hier registrieren.
    Du hast schon einen Forenaccount? Dann kannst du dich hier einloggen. Viel Spaß!

    Was denkst du zum Beispiel über diese Themen?

Neu Bug mit Konsequenz in MPI‘s

royalfaker

FK-Meister 2023
Ich habe diesbezüglich schon ein Ticket gemacht jedoch leider erfolglos deswegen bitte ich hier um Stellungsnahme.

Es ist mir im Abenteuer aufgefallen, das ein Spieler seit er LVL 201 hat auf seiner Waffe (Aushilfkochbeil ^4) insgesamt 8 Attribute zugelegt hat zu seinem früheren LVL 200.
Hier die Dokumentation:
lvl 200

lvl 201

Diese Fehlberechnung ist aus meiner Sicht ein Bug, weil es Spieler unter LVL 201 stark beeinträchtigt.

Hier die korrekte Berechnung:


8Attribute innerhalb einer Stufe dazugewinnen hat im Gameplay massive konsequenzen (Spieler mit lvl 201 haben plötzlich 1k lps mehr, weichen 10% besser aus, machen 10% eher krits und machen ca 10% mehr schaden)

Ist ein derartiger anstieg innerhalb eines levelaufstiegs beabsichtigt und sinnvoll?
Was hattet ihr damit bisher für erfahrungen?
 

Willybald

Entdecker
lol
was abenteuer angeht reagiert doch sowieso keiner
im besten falle bekommst du die antwort ; wir leiten das weiter
und dann darfst du warten und warten
aber ich glaub nicht das da was passiert oder geändert wird
jedenfalls nicht die nächsten 10 jahre
 

Birdie

Nobelpreisträger
Ich habe diesbezüglich schon ein Ticket gemacht jedoch leider erfolglos deswegen bitte ich hier um Stellungsnahme.

Es ist mir im Abenteuer aufgefallen, das ein Spieler seit er LVL 201 hat auf seiner Waffe (Aushilfkochbeil ^4) insgesamt 8 Attribute zugelegt hat zu seinem früheren LVL 200.
Hier die Dokumentation:
lvl 200

lvl 201

Diese Fehlberechnung ist aus meiner Sicht ein Bug, weil es Spieler unter LVL 201 stark beeinträchtigt.

Hier die korrekte Berechnung:


8Attribute innerhalb einer Stufe dazugewinnen hat im Gameplay massive konsequenzen (Spieler mit lvl 201 haben plötzlich 1k lps mehr, weichen 10% besser aus, machen 10% eher krits und machen ca 10% mehr schaden)

Ist ein derartiger anstieg innerhalb eines levelaufstiegs beabsichtigt und sinnvoll?
Was hattet ihr damit bisher für erfahrungen?

Das erklärt durchaus so manche extrem unwahrscheinliche Trefferquote von einem Ende des Feldes zum anderen, Ausweicherraten, die es nicht geben kann und so einiges mehr...

Würde mich schon interessieren, was dabei herauskommt.
 

Kentucky Sam

Holzmagier
Ich befürchte, dass sich für die Handvoll Mitspieler, die noch Abts spielen, der Aufwand irgendetwas zu ändern nicht lohnt.
Und das ist gut so, es gibt andere Baustellen, die dringender ein Update, eine Änderung benötigen würden!
 

jugolas

Vampir
Community-Manager
Wir haben das vom Entwickler prüfen lassen. Es gibt hier scheinbar ein Rundungsproblem in php das wir nicht so einfach behoben bekommen.
 

Birdie

Nobelpreisträger
Zumindest erklärt das schon mal die Frage, wieso Slam nahezu untreffbar ist und im Gegensatz dazu immer trifft ;)

Dachte schon, ich checks nicht mehr :D
 

royalfaker

FK-Meister 2023
Wir haben das vom Entwickler prüfen lassen. Es gibt hier scheinbar ein Rundungsproblem in php das wir nicht so einfach behoben bekommen.
Danke fürs Feedback.

Eine geringfügige Anpassung der Attributwerte (z.b. 0.0400001 pro lvl statt 0.04 pro lvl) mit der Testung, ob es wieder irgendwo eine Rundungs Differenz gibt wäre keine Option?

Meiner Meinung nach sollte es eigentlich sowieso nie mehr wie zwei Attribute pro weiteres LVL dazugeben, da stärke und charisma beim Aushilfkochbeil nur halb soviel pro lvl dazu kommt wie die beiden anderen attris.
daher ist ein sprung von 8 Attributen ziemlich deutlich übertrieben in der Spielmechanik
 

jugolas

Vampir
Community-Manager
Danke fürs Feedback.

Eine geringfügige Anpassung der Attributwerte (z.b. 0.0400001 pro lvl statt 0.04 pro lvl) mit der Testung, ob es wieder irgendwo eine Rundungs Differenz gibt wäre keine Option?
Leider nicht, weil wir das dann nur im zwei Wochentakt testen könnten durch den Updaterhythmus. Eigentlich sollte das System grundsätzlich immer auf den nächsten vollen Wert runden (womit dann auch eher die 200 falsch wäre)
da jetzt klar zu sein scheint, dass hier ein bug vorliegt, ist wohl jede teilnahme bug-using und strafbar?
Nein ist es nicht. (It's not a bug, it's a feature)
 

ruheloser

Fußballgott
Ehemaliges Teammitglied
Leider nicht, weil wir das dann nur im zwei Wochentakt testen könnten durch den Updaterhythmus. Eigentlich sollte das System grundsätzlich immer auf den nächsten vollen Wert runden (womit dann auch eher die 200 falsch wäre)
Hüstel, Normalerweise müsste das auch ein Entwickler testen und Prüfen, da er viel mehr Möglichkeiten hätte. Z.b. Schrittweise prüfen was für Zahlen der Code berechnet, dies ist aber nur Möglich wenn man auch Codezeile für Codezeile Schrittweise durchgeht beim Berechnen. Und dies kann eben nur ein Entwickler. Stichwort: Haltepunkte im Code.
 

jugolas

Vampir
Community-Manager
Es gibt Sachen mit höherer Priorität auf der Liste der Entwickler. Die Stunden die investiert werden um diesen Bug zu beheben, sind derzeit aus unserer Sicht bei anderen Features besser investiert.
 

xyzabcd

Entdecker
Wir haben das vom Entwickler prüfen lassen. Es gibt hier scheinbar ein Rundungsproblem in php das wir nicht so einfach behoben bekommen.
Hust.

a) Ich betreute etliche tausend Zeilen PHP-Code, die wissenschaftliche Daten verarbeiteten (und das wahrscheinlich auch noch immer tun), und wenn man mal von Eingabefehlern der Leute absieht, die die Zahlenlisten abgelesen und eingetippt haben, hatten alle Fehler dieselbe Ursache: Blödheit das Programmierers.
Hätte PHP einen so absurden Rundungsfehler, wie er hier beschrieben wird, hätte ich gewaltige Sprünge in den erzeugten Graphen bemerkt - und wenn nicht ich, dann die Labore, für die wir gearbeitet haben, denn die benutzten die Vorschau, die der PHP-Code lieferte, etwa so häufig wie die finalen Graphen, die das Batch-Prozessing mit R dann ausspuckte.
Rundungsfehler in PHP haben (heute, in der Steinzeit war das noch anders) eine von zwei Ursachen: (1) man schiebt eine Fließkommazahl in MySQL/MariaDB, hat dort den Datentyp falsch deklariert, und wundert sich dann später. (2) man wandelt fröhlich zwischen Fließkommazahl und String hin und her, und passt dabei nicht höllisch auf (don't do that). (3) man kommt an die Grenzen der Genauigkeit, aber bei der lächerlichen Genauigkeit, die hier benötigt wird, kann man das ausschließen.

b) royalfakers Screenshots zeigen Bilder des Wikis. Das Wiki benutzt zwar im Hintergrund PHP, aber die Berechnung der Boni auf der Seite selbst erfolgt in Javascript (westui.set_calc.calc und westui.set_calc.lvlUp). Da ist PHP zwangsweise völlig unschuldig.



Und weil das alles so schön ist, wollen wir uns das alles mal näher ansehen... am Beispiel des Werkzeugs und der Beweglichkeit.
Das Werkzeug hat einen Beweglichkeitsbonus von 0.08 pro Level.

Und nun gucken wir mal, was im Code passiert (Javascript vom Wiki):
JavaScript:
        lvlUp: function(upg, val) {
            var d = val < 1 ? 3 : -1; // val ist in unserem Fall immer >=1, daher ist d=-1
            // Math.pow = Potenzfunktion
            // Math.round runded.
           // !negiert einen ja/nein-Wert und ist dabei ziemlich freizügig.
            var e = !upg ? 0 : Math.round(Math.max(1, val * Math.pow(10, d) * upg)) / Math.pow(10, d + 1);
            // in unserem Fall kann man das vereinfachen, weil val >= 1 und damit d=-1 ist, und Math.pow(10,-1)=0.1, Math.pow(10,d)=1 ist
           var e = !upg ? 0 : Math.round(Math.max(1, val * 0.1 * upg))
            return val + e;
        },
        ....
            // upg = Veredelungslevel
            // lvl = Char level
           // key = 1 für Levelabhängige Boni, 0 für feste
           // bi eingabe = der Bonus, um den es geht (0.08, 0.12)
           // bi ausgabe = der tatsächliche Bonus, also das, was uns interessiert.
           // Math.ceil() liefert die nächsthöhere Ganzzahl bei Fließkommazahlen, rundet also nach oben im Zahlenstrahl
           bi = wsc.lvlUp(upg, (lvl && key ? Math.ceil(bi * lvl) : bi));
           // in unserem Fall gilt, weil levelabhängig:
           // bi = wsc.lvlUp(upg, Math.ceil(bi * lvl));

Bei 0.08, Level 200, unveredelt: aufgerufen wird wsc.lvlUp(0, ceil(0.08*200)) => lvlUp(0, 16)
lvlUp(0,16): d= -1, e = 0 (unveredelt), return 0+16
Bei 0.08, Level 201 unveredelt: aufgerufen wird wsc.lvlUp(0, ceil(0.08*201)) => lvlUp(0, 17)
lvlUp(0,17): d= -1, e = 0 (unveredelt), return 0+17
Das ist also offensichtlich wie erwartet.

Bei 0.08, Level 200, veredelt auf 4, passiert das: lvlup(4, 16)
e= round(max(1, 16*0.1*4))
= round(6.4) = 6
return = 16+6 = 22

Bei 0.08, Level 201, veredelt auf 4, passiert das: lvlup(4, 17)
e= round(max(1, 17*0.1*4))
= round(6.8) = 7
return = 17+7 = 24

Da passiert kein Rundungsfehler irgendeiner Art, sondern es schlagen zwei Rundungen gleichzeitig zu: ceil(0.08*level), und round vom "Ergebnis des ceil multipliziert mit Veredelung durch 10".

Die einzige Möglichkeit, so etwas zu verhindern, wäre überhaupt nur einmal, ganz am Ende, zu runden. Das wäre unzweifelhaft mathematisch korrekter, und hätte als kleine Nebenwirkung, dass die Veredelung auf Stufe 1 unter Umständen wirkungslos wäre, wenn die Rundung nämlich schon dasselbe Bewirken würde.

Mit anderen Worten: kein Fehler, sondern tatsächlich ein Feature. Also ist alles in bester Ordnung.
 

shith.

FK-Meisterleiter 2023
Hust.

a) Ich betreute etliche tausend Zeilen PHP-Code, die wissenschaftliche Daten verarbeiteten (und das wahrscheinlich auch noch immer tun), und wenn man mal von Eingabefehlern der Leute absieht, die die Zahlenlisten abgelesen und eingetippt haben, hatten alle Fehler dieselbe Ursache: Blödheit das Programmierers.
Hätte PHP einen so absurden Rundungsfehler, wie er hier beschrieben wird, hätte ich gewaltige Sprünge in den erzeugten Graphen bemerkt - und wenn nicht ich, dann die Labore, für die wir gearbeitet haben, denn die benutzten die Vorschau, die der PHP-Code lieferte, etwa so häufig wie die finalen Graphen, die das Batch-Prozessing mit R dann ausspuckte.
[...]

Und nun gucken wir mal, was im Code passiert (Javascript vom Wiki):
JavaScript:
        lvlUp: function(upg, val) {
            var d = val < 1 ? 3 : -1; // val ist in unserem Fall immer >=1, daher ist d=-1
            // Math.pow = Potenzfunktion
            // Math.round runded.
           // !negiert einen ja/nein-Wert und ist dabei ziemlich freizügig.
            var e = !upg ? 0 : Math.round(Math.max(1, val * Math.pow(10, d) * upg)) / Math.pow(10, d + 1);
            // in unserem Fall kann man das vereinfachen, weil val >= 1 und damit d=-1 ist, und Math.pow(10,-1)=0.1, Math.pow(10,d)=1 ist
           var e = !upg ? 0 : Math.round(Math.max(1, val * 0.1 * upg))
            return val + e;
        },
        ....
            // upg = Veredelungslevel
            // lvl = Char level
           // key = 1 für Levelabhängige Boni, 0 für feste
           // bi eingabe = der Bonus, um den es geht (0.08, 0.12)
           // bi ausgabe = der tatsächliche Bonus, also das, was uns interessiert.
           // Math.ceil() liefert die nächsthöhere Ganzzahl bei Fließkommazahlen, rundet also nach oben im Zahlenstrahl
           bi = wsc.lvlUp(upg, (lvl && key ? Math.ceil(bi * lvl) : bi));
           // in unserem Fall gilt, weil levelabhängig:
           // bi = wsc.lvlUp(upg, Math.ceil(bi * lvl));
[...]
Wenn wir hier schon über Entwickler das lästern anfangen, dann möchte ich noch mit für mich wichtigen Aspekten nachlegen:
 

xyzabcd

Entdecker
Hallo Shith,

die sprechenden Namen dürften dem Javascript-Minifier zum Opfer gefallen sein. Das ist gängige Praxis.

Gruß, Uwe
 

shith.

FK-Meisterleiter 2023
Hallo Shith,

die sprechenden Namen dürften dem Javascript-Minifier zum Opfer gefallen sein. Das ist gängige Praxis.

Gruß, Uwe
Nope, dann wären sie in der Regel nur 2 Stellen lang und der Funktionsname wäre keine 5 Stellen mehr lang, außerdem würde der Minifier die Kommentare entfernen. Das ist schon so entwickelt.
 
Oben