![]() ![]() |
Die Gegner-KI und die Schadensermittlung |
Bevor ein Gegner überhaupt eine Fertigkeit ausüben kann, sollte sein Verhalten zum Tragen kommen, also die Art und Weise, nach der ein Gegner sein Ziel auswählt, womit er angreift und dergleichen. Gerade hierfür kommt hier die Variable "Chara-Move-ID" zum Einsatz, um die Gegner untereinander unterscheiden zu können (auch dahingehend, ob es sich um einen CharSet-Gegner oder einen Picture-Gegner handelt). Hier noch einmal die Tabelle:
Nummer: | Charakter: |
1 | Held 1 |
2 | Held 2 |
3 | Held 3 |
4 | Held 4 |
5 | Gegner 1 |
6 | Gegner 2 |
7 | Gegner 3 |
8 | Gegner 4 |
Ihr seht also, dass die Werte 5 bis 8 für die Gegner stehen, also für unsere Zwecke die wichtigen sind. Gegner 1 bis Gegner 3 sollen hier die CharSet-Gegner sein, während Gegner 4 demnach der Picture-Gegner ist. Aber wie soll sich ein Gegner verhalten? Nach welchen Kriterien geht ein Angreifer vor, wenn er sich um sein Ziel kümmert? Hier kann man schon auf typisches menschliches Verhalten zurückgreifen:
Welcher der Gegner ist der körperlich schwächere? Hier können die Gegner das an Werten wie der Angriffskraft erkennen.
Welcher Gegner hat die geringere, maximale Lebenskraft und die größeren Wunden? Der Chara mit der geringsten, maximalen Lebenskraft gilt bei den Angreifern als Schwächling und wird eher angegriffen als ein mutiger, starker Gegner.
Alternativ kann hier auch ein zufällig ausgewähltes Ziel durch die Gegner angegriffen werden. In unserem Beispiel gehen wir zuerst davon aus, dass die Gegner eine 50:50-Chance haben, entweder ein zufälliges oder ein aufgrund "körperlicher Merkmale" bestimmtes Ziel anzugreifen.
![]() |
Erstellt ein neues, freies Ereignis, das durch Tastendruck gestartet
werden soll. Nennt es "Gegnerskills". |
||||||||||||||||||||||||||||
![]() |
Auf der ersten Ereignis-Seite bestimmt ihr eine neue, freie Variable,
der ihr den Namen "Temp-Randomized" gebt. Sie soll eine Zufallszahl zwischen
1 und 100 speichern. |
||||||||||||||||||||||||||||
![]() |
Dieser Variable folgt eine Bedingung, die abfragt, ob der Wert der
Variable "Temp-Randomized" größer als 50 ist. Einen Nein-Fall brauchen wir
hier unbedingt. |
||||||||||||||||||||||||||||
![]() |
Im Ja-Fall der Bedingung soll nun der "schwächste"
Gegner gewählt werden. Hierfür braucht ihr zum Anfang eine neue, freie
Variable, die ihr "Temp-Hero-Var-ID" nennt. Sie soll die Nummer der Variable
speichern, die ihr "Held #1" genannt habt (Im Kapitel, das den Einstieg und
das Verlassen des SKS erklärt). In unserem Beispiel ist dies die Zahl 31. Auch die bereits aus dem Kapitel [Anzeige abnormer Zustände] bekannte Variable "Zustandsvar No" soll verwendet werden und die Nummer der Variable speichern, die ihr "Zustand - Held #1" genannt habt. |
||||||||||||||||||||||||||||
![]() |
Direkt danach folgt eine Endlosschleife. |
||||||||||||||||||||||||||||
![]() |
Innerhalb dieser Endlosschleife legt ihr zuerst
eine weitere Variable an, der ihr den Namen "Temp-Hero-ID" gebt. Sie soll
den Wert der Variable speichern, deren Nummer von der Variable "Temp-Hero-Var-ID"
vorgegeben wird. Legt auch gleich noch eine neue Variable an, der ihr den Namen "Temp-Condition" gebt. Sie soll die abnormen Zustände aus der Variable aufnehmen, deren Nummer von der Variable "Zustandsvar No" vorgegeben wird. |
||||||||||||||||||||||||||||
![]() |
Hiernach folgt eine Bedingung, die prüfen soll, ob
der Wert der Variable "Temp-Condition" anders als 1 ist. Hier brauchen wir
einen "Nein-Fall".
|
||||||||||||||||||||||||||||
![]() |
Im Nein-Fall der ganz am Anfang angelegten
Bedingung soll nun zufällig ein Ziel für den Gegner gewählt werden. Die bereits verwendete Variable "Temp-Hero-Var-ID" soll die Nummer der Variable speichern, die ihr "Held #1" genannt habt (Im Kapitel, das den Einstieg und das Verlassen des SKS erklärt). In unserem Beispiel ist dies die Zahl 31. Auch die bereits aus dem Kapitel [Anzeige abnormer Zustände] bekannte Variable "Zustandsvar No" soll verwendet werden und die Nummer der Variable speichern, die ihr "Zustand - Held #1" genannt habt. |
||||||||||||||||||||||||||||
![]() |
Darauf folgt - noch immer innerhalb des
Nein-Falles - eine Endlosschleife. |
||||||||||||||||||||||||||||
![]() |
In dieser Endlosschleife soll in die Variable "Enemy's Target"
eine Zufallszahl zwischen 1 und 4 geschrieben werden. |
||||||||||||||||||||||||||||
![]() |
Nun müssen die Werte der Variablen "Temp-Hero-Var-ID"
und "Zustandsvar No" um den Wert der Variable "Enemy's Target" erhöht, dann
jeweils um 1 verringert werden. |
||||||||||||||||||||||||||||
![]() |
Die Variable "Temp-Hero-ID" soll nun den Wert der
Variable speichern, deren Nummer von der Variable "Temp-Hero-Var-ID"
vorgegeben wird. Auch die Variable "Temp-Condition" soll den Wert der Variable aufnehmen, deren Nummer in der Variable "Zustandsvar No" gespeichert ist. |
||||||||||||||||||||||||||||
![]() |
Direkt danach folgt eine Bedingung, die abfragt,
ob der Wert der Variable "Temp-Hero-ID" anders als der Wert "0" ist.
Hier ist ein Nein-Fall unbedingt erforderlich.
|
Gegnerskills-Ereignis | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[Ereignisseite 1][Push Key] [Variable [Temp-Randomized]][<-- [Wert setzen][zwischen [1] und [100]]] [Bedingung][Variable][Temp-Randomized][größer][50]
|
Im englischem Maker |
<>Change Var: Var[qqq1: Temp-Randomized]
(Set)-Random(1 to 100) <>If Var(qqq1: Temp-Randomized) 50 (>) <>Change Var: Var[qqq2: Temp-Hero-Var-ID] (Set)-31 <>Change Var: Var[xxx1: Zustände No.] (Set)-85 <>Loop <>Change Var: Var[qqq3: Temp-Hero-ID] (Set)-Var[Var[qqq2]] <>Change Var: Var[qqq4: Temp-Condition] (Set)-Var[Var[xxx1]] <>If Var (qqq4: Temp-Condition) 1 (<>) <>If Var (qqq3: Temp-Hero-ID) 1 <>Change Var: Var[qqq5: Temp-Attrib-New] (Set)-Alex's HP <>Change Var: Var[qqq5: Temp-Attrib-New] (+)-Alex's Max HP <>Change Var: Var[qqq5: Temp-Attrib-New] (+)-Alex's Attack <>Change Var: Var[qqq6: Temp-Weakling?] (Set)-Var[qqq2] <> :Else Case <>If Var (qqq3: Temp-Hero-ID) 1 <>Change Var: Var[qqq5: Temp-Attrib-New] (Set)-Annie's HP <>Change Var: Var[qqq5: Temp-Attrib-New] (+)-Annie's Max HP <>Change Var: Var[qqq5: Temp-Attrib-New] (+)-Annie's Attack <>Change Var: Var[qqq6: Temp-Weakling?] (Set)-Var[qqq2] <> :End Case <> :End Case <>If Var(qqq2: Temp-Hero-Var-ID) 31(<>) <>If Var(qqq7: Temp-Attrib-Old) 0(<>) <>If Var(qqq7: Temp-Attrib-Old) V[qqq5](>=) <>Change Var: Var[qqq7: Temp-Attrib-Old] (Set)-Var[qqq5] <>Change Var: Var[qqq8: Enemy's Target] (Set)-Var[qqq6] <> :End Case <>Change Var: Var[qqq2: Temp-Hero-Var-ID] (+)-1 <>Change Var: Var[xxx1: Zustände No.] (+)-1 <>Label 2# <>If Var(qqq2: Temp-Hero-Var-ID) 34(>) <>Change Var: Var[qqq8: Enemy's Target] (-)-30 <>Break <> :End Case <> :Else Case <>Goto Label 1# <> :End Case <> :Else Case <>Label 1# <>Change Var: Var[qqq7: Temp-Attrib-Old] (+)-Var[qqq5] <>Change Var: Var[qqq8: Enemy's Target] (Set)-Var[qqq6] <>Change Var: Var[qqq2: Temp-Hero-Var-ID] (+)-1 <>Change Var: Var[xxx1: Zustände No.] (+)-1 <>Goto Label 2# <> :End Case <> :Else Case <>Change Var: Var[qqq2: Temp-Hero-Var-ID] (+)-1 <>Change Var: Var[xxx1: Zustände No.] (+)-1 <>Goto Label 2# <> :End Case <> :End Loop <> :Else Case <>Change Var: Var[qqq2: Temp-Hero-Var-ID] (Set)-31 <>Change Var: Var[xxx1: Zustände No.] (Set)-85 <>Loop <>Change Var: Var[qqq8: Enemy's Target] (Set)-Random(1 to 4) <>Change Var: Var[qqq2: Temp-Hero-Var-ID] (+)-Var[qqq8] <>Change Var: Var[xxx1: Zustände No.] (+)-Var[qqq8] <>Change Var: Var[qqq2: Temp-Hero-Var-ID] (-)-1 <>Change Var: Var[xxx1: Zustände No.] (-)-1 <>Change Var: Var[qqq3: Temp-Hero-ID] (Set)-Var[Var[qqq2]] <>Change Var: Var[qqq4: Temp-Condition] (Set)-Var[Var[xxx1]] <>If Var(qqq3: Temp-Hero-ID) 0(<>) <>If Var(qqq4: Temp-Condition) 1(<>) <>Break <> :Else Case <>Goto Label 3# <> :End Case <> :Else Case <>Label 3# <>Change Var: Var[qqq2: Temp-Hero-Var-ID] (+)-1 <>Change Var: Var[xxx1: Zustände No.] (+)-1 <>Change Var: Var[qqq2: Temp-Hero-Var-ID] (-)-Var[qqq8] <>Change Var: Var[xxx1: Zustände No.] (-)-Var[qqq8] <> :End Case <> :End Loop <> :End Case <> |
Im deutschem Maker (V1.10c) |
<>Var. ändern:[qqq1: Temp-Randomized]
Wert, Zufll(1 * 100) <>Bedingung:[qqq1: Temp-Randomized]-50 > <>Var. ändern:[qqq2: Temp-Hero-Var-ID] Wert, 31 <>Var. ändern:[xxx1: Zustände No.] Wert, 85 <>Schleife <>Var. ändern:[qqq3: Temp-Hero-ID] Wert, Var.[V[qqq2]]Inh. <>Var. ändern:[qqq4: Temp-Condition] Wert, Var.[V[xxx1]]Inh. <>Bedingung:[qqq4: Temp-Condition]-1andr <>Bedingung:[qqq3: Temp-Hero-ID]-1 <>Var. ändern:[qqq5: Temp-Attrib-New] Wert, Alex LP <>Var. ändern:[qqq5: Temp-Attrib-New] Wert, Alex Max LP <>Var. ändern:[qqq5: Temp-Attrib-New] (+)-Alex's Angriff <>Var. ändern:[qqq6: Temp-Weakling?] Wert, Var.[qqq2]Wert <> :Ansonsten <>Bedingung:[qqq3: Temp-Hero-ID]-1 <>Var. ändern:[qqq5: Temp-Attrib-New] Wert, Annie LP <>Var. ändern:[qqq5: Temp-Attrib-New] +, Annie Max LP <>Var. ändern:[qqq5: Temp-Attrib-New] +, Annie Angriff <>Var. ändern:[qqq6: Temp-Weakling?] Wert, Var.[qqq2]Wert <> :End-Fall <> :End-Fall <>Bedingung:[qqq2: Temp-Hero-Var-ID]-31andr <>Bedingung:[qqq7: Temp-Attrib-Old]-0andr <>Bedingung:[qqq7: Temp-Attrib-Old]-V[qqq5]>= <>Var. ändern:[qqq7: Temp-Attrib-Old] Wert, Var[qqq5]Wert <>Var. ändern:[qqq8: Enemy's Target] Wert, Var[qqq6]Wert <> :End-Fall <>Var. ändern:[qqq2: Temp-Hero-Var-ID] +, 1 <>Var. ändern:[xxx1: Zustände No.] +, 1 <> -> Label:2Nr <>Bedingung:[qqq2: Temp-Hero-Var-ID]-34 > <>Var. ändern:[qqq8: Enemy's Target] -, 30 <>Schleife stoppen <> :End-Fall <> :Ansonsten <>Gehe zu Label: 1Nr <> :End-Fall <> :Ansonsten <> -> Label: 1Nr <>Var. ändern:[qqq7: Temp-Attrib-Old] +, Var.[qqq5]Wert <>Var. ändern:[qqq8: Enemy's Target] Wert, Var[qqq6]Wert <>Var. ändern:[qqq2: Temp-Hero-Var-ID] +, 1 <>Var. ändern:[xxx1: Zustände No.] +, 1 <>Gehe zu Label: 2Nr <> :End-Fall <> :Ansonsten <>Var. ändern:[qqq2: Temp-Hero-Var-ID] +, 1 <>Var. ändern:[xxx1: Zustände No.] +, 1 <>Gehe zu Label: 2Nr <> :End-Fall <> :Schleifenende <> :Ansonsten <>Var. ändern:[qqq2: Temp-Hero-Var-ID] Wert, 31 <>Var. ändern:[xxx1: Zustände No.] Wert, 85 <>Schleife <>Var. ändern:[qqq8: Enemy's Target] Wert, Zufl.(1 * 4) <>Var. ändern:[qqq2: Temp-Hero-Var-ID] +, Var.[qqq8]Wert <>Var. ändern:[xxx1: Zustände No.] +, Var[qqq8]Wert <>Var. ändern:[qqq2: Temp-Hero-Var-ID] -, 1 <>Var. ändern:[xxx1: Zustände No.] -, 1 <>Var. ändern:[qqq3: Temp-Hero-ID] Wert, Var[Var[qqq2]]Inh. <>Var. ändern:[qqq4: Temp-Condition] Wert, Var[Var[xxx1]]Inh. <>Bedingung:[qqq3: Temp-Hero-ID]-0andr <>Bedingung[qqq4: Temp-Condition]-1andr <>Schleife stoppen <> :Ansonsten <>Gehe zu Label: 3Nr. <> :End-Fall <> :Ansonsten <> -> Label:3Nr <>Var. ändern:[qqq2: Temp-Hero-Var-ID] +, 1 <>Var. ändern:[xxx1: Zustände No.] +, 1 <>Var. ändern:[qqq2: Temp-Hero-Var-ID] -, Var[qqq8]Wert <>Var. ändern:[xxx1: Zustände No.] -, Var[qqq8]Wert <> :End-Fall <> :Schleifenende <> :End-Fall <> |
Im Selbem Ereignis, nur auf einer neuen Ereignis-Seite, soll eine globale
Schadensberechnung stattfinden, der es egal sein soll, ob ein physischer oder
magischer Angriff stattfindet. Damit wir die globale Schadensermittlung auch für
die Helden verwenden können, müssen Werte wie die Angriffskraft der Fertigkeit
oder Waffe sowie der Verteidigungswert des Zieles übergeben werden, indem sie
vor dem Aufruf der Ereignis-Seite in die Variablen geschrieben werden.
Als Ergebnis soll ein einziger Wert zurückgegeben werden, anhand der dann das
entsprechende Fertigkeiten- bzw. Waffenereignis prüft, ob ein Treffer gelandet
werden konnte oder nicht.
![]() |
Für den Anfang brauchen wir hier drei Variablen, die ihr "Calc -
Ergebnis", "Calc - Temp-Attack" und "Calc - Temp-Defense" nennt. Alle drei
sollen auf den Wert "0" gesetzt werden. |
||||||||||||||||||||||||||||||
![]() |
Danach brauchen wir noch zwei weitere Variablen, die ihr "Calc - Attack"
und "Calc - Defense" nennt. Alle beiden sollen durch 10 geteilt werden. |
||||||||||||||||||||||||||||||
![]() |
Hiernach soll eine weitere Variable angelegt werden, die ihr "Calc -
Trefferchance" nennt. Sie soll als Ausgangswert eine Zufallszahl zwischen 1
und 100 aufnehmen. |
||||||||||||||||||||||||||||||
![]() |
Direkt danach folgt eine Bedingung, die prüfen soll, ob der Wert der
Variable "Calc - Trefferchance" kleiner als 50 ist. Ein Nein-Fall ist hier
nicht nötig.
|
Gegnerskills-Ereignis | ||||||||||||||||||||||
[Ereignisseite 1][Push Key] /* * Anstelle dieses Kommentares befindet sich die MML-Darstellung * aus "Schritt II - Die Gegner-KI" */ |
||||||||||||||||||||||
[Ereignisseite 2][Push Key] [Variable [Calc - Ergebnis]][<-- [Wert setzen][0]] [Variable [Calc - Temp-Attack]][<-- [Wert setzen][0]] [Variable [Calc - Temp-Defense]][<-- [Wert setzen][0]] [Variable [Calc - Angriff]][<-- [/][10]] [Variable [Calc - Abwehr]][<-- [/][10]] [Variable [Calc - Trefferchance]][<-- [Wert setzen][Zufall zwischen [1] und [100]]] [Bedingung][Variable][Calc - Trefferchance][kleiner als][50]
|
Im englischem Maker |
<>Change Var: Var[hhh1: Calc - Ergebnis]
(Set)- 0 <>Change Var: Var[hhh2: Calc - Temp-Attack] (Set)- 0 <>Change Var: Var[hhh3: Calc - Temp-Defense] (Set)- 0 <>Change Var: Var[hhh4: Calc - Attack] (/)- 10 <>Change Var: Var[hhh5: Calc - Defense] (/)- 10 <>Change Var: Var[hhh6: Calc - Trefferchance] (Set)- Random(1 to 100) <>If Var(hhh6: Calc - Trefferchance) 50(<) <>Loop <>Change Var: Var[hhh1: Calc - Ergebnis] (+)-Random(0 to 1) <>Change Var: Var[hhh7: Calc - Damage] (-)- 1 <>If Var(hhh7: Calc - Damage) 0 <>Break <> :End Case <> :End Loop <>Loop <>Change Var: Var[hhh2: Calc - Temp-Attack] (+)-Random(0 to 1) <>Change Var: Var[hhh4: Calc - Attack] (-)- 1 <>If Var(hhh4: Calc - Attack) 0 <>Break <> :End Case <> :End Loop <>Change Var: Var[hhh2: Calc - Temp-Attack] (+)-Random(10 to 100) <>Change Var: Var[hhh1: Calc - Ergebnis] (*)- Var[hhh2] <>Change Var: Var[hhh1: Calc - Ergebnis] (/)- 100 <>Loop <>Change Var: Var[hhh3: Calc - Temp-Defense] (+)-Random(0 to 1) <>Change Var: Var[hhh5: Calc - Defense] (-)- 1 <>If Var(hhh7: Calc - Defense) 0 <>Break <> :End Case <> :End Loop <>Change Var: Var[hhh3: Calc - Temp-Defense] (-)- 100 <>Change Var: Var[hhh3: Calc - Temp-Defense] (*)- -1 <>Change Var: Var[hhh1: Calc - Ergebnis] (*)- Var[hhh3] <>Change Var: Var[hhh1: Calc - Ergebnis] (/)- 100 <> :End Case <> |
Im deutschem Maker (V1.10c) |
<>Var. ändern:[hhh1: Calc - Ergebnis]Wert,
0 <>Var. ändern:[hhh2: Calc - Temp-Attack]Wert, 0 <>Var. ändern:[hhh3: Calc - Temp-Defense]Wert, 0 <>Var. ändern:[hhh4: Calc - Attack] /, 10 <>Var. ändern:[hhh5: Calc - Defense] /, 10 <>Var. ändern:[hhh6: Calc - Trefferchance]Wert, Zufll[1*100] <>Bedingung:Varbl[hhh6: Calc - Trefferchance]-50 < <>Schleife <>Var. ändern:[hhh1: Calc - Ergebnis]+, Zufll[0*1] <>Var. ändern:[hhh7: Calc - Damage]-, 1 <>Bedingung:Varbl[hhh7: Calc - Damage]-0 <>Schleife stoppen <> :End Fall <> :Schleifenende <>Schleife <>Var. ändern:[hhh2: Calc - Temp-Attack]+, Zufll[0*1] <>Var. ändern:[hhh4: Calc - Attack]-, 1 <>Bedingung:Varbl[hhh4: Calc - Attack]-0 <>Schleife stoppen <> :End Fall <> :Schleifenende <>Var. ändern:[hhh2: Calc - Temp-Attack]+, Zufll[10*100] <>Var. ändern:[hhh1: Calc - Ergebnis]*, Var[hhh2]Wert <>Var. ändern:[hhh1: Calc - Ergebnis]/, 100 <>Schleife <>Var. ändern:[hhh3: Calc - Temp-Defense]+, Zufll[0*1] <>Var. ändern:[hhh5: Calc - Attack]-, 1 <>Bedingung:Varbl[hhh5: Calc - Attack]-0 <>Schleife stoppen <> :End Fall <> :Schleifenende <>Var. ändern:[hhh3: Calc - Temp-Defense]-, 100 <>Var. ändern:[hhh3: Calc - Temp-Defense]*, -1 <>Var. ändern:[hhh1: Calc - Ergebnis]*, Var[hhh3]Wert <>Var. ändern:[hhh1: Calc - Ergebnis]/, 100 <> :End-Fall <> |