====== Funktionen ======
Funktionen im Skript werden dazu benutzt um Abläufe zu automatisieren und eure Geschichte im Spiel zu gestalten.
Sie können //Parameter// und einen //Rückgabewert// haben. Einfache Funktionen lassen sich betrachten wie ein Todo-Zettel mit Aufgaben, die noch zu erledigen sind.
Wenn der Zettel einmal aufgeschrieben wurde, kann er immer wieder abgearbeitet werden, indem sein [[Skript:Bezeichner|Name]] aufgerufen wird.
===== Definition =====
func typ Name (
//hier, zwei Parameter. Bei einer Parameteranzahl zwischen 0 und 8 gibt es keine Probleme
var typ ParameterA,
var KLASSEN_TYP ParameterB
) {
//TODO Liste, der Aufgabenzettel für die Engine
//Variablenzuweisung
Questvariable = Konstante;
//Eigenschaftenzuweisung
ParameterB.eigenschaft[ParameterA] = Andere_Konstante;
//Der Rückgabewert
return Wert_Vom_Typ_typ;
};
^Code ^Beschreibung ^Möglicher Wert^
|typ|Bezeichnet einen Werttyp.|int, float, string, void (kein Rückgabewert), C_NPC, C_ITEM|
|KLASSEN_TYP|Bezeichnet einen Werttyp, der eine [[Skript:Klassen|Klasse]] ist.|C_NPC, C_ITEM, C_INFO|
|Name|Bezeichnet die Funktion. Ihr Name muss neu sein.|FunktionA, ABC_Funktion, A_Funktion_001|
|ParameterA, ParameterB|Bezeichnen die Parameter einer Funktion.|siehe oben|
|Questvariable|Bezeichnet eine globale Variable|siehe [[Skript:Variablen]]|
|Konstante, Andere_Konstante|Bezeichnet zwei globale Konstanten|siehe [[Skript:Konstanten]]|
Welche Bedeutung die Anweisungen **Variablen**- bzw. **Eigenschaftenzuweisung** und **return** haben steht im Abschnitt [[Skript:Operatoren]].
===== Parameter (Mehrzahl) =====
[[Skript:Funktionen|Zurück zum Aufgabenzettel]]. Es wurde gesagt, dass die Aufgabenzettel beliebig oft abgearbeitet werden können. Wenn allerdings sich das Abarbeiten nicht //irgendwie// verallgemeinern ließe, dann müssten wir sehr viele Zettel bzw. Funktionen schreiben.
Jedoch, glücklicherweise lassen sie sich mittels Parameter verallgemeinern, d.h. ein Zettel kann für mehr als eine Situation [[Skript:Funktionen|aufgerufen]] werden.
**Beispiel**
Deine Mutter schreibt **einen** Zettel ''func void Kind_Kauft_bei_Aldi(Kind,Produkt,Anzahl) {};'' um jedes ihrer Kinder, mit dem Einkauf bei Aldi Süd eines beliebigen Produktes in beliebiger Anzahl zu beauftragen.
Noch allgemeiner formuliert lautete ihr Zettel ''func void Kind_Kauft_bei(Kind,Produkt,Anzahl,Haendler) {};''
===== Funktionsaufruf =====
Jede Funktion kann aufgerufen werden. Das heißt, dass die Aufgaben auf dem Zettel abgearbeitet werden.
Beim Aufruf schreibt man den Namen des Zettels bzw. der Funktion und in runden Klammern - mit oder ohne Leerzeichen - danach die zu //übergebenden// Parameter getrennt durch Kommata (Kommas). Der Zettel wird dann mit den übergebenen Parametern abgearbeitet.
**Beispiel (fortgesetzt)**
Deine Mutter schickt **dich** zum **Bioladen** um **zwölf** **Bio-Eier** zu kaufen. Dazu ruft sie //ihren// Zettel auf: ''Kind_Kauft_Bei(Du,Bioeier,12,Bioladen);''
Dabei ist natürlich wichtig, dass die Parameter in der richtigen Reihenfolge übergeben, d.h. aufgeschrieben werden. Außerdem müssen und können nur dann Parameter übergeben, wenn die [[Skript:Funktionen|Funktionsdefinition]] sie auch enthält und zwar **genau** so viele die Funktionsdefinition enthält und vom gleichen [[Skript:Daedalus|Typ]]!
===== Rückgabewert, englisch: return value =====
Manchmal möchte man eine //Antwort// über das //Ergebnis// der Funktion erhalten. Dazu muss in der Funktionsdefinition der Antworttyp, Ergebnistyp oder Rückgabetyp festgelegt werden. Zulässig sind alle [[Skript:Daedalus|Typen]] oder ''void'', welches soviel bedeutet wie: kein Rückgabewert.
**Beispiel (fortgesetzt)**
Deine Mutter schreibt auf ihren Zettel, dass sie eine Zahl bzw. ''int'' als Antwort möchte. Die Zahl ist der Gesamteinkaufspreis in //Eurocent//.
func int Kind_Kauft_Bei_Gesamtpreis(Kind,Produkt,Anzahl,Haendler) { return Gesamtpreis; };
Es gehört zum guten Ton, dass die Mutter sich diese Antwort merkt.
var int ausgegeben;
ausgegeben = ausgegeben + Kind_Kauft_Bei_Gesamtpreis(Du,Bioeier,12,Bioladen);
In diesem Beispiel merkt sich deine Mutter, wieviel ihre Kinder insgesamt bisher ausgegeben haben, in dem sie zu dem was bisher ausgegeben wurde das hinzuzählt was zuletzt ausgegeben wurde.
Wenn die //Antwort// der Funktion mittels der Anweisung ''return Wert_vom_Werttyp_typ;'' zurückgegeben wird, dann wird sofort die weitere Abarbeitung des //Todo-Zettels// eingestellt, beendet.
===== Siehe auch =====
[[Skript:Daedalus]], [[Skript:Funktionstypen]]