Gruppenleveldurchschnitt ermitteln

  • Aloha, erstmal frohes neues Jahr :-)


    bei meinen aktuellen Projekt benötige ich den Leveldurchschnitt der Gruppe auf einer Variablen (für paar Skills) , rumprobiert und hinbekommen :-)

    Auf jeden Fall, falls jemand auch mal den Leveldurchschnitt ermitteln möchte lautet der Script-Call folgend:

    Code: Leveldurchschnitt der gesamten Gruppe
    1. var high = Math.max.apply(null, $gameParty.members().map(function(actor) {return actor.level}));
    2. var low = Math.min.apply(null, $gameParty.members().map(function(actor) {return actor.level}));
    3. var durchschnitt = (high + low) / 2;
    4. $gameVariables.setValue(139, durchschnitt)
    Code: Leveldurchschnitt der am Kampf teilnehmenden Akteure
    1. var high = Math.max.apply(null, $gameParty.battleMembers().map(function(actor) {return actor.level}));
    2. var low = Math.min.apply(null, $gameParty.battleMembers().map(function(actor) {return actor.level}));
    3. var durchschnitt = (high + low) / 2;
    4. $gameVariables.setValue(139, durchschnitt)

    Rot eingefärbt = Die Id der Variable in dem der Wert gespeichert werden soll :-)

  • Das berechnet die Mid-Range, d.h. (höchstes Actor-Level + niedrigstes Actor-Level) / 2und somit nicht den Durchschnitt, welcher die Summe aller Actor-Level durch die Anzahl an Actors wäre.

    Code
    1. var mean = 0;
    2. var members = $gameParty.members();
    3. for (var i = 0; i < members.length; i++) {
    4. mean += members[i].level;
    5. }
    6. mean /= members.length;
    7. $gameVariables.setValue(ID, mean);

    (Nicht getestet, geht vermutlich noch kürzer mit irgendwelchen Hilfsfunktionen)


    Ich weiß nicht wofür du das brauchst, aber je nachdem wie die Level deiner Gruppe verteilt sind kann das zu ziemlich ungewünschten Ergebnissen führen. z.B.:

    3 Actor Level 1, 1 Actor Level 20:

    Mid-Range: (1+20)/2 = 10.5

    Mean: (1+1+1+20)/4 = 5.75

  • Grandro vielen Dank für die Verbesserung :-)


    Ich werde es später mal Ausprobieren - Ich brauche das im Grunde für paar Skills, weil wenn der Spieler einen Skill einsetzt funktioniert "a.level" aber wenns der Gegner macht nicht, daher bekommen dann die Gegner dafür den Durchschnitt :-)


    Als Anmerkung noch, was mir aufgefallen ist bei Zeile 2: $gameParty.members(); Umfasst die gesamte Gruppe // $gameParty.battleMembers() würden dann nur die im Kampf befindlichen gerechnet werden. Aber ob das wiederum mit "length" geht habe ich keinen Plan.


    PS: Bei Java "for" raffe ich nicht wirklich - Wenn du Zeit und Lust hast, kannst du mir erklären wie die Bereiche dafür aufgebaut sind?

  • Als Anmerkung noch, was mir aufgefallen ist bei Zeile 2: $gameParty.members(); Umfasst die gesamte Gruppe // $gameParty.battleMembers() würden dann nur die im Kampf befindlichen gerechnet werden. Aber ob das wiederum mit "length" geht habe ich keinen Plan.

    Auch die Battlemembers haben die length-Eigenschaft. In beiden Fällen wird ein Array zurückgegeben und jedes Array hat eine Länge.


    PS: Bei Java "for" raffe ich nicht wirklich - Wenn du Zeit und Lust hast, kannst du mir erklären wie die Bereiche dafür aufgebaut sind?

    JavaScript ist nicht Java. Es gibt viele Gemeinsamkeiten aber auch einige Unterschiede. Das aber nur am Rande und für die For-Schleife ist das auch egal.

    Eine For-Schleife ist eigentlich recht einfach. Der eingeklammerte Bereich ist in drei Teile unterteilt. Im ersten Teil wird eine Variable definiert, die als Index dient. Der Einfachheit halber nimmt man normalerweise var i = 0;. Im zweiten Teil steht die Bedingung. Solange die Bedingung true zurückgibt, wird diese Schleife wiederholt. In diesem Fall ist das i < members.length, heißt also, wiederhole die Schleife solange wie die gerade definierte Variable i kleiner ist als die Anzahl der Gruppenmitglieder. Der dritte Bereich wird ausgeführt, wenn die Schleife durchgelaufen ist und bevor geprüft wird, ob sie nochmal durchlaufen soll. Das i++ bedeutet so viel wie, erhöhe die Variable i um 1. In diesem Bereich ist es wichtig, dass irgendwann die Bedingung, also der zweite Bereich, false zurückgeben muss, weil man sonst in der Schleife feststeckt.

    Im Codeblock der Schleife wird dann einfach der Level des aktuellen Gruppenmitglieds zu der Variable mean dazu addiert.


    Mehr zu den Schleifen findest du hier: Touch me

  • Bis 31, ja. Weil wenn i = 32 ist, dann ist die Bedingung ja schon false. Sonst müsstest du <= verwenden. Das darf man bei Arrays allerdings nicht tun, weil der erste Eintrag im Array den Index 0 hat. Mit <= würde man also am Ende auf einen Eintrag im Array zugreifen wollen, den es gar nicht gibt.

  • Aloha, erstmal frohes neues Jahr :-)


    bei meinen aktuellen Projekt benötige ich den Leveldurchschnitt der Gruppe auf einer Variablen (für paar Skills) , rumprobiert und hinbekommen :-)

    Auf jeden Fall, falls jemand auch mal den Leveldurchschnitt ermitteln möchte lautet der Script-Call folgend:

    Code: Leveldurchschnitt der gesamten Gruppe
    1. var high = Math.max.apply(null, $gameParty.members().map(function(actor) {return actor.level}));
    2. var low = Math.min.apply(null, $gameParty.members().map(function(actor) {return actor.level}));
    3. var durchschnitt = (high + low) / 2;
    4. $gameVariables.setValue(139, durchschnitt)
    Code: Leveldurchschnitt der am Kampf teilnehmenden Akteure
    1. var high = Math.max.apply(null, $gameParty.battleMembers().map(function(actor) {return actor.level}));
    2. var low = Math.min.apply(null, $gameParty.battleMembers().map(function(actor) {return actor.level}));
    3. var durchschnitt = (high + low) / 2;
    4. $gameVariables.setValue(139, durchschnitt)

    Rot eingefärbt = Die Id der Variable in dem der Wert gespeichert werden soll :-)

    Ich hab keinen blassen Schimmer von JS, aber eins fällt mir hier sofort auf. Rot eingefärbt seh ich nämlich nix :D


    Danke, dass du den Schnipsel mit uns teilst und danke an die Verbesserungsvorschläge. Man weiß nie, wann man sowas mal braucht :)