Ressourcen-Icon

Variablen (Short, Long, Float, Ref)

Grundlegende Informationen zu Variablen
  1. Was ist eine Variable?
    a) Was gibt es für Variablen?
    b) Die Float Variable, erste Informationen.
  2. Wieso brauche ich sowas?
  3. Wie erstelle ich nun eine Variable?
    a) Wie verändere ich solche Variablen nun im Script?
  4. Und wie kann ich sie nun Abfragen?
    a) Relationen
  5. Ein kleines Beispiel.
  6. Besondere Variablen.
  7. Danksagungen für Verbesserungen etc.
1. Was ist eine Variable?
Ganz einfach formuliert ist eine Variable ein Zahlenspeicher. Wie z.b. die Tor Anzeige für die Heimmannschaft kann ich mit ihr Speichern wie oft etwas schon vorgekommen ist.

1. a) Was gibt es für Variablen?
Es gibt in Oblivion 4 verschiedene Arten von Variablen. Unterschieden wird dabei, zwischen der Art der Zahlen, welche darin gespeichert werden können und der Größe der Zahlen.
Und hier sogar wofür sie gut ist.

Da wären also:
  • Short - was übersetzt für kurz steht und so kann diese Variable nur 'kleine' ganze Zahlen speichern. Um genau zu sein Zahlen zwischen:
    -32.768 bis 32.767
    (das ist also nicht wirklich klein...)
  • long - was übersetzt für lang steht und so kann diese Variable halt 'große' ganze Zahlen speichern. Um auch hier genau zu sein, Zahlen zwischen:
    -2.147.483.648 bis 2.147.483.647
    (was ja schon wirklich riesig ist)
  • "float" definiert eine "floating-point number", zu Deutsch "Gleitkommazahl". Je nach Implementierung bieten diese Variablen eine bestimmte Anzahl von Stellen, wobei nicht festgelegt ist, hinter welche Stelle das Komma ist.
    Diese Zahlen können zwischen 1.18E-38 bis 3.40E38 (Präzision 7 Stellen) liegen.
    Diese Variablen sollte man als Anfänger erst einmal ignorieren, da die Zahlen im binär System gespeichert zu sein scheinen. Ich werde später, nachdem ich mir selbst das nochmal genauer angesehen habe, aber nochmal darauf eingehen.
  • ref - reference , sprich Referenz Variablen. Diese Variable wird benutzt, wenn man direkt auf einen Gegenstand zugreifen möchte, hierbei scheint es egal zu sein, ob es ein NPC oder halt ein Item ist.
1. b) Die Flaot Variable, erste Informationen
Wie ich schon ansprach, ist diese Variable nicht so einfach zu verstehen wie die anderen.
Dies basiert auf 2 Informationen die einem die Hilfsseite zum CS gibt.

  1. sie basiert auf dem Binären System.
  2. sie arbeitet mit Exponenten.
  1. Das Binäre System Arbeitet nur mit jeweil zwei Werten pro Stelle einer Zahl. Während das normale Dezimale Zahlensystem mit 10 arbeitet.
    Dezimal: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    Binär: 0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001
    Also jedes mal wenn die 1 erreicht wird und der Wert um eins erhöht wird, wird die nächst höhere Stelle auf eins gesetzt. Bzw. wenn diese schon 1 ist auf 0 und erneut die nächst höhere.
    Ich empfehle euch einfach mal einen Link wo es ausführlicher erklärt ist: Link
  2. das Multiplizieren mit Exponenten ist eine Sache die Häufig passiert.
    Wenn z.b. Zahlen zu groß werden:
    1.000.000 ist das gleiche wie 10^6
    Oder halt:
    0.000.001.234 das gleiche ist wie 1234^-6 (^ bedeutet hoch, für die die es noch nicht wussten)
    In Oblivion wird dieses Zeichen jedoch mit dem E ersetzt (E für exponent nehme ich an).

    1.0000000E9 = 1.000.000.000
    1.0000001E9 = 1.000.000.100
Wie ihr schon seht liegt hier dann auch die Begrenzung. Ihr könnt keine Zalen zwischen diesen beiden Zahlen wählen. Da diese zu lang wären für die Float Variable.

Wie Verbinde ich nun diese beiden Dinge?
Nun, das konnte ich leider aus der Beschreibung nicht herrauslesen und müsste ich noch einmal weiter untersuchen.
Leider ist mir das System so halt noch nicht klar. Wer da schon was herraus gefunden hat, dem wäre ich verbunden, wenn er mich informiert... Danke.

2. Wozu brauche ich sowas?
Man brauch so etwas bei vielen Gelegenheiten.
Ein paar Beispiele:
Du möchtest das der Spieler 3mal an eine Tür klopfen soll, bevor ihm einlass gewährt wird.
Du möchtest eine Wunderlampe erstellen, die dem Spieler nur 3 Wünsche erfüllt.
Du willst das der Spieler nur einmal ein Rätsel beantworten muss um eine Tür zu öffnen und die Tür danach immer dem Spieler offen stehen soll.

Für all diese Sachen musst du in einem Script nachprüfen lassen, wie oft der Spieler etwas schon getan hat. Dies geht über Variablen.
Es gibt aber noch andere Möglichkeiten wo man so etwas gebrauchen könnte:

Bsp:
Du willst ein Schwert erstellen, welchs mit jedem getöteten Gegner mehr Schaden anrichtet.

Hier könntest du mit Variablen einen Script Zauber auf das Schwert legen welches in Höhe einer Variablen, oder durch eine Variable bestimmt Schaden macht.

3. Wie erstelle ich nun eine Variable?
Eine Variable wird immer vor dem eigentlichen Script erstellt. Das bedeutet, du sagst dem Script das es mit einer Variablen arbeiten wird, bevor diese überhaupt einen richtigen Wert bekommt. Daher bekommt die Variable vorrübergehend schon den Wert 0 zugeteilt (Bool'sche Algebra: 0 = aus, 1 = ein, könnte auch ein Grund dafür sein... Wink .

Nun aber kurz etwas zu der Syntax, sprich dazu wie so etwas geschrieben wird:

Code:
short 'NameDerVariablen_1'
long 'NameDerVariablen_2'
Float 'NameDerVariablen_3'
ref 'NameDerVariablen_4'
Man setzt also erst die Art der Variable und dann den Namen selbiger. Wie ich schon deutlich machen sollte durch die Zahlen, müssen Variablen in einem Script natürlich einmalige Namen haben.

Merke:
Man kann nicht zwei Variablen mit den selben Namen haben!

Nun schauen wir aber noch einmal wo in einem Script wir diese Variablen erstellen müssen:

Code:
scriptname WieSetzeIchEineVariable

short KleineZahlen
long GroßeZahlen
Float Kommazahlen
ref Referenzen

Begin XXXX ; ab hier startet erst das eigentliche Script! 
  [Script]
End ; das Ende des Scripts
Wie ihr seht, werden die Variablen vor dem eigentlichen Script schon bestimmt. Also vor dem was ausgeführt wird (hier verinfacht nur mit einem Begin).
Wie ihr schon seht habe ich den Variablen hier auch schon Namen gegeben. Nämlich: KleineZahlen , GroßeZahlen , Kommazahlen , Referenzen .

3 a) Wie verändere ich diese Variablen nun im Script?
Soweit so gut, wir haben gesehen wie man eine Variable erstellt, aber sie soll ja nicht ihr Leben lang auf 0 gestellt bleiben.

Dies geht mit dem Befehl:

Code:
set [VariablenName] to [Wert]
Natürlich kann man mit einer Variablen rechnen, sonst wären sie ja unnütz.

Hier also mal ein kleines Beispiel (von der Hilfsseite zum CS)
Ihr erstellt einfach ein neues Script als MagicEffect Script.
(TES -> oben rechts, Gameplay -> EditScript -> Script -> New -> oben rechts in dem ScriptFenster bei ScriptType auf MagicEffect stellen.)

Tipt es einfach mal ab. Fügt es einen Zauber hinzu setzt wie Wirkungsdauer dieses Zaubereffektes auf 5 und probiert es dann mal im Spiel aus.

Code:
scriptname MeinErsterZauber

short updateCount

Begin ScriptEffectUpdate
  set updateCount to updateCount + 1
End

Begin ScriptEffectFinish
  Message "ScriptEffectUpadte lief %.0f mal", updateCount
End
Was macht dieses Script?
Ihr seht oben wird mit

Code:
short updateCount
Die Variable updateCount als kurz Variable bestimmt.

Die Linie zwischen 'Begin ScriptEffectUpdate' wird jede sekunde in der der Zauber wirkt ausgeführt.
Mit dem

Code:
set updateCount to updateCount + 1
wird also jedes mal unsere Variable um 1 erhöht.

'Begin ScriptEffectFinish' läuft sobald das Script beendet wird.

Code:
Message "ScriptEffectUpadte lief %.0f mal", updateCount
Gibt den Spieler die Nachricht wie oft der update count lief.

Ihr seht, also so kann man diese Variable verändern, natürlich kann man auch eine Variable auf eine andere Variable setzen. Oder bei der ref Variable werdet ihr häufig dieses finden:

Code:
set [RefVariablenName] to getself
Womit die ReferenzVariable auf das ausführende Item gesetzt wird.

4. Und wie kann ich sie nun abfragen?
Zum Abfragen von Variablen benutzen wir, wie für alles andere auch, eine IF Abfrage.
If, übersetzt Falls, fragt ab wie ein Wert ist.

Hierbei gibt es die eher typischen Relationen, welche ich unter 4. a) noch näher beschreibe.

Also einmal ein kleines Beispiel, welches jedoch ein wenig umständlich ist, da ich halt eine normale Variable benutzen möchte anstatt einer spezielleren:

Dazu erstellen wir zuerst eine neue Quest.
Character -> Quests... -> rechtsclick -> new -> Name 'zzCountQ'

nun die Quest auswählen und dort unter Script auf den '...' Button. Neues Script erstellen, und diesmal anstatt auf Spell Effect, auf Quest stellen.

Dort erstellen wir nun eine Variable:

Code:
scn zzCount

short Slashcount
Speichern und noch einmal nachprüfen ob dieses nun auch wirklich das unter der Quest ausgesuchte script ist.
So wir haben nun also in einem Script eine Variable bestimmt ohne mehr an ihr zu ändern, dies mag auf den Ersten Blick merkwürdig wirken, da wir keine Abfrage und nichts weiter haben, aber wenn ihr schon einmal die restlichen Scripts angesehen habt, dürftet ihr sowas schon einmal gesehen haben.

Nun erstellen wir ein zweites Script, diesmal wieder ein Spell Effect Script.

Code:
scn zzCountingBlade

Begin ScriptEffectStart
  if zzCountQ.SlashCount < 5 
  set zzCountQ.SlashCount to zzCountQ.SlashCount + 1
  message "Du hast nun %.0f mal zugeschalgen", zzCountQ.SlashCount
  Else 
  set zzCountQ.SlashCount to 0
  message "Komisch, du dachtest es würde etwas passieren"
  Endif
End
Wie ihr seht, haben wir nun ein If, die unsere Variable SlashCount abfragt und sie in die kleiner als Relation mit der Zahl 5 setzt. Sprich, solange sie kleiner als fünf ist, wir der Code der nun folgt ausgeführt.
Wenn die Zahl mind. gleich 5 ist, Wird der Code zwischen dem Else und dem Endif ausgeführt. (Nochmal der Hinweis das ihr eine Liste der Relationen unter 4. a) findet)

Das Script abspeichern, ein enchantment erstellen mit dem ScriptEffect zzCountingBlade und dies dann natürlich noch einem Schwert beifügen.

Nun einfach mal z.b. Monster/Tier suchen und langsam einzeln dagegen schlagen.

----

Was hat uns dies nun gebracht? Nun, wir haben bis jetzt nur ein Paar dumme Nachrichten bekommen. Erst 4 mal eine Nachricht wie oft wie zugeschlagen aber und dann einmal eine das etwas hätte passieren können und dann wieder wie oft wir zugeschlagen haben. Aber wir hätten auch einen besonderen Effekt nach 5 Schlägen hinzufügen können.

Aber noch einmal zurück, warum habe ich eine Quest und ein Questscript erstellt?
Einfach, weil es keine Möglichkeit gibt die Variable direkt in diesem einem Script unterzubringen. Also habe ich über eine Quest, die nicht einmal aktiviert war, eine Link zu eine immer existente Variable geschlagen.
Theoretisch hätte ich das auch mit den speziellen Variablen den sogenannten Globals machen können. Aber dazu später mehr.

4. a) Relationen
Relationen sind sozusagen Verhältnisse. Wie Verhalten sich zwei Zahlen zueinander.
Ein kleines Beispiel:
5 ist größer als 4 aber kleiner als 6. Hier sind direkt zwei Relationen.
Einmal das 5 größer als 4 ist und einmal das 5 kleiner als 6 ist.
Einzeln in kurzer Schreibweise, sieht dies, wie ihr schon wisst so aus:
4 < 5 und 5 < 6

Wenn wir mit Variablen arbeiten. Werden diese Relationen eigentlich immer als Bedingung gelesen. "Wenn 4 < 5 ist". Für Natürliche Zahlen ist sowas geklärt, doch Variablen könnten halt kleinere oder größere Werte als 5 annehmen.

Welche Relationen gibt es nun?:

A == B Dies ist das Zeichen für genau gleich. Es wird sozusagen als normales gleich benutzt.
A != B Dies ist das Zeichen für A ungleich B.
A < B Das Zeichen für A kleiner B.
A > B Das Zeichen für A größer B.
A => B Das Zeichen für A kleiner oder gleich B. (A <= 5, heißt A kanne alle negativen Zahlen und positiven Zahlen bist zur einschließlich 5 annehmen)
A >= B Das Zeichen für A größer oder gleich B.

Auch wenn es nicht zwingend hierher gehört, möchte ich darauf Hinweisen, das es auch noch Anfragen gibt, bei denen 2 Variablen abgefragt werden. Dafür gibt es dann noch folgende Zeichen.

A && B Dies steht für, A und B. Es sorgt dafür das etwas erst läuft, wenn beide Bedingungen erfüllt sind.
Mal ein Beispiel dazu:

Code:
If ( A == 5 ) && ( B !=10 )
Wir fragen ob A gleich 5 ist, und gleichzeitig ob B ungleich 10 ist.
Wenn nun also A gleich 5 ist und B ungleich 10, würde das If sagen, ja, es stimmt. Die Befehle nach mir müssen ausgeführt werden.
Wenn nun A gleich 5 ist, aber B auch gleich 10 ist. Werden die Befehle danach nicht laufen.
Wenn A ungleich 5 ist und B ungleich 10 ist. Werden die Befehle auch nicht laufen.
Genauso wenn beide Bedingungen nicht erfüllt sein sollten.

A || B Dies steht für A oder B. Es sorgt dafür das etwas solange läuft, bis beide Bedingungen nicht erfüllt sind.
Noch einmal das Beispiel von oben nun aber mit || oder verbunden.

Code:
If ( A == 5 ) || ( B != 10 )
Wir fragen ob A gleich 5 ist, oder ob B ungleich 10 ist.
Wenn nun also A gleich 5 ist und B ungleich 10, würde das If sagen, ja, es stimmt. Die Befehle nach mir müssen ausgeführt werden.
Wenn nun A gleich 5 ist, aber B auch gleich 10 ist. Werden die Befehle ausgeführt. Da ja nur eines von beiden stimmen muss!
Wenn A ungleich 5 ist und B ungleich 10 ist. Werden die Befehle die folgen auch wieder ausgeführt, da wie schon gesagt ja nur eines von beiden zutreffen muss. Also Entweder muss A gleich 5 sein oder B ungleich 10.
Wenn nun aber A ungleich 5 ist und B gleich 10 ist, werden die darauf folgende Befehle nicht ausgeführt. Da ja beide Aussagen nicht stimmen.

Wie ihr vielleicht schon bemerkt habt, entspricht das || , nicht wirklich dem logischen Oder, sondern viel mehr dem Und-Oder. Zumindest soweit ich es gelernt habe, stimmt somit also nicht die Aussage von der Hilfseite zum Tes, das es die logischen Ausdrücke wären.

5. Ein kleines Beispiel
Wir nehmen wie schon oben die Scripts ergänzen das zweite Script jedoch so, das es nun so aussieht:

Code:
scn VampiricBlade

Begin ScriptEffectStart
  If ( GetIsPlayable Rave == 1 ) && ( IsSpellTarget Vampirism25 != 1) 
 && ( IsSpellTarget Vampirism 50 != 1 ) && ( IsSpellTarget Vampirism75 != 1)
 && (IsSpellTarget Vampirism100 != 1)
  If ( zzCountQ.SlashCount < 5 )
  set zzCountQ.SlashCount to zzCountQ.SlashCount + 1
  Else
    If ( PcVampire >= 1 )
  messagebox "Das Schwert pumpt Blut in deine Adern", "okay"
  set PcVampire to 1
  Player.RemoveSpell Vampirism50
  Player.RemoveSpell Vampirism50Att
  Player.RemoveSpell Vampirism50Skills
  Player.RemoveSpell VampireSeduction
  Player.RemoveSpell Vampirism75
  Player.RemoveSpell Vampirism75Att
  Player.RemoveSpell Vampirism75Skills
  Player.RemoveSpell VampireReignOfTerror
  Player.RemoveSpell Vampirism100
  Player.RemoveSpell Vampirism100Att
  Player.RemoveSpell Vampirism100Skills
  Player.RemoveSpell VampireEmbraceOfShadows
  Player.AddSpell Vampirism25
  Player.AddSpell Vampirism25Att
  Player.AddSpell Vampirism25Skills
  set vampire.vampday to gameday
  set vampire.vamphour to gamehour
  Else
  messagebox "Das Schwert entleert sein Blut auf den Boden", "okay"
  Endif
  set zzCountQ.SlashCount to 0
  Endif
  Endif
End
Abspeichern,... etc.
Was macht dieses Script nun? Nun, es zählt im SlashCount mit, wie oft ihr mit dem Schwert bzw, mit jedem Schwert mit dieser Verzauberung, zugeschlagen habt.

Solltet ihr zufällig ein Vampir sein, erhaltet ihr nach 5 Schläge gegen eine der Spielbaren Rassen, der nicht gerade ein Vampir ist, eine Ladung Blut, als ob ihr gerade etwas getrunken hättet.
Ansonsten gibt es eine einfache Nachricht, das das Schwert sein Blut sozusagen verschwendet.

Wie ihr vielleicht auch schon in diesem Beispiel seht, gibt es eine Menge weitere Variablen. Z.b. Vamphour und Vampday, diese werden auch über die Quest Vampire von mir verändert. Ihr findet diese beiden Variablen übrigens im VampireScript.

6. Besondere Variablen
Wie ich schon andeutete, gibt es besondere Variable.

Das wären z.b. die Globals (sozusagen eine weitere Gruppe die ich oben nicht genannt habe). Dies sind Variablen die man schon über den Globals Punkt erstellen muss und auf welche jedes Script sofort zugreifen kann und so in keinem Script definiert werden müssen.

Dan gibt es noch folgende Variablen (Globals im übrigen), die vom Spiel selbst verändert werden, ohne extra in einem Script zu stehen:

  • GameYear , das momentane Jahr des Spiels
  • GameMonth ,der momentane Monat des Spiels
  • GameDay , der momentane Tag im Spiels
  • GameHour , die momentane Uhrzeit im Spiel
  • TimeScale , die SpielMinuten die in einer rl Minute vergehen
  • GameDaysPassed , Viele Tage (im Spiel?) sind vergangen seit Spielbeginn.
Dann gibt es noch einige welche sogar eine Funktion zu haben scheinen (Infos wie auch oben die von der Hilfsseite zum TES)

fQuestDelayTime
Bestimmt wie oft (in sekundentakt) das Spiel ein QuestScript abruft, standard ist 5 minuten

fTrapDamage
Wieviel Schaden eine Falle macht, jedesmal wenn sie den Auslöser trifft.

fTrapPushBack
Wie weit man von einer Falle zurück geschoben wird, bei jedem Treffer, Sollte zwischen 0 und 1000 stehen.

fTrapMinVelocity
Wie schnell eine Falle im Vergleich zum Spieler sein muss um Schaden zu machen. Dieser Wert ist in BSEinheiten (was mir persönlich gerade nichts sagt...)

bTrapContinius
Hat nur den Wert 1 oder 0 ! (1 = wahr/ein , 0 = unwahr/aus)
Wenn der Wert = 0 ist, macht die Falle nur beim ersten Treffen Schaden.
Ist der Wert = 1 macht die Falle solange Schaden wie der Auslöser (Player/NPC) mit ihr in Berührung ist.

7. Danksagung
Ein großes Danke an Brandanus, der mich auf meine schändliche Fehl Erklärung der Float Variable hingewiesen hat. Und der mich nochmal darauf hingewiesen hatte, das ich nicht alle Relationen angegeben hatte und die Relationen z.b. von den in Pascal verwendeten abweichen.

-----

So ich hoffe ich konnte euch ein wenig helfen, so dass ihr beim nächsten durchlesen/editieren der verschiedenen schon vorhandenen Scripts etwas mehr versteht.

Solltet ihr noch Fehler finden, oder Hinweise sowie weitere Erläuterungen (sprich Verbesserungen) haben, könnt ihr mich ja informieren. Ich werde dann schauen das ich das hier editieren. Natürlich werde ich dann auch erwähnen das ihr mich da verbessert oder darauf hin gewiesen habt etc.
Autor
ElderScrollsPortal.de
Aufrufe
2.535
Erstellt am
Letzte Bearbeitung
Bewertung
0,00 Stern(e) 0 Bewertung(en)

Weitere Ressourcen von ElderScrollsPortal.de