Skills und Damage Formula: Entfalten wir die volle Kraft!

  • Willkommen zu meiner zweiten Einheit zu Schadensformeln. Hier richte ich mich explizit an die fortgeschrittenen Nutzer, die sich bereits meinen ersten Kurs zu Herzen genommen haben und selbst schon einiges durchprobiert haben. Ich werde hier mal grob erwähnen, was wir alles durcharbeiten werden.

    • Wir werden uns eine Formel ansehen, bei der immer mindestens 1 Schaden verursacht wird.
    • Wir werden uns ansehen, wie man bei einem Skill eine eigene BattleLog Meldung erstellt.
    • Wie man einen Skill aus einem Plugin korrekt einbindet.
    • Wir werden uns einen Skill ansehen, bei dem wir nach dem Einsatz dem Helden einen Zustand erteilen werden.
    • Wir werden uns einen Skill ansehen, bei dem wir dem Gegner eventuell etwas klauen werden, abhängig von unserer Flinkheit.
    • Wir werden uns einen Skill ansehen, mit dem man bei allen Gegnern eine Bombe platziert.
    • Wir werden uns einen Skill ansehen, mit dem man bei allen Gegnern die platzierten Bomben explodieren lässt.

    Diese Punkte werden uns einige mächtige Möglichkeiten eröffnen, bei der wir schon sehr Tief in der Materie drin hängen werden. Es wird teilweise sehr kompliziert werden, aber ich gebe mir Mühe, euch das ganze so einfach wie Möglich zu erklären! Falls trotzdem Fragen aufkommen, meldet euch gern in den Kommentaren und wir fangen jetzt ohne große Umschweife mit dem Tutorial an. Haltet euch fest, jetzt geht es los!

    Einleitung

    Wie schon eingangs erwähnt, richtet sich dieses Tutorial auf fortgeschrittene Anwender. Wir werden uns teilweise auch etwas tiefer in der Materie bewegen, da ich meinen Fokus auch etwas erweitere und nicht nur in der Schadensformel hängen werde, sondern auch etwas allgemeiner mit den Skills arbeiten werde. Die .js welche ich für dieses Tutorial erstellt habe, wurde selbstverständlich an diesem Tutorial angehängt und kann dann von euch selbst auch nochmal in Ruhe begutachtet werden. Wer will, kann diese auch in sein eigenes Projekt einbinden.

    Diese Formeln können im Grunde ebenfalls bei RPG Maker VX Ace bzw. RPG Maker MV verwendet werden, benötigen jedoch etwaige Anpassungen.

    Grundlagen für dieses Tutorial

    Immer mindestens 1 Schaden

    Formel

    Dieser Punkt ist ein interessantes Konzept für Schadensberechnung, da man so immer mindestens 1 Schaden anrichtet, wenn der Skill schaden austeilt, man aber eindeutig zu Schwach ist, um dem Gegner wirklich Schaden auszurichten. Wenn wir den Standardangriff als Grundlage her nehmen, würde das wie folgt aussehen:

    dmg = a.atk*4 - b.def*2; if (dmg < 1) { dmg = 1; }; dmg;

    Erklärung

    dmg = a.atk*4 - b.def*2; ist unsere übliche Schadensformel, welche an die Variable dmg übergeben wird.

    if (dmg < 1) { dmg = 1; }; dmg; hier wird mit einem if überprüft, ob die Variable dmg weniger Schaden als 1 machen würde und falls ja, wird der Schaden auf 1 gesetzt. Das dmg; dient dazu, dass der Schaden ausgegeben wird.

    Im Grunde war dies eine einfache Wiederholung aus dem vorherigen Kurs und konnte auch mit diesem Wissen von dort umgesetzt werden. Dieser Punkt wird jedoch gelegentlich im Tutorial erwähnt, weswegen es eine gute Idee ist, diesen auch hier noch vorzuzeigen.

    Eine eigene Meldung in den BattleLog übergeben

    Aufbau

    Hier sind wir schon beim ersten Punkt, der uns in diesem Tutorial sehr nützlich ist. Es gibt einige Standard-Möglichkeiten, die einem beim BattleLog einen vordefinierten Text anzeigen, aber wenn wir selbst einen aufbauen wollen, dann wird das für viele ohne ein Plugin nicht funktionieren. Doch da liegt Ihr falsch. Ich zeige euch wie es geht!

    BattleManager._logWindow.addText("Ich bin ein Text, der nun angezeigt werden kann"); Damage-Formula;

    Erklärung

    Eine kurze Erklärung was dieser Befehl macht und wie mächtig dieser wirklich wird.

    BattleManager._logWindow.addText( dies fügt eine Nachricht zum Kampf-Log mit hinzu, sobald der Skill genutzt wird. Hier kann man spezielle Nachrichten reinschreiben, die auch den Gegner betreffen. Beim Text kann man zum Beispiel auch ausgeben, dass der Anwender mit dem Namen XY das Ziel YZ ganz bezaubernd findet. Dies würde dann so aussehen:

    BattleManager._logWindow.addText(a.name() + " findet " + b.name() + " ganz bezaubernd.");

    Dies würde also aussagen, dass sobald der Skill verwendet wird, steht dann im Kampflog (als Beispiel verwendet Reid den Skill gegen einen Gnom) "Reid findet Gnom A ganz bezaubernd.".

    Ihr werdet in diesem Tutorial diese Funktion ein paar mal sehen!

    Wie man eine Schadensformel für einen Skill aus einer .js korrekt einbindet!

    Erklärung

    Als erstes würde ich sagen, wir öffnen uns den Editor. Empfehlen würde ich persönlich Notepad++, da es doch sehr viele und auch gute Vorteile bietet, wenn man da etwas macht.

    Grundsätzlich sieht es wie folgt aus, wenn man einen Skill in der .js erstellt:
    function name(a, b) { return damageFormula };

    function name(a, b) gibt an, dass man diese Methode mit dem Namen der Funktion aufrufbar wird. Die beiden Parameter (a, b) müssen dann beim Aufrufen gesetzt werden, ansonsten erhält man eine Fehlermeldung, also achtet darauf! Bei diesem Beispiel, müsste man dann beim Skill in der Schadensformel folgendes angeben: dmg = name(a, b); dmg;

    Ebenso muss man diese .js bei den Plugins hinzufügen, so dass es auch genutzt werden kann.

    Zustandsänderung beim Anwender durch Nutzen des Skills

    Aufbau

    Wir wollen einen Skill machen, der dem Gegner Schaden anrichtet, welcher sich durch Angriff des Anwenders - Verteidigung berechnen lässt. Der Anwender soll dabei aber den Status 11 erhalten.

    a.addState(11); a.atk - b.def

    Erklärung

    Der Befehl a.addState(11) fügt dem Anwender den Status 11 hinzu. Danach wird mit a.atk - b.def berechnet, wie hoch der Schaden ausfällt. Wenn man einen anderen Status erteilen will, muss man lediglich die 11 mit der entsprechenden ID des gewünschten Status ersetzten.

    Weitere Möglichkeiten & Anwendungsbeispiele

    Es gibt hier viele verschiedene Situationen, in denen man dies nutzen kann. Man kann so zum Beispiel einen Status erstellen, welcher erst nach 2 Zügen weg geht, so dass man von Pokemon den Hyperstrahl nachbauen könnte. Ebenso kann man so auch für schwache, aber flinke Charaktere einen Skill basteln, der etwas Schaden austeilt und dem Anwender dann den Status 2 (Verteidigung) erteilt. So würde der Anwender in folge dessen, weniger Schaden erhalten.

    Mann kann aber auch einen Status entfernen, mit a.removeState(11). Hier würde man dem Anwender den Status mit der ID 11 wieder entfernen. Probiert euch hier ruhig etwas aus.

    Komplexe Skills

    Stehlen

    Spezifikation

    Was benötigen wir hier? Wir wollen einen Skill erstellen, der dem Gegner anhand der eigenen Flinkheit (agi) etwas Geld, oder gar ein Item klaut. Man könnte zwar alles in der Damage Formula selbst bearbeiten, jedoch würde ich dies nicht empfehlen. Wir werden nun auch erste Änderungen in an bestehenden Klassen des Makers durchführen um uns das ganze zu erleichtern.

    Wir wollen nun den Skill so erstellen, dass man einmal bei einem Gegner etwas klauen kann. Sobald etwas geklaut wurde, kann bei diesem Gegner nichts mehr geklaut werden in diesem Kampf. Ebenso könnte man ja sagen, dass man bei dem Gegner entweder eine zufällig bestimmte Menge Gold oder ein Item klauen kann.

    Als Erfolgschance würde ich sagen, nehmen wir die doppelte agi des Anwenders und rechnen diese * 100 und dividieren dann durch die vierfache agi des Ziels. Wir runden diesen Wert dann auf eine ganze Zahl. Dann lassen wir eine zufällige Zahl zwischen 0 und <100 zufällig bestimmen. Ist die zufällig generierte Zahl kleiner als unsere errechnete Zahl, so ist der Versuch es zu klauen erfolgreich und es wird nun ermittelt, ob es ein Item wird, oder doch eher etwas Geld. Das Item das geklaut werden kann, soll speziell hinterlegt sein. Die Chance zwischen Geld und Item soll bei 50:50 liegen. Es wird hier nochmals eine zufällige Zahl zwischen 1 und 10 generiert, wobei die geraden Zahlen für Item stehen und die ungeraden Zahlen für Geld. Es soll eine Zufällige Zahl zwischen 1 und 50 gerollt werden und dies ist dann das Gold das geklaut wird. Es soll dann im Battlelog eine Nachricht ausgegeben werden, was geklaut wurde, oder ob es überhaupt etwas zu klauen gibt. Zusätzlich soll der Angriff etwas Schaden anrichten.

    Zusammengefasst, soll der Skill folgendes beinhalten:

    1. Eine Abfrage, ob es bei dem Ziel etwas zu stehlen gibt, bzw. ob dieser bereits erfolgreich beklaut wurde.
    2. Die Formel für den Erfolg soll berechnet werden (2x a.agi * 100 / 4x b.agi) > Math.floor(Math.random() * 100);
    3. Eine Abfrage bei einem erfolgreichen Versuch, was geklaut werden soll. if (Math.floor(Math.random() * 10 + 1) % 2 == 0) {ja;}else{nein};
    4. Falls Geld geklaut wird, soll eine zufällige Zahl zwischen 1 und 50 generiert werden Math.floor(Math.random() * 50 + 1)
    5. Nachricht im BattleLog BattleManager._logWindow.addText(a.name() + " klaut " + Gegenstand/Geld + " vom Gegner " + b.name() + " .");
    6. Schaden soll ausgeteilt werden a.atk*2 - b.def

    Vorbereitung

    Wenn wir nun das alles von oben zusammen fassen, haben wir eine recht interessante Aufgabe vor uns. Starten wir mit dem ersten Punkt, so dass wir hier auch wirklich sauber arbeiten können. Erstellen wir als erstes eine .js welche wir Schadensformeln nennen und als Schadensformeln.js im plugin-Ordner abspeichern. Nun gehen wir in die Datenbank zum Skill und schreiben in die Schadensformel folgendes: dmg = stehlen(a, b); dmg;.

    Als nächstes gehen wir nun zurück in unser frisch erstelltes Plugin und schreiben einmal folgendes:

    function steal(a, b) {

    };

    Damit haben wir zumindest unsere Funktion bereits erstellt. Als nächstes werden wir dem Game_Battler eine Möglichkeit geben, zu erkennen, ob dieser erfolgreich bestohlen wurde. Dies machen wir wie folgt:

    var addNewFunctions = Game_Battler.prototype.initMembers;

    Game_Battler.prototype.initMembers = function() {

    addNewFunctions.call(this);

    this._steal = false;

    };

    Was haben wir hier gemacht? Wir haben eine bereits bestehende Methode um einen Wert erweitert, den wir dann in weiterer Folge brauchen werden. Der Übersicht halber werden wir noch 2 Methoden hinzu fügen um die Variable _steal abfragen zu können, bzw. um diese Variable auf true zu setzten. Dies sieht dann wie folgt aus:

    Game_Battler.prototype.stealSuccess = function() {

    this._steal = true;

    };

    Game_Battler.prototype.stealable = function() {

    return this._steal;

    };

    Wir haben nun die Methoden stealSuccess() und stealable() zum Game_Battler hinzu gefügt, was nun bedeutet, dass bei Gegnern und auch bei Helden etwas geklaut werden kann.

    Mit diesen Erweiterungen der Basis haben wir uns schon viele Möglichkeiten geschaffen. Starten wir nun durch mit unseren Überprüfungen. Dafür gehen wir in die anfangs erstellte Methode steal.

    Ausführung

    Wir werden uns nun erstmal der Tatsache widmen, dass wir schauen wollen, ob man bei diesem Gegner etwas klauen kann, oder nicht. Dies sieht wie folgt aus:

    if (!b.stealable()) {

    } else {

    };

    In unserer Abfrage, fragen wir nun ab, ob bei unserem Ziel die Variable stealable true ist. Da wir diese aber Grundsätzlich auf false haben, wird diese mit einem ! davor automatisch auf das Gegenteil gesetzt. Damit wird aus einem false ein true bzw. aus einem true ein false. Als nächstes würde ich vorschlagen, dass wir den Else-Zweig abschließen. Ich würde dort folgendes eingeben:

    if (b.enemyId() == 2) {

    BattleManager._logWindow.addText(b.name() + " hat nichts, das man stehlen könnte.");

    } else {

    BattleManager._logWindow.addText(b.name() + " hat nichts mehr, das man stehlen könnte.");

    };

    Ich habe hier nochmal eine if-Abfrage gemacht, da wir ja auch eventuell Gegner haben wollen, bei denen wir nichts klauen können. Dann würden wir einen Text ausgeben, bei dem eben drin steht, dass es nichts zum Stehlen gibt. Andernfalls soll einfach nur ein Text ausgegeben werden, dass es nichts mehr zu stehlen gibt bei besagtem Gegner.

    Konzentrieren wir uns nun auf den ersten Teil der übergeordneten if-Abfrage.

    if ((a.agi * 2 * 100 / (b.agi * 4)) > Math.floor(Math.random()*100)) {

    } else {

    };

    So sieht es nun richtig aus. Den else-Zweig werden wir zum Schluss bearbeiten. Wenn diese Abfrage nun aber positiv ausfällt, soll folgendes passieren:

    if ((Math.floor(Math.random()*10 + 1)) % 2 == 0) {

    } else {

    }

    Kurze Erklärung was hier gemacht wird. Der erste Teil der Abfrage mit dem Math.floor und Math.random sollte jedem noch bekannt sein aus dem vorhergehenden Tutorial. Jedoch haben wir jetzt ein % 2 == 0 mit dazu bekommen. Dieses macht folgendes: Dividiere das Ergebnis durch 2. Gibt es keinen Rest, dann ist die Zahl gerade, ansonsten Ungerade.

    Sollte die Zahl ungerade sein, geben wir folgendes ein:

    money = Math.floor(Math.random()*50 + 1);

    $gameParty.gainGold(money);

    BattleManager._logWindow.addText(a.name() + " konnte " + money + "\G von " + b.name() + " stehlen.");

    b.stealSuccess();

    Wir haben hier also erfolgreich Gold geklaut!

    Nun kümmern wir uns um das Item. Für dieses Tutorial würde ich sagen, soll man immer das Item mit der ID 1 erhalten. Ihr könnt das dann aber später mit etwas JavaScript-Wissen selbst erweitern und so für jeden Gegner ein eigenes Item zum stehlen definieren.

    Das stehlen würde dann wie folgt aussehen:

    item = $dataItems[1]

    $gameParty.gainItem(item, 1)

    BattleManager._logWindow.addText(a.name() + " konnte " + item.name() + " von " + b.name() + " stehlen.");

    b.stealSuccess();

    Was haben wir hier nun gemacht? Einfach gesagt, wir haben der Variable item das erste Item aus dem Datensatz $dataItems gegeben. Danach erhält der Spieler genau 1x das Item. Es wird ein Text ausgegeben und der Diebstahl wird als Erfolg verbucht.

    Kommen wir nun zu dem Fall, dass die Abfrage zum Stehlen fehl schlägt. Dann werden wir folgenden Text anzeigen:

    BattleManager._logWindow.addText(a.name() + " konnte leider nichts von " + b.name() + " stehlen.");

    Wir haben nun aber noch 2 Punkte offen. Wir haben ja zu Beginn gesehen, dass wir einmal bei Gegner 2 sagen, der hat Grundsätzlich nichts. Das müssen wir nun in unserer Abfrage berücksichtigen. Daher würde ich die Abfrage etwas umbauen und dann so aussehen lassen:

    function steal(a, b) {

    if (b.enemyId() == 2) {

    BattleManager._logWindow.addText(b.name() + " hat nichts, das man stehlen könnte.");

    } else if (!b.stealable()) {

    if ((a.agi * 2 * 100 / (b.agi * 4)) > Math.floor(Math.random()*100)) {

    if ((Math.floor(Math.random()*10 + 1)) % 2 == 0) {

    item = $dataItems[1]

    $gameParty.gainItem(item, 1)

    BattleManager._logWindow.addText(a.name() + " konnte " + $dataItems[1].name() + " von " + b.name() + " stehlen.");

    b.stealSuccess();

    } else {

    money = Math.floor(Math.random()*50 + 1);

    $gameParty.gainGold(money);

    BattleManager._logWindow.addText(a.name() + " konnte " + money + "\G von " + b.name() + " stehlen.");

    b.stealSuccess();

    };

    } else {

    BattleManager._logWindow.addText(a.name() + " konnte leider nichts von " + b.name() + " stehlen.");

    };

    } else {

    BattleManager._logWindow.addText(b.name() + " hat nichts mehr, das man stehlen könnte.");

    };

    };

    Was hat sich nun geändert? Naja sagen wir es so, wir haben die Abfrage ob die Gegnerische ID == 2 ist, an den Anfang gesetzt, da dies weitaus Sinnvoller ist, da wenn dies zutrifft, der Rest nicht berücksichtigt werden muss und wir diesen Punkt nur einmal vorhanden haben und nicht 2 mal schreiben müssen. Jetzt müssen wir nur mehr die Formel für den Schaden hinzufügen. Dies schreiben wir dann zum Schluss vor dem letzten }; rein:

    return a.atk*2 - b.def

    Dadurch haben wir nun auch eine kleine Formel für den Schaden dabei.

    Das wars dann auch schon mit dem Stehlen Skill.

    Bomben Platzieren Skill

    Spezifikation

    Wir wollen nun einen Skill erstellen, den wir nutzen und dann eine Bombe bei dem Ziel platzieren. Wir können den Skill beliebig oft verwenden und so mehrere Bomben bei einem Gegner platzieren. Es soll beim Platzieren ein Text angezeigt werden, welcher uns zum einen sagt, dass wir Bomben platziert haben und wie viele Bomben bei dem besagten Gegner platziert sind.

    Vorbereitung

    Wir werden nun wieder unser Plugin Schadensberechnung.js öffnen, da wir hier ein paar Dinge ergänzen werden. Die erste Änderung wird hier gemacht:

    var addNewStuff = Game_Battler.prototype.initMembers;

    Game_Battler.prototype.initMembers = function() {

    addNewStuff.call(this);

    this._steal = false;

    this._bombs = 0;

    };

    Verändert hat sich das nun soweit, dass wir eine weitere Variable hinzugefügt haben, welche sich this._bombs nennt. Dies werden wir dann dafür her nehmen, damit wir verfolgen können, wieviele Bomben platziert wurden. Da wir das nun haben, benötigen wir noch 3 Methoden.

    1. Einmal eine Methode um Bomben zu platzieren (addBombs(anzahl))
    2. Einmal eine Methode um die Bomben auf 0 zu setzten (resetBombs())
    3. Einmal eine Methode um heraus zu finden, wieviele Bomben platziert sind (bombs())

    Legen wir diese 3 mal schnell an:

    Game_Battler.prototype.bombs = function() {

    return this._bombs;

    };

    Game_Battler.prototype.addBombs = function(value) {

    this._bombs += value;

    };

    Game_Battler.prototype.resetBombs = function() {

    this._bombs = 0;

    };

    Nun haben wir unsere 3 Methoden angelegt, welche uns helfen, dass wir nun diesen Skill umsetzten können. Deswegen würde ich sagen: Legen wir los!

    Ausführung

    Beginnen wir einmal mit dem Grundgerüst für diesen Skill. Wir erstellen einen Skill, den wir zum Beispiel Bomben legen Einzeln nennen, welcher nur auf einen Gegner anwendbar ist. Bei der Schadensformel geben wir dann folgendes an:
    bombenLegen(a, b)

    In unserem "Plugin" werden wir uns nun diese Funktion ebenfalls anlegen.

    function bombenLegen(a, b) {

    };

    Mit dieser einfachen Zeile beginnen wir nun zu arbeiten. Wir wollen nun den Zähler um 1 erhöhen und dann eine Nachricht ausgeben, dass eine Bombe platziert wurde. Ebenso wollen wir eine Nachricht ausgeben, die besagt, wieviele Bomben bereits platziert sind. Beginnen wir also:

    b.addBombs(1);

    BattleManager._logWindow.addText(a.name() + " platziert eine Bombe in der Nähe von " + b.name());

    Hier haben wir nun den Zähler vom Ziel um 1 erhöht. Ebenfalls haben wir zuerst einmal eine Nachricht ausgegeben, dass der Anwender beim Ziel eine Bombe platziert hat. Jetzt fehlt nur noch eine Nachricht, die besagt wieiviele Bomben nun beim Ziel sind. Da es im deutschen einen kleinen Unterschied gibt zwischen "Beim Ziel liegt eine Bombe" und "Beim Ziel liegen 2 Bomben", brauchen wir noch eine kleine Abfrage, der Schönheit wegen.

    if (b.bombs() == 1) {

    BattleManager._logWindow.addText("Derzeit wurde eine Bombe bei " + b.name() + " platziert.");

    } else {

    BattleManager._logWindow.addText("Derzeit sind " + b.bombs() + " Bomben bei " + b.name() + " platziert.");

    };

    Hier prüfen wir nun, ob das Ziel genau eine Bombe hat. Sofern dies zutrifft, wird explizit der Text für die Einzahl verwendet, ansonsten der für die Mehrzahl.

    Im gesamten sieht diese Funktion dann so aus:

    function bombenLegen(a, b) {

    b.addBombs(1);

    BattleManager._logWindow.addText(a.name() + " platziert eine Bombe in der Nähe von " + b.name());

    if (b.bombs() == 1) {

    BattleManager._logWindow.addText("Derzeit wurde eine Bombe bei " + b.name() + " platziert.");

    } else {

    BattleManager._logWindow.addText("Derzeit sind " + b.bombs() + " Bomben bei " + b.name() + " platziert.");

    };

    };

    Zusätzliche Information

    Wenn man diesen Skill anwendbar auf alle Gegner macht, so wird der Text so oft angezeigt, wie Gegner am Bildschirm sind, man muss also im Grunde nichts ändern. Man sollte das nur dabei beachten.

    Bitte nicht wundern, wenn der Skill eingesetzt wird, erhaltet man immer wieder die Meldung, dass der Gegner keinen Schaden erhalten hat. Dies liegt daran, dass durch die Schadensformel ein Schaden erwartet wird. Wenn wir bei dem Skill nur platzieren und nicht Schaden machen, dann ist das leider nicht anders lösbar mit der Schadensformel. Dieser Skill kann theoretisch auch per Common Event umgesetzt werden, ist jedoch weitaus schwieriger das gezielt auf einzelne Ziele zu machen. Daher empfehle ich hier minimal Schaden mitzugeben, weil man dem Gegner die Bomben entgegenwirft, da könnt Ihr kreativ sein.

    Bomben zünden Skill

    Spezifikation

    Wir haben nun einen Skill, mit dem wir Bomben legen können, nun brauchen wir noch einen Skill, mit dem wir diese auch zum Explodieren bringen können sollten. Deswegen werden wir nun einen Skill erstellen, welcher beim Verwenden alle Bomben beim Ziel zum explodieren bringt. Der Schaden soll dabei pro Bombe erhöht werden (zB. 1 Bombe macht 50 Schaden und so würden dann 2 Bomben 100 machen). Es soll auch gesagt werden, wieviele Bomben gezündet werden.

    Ausführung

    Beginnen wir beim Skill in der Datenbank selbst. Wir erstellen einen Skill und schreiben bei der Schadensformel dann folgendes rein:

    dmg = bombenExplodieren(a, b, 50); dmg;

    Dies sieht nun etwas anders aus als sonst. Wir haben hier noch zusätzlich den Wert 50 dabei stehen. Damit kann man verschiedene Skills machen, mit denen man die Bomben zünden kann, die dann eventuell einfach besser Funktionieren und daher mehr Schaden verursachen. Da ist eurer Fantasie freien Lauf gelassen. Zurück aber zum Tutorial. Wir wollen nun diese Funktion auch in unserer Schadensformel.js hinzufügen.

    function bombenExplodieren(a, b, base) {

    };

    Wir haben nun den Grundstein gelegt, welchen wir im nächsten Schritt ausfüllen werden und damit das ganze funktionsfähig wird. Lasst uns den Schaden berechnen und den Text ausgeben, so wie die Bomben wieder auf 0 zurück setzten.

    dmg = base * b.bombs();

    BattleManager._logWindow.addText(a.name() + " zündet alle " + b.bombs() + " Bomben bei " + b.name());

    b.resetBombs();

    return dmg;

    Zuerst wird einmal der Schaden an sich berechnet, indem wir die übergebene Variable base mit der Anzahl der platzierten Bomben multiplizieren. Danach geben wir den Text aus, wieviele Bomben explodiert sind. Jetzt müssen wir nur noch die Bomben zurück setzten und den Schaden übergeben, was mit return dmg; passiert.

    Das war die große Hexerei dahinter. Hier noch einmal die gesamte Funktion auf einen Blick:

    function bombenExplodieren(a, b, base) {

    dmg = base * b.bombs();

    BattleManager._logWindow.addText(a.name() + " zündet alle " + b.bombs() + " Bomben bei " + b.name());

    b.resetBombs();

    return dmg;

    };

    Zusätzliche Information

    Wenn der Skill nicht nur auf ein Ziel angewendet wird, sondern auf alle, wird der Schaden für jedes Ziel einzeln gerechnet und die Nachricht wird dann ebenfalls mehrmals angezeigt.

    Abschluss

    Ich bin nun zum Schluss des Tutorials gekommen. Ich hoffe es ist noch immer recht verständlich für euch, da ich mir recht viele Gedanken dazu gemacht habe. Es gibt bei den ganzen Skills die hier heute vorgestellt wurden, noch immer Luft nach oben. Vor allem beim Stehlen Skill kann man noch so viel mehr machen, als das was gezeigt wurde von mir. Da kann man noch viel komplexer werden und auch verschiedene Items geben, bzw. auch Waffen & Rüstung ausgeben. Jedoch würde das mehr am Tutorial selbst vorbei gehen.

    Ich habe auch etwas JavaScript mit rein gepackt, da wir ohne diese kleinen Zusätze, die Skills erst gar nicht realisieren konnten. Ich habe ein paar Befehle nicht genauer erklärt, stehe da aber gern Rede und Antwort bei Fragen. Falls Ihr noch weitere Ideen für Skills habt, gebt bescheid und wir können das dann in eines der beiden Tutorials einarbeiten.

    Ich hoffe es hat euch im Großen und Ganzen gefallen. Das Plugin für die Damage Formeln befinden sich im Anhang in der .zip-Datei. Auf dieser könnt Ihr auch gern aufbauen und in eurem Projekt verwenden.

  • Ein schier überwältigendes Tutorial. Bei Programmierern frage ich mich oft, ob sie nicht in Wahrheit Aliens sind, weil so viel Hirnschmalz eigentlich nicht in einen menschlichen Schädel passen sollte.


    Herzlichen Dank für die Erhellung und für die viele Mühe! :laechelderork:

  • Das meiste Wissen bei den Damage Formulas kommt vom Ace damals, wie ich ein Script von Yanfly genutzt hatte, welches mir mehr Kontrolle über die Damage Formula gab, wo ich dann mit der Zeit genauer hin schaute und merkte, dass es eigentlich nur statt dem Wert aus der Datenbank, den aus dem Script weiter gegeben hat. Von da an begann ich dann halt vieles auszutesten, was geht und was nicht.


    Ich habe dann halt nur überlegt, wie man da einen Stehlen-Skill bauen könnte und wie man das mit den Bomben umsetzt. Es hilft einem zwar, dass man weiß wie man Code schreibt, aber man schafft das im Grunde auch ohne.

  • Da bin ich nicht sicher. Zu recht hast du darauf hingewiesen, dass dies ein Tutorial für Fortgeschrittene ist. Es geht ja schon damit los, dass der Laie nicht weiß, wo er den Code überhaupt eintragen soll. Wofür a und b stehen, muss auch bekannt sein, um die Codestücken sinnvoll modifizieren zu können. Ich vermute, dass man ohne wenigstens grundlegende Codingkenntnisse im Zusammenhang mit dem Maker trotz deiner sehr guten Erklärungen auf dem Schlauch stehen wird.


    Aber vielleicht juckt es dich oder eins unserer anderen Überhirne ja irgendwann in den Fingern, ergänzend hierzu ein anfängerfreundliches Urschleim-Tutorial für die Anwendung von JS im Maker zu verfassen. :laechelderork:

  • Ich hab gerade einen kleinen Fehler in der Formel bemerkt, hier die korigierte Version:


    ((b.isEnemy() && Math.floor(b.hp / b.paramBase(0) * 100) <= 20) || (b.isActor() && Math.floor(b.hp /b.maxhp * 100) <= 20) ? b.addState(1) : deine Schadensformel


    durch diese Änderung werden beim Helden die wahren maxHP verwendet und nicht wie beim Gegner, nur die Datenbank MaxHP. Falls der Skill nie gegen die Heldengruppe angewendet werden sollte, reicht es lediglich folgendes zu kopieren:


    Math.floor(b.hp / b.paramBase(0) * 100) <= 20? b.addState(1) : deine Schadensformel


    lg Flip

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!