hiermit will ich Euch mein erstes Tutorial an's Herz legen.
Dieses Tutorial beschäftigt sich mit Talentbäumen(Hier wird jedoch nur einer gezeigt!).
Ich muss auch dazusagen, dass es relativ KOMPLEX und UMFANGREICH ist, Talentbaum zuerschaffen
ich setze daher schon eine Grunderfahrung mit den GUI des Auslöser-Editors voraus
Eine Englische Version des Editors macht es euch noch einfacher, da ich diesen benutze
und somit jegliche hier geposteten Auslöser auf englisch sind
Wer sich jedoch mit den Deutschen auskennt und weiß was was übersetzt bedeutet,
so stellt für diese Person das Tutorial auch keine Große Herausforderung da
Dieses Tutorial habe ich wie folgt für euch gegliedert:
Tutorial:Talentbäume
1. Vorwort
2. Theorie
3. Praxis
3.1. Grundgerüst
3.2. Veränderungsverfahren
3.3. Erhalt der Talente
4. Abschluss
1. Vorwort
Zuerst will ich kurz erklären was ein Talentbaum ist. Ein Talentbaum bietet dem Spieler
das Lernen mehrerer Talente(sowohl passive als auch aktive Fähigkeiten) an.
Jedoch hat der Spieler dabei eine schier unendliche Möglichkeit seine Punkte
zuverteilen, wodurch theoretisch jeder Spieler im Vergleich zu einen anderen Spieler
eine andere Skillung(=Talentevergabe) hat. Das ist in der Praxis jedoch meist nur
eingeschränkt der Fall, weil sich einfach meist einige Talente abheben und sich daraus
eine optimale Skillung ergibt. Ebenfalls benötigen weit effizientere Talente eine bereits
in diesen Talentbaum investierte Anzahl von Punkten, damit diese nicht bereits am
Anfang erlernt werden können. Diese Talentbäume die ich hier vorstellen, sind vom
Design stark an die von World of Warcraft angelehnt(wer die nicht kennt, einfach mal googlen).
***!Ganz unten befinden sich die Downloadlinks
für die benutzten Images und die Map im Gesamten!***
2. Theorie
Nun gut, zuerst müssen wir uns überlegen:
a) wie groß soll der Talentbaum werden?
b) soll es Talente geben welche von anderen Abhängig sind?
c) auf welche Stufe sollen die einzelnen Talente gebracht werden können?
In meinen Tutorial habe ich mich dazuentschieden, dass
a) der Baum 4 Talente breit und 5 Talente in die Tiefe geht --> 20 Talente gesamt,
wobei jedoch aus Gründen der Schönheit nicht alle 20 benutzt werden.
b) Der Baum besitzt 2 Talente, welche in Abhängigkeit zu einem anderen Talent stehen.
c) Die Talente können als Maximalstufe 1 ; 2 ; 3 ; 5 haben
Gut, da wir das nun haben, setzen wir das alles mal künstlerisch um,
dabei bestimmen wir auch gleich mal unser Hindergrundbild des Baums
so sieht erstmal das Bild aus:
und so sieht es dann als "Vorschau" für den zukünftigen Talentbaum aus:
(ist nicht alles ganz symmetrisch aber ist eh nicht schlimm^^)
Die grünen Zahlen stellen dabei den gewünschten maximalen Level der Talente da,
wobei die roten Zahlen die Position der einzelnen Talente angeben!
Nur weil ein Talent nicht existiert, wie die 2, gibt es trotzdem die Position.
(man kann auch schon erkennen wenn man sich den Link anguckt, dass ich den Talentbaum Mutation nenne)
3. Praxis
so dann geht es jetzt um die Umsetzung des Meisterwerkes
wichtig zu sagen ist, dass ich es alles mit den GUI gemacht habe, da dies doch
verständlicher ist, wobei es natürlich auch ohne geht
3.1. Grundgerüst
Fangen wir also an!
Erstellen wir erstmal alle Variablen die für den Talentbaum notwendig sind!
Variablen:
Die Variable Talent_Dialog für den Dialog selber:
Talent_Dialog = No Dialog <Dialog>
Die Variable Talent_Tooltip für die Tooltips(Typ:Text) mit einen 2-dimensionalen Feld mit den Größen
20 und 8, 20 weil es 20 Talente sind und 8 für 8 unterschiedliche Tooltips je Talent:
Talent_Tooltip = No Text <Text[20][8]>
Die Variable Talent_Images für die Umrandungen der Talentbuttons(Typ:Dialog-Item) diesmal ein
1-dimensionales Feld mit der Größe 20, weil es ja 20 Talente sind:
Talent_Images = No Dialog Item <Dialog Item[20]>
Die Variable Talent_Images Level für die Bilder der Talente selber(Typ:Dialog-Item), auch wieder ein
1-dimensionales Feld wegen 20 Talenten:
Talent_Images Level = No Dialog Item <Dialog Item[20]>
Die Variable Talent_Images Button für die Upgradestufe der Talente selbst(Typ:Dialog-Item),
auch wieder ein 1-dimensionales Feld wegen 20 Talenten:
Talent_Images Button = No Dialog Item <Dialog Item[20]>
Wer sich jetzt fragt: Warum das nicht alles in eine Variable mit einer Größe von 60?
Weil so ist es leicht erweiterbar für MEHRERE Talentbäume und leichter aufzrufen.
Die Variable Talent_Bedingungspfeile für die zwei "Bedingungspfeile", wie ich sie so gern nenne
Diese dienen nur zur optischen Unterstützung und bekommen jedoch trotzdem ihre
eigene Variable vom Typ Dialog-Item mit einer Feldgröße von 2, da es ja nur 2 gibt:
Talent_Bedingungspfeile = No Dialog Item <Dialog Item[2]>
Die Variable Talent_Check legt fest, ob es diese Talente überhaupt gibt, wie man oben sehen kann
gibt es bei uns die Talente an der Position 2,5,8,9,10,12,16,17,19 nicht, diese
werden durch diese Variable vom Typ Boolean aussortiert:
Talent_Check = true <Boolean[20]>
Der Standard-Wert dieser Variable liegt bei true!
Die 2 Variablen Talent_Maxlevel und Talent_Skilllevel legen wie der Name bereits sagt,
in einem Feld mit der Größe 20 vom Typ Integer die aktuelle Stufe der Talente, sowie
die maximale Stufe der Talente fest:
Talent_Skilllevel = 0 <Integer[20]>
Talent_Maxlevel = 0 <Integer[20]>
Die Variable Talent_Spended Points vom Typ Integer dient dazu,
um festzulegen wie viele Talentpunkte bereits in den Talentpunkt reingesteckt wurden:
Talent_Spended Points = 0 <Integer>
Die Variable Talent_Remaining Points legt dementsprechend fest, wie viele Talentpunkte
der Spieler am Anfang hat:
Talent_Remaining Points = 50 <Integer>
Der Standard-Wert dieser Variable liegt bei mir bei 50,
dieser Wert ist jedoch nach belieben zuverändern!
Die Variable Talent_Needed Points unterteilt die 20 Talente in Ebenen, je nachdem
wie viel Punkte man halt für die nächste Ebene voraussetzt:
Talent_Needed Points = 0 <Integer[20]>
Die Variable Talent_Texte dient für die beiden Texte "Unverteilte Talentpunkte"
und "Verteilte Talentpunkte im Talentbaum", ist jedoch vom Typ Dialog-Item:
Talent_Texte = No Dialog Item <Dialog Item[2]>
Die letzten beiden Variablen Talent_Pos X und Talent_Pos Y dienen alleine zur Bestimmung
jeglicher Positionen der Umrandungen, der Bilder, der Upgradesymbole und der Bedingungspfeile:
Talent_Pos X = 0 <Integer[42]>
Talent_Pos Y = 0 <Integer[42]>
Am Ende sollte das alles bei Euch so aussehen:
Damit haben wir schonmal alle Variablen erzeugt!
Jetzt geht es darum, die Variablen erstmal mit nötigen Grundwerten auszustatten!
Das ist eigentlich jetzt der langwierigste Schritt
Triggers
Zuerst erstellen wir uns also einen neuen Auslöser: Initialization Start
Als Event legen wir da fest: Game - Map initialization
Dieser Auslöser benötigt sogar nur eine Lokale Variable:
Temp_Anzahl = 0 <Integer> , ist natürlich eine Variable vom Typ Integer
Nun kommen wir zu den Aktionen:
Als erstes setzen wir die Variable Talent_Check da false,
wo wir kein Talent später haben wollen, sprich bei: 2 5 8 9 10 12 16 17 19
Das sieht dann so aus:
Nun legen wir die jeweiligen maximalen Stufen der Talente fest(siehe Bild oben):
Dafür müssen wir nur die Variable Talent_Maxlevel an den jeweiligen
Positionen definieren:
also bei Pos 1 -> 2, Pos 3 -> 5, Pos 4 -> 3, Pos 6 -> 5, Pos 7 -> 2, Pos 10 -> 3,
Pos 12 -> 1, Pos 13 -> 2, Pos 14 -> 1, Pos 15 -> 1, Pos 18 -> 3, Pos 20 -> 5
Das sieht dann auch wieder so aus:
Als nächstes definieren wir nun die Positionen aller Talente,Pfeile,etc. :
Sprich die Variablen Talente_Pos X und Talente_Pos Y werden hier bestimmt.
Dafür lassen wir erstmal die lokale Variable Temp_Anzahl
in einer Schleife von 1 bis 20 mit einer Erhöhung von 1 durchlaufen.
(falls das unverständlich war hier eine javaumsetzung: for(i=1;i++;i<20))
in SC2 Sieht das so aus:
General - For each integer Temp_Anzahl from 1 to 20 with increment 1, do (Actions)
Die Aktionen
Talent_Pos X[Temp_Anzahl] = (-103 + (69 * ((Temp_Anzahl + 3) mod 4)))
Talent_Pos Y[Temp_Anzahl] = (-175 + (70 * (((Temp_Anzahl + 3) / 4) - 1)))
Talent_Pos X[(Temp_Anzahl + 20)] = (-89 + (69 * ((Temp_Anzahl + 3) mod 4)))
Talent_Pos Y[(Temp_Anzahl + 20)] = (-159 + (70 * (((Temp_Anzahl + 3) / 4) - 1)))
Auf den ersten Blick sieht das alles sehr komplziert aus und es war auch gar nicht so
einfach die Positionen mit Hilfe einer Variable so festzulegen, dass daraus ein Rechteck
am Ende wird Allein um alle diese Werte auszurechnen, damit es am Ende stimmt,
dauerte lange xD Daher empfehle ich ein einfach übernehmen dieser arithmetischen Funktionen.
Die Bestimmungen von Talent_Pos X[(Temp_Anzahl + 20)] und Talent_Pos
Y[(Temp_Anzahl + 20)] dienen hier zur Bestimmung der Upgradebilder, da diese ja
nicht an der gleichen Position sind!
Das würde dann am Ende wieder so aussehen:
Als nächstes legen wir noch die Positionen der beiden Pfeile fest:
Variable - Set Talent_Pos X[41] = (-103 + (69 * (4 - 1)))
Variable - Set Talent_Pos Y[41] = (-104 + (70 * (3 - 1)))
Variable - Set Talent_Pos X[42] = (-67 + (69 * (2 - 1)))
Variable - Set Talent_Pos Y[42] = (-175 + (70 * (4 - 1)))
Wenn man sich das jetzt anguckt könnte man sich fragen warum ich das nicht
zusammengefasst haben den Wert. Ich habe das jedoch nicht getan, weil es so
wirklich viel einfacher ist die Position wieder zuverändern. Man verändert nur
die Zahl vor " - 1)))" , sprich die erste Zahl in der letzten Klammer.
Damit haben wir erstmal den 1. Auslöser fertig. Aber die Initialisierung ist noch lange
nicht abgeschlossen, jedoch ist es besser nicht alles in einen Auslöser zupacken,
da es für die Übersicht und so besser ist.
Also erstellen wir einen neuen Auslöser: Initialization Tooltips
Dieser Auslöser benötigt kein Event, keine lokalen Variablen oder eine Bedingung,
dafür umfasst er verdammt viele Zeilen von Set Variable = .... .
Hier bestimmen wir NUR die Tooltips.
Ein jedes Tooltip eines Talents wird in Talent_Tooltip gespeichert, wobei die 1. Dimension des Arrays die Talentnummer(=Talentposition) annimmt
und die 2. Dimension des Arrays legt hierbei die Tooltips für jede Stufe des Talents fest:
[0] -> ungelernt
[1] -> auf Stufe 1
[2] -> auf Stufe 2
[3] -> auf Stufe 3
[4] -> auf Stufe 4
[5] -> auf Stufe 5
[6] -> ungelernt, mit fehlenden Voraussetzungen(a+b)(auch wenn b nicht vorhanden!)
[7] -> ungelernt, mit fehlender Voraussetzung(a)
[8] -> ungelernt, mit fehlender Voraussetzung(b)
Voraussetzung a: Benötigt X Talentpunkte im Talentbaum
Voraussetzung b: Benötigt X Talentpunkte im Talent Y
WICHTIG!
Talente welche KEINE Vorausetzungen haben(Talente der 1. Ebene)
müssen trotzdem das Tooltip [6] haben anstatt das Tooltip [0]!
(weil es einfacher ist)
Desweiteren besteht jedes Tooltip aus einen 4fachen kombinierten Text:
Text 1 = Voraussetzungen (wenn keine vorhanden ist, dann leer lassen!)
Text 2 = Name<n/>
Text 3 = Rang<n/>
Text 4 = Beschreibung
Bsp.:
Text 1 =
Text 2 = Tötungsdrang<n/>
Text 3 = Rang 0/3<n/>
Text 4 = Verursacht 5% mehr Schaden.
<n/> <-- steht für einen Zeilenumbruch!
Nach diesen vielen Informationen will ich also kurz zeigen wie dass dann für ein spezielles Beispiel aussieht!
Talent_Tooltip[10][6] = (Combine ("Benötigt 10 Punkte im Talentbaum '...", "Skill 10 ", "Rang 0/3 ", "Beschreibung"))
In dieser Darstellung wirkt das doch erstmal unübersichtlich, aber anders dargestellt:
Code: Alles auswählen
Set Variable
Variable: Talent_Tooltip
Index 1: 10
Index 2: 6
Value: Combine Text Multiple
Text <Text+>
Text: "Benötigt 10 Punkte im Talentbaum '..."
Text: "Skill 10 "
Text: "Rang 0/3 "
Text: "Beschreibung"
Art und Weise 58 Tooltips für den ganzen Talentbaum.
So als nächstes erzeugen wir wieder einen neuen Auslöser: Initialization End
Dieser Auslöser benötigt wieder kein Event oder eine Bedingung,
dafür benötigt er 2 lokale Variablen:
1. Temp_Nummeriert = 0 <Integer> , sprich Typ Integer
2. Temp_Pfad = "" <String> , sprich Typ String
Dieser komplette Auslöser dient dazu, um den ganzen Talentbaum zuerzeugen
Als erstes erstellen wir nun also einen Dialog mit der Größe 381/500 genau in der Mitte:
Dialog - Create a Modal dialog of size (381, 500) at (0, 0) relative to Center of screen
Danach setzen wir die Variable Talent_Dialog gleich diesen neuen Dialog.
Variable - Set Talent_Dialog = (Last created dialog)
Danach erstellen wir einen Text(Label) für den Dialog Talent_Dialog mit einer Größe von 400 x 100 in der Mitte
mit einem Offset von 50 x 215, der Text dabei ist erstmal:
"Unverteilte Talentpunkte: Talent_Remaining Points"
Als Quellcode:
Code: Alles auswählen
Create Dialog Item (Label)
Dialog: Talent_Dialog
Width: 400
Height: 100
Anchor: Center
Offset X: 50
Offset Y: 215
Text: Combine Text
Text 1: "Unverteilte Talentpunkte: "
Text 2: Combine Text Multiple
Text <Text+>
Text: "<c val="FFFF00">" // dient nur zur farblichen Untermalung
Text: Convert Integer To Text
Value: Talent_Remaining Points
Text: "</c>" // dient nur zur farblichen Untermalung
Color: White
Text Writeout: false
Text Writeout Duration: 1.0
Variable - Set Talent_Texte[2] = (Last created dialog item)
Danach erzeugen wir das Bild von unserem Talentbaum:
Das Bild ist 310 x 350 Groß, wieder Verankert in der Mitte mit einem Offset von -1 x -36
und anstatt dann ein Bild auszuwählen gehen wir auf Custom Script und geben:
"Mutation.dds" ein.
Das ganze sieht dann wieder so aus:
Code: Alles auswählen
Create Dialog Item (Image)
Dialog: Talent_Dialog
Width: 310
Height: 350
Anchor: Center
Offset X: -1
Offset Y: -36
Tooltip: ""
Image: "Mutation.dds"
Image Type: Normal
Tiled: false
Tint Color: White
Blend Mode: Normal
Variable Temp_Nummeriert
in einer Schleife von 1 bis 20 mit einer Erhöhung von 1 durchlaufen:
In dieser Schleife definieren wir dann eine IF-THEN-ELSE Anweisung.
bei IF legen wir fest:
Talent_Check[Temp_Nummeriert] == true
bei THEN wird es dann schon etwas länger:
zuerst legen wir die lokale Variable Temp_Pfad fest.
Temp_Pfad dient dazu uns das Leben leichter zumachen und bestimmt die Bildpfade.
Jedes Bild MUSS folgenden Pfad haben: Tree_Skill<Skillnummer von 1-20>.dds
daraus folgt für Temp_Pfad:
Temp_Pfad = (Combine ("Tree_Skill", (String(Temp_Nummeriert)), ".dds"))
Code: Alles auswählen
Set Variable
Variable: Temp_Pfad
Value: Combine Strings Multiple
Strings <String+>
Strings: "Tree_Skill"
Strings: Convert Integer To String
Value: Temp_Nummeriert
Strings: ".dds"
Das Tooltip wird Talent_Tooltip[Temp_Nummeriert][6]
Code: Alles auswählen
Create Dialog Item (Button)
Dialog: Talent_Dialog
Width: 41
Height: 42
Anchor: Center
Offset X: Talent_Pos X
Index 1: Temp_Nummeriert
Offset Y: Talent_Pos Y
Index 1: Temp_Nummeriert
Tooltip: Talent_Tooltip
Index 1: Temp_Nummeriert
Index 2: 6
Button Text: ""
Hover Image: ""
Variable - Set Talent_Images Button[Temp_Nummeriert] = (Last created dialog item)
Danach erstellen wir Bild mit der Größe 41 x 42 an der Position
Talent_Pos X[Temp_Nummeriert] x Talent_Pos Y[Temp_Nummeriert],
natürlich in der Mitte verankert. Beim Bildpfad legen wir "Unlearned.dds" fest.
Code: Alles auswählen
Create Dialog Item (Image)
Dialog: Talent_Dialog
Width: 41
Height: 42
Anchor: Center
Offset X: Talent_Pos X
Index 1: Temp_Nummeriert
Offset Y: Talent_Pos Y
Index 1: Temp_Nummeriert
Tooltip: ""
Image: "Unlearned.dds"
Image Type: Normal
Tiled: false
Tint Color: White
Blend Mode: Normal
Variable - Set Talent_Images[Temp_Nummeriert] = (Last created dialog item)
Danach erstellen wir wieder Bild mit der Größe 41 x 42 an der Position
Talent_Pos X[Temp_Nummeriert] x Talent_Pos Y[Temp_Nummeriert],
natürlich in der Mitte verankert. Beim Bildpfad legen wir diesmal jedoch unter Custom
Script folgendes fest: lv_temp_Pfad
Code: Alles auswählen
Create Dialog Item (Image)
Dialog: Talent_Dialog
Width: 41
Height: 42
Anchor: Center
Offset X: Talent_Pos X
Index 1: Temp_Nummeriert
Offset Y: Talent_Pos Y
Index 1: Temp_Nummeriert
Tooltip: ""
Image: lv_temp_Pfad
Image Type: Normal
Tiled: false
Tint Color: White
Blend Mode: Normal
Talent_Pos X[Temp_Nummeriert+20] x Talent_Pos Y[Temp_Nummeriert+20],
natürlich in der Mitte verankert. Beim Bildpfad legen wir diesmal jedoch "Unlearned.dds" fest.
Code: Alles auswählen
Create Dialog Item (Image)
Dialog: Talent_Dialog
Width: 11
Height: 11
Anchor: Center
Offset X: Talent_Pos X
Index 1: Arithmetic (Integer)
Value 1: Temp_Nummeriert
Operator: +
Value 2: 20
Offset Y: Talent_Pos Y
Index 1: Arithmetic (Integer)
Value 1: Temp_Nummeriert
Operator: +
Value 2: 20
Tooltip: ""
Image: "unlearned_0.dds"
Image Type: Normal
Tiled: false
Tint Color: White
Blend Mode: Normal
Variable - Set Talent_Images Level[Temp_Nummeriert] = (Last created dialog item)
Danach legen wir innerhalb dieser Schleife nur noch die Renderprioritäten der Talente_Images und Talente_Images Level fest, damit diese IMMER über den
Bild des Talents sind:
Dialog - Set Talent_Images[Temp_Nummeriert] Render Priority to 513 for (All players)
Dialog - Set Talent_Images Level[Temp_Nummeriert] Render Priority to 514 for (All players)
Diese gesamte komplizierte Schleife sieht dann so aus:
Danach muss in diesen tollen Auslöser(Initialization End)
nur noch die Erstellung der beiden Bedingungspfeile
Da wir jetzt aber schon geübt im Erstellen von Bildern sind geht das ruckzug:
15 x 103 groß, Offset Talent_Pos X[41] x Talent_Pos Y[41]
mit den Bild "Unlearned_ArrowDown.dds".
Code: Alles auswählen
Create Dialog Item (Image)
Dialog: Talent_Dialog
Width: 15
Height: 103
Anchor: Center
Offset X: Talent_Pos X
Index 1: 41
Offset Y: Talent_Pos Y
Index 1: 41
Tooltip: ""
Image: "Unlearned_ArrowDown.dds"
Image Type: Normal
Tiled: false
Tint Color: White
Blend Mode: Normal
Variable - Set Talent_Bedingungspfeile[1] = (Last created dialog item)
Dann noch die Renderpriorität wieder verändern:
Dialog - Set Talent_Bedingungspfeile[1] Render Priority to 515 for (All players)
Und das ganze jetzt noch für den 2. Pfeil:
32 x 15 groß, Offset Talent_Pos X[42] x Talent_Pos Y[42]
mit den Bild "Unlearned_ArrowRight.dds".
Code: Alles auswählen
Create Dialog Item (Image)
Dialog: Talent_Dialog
Width: 32
Height: 15
Anchor: Center
Offset X: Talent_Pos X
Index 1: 42
Offset Y: Talent_Pos Y
Index 1: 42
Tooltip: ""
Image: "Unlearned_ArrowRight.dds"
Image Type: Normal
Tiled: false
Tint Color: White
Blend Mode: Normal
Variable - Set Talent_Bedingungspfeile[2] = (Last created dialog item)
Dann noch die Renderpriorität wieder verändern:
Dialog - Set Talent_Bedingungspfeile[2] Render Priority to 515 for (All players)
Und zum krönenden Abschluss des Auslösers fügen wir noch ein Text(Label) hinzu:
Größe von 400 x 100 in der Mitte mit einem Offset von 50 x 195, der Text dabei ist erstmal:
"Mutation-Talente: Talent_Spended Points"
Als Quellcode:
Code: Alles auswählen
Create Dialog Item (Label)
Dialog: Talent_Dialog
Width: 400
Height: 100
Anchor: Center
Offset X: 50
Offset Y: 195
Text: Combine Text
Text 1: "Mutation-Tal<c "
Text 2: Combine Text Multiple
Text <Text+>
Text: "<c val="6000BF">" // dient nur zur farblichen Untermalung
Text: Convert Integer To Text
Value: Talent_Spended Points
Text: "</c>" // dient nur zur farblichen Untermalung
Color: White
Text Writeout: false
Text Writeout Duration: 1.0
Variable - Set Talent_Texte[1] = (Last created dialog item)
Jetzt sind wir mit diesen Auslöser fertig und springen nochmal zum Auslöser Initialization Start
und gehen dort zum Ende runter, da wurde als letztes die Position der Pfeile definiert.
Dort fügen wir jetzt 2 weiter Aktionen hinzu:
Diese starten die Auslöser Initialization Tooltip, wobei dort
gewartet wird bis dieser fertig ist und dann noch den Auslöser Initialization End:
Trigger - Run Initialization Tooltips (Check Conditions, Wait until it finishes)
Trigger - Run Initialization End (Check Conditions, Don't Wait until it finishes)
Sieht dann so aus:
So damit sind jetzt 3/5 Auslösern fertig
Kommen wir nun zum 4. Auslöser: Show
Als Event definieren wir dabei: Ein Spieler drückt die Taste N runter, ob shift/alt/ctrl ist egal^^
Die Aktion ist hierbei eine multiple IF-THEN-ELSE Anweisung:
die 1. Else If Anweisung hat als IF:
(Talent_Dialog is visible for (Triggering player)) == false
sprich der Dialog kann vom Spieler nicht gesehen werden.
(im deutschen heißt das sicher : Dialog X ist sichtbar für Spieler Y)
als THEN kommt dann:
Dialog - Show Talent_Dialog for (Player group((Triggering player)))
(zufinden unter Dialog - Zeige/Verberge Dialog)
danach muss der Auslöser auch noch beendet werden, da sonst die 2. Else If Anweisung durchlaufen wird, daher:
Trigger - Clear the action queue (Interrupt the active action)
die 2. Else If Anweisung ist die Implikation der 1., sprich:
IF:
(Talent_Dialog is visible for (Triggering player)) == true
THEN:
Dialog - Hide Talent_Dialog for (Player group((Triggering player)))
Trigger - Clear the action queue (Interrupt the active action)
Der ganze Auslöser sieht dann so aus:
Nun können wir mal das Spiel starten und wenn alles geklappt hat und die Bilder richtig importiert wurden(ich habe derzeit keine Skill-Images drin^^) müsste das Ergebnis so ausssehen:
3.2. Veränderungsverfahren
So jetzt sind wir endlich beim nächsten Punkt angekommen!
Hier geht es darum ,dass wenn man auf ein Talent klickt, es sich, wenn die Bedingungen erfüllt sind, erhöht!
Auch das ist wieder ein recht umfangreicher Komplex und dazu werden benötigt:
- 1 Trigger
- 2 Condition Definitions
- 1 Action Definition
Diese brauchen wir zur Überprüfung dafür, ob wir das Talent lernen können, wenn
es eine Bedingung besitzt(wie benötigt Talent 12 oder so):
also rechtsklick im auslösereditor, dann neu->neue bedingungsdefinition(sry engl. client -.-)
Dieses neue Bedingung nennen wir mal ganz unkompliziert Bedingung für Talentnummer 15
Bei Return Type stellen wir Boolean ein
Bei Paramaters fügen wir einen Integer hinzu, mit den Namen Talentnummer.
bei Grammar text müsste dann stehen: Bedingung für Talentnummer 15(Talentnummer)
nun fügen wir die Aktionen dafür hinzu:
eine If-then-else anweisung
if: Talentnummer == 15
then:
-->if then else(mal wieder)
-->if:Talent_Skilllevel[14]== 1
-->then: Return true
-->else: Return false
else: Return true
das sieht hier grad wirklich sehr unstrukturiert aus,
im editor müsste das bei euch dann so aussehen:
Die 2. Bedingungsdefinition(Bedingung für Talentnummer 15)
ist genau das selbe, nur das wir dort:
Talentnummer == 15 mit Talentnummer == 20 austauschen und
Talent_Skilllevel[14] == 1 mit Talent_Skilllevel[12] == 1 austauschen.
Also:
Nun müssen wir noch eine Aktionendefinition erstellen,
diese nennen wir auch ganz unkompliziert: Aktualisierung der Bedingungen
(mir fallen immer so kurze Namen ein, wa?^^)
Als Parameter benötigen wir hier 2 Dinge,
1. Talentnummer , vom Typ Integer
2. Spieler, vom Typ Integer
und eine Lokale Variable:
Temp_Talentnummer , vom Typ Integer
mit den Startwert : Talentnummer
Die Aktionen dieser Definition beschränken sich auf 16 If-Then-Else Anweisungen,
welche wahrscheinlich hier alle reinzuschreiben und zu erklären erstmal
a) meine Motivation und
b) eure Nerven sprengen würden^^ Daher verzichte ich VOERST darauf, werde sie jedoch noch später hinzufügen,
da ich inzwischen eh schon mehrere Stunden hier dran arbeite
der Code dieser Action Definition werde ich
erstmal ohne Kommentar hier reinposten -.- erklärung kommt später
Code: Alles auswählen
Aktualisierung der Bedingungen
Options: Action
Return Type: (None)
Parameters
Talentnummer = 0 <Integer>
Spieler = 0 <Integer>
Grammar Text: Aktualisierung der Bedingungen(Talentnummer, Spieler)
Hint Text: (None)
Custom Script Code
Local Variables
Temp_Talentnummer = Talentnummer <Integer>
Actions
General - If (Conditions) then do multiple (Actions)
If Then Else
General - Else if (Conditions) then do (Actions)
Else If
And
Conditions
Temp_Talentnummer == 12
Talent_Skilllevel[Temp_Talentnummer] == Talent_Maxlevel[Temp_Talentnummer]
(Image of Talent_Bedingungspfeile[1] for (Triggering player)) != "Learned_ArrowDown.dds"
Then
Dialog - Set Talent_Bedingungspfeile[1] image to Learned_ArrowDown.dds for (Player group(Spieler))
Dialog - Set Talent_Bedingungspfeile[1] Render Priority to 515 for (All players)
General - Else if (Conditions) then do (Actions)
Else If
And
Conditions
Temp_Talentnummer == 14
Talent_Skilllevel[Temp_Talentnummer] == Talent_Maxlevel[Temp_Talentnummer]
(Image of Talent_Bedingungspfeile[2] for (Triggering player)) != "Learned_ArrowRight.dds"
Then
Dialog - Set Talent_Bedingungspfeile[2] image to Learned_ArrowRight.dds for (Player group(Spieler))
Dialog - Set Talent_Bedingungspfeile[2] Render Priority to 515 for (All players)
General - Else if (Conditions) then do (Actions)
Else If
Talent_Spended Points >= 5
Talent_Spended Points < 10
Then
General - Pick each integer from 5 to 8, and do (Actions)
Actions
General - If (Conditions) then do (Actions) else do (Actions)
If
Talent_Skilllevel[(Picked integer)] == 0
Then
Dialog - Set Talent_Images Button[(Picked integer)] tooltip to Talent_Tooltip[(Picked integer)][0] for (Player group(Spieler))
Else
General - Else if (Conditions) then do (Actions)
Else If
Talent_Spended Points >= 10
Talent_Spended Points < 15
Then
General - Pick each integer from 9 to 12, and do (Actions)
Actions
General - If (Conditions) then do (Actions) else do (Actions)
If
Talent_Skilllevel[(Picked integer)] == 0
Then
Dialog - Set Talent_Images Button[(Picked integer)] tooltip to Talent_Tooltip[(Picked integer)][0] for (Player group(Spieler))
Else
General - Else if (Conditions) then do (Actions)
Else If
Talent_Spended Points >= 15
Talent_Spended Points < 20
Then
General - Pick each integer from 13 to 16, and do (Actions)
Actions
General - If (Conditions) then do (Actions) else do (Actions)
If
Talent_Skilllevel[(Picked integer)] == 0
(Picked integer) != 15
Then
Dialog - Set Talent_Images Button[(Picked integer)] tooltip to Talent_Tooltip[(Picked integer)][0] for (Player group(Spieler))
Else
General - Else if (Conditions) then do (Actions)
Else If
Talent_Spended Points >= 20
Then
General - Pick each integer from 17 to 20, and do (Actions)
Actions
General - If (Conditions) then do (Actions) else do (Actions)
If
Talent_Skilllevel[(Picked integer)] == 0
(Picked integer) != 20
Then
Dialog - Set Talent_Images Button[(Picked integer)] tooltip to Talent_Tooltip[(Picked integer)][0] for (Player group(Spieler))
Else
General - If (Conditions) then do (Actions) else do (Actions)
If
And
Conditions
Talent_Spended Points >= 15
Talent_Skilllevel[14] == 1
Talent_Skilllevel[15] == 0
Then
Dialog - Set Talent_Images Button[15] tooltip to Talent_Tooltip[15][0] for (Player group(Spieler))
Else
General - If (Conditions) then do (Actions) else do (Actions)
If
And
Conditions
Talent_Spended Points < 15
Talent_Skilllevel[14] == 1
Talent_Skilllevel[15] == 0
Then
Dialog - Set Talent_Images Button[15] tooltip to Talent_Tooltip[15][7] for (Player group(Spieler))
Else
General - If (Conditions) then do (Actions) else do (Actions)
If
And
Conditions
Talent_Spended Points >= 15
Talent_Skilllevel[14] == 0
Talent_Skilllevel[15] == 0
Then
Dialog - Set Talent_Images Button[15] tooltip to Talent_Tooltip[15][8] for (Player group(Spieler))
Else
General - If (Conditions) then do (Actions) else do (Actions)
If
And
Conditions
Talent_Spended Points >= 20
Talent_Skilllevel[12] == 1
Talent_Skilllevel[20] == 0
Then
Dialog - Set Talent_Images Button[20] tooltip to Talent_Tooltip[20][0] for (Player group(Spieler))
Else
General - If (Conditions) then do (Actions) else do (Actions)
If
And
Conditions
Talent_Spended Points < 20
Talent_Skilllevel[12] == 1
Talent_Skilllevel[20] == 0
Then
Dialog - Set Talent_Images Button[20] tooltip to Talent_Tooltip[20][7] for (Player group(Spieler))
Else
General - If (Conditions) then do (Actions) else do (Actions)
If
And
Conditions
Talent_Spended Points >= 20
Talent_Skilllevel[12] == 0
Talent_Skilllevel[20] == 0
Then
Dialog - Set Talent_Images Button[20] tooltip to Talent_Tooltip[20][8] for (Player group(Spieler))
Else
Als Event benutzen wir hier:
Ein Dialog-Item wird von einen beliebigen Spieler gedrückt
(Dialog - Any Dialog Item is Clicked by Player Any Player)
Für diesen Auslöser benötigen wir exakt 4 lokale Variablen:
1. Temp_Talentnummer , vom Typ Integer
2. Temp_Talenttreenumber , vom Typ Integer
3. Temp_Tooltip , vom Typ Text
4. Temp_Pfad , vom Typ String
Ich werde die Aktionen jetzt als Code posten und dann im Code erklären:
Es steht immer über der jeweiligen Aktion!
(wer will kann diesen code auch ohne jegliches Verständtnis in ein Custom Script kopieren,
das läuft zumindest auch xD
Code: Alles auswählen
//Es soll eine Schleife von 1-20 ausgeführt werden
General - Pick each integer from 1 to 20, and do (Actions)
Actions
//If then else Anweisung
General - If (Conditions) then do (Actions) else do (Actions)
If
//wenn der angeklickte button gleich der von der schleife ist,
(Used dialog item) == Talent_Images Button[(Picked integer)]
Then
//dann soll die Nummer des Talents in Temp_Talentnummer gespeichert werden
Variable - Set Temp_Talentnummer = (Picked integer)
Else
//if-then-else anweisung wieder
General - If (Conditions) then do (Actions) else do (Actions)
If
//wenn die 2 erstellen Bedingungen erfüllt sind,
(Bedingung für Talentnummer 15(Temp_Talentnummer)) == true
(Bedingung für Talentnummer 20(Temp_Talentnummer)) == true
//und die Punkte die man in den Baum gesteckt hat, mindestens so groß ist,
//wie die benötigten Punkte für diese Ebene,
(Talent_Needed Points[Temp_Talentnummer] * 5) <= Talent_Spended Points
//und der Skilllevel des gewünschten Talents noch nicht auf der maximalen Stufe ist,
Talent_Skilllevel[Temp_Talentnummer] < Talent_Maxlevel[Temp_Talentnummer]
//und man noch mindestens 1 Talentpunkt über hat, dann:
Talent_Remaining Points > 0
Then
//Sollen die verbleibenden Punkte um 1 verringert werden
Variable - Set Talent_Remaining Points = (Talent_Remaining Points - 1)
//Sollen die Punkte, die in diesen Talentbaum stecken, um 1 erhöht werden
Variable - Set Talent_Spended Points = (Talent_Spended Points + 1)
//Soll die Stufe des Talents um 1 erhöht werden
Variable - Set Talent_Skilllevel[Temp_Talentnummer] = (Talent_Skilllevel[Temp_Talentnummer] + 1)
//Ebenfalls soll natürlich auch das Tooltip angepasst werden an die neue Stufe!
Dialog - Set Talent_Images Button[Temp_Talentnummer] tooltip to Talent_Tooltip[Temp_Talentnummer]
Talent_Skilllevel[Temp_Talentnummer]] for (Player group((Triggering player)))
General - If (Conditions) then do (Actions) else do (Actions)
If
//Wenn das Talent dann auf der maximalen Stufe ist,
Talent_Skilllevel[Temp_Talentnummer] == Talent_Maxlevel[Temp_Talentnummer]
Then
//Dann soll der Pfad fürs angepasste neue Bild bestimmt werden
Variable - Set Temp_Pfad = (Combine ("Maxlearned_", (String(Talent_Maxlevel[Temp_Talentnummer])), ".dds"))
// Und die Umrandung muss auch geändert werden, weil ausgelernt!
Dialog - Set Talent_Images[Temp_Talentnummer] image to Maxlearned.dds for (Player group((Triggering player)))
// Ebenfalls soll es natürlich wieder von der Renderpriorität angepasst werden,
// Damit es ÜBER allen anderen ist
Dialog - Set Talent_Images[Temp_Talentnummer] Render Priority to 513 for (Player group((Triggering player)))
Else
//Sonst soll der Pfad fürs angepasste neue Bild bestimmt werden,
// in diesem Fall aber ein NICHT_ausgelerntes bild
Variable - Set Temp_Pfad = (Combine ("Learned_", (String(Talent_Skilllevel[Temp_Talentnummer])), ".dds"))
//Ebenfalls soll trotzdem die Umrandung geändert werden, aber zu einer
// nicht ausgelernten Version der Umrandung
Dialog - Set Talent_Images[Temp_Talentnummer] image to Learned.dds for (Player group((Triggering player)))
// Auch davon soll wieder die Renderpriorität angepasst werden
Dialog - Set Talent_Images[Temp_Talentnummer] Render Priority to 513 for (Player group((Triggering player)))
// Das Upgradesymbol soll nun das Bild von Temp_Pfad kriegen
Dialog - Set Talent_Images Level[Temp_Talentnummer] image to lv_temp_Pfad for (Player group((Triggering player)))
// Auch davon soll natürlich die Renderpriorität erhöht werden :)
Dialog - Set Talent_Images Level[Temp_Talentnummer] Render Priority to 514 for (Player group((Triggering player)))
// Der Text für die Anzahl der investierten Punkte muss angepasst werden!
Dialog - Set Talent_Texte[1] text to ("Mutation-Tal<c " + (Combine ("<c val="6000BF">",
(Text(Talent_Spended Points)), "</c>"))) for (Player group((Triggering player)))
// Der Text für die Anzahl der unverteiltenPunkte muss angepasst werden!
Dialog - Set Talent_Texte[2] text to ("Unverteilte Talentpunkte: " + (Combine ("<c val="FFFF00">",
(Text(Talent_Remaining Points)), "</c>"))) for (Player group((Triggering player)))
// Dann soll unsere tolle Aktionendefinition ausgeführt werden!
Aktualisierung der Bedingungen(Temp_Talentnummer, (Triggering player))
Else
Ebenfalls könnt ihr im Spiel testen und werdet feststellen, dass die Umrandungen sich
bereits verändern nur es gibt halt noch keine Auswirkungen
Hier ein Beispiel:
3.3. Erhalt der Talente
Das letzte was wir jetzt noch brauchen ist eine Action Definition(Aktionendefinition),
welche wir Erhalt des Talents nennen.
Diese Aktionendefinition beinhaltet folgende Parameter:
Talentnummer , vom Typ Integer
Spieler , vom Typ Integer
Der Gramar Text müsste dann so aussehen: Erhalt des Talents(Talentnummer, Spieler)
Hier erstellen wir wieder eine Multiple If-then-else Anweisung:
und jetz geht es ganz schematisch vor
Für jedes Talent das wir haben(in diesem Fall 12 Stück) erstellen wir eine
Else If then do Aktion
der Else If part ist immer:
Code: Alles auswählen
Else If
Talentnummer == #nummer
//#nummer bitte mit der Nummer von 1-20 ersetzen
ich habe hier für meine Map 4 Beispielskills(relativ simpel alle^^):
Erklären stehen im Code über den Aktionen
Code: Alles auswählen
General - If (Conditions) then do multiple (Actions)
If Then Else
General - Else if (Conditions) then do (Actions)
Else If
Talentnummer == 1
Then
//Erhöht die Geschwindigkeit des Thors um je 2.5
Unit - Set Thor [6.89, 3.28] Movement Speed to ((Thor [6.89, 3.28] Movement Speed (Current)) + 2.5)
General - Else if (Conditions) then do (Actions)
Else If
Talentnummer == 3
Then
//Diese Variable vom Typ Real muss vorher aber global erstellt werden
Variable - Modify Talent 3: + 20.0
//Erhöht die Größe des Thors um je 20%
Unit - Set Thor [6.89, 3.28] scale to (Talent 3%, Talent 3%, Talent 3%) of its original size
General - Else if (Conditions) then do (Actions)
Else If
Talentnummer == 4
Then
// Erhöht das maximale Leben des Thors um je 100
Unit - Set Thor [6.89, 3.28] Maximum Life to ((Thor [6.89, 3.28] Maximum Life (Current)) + 100.0)
General - Else if (Conditions) then do (Actions)
Else If
Talentnummer == 6
Then
// Erhöht die Schilde des Thors um je 100
Unit - Set Thor [6.89, 3.28] Maximum Shields to ((Thor [6.89, 3.28] Maximum Shields (Current)) + 100.0)
zu der Aktion gehen wo steht:
Aktualisierung der Bedingungen(Temp_Talentnummer, (Triggering player))
und direkt darunter fügt ihr hinzu mit unserer neuen Aktionendefinition:
Erhalt des Talents(Temp_Talentnummer, (Triggering player))
Nun kann ich nur sagen: Congratulation!
Es ist vollbracht Nun könnt ihr Talentpunkte verteilen und erhaltet Boni,
hier ein Video von mir was das auch nochma zeigt:
4. Abschluss
Nun, ich hoffe dieses Tutorial war verständlich und hilfreich, sobald ich an einen
deutschen Editor komme, werde ich mir auch noch die Mühe machen den Teil
zuübersetzen, der bisher auf Englisch ist. Ebenfalls fehlt noch 1 Auslöser, welcher
nur in der kompletten Map drin ist, den werde ich binnen 1 Tag nachreichen.
Ebenfalls stelle ich hiermit alle benutzten Images für die Umrandungen, Upgradestufen, etc. nachreichen:
http://www.file-upload.net/download-255 ... e.rar.html
Hier ist auch noch die Map:
enGB-Version: http://www.file-upload.net/download-255 ... C2Map.html
deDE-Version: http://www.file-upload.net/download-255 ... C2Map.html
falls es noch Fragen gibt
so stellt sie bitte
grüße
Deathwing