GTA SAN ANDREAS
MODS for


Der Opcode
- Als Beispiel der set_camera-code
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
- 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:
- im weiteren wird diese Lokale Variable für den folgenden code benutzt, mit dem man den car_generator ein/aus schalten kann
- Zur Gestaltung der Lokale Variable sind außschließlisch Zahlen zu verwenden, welchen ein @ davorgestellt wird
- 0@, 1@, ... 30@, bis einschließlich @31 sind in normalen Threads der main.scm und Extern_Scripte zulässig
- 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}
- Local Variable haben einen lokalen Geltungsbereich, sie existieren nur für das jeweilige script und nicht für andere scripte
- 32@ and 33@ sind für Timer reserviert und können für nichts anderes verwendet werden (sonst riskiert man einen Absturtz)
- 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
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
0006: @33 = 0 ;; integer values
:Sequenz
if
001B: 2000 > @33 ;; integer values
else_jump @weiter
$ : Definiert den dazugehörigen Eintrag zu einer Globalen Variable
- Von der Verwendung her das gleiche wie die Lokale Variable mit dem Unterschied,
- daß 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
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)
- z.B.
:MAIN_1
@ : wird auch für die Sprunganweisung zu Labels (Script-Adressen) benutzt.
- Z.B.
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
- 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.
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
@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
Keywords
- Beim Dekompilieren OHNE Opcodes wird das Script schlanker dargestellt; siehe Bschreibung der Sannybuilder-Funktionen
- Sannybuilder erlaubt das Verwenden von Keywords anstatt der klassischen Schreibweise mit opcodes
- 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
Classes
- Beim Dekompilieren OHNE Opcodes wird das Script schlanker dargestellt; siehe Bschreibung der Sannybuilder-Funktionen
- Sannybuilder erlaubt das Verwenden von Classes anstatt der klassischen Schreibweise mit opcodes
- Das gilt aber nur für eine Reihe bestimmter Opcodes; lest dazu in der Sannybuilder-Hilfe unter Coding >> Classes
- 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