[SCM][Tutorial]Guide

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [SCM][Tutorial]Guide

    Was ist SCM-Scripting?:
    • SCM ist besser bekannt als Cleo. Die Sprache wird in San Andreas verwendet um Mission und Scriptabhängige Modelle zu laden/erstellen. Außerdem regelt sie die Höhe der maximalen Wanteds und wo man noch Tod sowie Verhaftung spawnt.

    Welches Programm wird benötigt?:
    • Um Scripts zu erstellen und zu compillen wird das Programm "SannyBuilder" von Seeman benötigt.
    Welche Vorteile bieten mir Cleo Scripts?:
    • Man kann Problems Funktionen in San Andreas hinzufügen ohne die main.scm (Hauptdatei der Missionen etc.) zu verändern. Das hat den Vorteil das man kein "Neues Spiel" starten muss, was bei Änderung an der main.scm der Fall währe.


    Nachfolgen folgt die 4-Teilige Reihe des Guides.
  • Guide #1 - SannyBuilder installieren und Grundlegende Funkionen

    Der erste Schritt um Cleo-Scripte zu erstellen


    -Downloade dir SannyBuilder von seemann (sannybuilder.com)
    Die EXE ausführen und das San Andreas Installationsverzeichnis angeben.
    Ein Ordner mit Namen "Cleo" wurde ebenfalls erstellt. Dort kommen deine fertigen Scripts hinein.
    Nach dem Start gehst du auf "Neu" und solltest das sehen:



    Kopiere nun das Beispiel in die Neue Seite.

    [cpp]{$CLEO .cs}
    :DEMOTEXT
    03A4: name_thread "DEMO"
    wait 1000

    :DEMOTEXT_1
    wait 0
    if
    0256: player $PLAYER_CHAR defined
    004D: jump_if_false @DEMOTEXT_1
    if
    00E1: key_pressed 0 17
    004D: jump_if_false @DEMOTEXT_1
    00BA: text_styled 'FEM_OK' 1000 ms 1
    0A93: end_custom_thread[/cpp]

    Speichere es in einem Ordner ab. Welchen Namen du ihm gibst ist egal.
    Kompiliere nun das Script indem du " F6" drückst oder via "Start --> Kompilieren"
    Wenn die Cleo-Libary installiert ist, wird das Script kompiliert und im Cleo Ordner abgelegt.
    Die Cleo-Scriptdatei erhält dann als Dateiformat die Endung, die in der Cleo-Direktive am Scriptanfang einzutragen ist.

    {$CLEO .cs} = Cleo-Direktive, wird zu *.cs kompiliert
    Als DEMOTEXT.txt gespeichert und zu DEMOTEXT.cs kompiliert

    _______________________________________________________________________________________________________________________________________

    Wenn CLEO nicht installiert ist, dann fordet SannyBuilder dazu auf und am rechten unteren Fensterand,
    erscheint das CLEO - Feld mit rotem Rahmen. Klick drauf und Sannybuilder installiert Cleo sofort.
    Installationsanleitung


    C L E O 3 / Die neue Mission Script-Technik für GTA San Andreas
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


    *CLEO 3 ermöglicht das Hinzufügen
    von Funktionen und sogar Missionen zum Spiel
    ohne die Main.scm zu ändern
    ----------
    *Vorhandene Savegames können problemlos geladen werden
    ----------
    *Vorraussetzung ist die modifizierbare GTA-SA-Version
    GTASA-US-1.0 und 1.01 oder EU-1.0 und 1.01
    Dabei kommt es auf die gta_sa.exe an, mit der man sein Spiel betreibt.
    ----------
    *Die Installation ist sehr einfach
    Man kopiert die CLEO 3-Basisdateien und den CLEO-Ordner
    ins GTA-SA_installationsverzeichnis
    ----------
    *CLEO-Scriptmods, die auf GTA-Fanwebseiten angeboten werden,
    kann man dann als einzelne Datei zum Spiel hinzugefügen,
    indem sie im CLEO-Ordner abgelegt werden

    oder wieder entfernen indem man sie einfach in
    einen anderen Ordner verschiebt oder ganz löscht


    ----------

    ----------


    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // CLEO 3-Basisdateien //
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Die CLEO 3-Basisdateien bestehen aus:
    - cleo.asi
    - vorbisFile.dll
    - vorbisHooked.dll
    - CLEO-Ordner für die Script-Mods
    ----------
    Bei diesem CLEO 3-Basisdateien-Paket
    ist ein Demoscript als Beispiel dabei,
    das im Spiel einen kurzen Text einblendet
    - DEMOTESTTEXT.cs
    ----------
    Dann ist noch ein GXT-Plugin dabei
    - GXTHook.cleo
    - CLEO_TEXT - Ordner
    Es ermöglicht den Scriptauthoren das Erstellen neuer GXT-Einträge,
    damit man neuen Text darstellen kann,
    ohne die german.gxt oder american.gxt ändern zu müssen
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Die im GTA-SA schon vorhandene vorbisFile.dll wird ersetzt
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



    ----------

    ----------


    CLEO 3 wurde zum größten Teil von "Seemann" entwickelt, dem Author des Sannybuilders
    (Editor für Main.scm und mission-coding / Nachfolge-tool des Missionbuilders von Bart Waterduck)
    Nur Seemanns Sannybuilder ermöglicht das Erstellen von CLEO-Scriptmods

    Seemann bietet auf seiner Webseite die originale CLEO 3 -Library an,
    die zusätzliche Plugins enthält, z.B. einen MP3 Player

    Außerdem bietet er auf seiner Homepage Support für die CLEO-Technik sowie für den Sannybuilder

    cleo.sannybuilder.com/
    sannybuilder.com/

    ----------

    ----------

    Eine besondere Rolle spielen die Dateien
    -vorbisFile.dll
    -vorbisHooked.dll

    Außer denen, die in Seemanns CLEO 3 -Library enthalten sind
    kann man sie sich auch von JernejL (Delfi) downloaden,
    dem Author des ASI plugin loader
    gtatools.com/filedb/action.php?action=file&id=19


    -----------------------------------------------------------------------

    ---------------------------------------------------------------------



    _______________________________________________________________________________________________________________________________________

    War der kompilieren + kopieren -Vorgang erfolgreich, erscheint nun eine Report-Ausgabe.



    Diese mit Klick auf OK bestatigen.
    Die unterste Angabe "Largest Script" gibt die Größe des Cleo scripts an. Die anderen beziehen sich auf das Kompilieren einer main.scm


    _______________________________________________________________________________________________________________________________________

    Nun starte dein San Andreas. Es gibt zwei Wege dies zu tun.
    Entweder normal über die Verknüpfung / gta_sa.exe oder per San Andreas Icon in SannyBuilder.

    Teste jetzt das Script im Spiel: Drücke die Feuertaste, dann wird die Textmeldung OK ausgegeben.
    Das Script wird dann beendet, deaktiviert, weil es mit dem opcode 0A93: end_custom_thread endet

    0A93: end_custom_thread ist ein Code, den Seemann extra für Cleoscripte programmiert hat
    Die Originalversion des Codes, die in der main.scm genutzt wird, wäre 004E: end_thread

    Die extra Cleo-Opcodes findet man in der Sannybuilder-HILFE unter CLEO 3 Code Library >> CLEO 3: Opcodes
    Siehe auch: Besonderheiten in Cleo

    Als nächstes solltet ihr euch über die Grundlagen fürs Cleo-Scripten informieren

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Aebian ()

  • Guide #2 - Besonderheiten in Cleo

    Zwei bedeutende Codes, um Scripte zu starten, sind jene die für die main schon existieren und für Cleo neu erstellt wurden,:


    1.) 004F: create_thread @SAVEGAME startet in der Main.scm die gewöhnlichen Scripte, Thread genannt
    Wenn man so ein gewöhnliches Script als Cleoscript kompilieret, bedarf es diesen code nicht, da es vom Cleo-Programm gestartet wird.
    Um ein weiteres Cleoscript aus einem anderen Cleoscript zu starten, ist folgender Cleo-opcode anzuwenden:
    "0A92: create_custom_thread "New_Test_thread.cs"

    Der Name, der zu startenden Datei mit Punkt und Dateityp wird zwischen die Anführungszeichen eingetragen.


    Die Cleo-Scriptdatei erhält dann als Dateiformat die Endung, die in der Cleo-Direktive am Scriptanfang einzutragen ist
    {$CLEO .cs} = Cleo-Direktive, wird zu *.cs kompiliert
    Als New_Test_thread.txt gespeichert und zu New_Test_thread.cs kompiliert
    _______________________________________________________________________________________________________________________________________


    Das Script wird dann 2 mal gestartet, einmal vom anderen Script heraus und einmal vom Cleo-Programm
    Man muss eine Abfrage an den Scriptanfang stellen, die dafür sorgt,
    daß es beendet wird sobald es vom Cleo-Programm gestartet wurde.


    Eine andere Möglichkeit ist, das zu startende Script als .S zu erstellen
    "0A92: create_custom_thread "New_Test_thread.s" wäre das dann
    Die zu startende Cleo-Scriptdatei erhält dann als Dateiformat die selbe Endung, {$CLEO .cs}
    Man muss dann den Datei-Typ manuell von .CS in .S ändern
    In diesem Fall wird das zu startende Script "New_Test_thread.s" nur ausgeführt, wenn es mit "0A92: create_custom_thread" von einer anderen Scriptdatei aufgerufen wird.
    Der create_thread code mit Parametern:
    Der create_custom_thread -Code kann auch mit Informationen gefüttert werden Zum Beispiel:

    0A92: create_custom_thread "PimpmyCarFULL2A1.cs" 1 2 0 3@ 4@ 5@ 6@ 29@ 8@ 9@ 10@
    Das zu startende Script empfängt die Werte aus den Parametern der create_thread-Zeile und setzt dann 0@ gleich mit dem Wert des ersten Parameters, 1@ mit dem zweiten, usw.

    0@ entspricht 1.Parameter
    1@ entspricht 2.Parameter
    2@ entspricht 3.Parameter
    3@ entspricht 4.Parameter
    4@ entspricht 5.Parameter
    usw.
    Es können integere Werte sowie Locale Variable in den Parametern eingetragen werden.
    Ich empfehle, nur integere Werte zu transportieren.

    Man muss nicht 2 Cleodateien erstellen um einen create_thread aufzurufen,
    Man kann auch viele threads in ein Cleo.cs packen, die aus ihrer eigenen Cleo.cs heraus aufgerufen werden und in der selbigen laufen.
    Aber man muss eine Abfrage an den Scriptanfang stellen, die dafür sorgt,
    daß es is in den Hauptthread geleitet wird sobald es vom Cleo-Programm gestartet wurde.

    _______________________________________________________________________________________________________________________________________

    2.) 0417: start_mission 3 startet ein Missionsscript der main.scm.

    Angegeben wird eine Nummer, die die Missionen in der Missionsauflistung in der main.scm haben
    Bei Cleo gibts keine Liste. Aber ein Cleo-Missionsscript erfordert immer ein Cleo-Missions-STARTER-script, mit folgem Cleo-Opcode:

    0A94: start_custom_mission "DriftMission"

    Der Name, der zu startenden Missionsdatei ohne Dateityp wird zwischen die Anführungszeichen eingetragen.
    Die Cleo-Scriptdatei erhält dann als Dateiformat die Endung, die in der Cleo-Direktive am Scriptanfang einzutragen ist

    {$CLEO .cm} = Cleo-Direktive, wird zu *.cm kompiliert
    Als DriftMission.txt gespeichert und zu DriftMission.cm kompiliert

    Die Missionsdatei kann auch in einem anderen Ordner, z.B. in einem Unterordner des Cleo-Ordners gespeichert werden
    "0A94: start_custom_mission "RaceMissions\DriftMission" startet dieses mission script: GTASA\CLEO\RaceMissions\DriftMission.cm

    Script-Vorlage siehe unten


    _______________________________________________________________________________________________________________________________________

    "0A93: end_custom_thread" beendet das Script, es ist dann inaktiv.
    Die Originalversion des Codes, die in der main.scm genutzt wird, ist "004E: end_thread"
    Und diese Originalversion wird in Cleo-Missions-scripten benutzt: "004E: end_thread"
    Also: "0A93: end_custom_thread" bei gewöhnlichen Cleo-Scripten, die zu einer *.cs kompiliert werden.

    [cpp]{$CLEO .cs}
    0A93: end_custom_thread[/cpp]
    "004E: end_thread" bei Cleo-Missions-scripten, die zu einer *.cm kompiliert werden:
    [cpp]{$CLEO .cm}
    004E: end_thread[/cpp]

    _______________________________________________________________________________________________________________________________________

    Cleo erstellt beim Speichern zusätzliche Speicherdateien, die unter CLEO\Cleo_save abgelegt werden.


    Beim Speicherstand-Laden ist darauf zu achten, daß die Präsenz der Scripte im Cleo-Ordner dem Status entspricht, wie er gespeichert wurde
    besondere Aufmerksamkeit gilt dabei Scripten, die den Cleo-opcode, um den Script Status zu registrieren, enthalten


    _______________________________________________________________________________________________________________________________________

    Script Status registrieren

    Die Cleo-Scripte mit Endung .CS werden beim Spiel laden immer neu ausgeführt, egal ob Savegame geladen wurde oder Neus Spiel gestartet.
    Werden im Script, parked_car_generators ausgeführt und man speichert dann und lädt dieses Savegame, wirds nochmal ausgeführt.
    Es entsteht eine Doublette, eine weitere Instanz des parked cars, wenn man das mehrmals macht, hat man mehrmals das selbe parked_car.
    Das gilt auch für Objekte, die platziert werden sowie für Pickups.

    Um das zu verhindern gibts ein Cleo-Opcode, oder um den Scriptstatus mittels "Cleo-Variable" zu bestimmen, muss der Scriptstatus gespeichert werden.
    Dazu trägt man zu Scriptbeginn folgenden code ein:

    [cpp]0A95: enable_thread_saving[/cpp]

    _______________________________________________________________________________________________________________________________________

    Spezielle globale "Cleo-Variable"

    Die Dinge im Spiel brauchen eine Identität (ID), unter dem sie im Spiel registriert werden, ein Name mit dem wir der Engine anweisen im Spiel auszuführen. z.B. für die Definition eines parked-car-generators.
    Sie sind variable einsetzbar
    Das Charackter-Zeichen @ bildet zusammen mit einer Zahl, eine Lokale Variable
    Beispiel: 1@
    Das Charackter-Zeichen $ bildet zusammen mit Buchstaben oder Zahlen, auch Unterstrich ist möglich, eine Globale Variable
    Beispiel: $ONMISSION oder $PLAYER_CHAR oder $10440.

    Lokale oder Globale Variable hat folgende Bedeutung:

    Lokale Variable gelten nur innerhalb des jeweiligen Scriptes, in denen sie eingesetzt werden

    Globale Variable gelten global. Sie können in einem Script einen Wert an die Engine übertragen, der von anderen Scripten, die die gleichnamige Globale Variable in Ausführung bringen, registriert wird.

    Die dekompilierte main.scm enthält viele Scripte, wie gewöhnliche "Threads" im Hauptteil, Missions-Scripte, Extern Scripte die zur externen Script.img kompiliert werden und diverse Sub-Scripte.

    In der main.scm werden Globale Variable dazu benutzt, um Werte oder Spiel-Inhalte scriptübergreifend zu verstehen.
    So wird zum Beispiel der Wert einer Globale Variable zum Registrieren einer abgeschlossenen Mission im Missions-Script verändert
    Das Script zum Starten des Missions-Scriptes versteht die Wertänderung und schaltet die nächste Mission frei.

    In Cleoscripten sollen aber keine Globalen Variablen benutzt werden, weil das zu Fehlern führen kann

    Einzig diese 3 Globale Variable hat Seemann für das Cleo-Programm registriert:

    $PLAYER_CHAR

    $PLAYER_ACTOR

    $ONMISSION

    Trotzdem funktionieren Scripte, die Globale Variable enthalten, aber nicht zuverlässig. Besonders beim Spielen von Story-Missionen,
    während ein Cleo-Script Globale Variable ausführt, kann dies zu schweren Bugs oder Abstürtzen führen.


    Als Ersatz für die scriptübergreifende Funktion Globaler Variablen hat Seemann die spezielle globale "Cleo-Variable" erstellt

    Sie kann nur mit den extra dafür vorgesehenen CLEO OPCODES benutzt werden:

    0AB3: var 0 = 10
    und
    0AB4: 0@= var 0

    Anstatt eines Charackter-Zeichens bildet der Ausdruck var zusammen mit einer Zahl die spezielle globale "Cleo-Variable".
    Da die Variable in anderen codes nicht benutzt werden kann, muss erst ihr Wert an eine Lokale Variable weitergegeben werden:


    [cpp]0AB4: 13@ = var 44
    if
    0039: 13@ == 1 // integer values
    004D: jump_if_false @weiter[/cpp]

    Die Einträge im CLEO OPCODE 0AB3 können variabel gestaltet werden
    0AB3: var 44 = 10// var 44 wird sofort mit einem integeren Wert gleichgesetzt, nämlich 10
    0AB3: var 44 = 1@// var 44 wird mit einer Localen Variable gleichgesetzt, und erhält deren Wert

    _______________________________________________________________________________________________________________________________________

    Script-Vorlage zum Starten eines Cleo-Missions-Script


    In diesem Starter-Script wird eine Bedingung abgefragt, die man erfüllen muss, um die Mission zu starten
    if
    00FE: actor $PLAYER_ACTOR 1 (in-sphere)near_point 2480.1343 -1665.475 13.3348 radius 3.5 3.5 5.5
    (man muss in die rote Markierung bei x= 2480.1 , y= -1665.4 , z= 13.3 , oder einfach die eigenen Koordinaten eingeben)
    [cpp]{$CLEO .cs}
    :Test_M_Start_1
    03A4: name_thread 'TSTM'

    :Test_M_Start_2
    0001: wait 0 ms
    00D6: if 0
    0256: player $PLAYER_CHAR defined
    004D: jump_if_false @Test_M_Start_2
    00D6: if 0
    0038: $ONMISSION == 0 // integer values
    004D: jump_if_false @Test_M_Start_2

    :Test_M_Start_6
    00D6: if 0
    00FE: actor $PLAYER_ACTOR 1 (in-sphere)near_point 2480.1343 -1665.475 13.3348 radius 3.5 3.5 5.5
    004D: jump_if_false @Test_M_Start_2
    00BA: text_styled 'STAD_02' 1000 ms 2
    0004: $ONMISSION = 1 // integer values
    0A94: start_custom_mission "TestMission" //
    0002: jump @Test_M_Start_2[/cpp]

    Das Missions-Starter-Script enthält den Cleo-Opcode: "0A94: start_custom_mission "TestMission"

    Der Name, der zu startenden Missionsdatei ohne Dateityp wird zwischen die Anführungszeichen eingetragen.
    Die Cleo-Missions-Datei erhält dann als Dateiformat die Endung, die in der Cleo-Direktive am Missions-Scriptanfang einzutragen ist
    {$CLEO .cm} = Cleo-Direktive, wird zu *.cm kompiliert
    Als TestMission.txt gespeichert und zu TestMission.cm kompiliert
    Name der Cleo-Missions-Datei und Eintrag im start_custom_mission -opcode müssen übereinstimmen

    [cpp]{$CLEO .cm}
    :TestMiss_1
    03A4: name_thread "TESTM"
    0050: gosub @TestMiss_main_1
    00D6: if 0
    0112: wasted_or_busted
    004D: jump_if_false @TestMiss_end_1
    0050: gosub @TestMiss_fail_1

    :TestMiss_end_1
    0050: gosub @TestMiss_clep_1
    004E: end_thread

    :TestMiss_main_1
    0317: increment_mission_attempts//here starts the missionscript
    0004: $ONMISSION = 1
    054C: use_GXT_table 'MENU2P'
    00BC: text_highpriority 'MENU_18' 5000 ms 1

    :TestMiss_11
    0001: wait 0 ms
    if and
    02D8: actor $PLAYER_ACTOR currentweapon == 0
    00E1: key_pressed 0 17
    004D: jump_if_false @TestMiss_11

    :TestMiss_pass_1
    00BA: text_styled 'M_PASS' 5000 ms 1
    0051: return

    :TestMiss_fail_1
    00BA: text_styled 'M_FAIL' 5000 ms 1
    0051: return

    :TestMiss_clep_1
    0004: $ONMISSION = 0
    00D8: mission_cleanup
    0051: return[/cpp]

    Wenn die Mission gestartet wurde, einfach bei aufgeschalteter nackter Faust, die [FEUERN]-Taste drücken, um die Mission zu beenden.
  • Guide #3 - Der Opcode

    Als Beispiel der set_camera-code:

    [cpp]03CB: set_camera 807.0 -937.0 36.5625[/cpp]
    03CB: ist der Opcode zur Ausführung der Funktion. 807.0 -937.0 36.5625 ist ein Wert, eine Information, die zum Opcode passen muss.

    set_camera ist die Interpretation des MissionBuilder-Programmierers bzw. der anderen Scriptmeister der GTA Community und ist in der kompilierten main.scm oder Cleo-Scriptdatei nicht mehr vorhanden
    Die Funktionen der Opcodes wurden erst nach und nach ausfindig gemacht, mit Beschreibungen versehen und auf der Data Base veröffentlicht.
    Mit der aktuellesten Cleoversion brachte Seemann neue Cleo-Opcodes ins Spiel dazu war auch die Aktualisierung der sascm.ini für den Sannybuilder erforderlich.
    Die SASCM.INI ist die Konfigurationsdatei für die Syntax des Sannybuilder-Kompilers in ihr findet man alle Opcodes mit Beschreibungen aufgelistet, jedoch nicht in einer fürs Script benutzbaren Schreibweise.
    Am einfachsten sucht man fürs Scripten benutzbare Codezeilen mit dem Opcode-Search-Tool zu finden im Sannybuilder-Hauptmenü unter Programme >> IDE Programme >> Opcode suchen

    [cpp]//---Code-Zeilen mit Interpretation

    04E4: unknown_refresh_game_renderer_at 2494.5 -1668.5
    03CB: set_camera 2494.5 -1668.5 13.4
    0173: set_actor $PLAYER_ACTOR z_angle_to 180.0
    0373: set_camera_directly_behind_player
    014B: 1@ = init_parked_car_generator #PCJ600 0 17 1 alarm 0 door_lock 0 0 10000 at 2490.0 -1682.0 13.5 angle 90.0
    014C: set_parked_car_generator 1@ cars_to_generate_to 101

    //----Code-Zeilen ohne Interpretation

    04E4: 2494.5 -1668.5
    03CB: 2494.5 -1668.5 13.4
    0173: $PLAYER_ACTOR 180.0
    0373:
    014B: 1@ #PCJ600 0 17 1 0 0 0 10000 2490.0 -1682.0 13.5 90.0
    014C: 1@ 101[/cpp]
  • Guide #4 - DATA TYPE MEANING/Die Zeichen und ihre Bedeutung

    @: Definiert den dazugehörigen Eintrag zu einer Lokalen Variable

    Die Dinge im Spiel brauchen eine Identität, unter dem sie im Spiel registriert werden, ein Name mit dem wir der Engine anweisen im Spiel auszuführen.
    Sie sind variable einsetzbar z.B. für die Definition eines parked cars:

    [cpp]014B: 1@ = init_parked_car_generator #PCJ600 0 17 1 alarm 0 door_lock 0 0 10000 at 2490.0 -1682.0 13.5 angle 90.0[/cpp]

    Im weiteren wird diese Lokale Variable für den folgenden Code benutzt.

    [cpp]014C: set_parked_car_generator 1@ cars_to_generate_to 101[/cpp]

    Zur Gestaltung der Lokale Variable sind außschließlich Zahlen zu verwenden:

    @0 bis @30 in Threads der main.scm und in externen Scripts.
    sowie in Cleo-CS Dateien mit Directiven {$CLEO .cs} oder {$CLEO .s}
    @0 bis @900 in Missionen sowie in Cleo-CM Dateien mit Directiven {$CLEO .cm}
    Die Lokale Variable @33 wird automatisch als Timer benutzt. Sie muss nicht definiert werden sondern ledeglich auf 0 gesetzt.
    Im Anschluss kann man dann Zeitspannen abfragen. Die Zeit wird als integerer Wert gemessen, 1 = 1/1000 Sekunde.

    [cpp]0006: @33 = 0 ;; integer values

    :Sequenz
    if
    001B: 2000 > @33 ;; integer values
    004D: jump_if_false @weiter[/cpp]


    _______________________________________________________________________________________________________________________________________

    $ : Definiert den dazugehörigen Eintrag zu einer Globalen Variable

    Von der Verwendung her das gleiche wie die Lokale Variable mit dem Unterschied, dass die Lokale Variable nicht scriptübergreifend abrufbar ist, sondern im einzelnen Script sozusagen eingeschlossen bleibt.
    Die Globale Variable hingegen ist in der gesamten Main abrufbar, egal wo sie definiert wurde. In Cleoscripten sollen aber keine Globalen Variablen benutzt werden, weil das zu Fehlern führen kann.

    Als Ersatz für die scriptübergreifende Funktion Globaler Variablen
    hat Seemann die spezielle globale "Cleo-Variable" erstellt
    siehe: Besonderheiten in Cleo

    _______________________________________________________________________________________________________________________________________

    # : Kennzeichnet den dazugehörigen Eintrag daß es sich um den Dateinamen eines Modells handelt.

    [cpp]0247: load_model #BMYCG
    0247: load_model #HMYCM
    0247: load_model #SWATVAN
    0247: load_model #M4
    0247: load_model #COLT45
    0247: load_model #BARREL4
    06E9: load_car_component #NTO_B_S
    [/cpp]

    _______________________________________________________________________________________________________________________________________

    : : Doppelpunkt am Zeilen-Anfang kennzeichnet Labels (Script-Adressen). Zum Beispiel:

    [cpp]:MAIN_1[/cpp]

    _______________________________________________________________________________________________________________________________________

    @ : wird auch für die Sprunganweisung zu Labels (Script-Adressen) benutzt. Beispielsweise so:

    [cpp]004D: jump_if_false @SAVE_5
    0050: gosub @SAVE_14
    0002: jump @SAVE_1[/cpp]

    _______________________________________________________________________________________________________________________________________


    '...' : Kurzer String zum Eintragen von Buchstaben und Zahlen wie GXT-Eintragsnamen oder Namen aus speziellen IPL-Einträgen und Ähnliches. Als Beispiel:

    [cpp]03A4: name_thread 'MAIN'
    0917: audio_zone 'BEACH' enable_sound 0
    00BA: show_text_styled GXT 'INTRO_1' time 1000 style 2
    0299: activate_garage 'MODLAST'
    07FB: set_interior 'GYM1' access 1 // Ganton Gym
    0390: load_txd_dictionary 'LD_BEAT'
    076C: set_zone 'GAN1' gang 1 density_to 25[/cpp]

    _______________________________________________________________________________________________________________________________________

    "...": Langer String zum Eintragen von Buchstaben und Zahlen wie Animations- und IFP-Datei-Namen, Bodypart-Namen, Partikel-Namen und ähnliches. Als Beispiel:

    [cpp]087B: set_player $PLAYER_CHAR clothes_texture "PLAYER_FACE" model "HEAD" body_part 1
    038F: load_texture "DOWN" as 1 // Load dictionary with 0390 first
    0605: actor -1 perform_animation_sequence "DAN_LOOP_A" IFP_file "DANCING" 4.0 loop 1 0 0 0 time -1 // versionA
    0674: set_car_model #GREENWOO numberplate "GROVE4L_"
    0245: set_actor 5@ walk_style_to "GANG2"
    064B: 25@ = create_particle "EXPLOSION_MOLOTOV" at 2010.0 -1610.0 16.5 type 1[/cpp]

    Zum Gleichsetzen oder Übergeben von Einträgen aus langen oder kurzen Strings, müssen extra dafür vorgesehene Opcodes sowie erweiterte Variable-Zeichen benutzt werden:
    05AA:
    05A9:
    06D2:
    06D1:

    Ansonsten können in allen anderen Opcodes, die Strings enthalten, auch erweiterte Variable (String-Variable) anstelle der Strings selbst, benutzt werden.

    _______________________________________________________________________________________________________________________________________

    @s - Local-String-Variable

    [cpp]05AA: 5@s = 'FEM_OK'
    00BC: show_text_highpriority GXT 5@s time 10000 flag 1[/cpp]

    _______________________________________________________________________________________________________________________________________

    s$ - Global-String-Variable

    [cpp]05A9: s$Actor_Speech_GXT_Reference = 'CATX_UA' // ~z~Carl, you are a fucking idiota!
    00BC: show_text_highpriority GXT s$Actor_Speech_GXT_Reference time 10000 flag 1

    Wird in Missionen der original Main.scm dazu benutzt GXT-Eintragsnamen variable an den AudioL-Thread zu übergeben
    Der AudioL-Thread erledigt das Ausführen von Dialogen und das Anzeigen des dazugehörigen Texts
    Dort wird mit 05AA: erst eine local-string-variable mit der global-string-variable gleichgesetzt

    05AA: 5@s = s$Actor_Speech_GXT_Reference
    00BC: show_text_highpriority GXT 5@s time 10000 flag 1[/cpp]

    _______________________________________________________________________________________________________________________________________

    @v - Local-Long-String-Variable

    [cpp]06D2: 28@v = "LAPDAN1" // @v = string
    0812: AS_actor $PLAYER_ACTOR perform_animation "LAPDAN_P" IFP_file 28@v 1000.0 loopA 0 lockX 0 lockY 0 lockF 1 time -1
    [/cpp]

    _______________________________________________________________________________________________________________________________________

    v$ - Global-Long String-Variable

    [cpp]06D1: v$1225 = "Bat_block"// 16-byte strings
    0605: actor $PLAYER_ACTOR perform_animation_sequence v$1225 from_file "BASEBALL" 4.0 1 0 0 0 -1 ms[/cpp]

    _______________________________________________________________________________________________________________________________________

    Keywords
    Beim Dekompilieren ohne Opcodes wird das Script schlanker dargestellt; Sannybuilder erlaubt das Verwenden von Keywords anstatt der klassischen Schreibweise mit Opcodes
    Anstelle von
    [cpp]004D: jump_if_false @MAIN_6[/cpp]
    reicht auch
    [cpp]jf @MAIN_6
    oder
    else_jump @MAIN_6
    Man darf auch beide Schreibweisen mischen 004D: jf @MAIN_6[/cpp]