Der Opcode

  1. Als Beispiel der set_camera-code
  2. 03CB: set_camera 807.0 -937.0 36.5625

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 oder von
    anderen Programmierer-Asse der GTA-Fan 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-Hauptmenue unter Programme >> IDE Programme >> opcode suchen
    //---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

DATA TYPE MEANING/Die Zeichen und ihre Bedeutung

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

  1. 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
  2. Sie sind variable einsetzbar
  3. Z.B. für die Definition eines parked cars:
  4. 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
  5. im weiteren wird diese Lokale Variable für den folgenden code benutzt, mit dem man den car_generator ein/aus schalten kann
  6. 014C: set_parked_car_generator 1@ cars_to_generate_to 101
  7. Zur Gestaltung der Lokale Variable sind außschließlisch Zahlen zu verwenden, welchen ein @ davorgestellt wird
  8. 0@, 1@, ... 30@, bis einschließlich @31 sind in normalen Threads der main.scm und Extern_Scripte zulässig
  9. sowie in Cleo-.CS Dateien mit Directiven {$CLEO .cs} oder {$CLEO .s}
  10.  
  11. @0 bis @900 in Missionen sowie in Cleo-.CM Dateien mit Directiven {$CLEO .cm}
  12.  
  13. Local Variable haben einen lokalen Geltungsbereich, sie existieren nur für das jeweilige script und nicht für andere scripte
  14.  
  15. 32@ and 33@ sind für Timer reserviert und können für nichts anderes verwendet werden (sonst riskiert man einen Absturtz)
  16. 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
  17. 0006: @33 =  0  ;; integer values
    
    :Sequenz
    if
    001B:    2000 > @33  ;; integer values 
    else_jump @weiter

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

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

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

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

    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

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

  1. z.B.
  2. :MAIN_1

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

  1. Z.B.
  2. 004D: jump_if_false @SAVE_5
    0050: gosub @SAVE_14
    0002: jump @SAVE_1

'...' - kurzer string
zum Eintragen von Buchstaben und Zahlen wie GXT-Eintragsnamen oder Namen aus speziellen IPL-Einträgen und ähnliches

    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

"..." - langer string
zum Eintragen von Buchstaben und Zahlen wie Animations- und IFP-Datei-Namen, Bodypart-Namen, Partikel-Namen und ähnliches

    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

  1. Zum Gleichsetzen oder Übergeben von Einträgen aus langen oder kurzen Strings,
  2. müssen extra dafür vorgesehene Opcodes sowie erweiterte Variable-Zeichen benutzt werden
  3. 05AA:
  4. 05A9:
  5. 06D2:
  6. 06D1:
  7. Ansonsten können in allen anderen Opcodes, die Strings enthalten, auch erweiterte Variable (String-Variable)
  8. anstelle der Strings selbst, benutzt werden.

@s - local-string-variable

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

s$ - global-string-variable

    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

@v - local-long-string-variable

    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

v$ - global-long string-variable

    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

  1. Keywords

  2. Beim Dekompilieren OHNE Opcodes wird das Script schlanker dargestellt; siehe Bschreibung der Sannybuilder-Funktionen
  3. Sannybuilder erlaubt das Verwenden von Keywords anstatt der klassischen Schreibweise mit opcodes
  4. Anstelle von
    004D: jump_if_false @MAIN_6
    reicht auch
    jf @MAIN_6
    oder
    else_jump @MAIN_6
    Man darf auch beide Schreibweisen mischen 004D: jf @MAIN_6

Opcode = Keyword
_____________
0001: = wait
00d6: = if
004d: = else_jump
004d: = jf
0002: = jump
0051: = return
0050: = gosub
016a: = fade
01B6: = set_weather
03a4: = thread
04BB: = select_interior
0417: = start_mission
00d8: = mission_cleanup
0317: = increment_mission_attempts

  1. Classes

  2. Beim Dekompilieren OHNE Opcodes wird das Script schlanker dargestellt; siehe Bschreibung der Sannybuilder-Funktionen
  3. Sannybuilder erlaubt das Verwenden von Classes anstatt der klassischen Schreibweise mit opcodes
  4. Das gilt aber nur für eine Reihe bestimmter Opcodes; lest dazu in der Sannybuilder-Hilfe unter Coding >> Classes
  5. Anstelle von
    00AB: put_car 22@ at -1577.942 52.6333 40.0
    wird
    Car.PutAt(22@, -1577.942, 52.6333, 40.0)
    Die Bedeutung des Codes wird über Class-Einträge definiert,
    Car = class-Name
    PutAt = class-Mitglied
    Name und Mitglied werden zusammengefasst und mit einem Punkt voneinander getrennt
    22@ = class-Besitzer
    class-Besitzer und die Parameter werden in Klammern gesetzt und mit Komma getrennt
    (Parameter = für den opcode erforderliche Informationen)

// 2 Schrägstriche(slash) und alles was dahinter steht wird beim Kompilieren ignoriert

////--------- kann somit für Kommentare benutzt werden