GTA SAN ANDREAS
MODS for
GTA-San Andreas-Mission-scripting
mit Bart Waterducks Mission Builder/Teil1
Übersicht
- für Anfänger: Vorbereitung und Umgang mit dem SABuilder033
- Erste Lektion: Parked cars (Autos platzieren) und Waffen-Pickups
- Koordinaten auslesen
- speichern und kompilieren
- create_thread/Einfügen eines Mod-Scripts am Beispiel eines neuen Speicherpunktes
- Einteilung und Aufbau der Main
- Stripped main
- Der Opcode
- DATA TYPE MEANING/Die Zeichen und ihre Bedeutung
- Arbeiten mit der Stripped Main erleichtert das Scripten
- Script schreiben
- Modelle einsetzen
- Lokals and Globals
- Math-Coding
- Tastenbelegung
- gosub
- Animationen
- Sounds
- Text aus der german.gxt
- Missionen
- EXTERNAL_SCRIPT
- Zusammenfassung
- Garagen
- Das Interaktive Menue
- Define Memory Beispiel-Scripte
- CJ spricht
- die Koordinatenanzeige
- Die frei bewegliche Kamera
- Cardrive-Script
- Das Wetter-Script
- Stripped Main with Externscripts and Submissions
- Wenn im Mozilla Firefox die Seite nicht richtig dargestellt wird, dann schließt alle anderen Tabs oder startet ihn neu
Vorbereitung und Umgang mit dem SABuilder033
- 1. Entferne den Schreibschutz vom Grand Theft Auto San Andreas-Installationsverzeichnis und allen darin befindlichen Unterordner und Dateien.
- 2.Saug Dir den Missionbuilder SABuilder033 und entpacke den Download-file irgendwo auf Deine Festplatte
- SABuilder033
- 3.Leg im Programmordner namens SA Builder einen neuen Ordner an und benenne diesen: Original SCM
- 4.Kopiere in den Ordner Original SCM folgende
Originaldateien des Spiels:
MAIN.SCM
SCRIPT.IMG - und in den Ordner SA Builder folgende Originaldateien
default.ide
vehicles.ide
peds.ide - 5.Saug Dir diese Datei:
SASCM.INI
und ersetze damit die gleichnamige Datei, die sich im Ordner SA Builder befindet.
Die SASCM.INI ist die Konfigurationsdatei für die Syntax des Kompilers
Für den SA MissionBuilder 0.33 gibts hin und wieder eine neue SASCM.INI
Mehr dazu weiter unten.
(Die SASCM.INI vom gta-action-download ist nicht aktuell und nicht kompatibel zu meinen Scripten, die ich im Forum poste.)
Inzwischen gibt es noch aktuellere.
Aber ich beziehe mich prinzipiell auf die SASCM.INI vom 1.September2005 - 6.Aktiviere den Missionbuilder (Doppeklick auf SABuilder033.exe)
- 7.Klicke auf den Menueschalter Compiler und mach den Haken weg bei Disable Custom ID when Decompiling
- 8.Öffne im Missionbuilder die MAIN.SCM, die sich jetzt
im Ordner Original SCM befinden sollte. Wähle dazu bei File type : SCM-Datei aus. Du wirst dabei gefragt wo der Quell-Text gespeichert werden soll. Wähle dafür wieder
den Ordner Original SCM.
Jetzt wird die Original Main dekompiliert. Das dauert n bißchen !
So, jetzt hast Du das Main-Script vor Dir. Erschreck nicht. Das sind 535 336 Zeilen Textcode. Am Anfang wird man von der Unmenge von neuen Begriffen erschlagen. Das braucht seine Zeit bis man Licht ins Dunkle bekommt. - 9.Bevor Du irgend etwas machst, Benutze die Suchfunktion und suche nach:
create_emulated_actor_from_player
- Da muss jetzt folgendes stehen:
- und NICHT
- 01F5: $3 = create_emulated_actor_from_player $2
01F5: $PLAYER_ACTOR = create_emulated_actor_from_player $PLAYER_CHAR
- sonst lies Punkt 7. nochmal
Wenns stimmt, speichere es unverzüglich ab als OriginalSAmain.txt. Am besten wieder in den Ordner OriginalSCM.
- Um mission scripting zu lernen, sollte man als erstes versuchen das Script zu verstehen.
D.h. - - die Readme.txt, die beim Missionbuilder dabei ist, gründlich lesen.
- - parked cars und pickups für Waffen und andere Objekte ins Spiel setzen und im Spiel testen.
- - ein Scriptmod in Form eines "THREAD" einbauen und im Spiel testen.
- - ein kleines script (ein THREAD) schreiben und im Spiel testen. z.B. ein Auto mit Fahrer ins Spiel zaubern und an einen bestimmten Punkt fahren lassen.
- 10. Erste Übung:
- parked cars einfügen
- 11. erfordert:
- Koordinaten auslesen
- 12. Abschluss:
- speichern und kompilieren
parked cars und Waffen-pickups
- Zuerst stellt sich die Frage: Wo kommt was hin?
- parked cars bevorzuge Ich in der Mission 0 zu setzen.
- Die Mission 0 und die Mission 1 werden im Original nicht für Handlungen benutzt, sondern um haufenweise Settings zu setzen sowie parked cars, pickups, Objekte usw.
- Benutze die Suchfunktion und suche nach:
- Schaffe eine Lücke unter diesen Zeilen und füge folgenden code ein:
- speichere, kompiliere und teste im Spiel
- Beschreibung des parked car-codes
;;-------------Mission 0---------------
; Originally: Initial 1
:INITIAL_1
03A4: name_thread 'INITIAL'
014B: $MR1 = 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 $MR1 cars_to_generate_to 101
032B: $WP1 = create_weapon_pickup #AK47 15 ammo 3000 at 2490.0 -1662.0 13.5
032B: $WP2 = create_weapon_pickup #JETPACK 15 ammo 0 at 2492.0 -1662.0 13.5
0213: $OP1 = create_pickup #BODYARMOUR type 15 at 2494.0 -1662.0 13.5
0213: $OP2 = create_pickup #GUN_PARA type 15 at 2496.0 -1662.0 13.5
0213: $OP3 = create_pickup #BRIBE type 15 at 2498.0 -1662.0 13.5
parked cars erfordern 2 code-zeilen
1. der code zur Definition des vehikels
014B: $MR1 = 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
2. der code für das Einschalten der parked car-Funktion
014C: set_parked_car_generator $MR1 cars_to_generate_to 101
generate_to 101 bedeuted, daß das car immerwieder erscheint
generate_to 0 bedeuted, daß die Funktion deaktiviert ist
der code zur Definition des vehikels im Detail
014B: ist der opcode zur Ausführung der Funktion
$MR1 ist der Variabel-Namen unter dem im Spiel das "parked-car" registriert wird
#PCJ600 ist der Dateiname des Modells, zur Angabe eines Dateinamens wird ein # (Raute/hash) davorgestellt
Anstatt des Dateinamens kann auch nur die ID-Nummer eingetragen werden, ohne Verwendung von # (Raute/hash)
Das würde so aussehen:
;mit ID-Nummer:
014B: $MR1 = init_parked_car_generator 461 0 17 1 alarm 0 door_lock 0 0 10000 at 2490.0 -1682.0 13.5 angle 90.0
;mit Dateiname:
014B: $MR1 = 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
Dateiname oder ID-Nummer
muß auf jedenfall in der VEHICLES.IDE vorkommen
in den Parametern hinterm Dateiname #PCJ600 0 17 1 kann die Farbe bestimmt werden
der erste Parameter, in diesem Fall die 0 ist die Primär-farbe, 0=schwarz
der zweite Parameter, in diesem Fall die 17 ist die Sekundär-farbe, 17=dunkelrot
wird in dem Farbparameter -1 eingetragen, dann wird die Farbe nach Zufall gewählt
im Parametern alarm 0 kann ein Wert zwischen 0 und 100 eingetragen werden
das entspricht einer Prozentangabe und bestimmt die Wahrscheinlichkeit ob bei dem auto der arlarm angeht
im Parametern door_lock 0 kann ein Wert zwischen 0 und 100 eingetragen werden
das entspricht einer Prozentangabe und bestimmt die Wahrscheinlichkeit ob das auto abgeschlossen ist
in den letzten Parametern at 2490.0 -1682.0 13.5 angle 90.0 werden die Koordinaten und die Winkelausrichtung eingetragen
zur Bestimmung des Ortes für die Platzierung
Hier dürfen nur kommagetrennte Werte (floating points value)eingetragen werden
wobei anstatt eines Kommas, ein Punkt . zu setzen ist.
at 2490.0 -1682.0 13.5
entspricht
at X-koordinate Y-koordinate Z-koordinate
angle 90.0 , für die Winkelausrichtung im Kreisbogen kann ein Wert zwischen 0.0 und 360.0 Grad eingetragen werden
- Beschreibung der pickup-codes
es gibt dafür 2 verschiedene codes
032B: für Waffen mit Munition und für den Jetpack
0213: für Schlagwaffen und Objekte wie der Fallschirm (GUN_PARA) oder die Schutzweste (BODYARMOUR)
032B: $WP1 = create_weapon_pickup #AK47 15 ammo 3000 at 2490.0 -1662.0 13.5
0213: $OP1 = create_pickup #BODYARMOUR type 15 at 2494.0 -1662.0 13.5
032B: oder 0213: ist der opcode zur Ausführung der Funktion
$WP1 bzw. $OP1 ist der Variabel-Namen unter dem im Spiel das Pick-Up registriert wird
#AK47 ist der Dateiname des Modells, zur Angabe eines Dateinamens wird ein # (Raute/hash) davorgestellt
Anstatt des Dateinamens kann auch nur die ID-Nummer eingetragen werden, ohne Verwendung von # (Raute/hash)
Das würde so aussehen:
;mit ID-Nummer:
032B: $WP1 = create_weapon_pickup 355 15 ammo 3000 at 2490.0 -1662.0 13.5
;mit Dateiname:
032B: $WP1 = create_weapon_pickup #AK47 15 ammo 3000 at 2490.0 -1662.0 13.5
Dateiname oder ID-Nummer von Waffen
muß auf jedenfall in der DEFAULT.IDE vorkommenbei Einsetzen eines Objektnamens, also auch für Objekt-Pickups muss zusätzlich dieser Name in der
Objektliste (main.scm/Segment 2 / a table of 3D objects) aufgeführt seinbei Einsetzen der ID-Nummer von Objekten, also auch für Objekt-Pickups muss diese Nummer in einer der IDE-Dateien vorhanden sein
der Parameter hinterm Dateiname #AK47 15 gibt den Pickup-Typ an
Typ 15 ist ein Pickup, der immerwieder erscheint
Typ 3 ist ein Pickup, der nur einmal erscheintbeim Waffen-Pickup kann im Parameter ammo 3000 die Munitionsmenge angegeben werden,
die die Pickup-Waffe haben soll.
Maximum ist 99999
in den letzten Parametern at 2490.0 -1662.0 13.5 werden die Koordinaten eingetragen
zur Bestimmung des Ortes für die Platzierung
Hier dürfen nur kommagetrennte Werte (floating points value)eingetragen werden
wobei anstatt eines Kommas, ein Punkt . zu setzen ist.
at 2490.0 -1662.0 13.5
entspricht
at X-koordinate Y-koordinate Z-koordinate
Koordinaten auslesen
- 11.Saug Dir den San Andreas Place Manager
- und benutze ihn parallel zum Spiel, um die Koordinaten auszulesen, damit Du die Sache an den gewünschten Ort rücken kannst.
- Wenn Du im Hauptmenue von San Andreas bist,kannst Du ohne das Spiel zu beenden zu Windows bzw. zum Missionbuilder und dem Place Manager zurückkehren
indem Du die Tabtaste und linke ALT-Taste gleichzeitig drückst, oder die Windows-Taste,
und über die Taskleiste kommst Du wieder ins Spiel. Dann pass aber auf, daß Du das Spiel nicht ein zweites mal einschaltest. - Klick im Place Manager auf "add place", kopiere die Koordinaten und übertrage sie ins script
- Für einen Ort im Spiel zu definieren sind 3 Koordinaten-Einträge nötig
- X-Coordinaten, Y-Coordinaten, Z-Coordinaten
-
Hier dürfen nur kommagetrennte Werte (floating points value)eingetragen werden
wobei anstatt eines Kommas, ein Punkt . zu setzen ist. - Übernehme NICHT das Komma aus dem Place
Manager sondern mache einen Punkt daraus
Es sollte sich wenigstens eine Stelle hinter dem Punkt befinden.
speichern und kompilieren
- 12.Speichere das jetzt als *.txt ab und vergib dabei einen neuen Namen
- 13.Kompiliere das Script zur main.scm.
Wähle dazu im Menuepunkt "RUN" Compile & Copie oder klick auf einen der Schalter darunter.
Wenn die Fehlermeldung kommt, daß das Programm das Spiel nicht findet,
dann wähle die simple Funktion Compile und kopiere manuell die frisch gebackenen
Dateien:MAIN.SCM und SCRIPT.IMG nach Grand Theft Auto San Andreas\data\script.
Du findest sie im Ordner Original SCM - Wenn Du die Dateien nicht findest, dann achte auf die
Meldung die bei erfolgreichem Kompilieren ausgegeben wird - Da wird der Pfad angegeben, wohin die MAIN.SCM und SCRIPT.IMG kompiliert wurde
- Wenn die Fehlermeldung kommt, daß Define Memory nicht reicht, dann erhöhe ihn.
Und zwar steht ganz am
Anfang des Scripts: - Mach z.B. DEFINE MEMORY 44800 daraus. Speichere dann und kompiliere nochmal.
- Das wars. Probiers jetzt aus im Spiel.
DEFINE MEMORY 43800
Die Main.scm kannst Du während dem aktiviertem Spiel ins Spiel kopieren.
Die Script.img nicht.
Die Script.img brauchst Du aber nur einmal ins Spiel kopieren zum Scriptetesten.
Die Main.scm und die Script.img müssen vom ein und dem selben Kompiliervorgang entstanden sein, wenn das Spiel dauerhaft stabil laufen soll.
Sonst gibts Abstürze beim Basketball und Tanzen
-
Vermeide es, wenns geht Scripttext zu kompilieren, wieder zu dekompilieren, am dekompilierten weiterzuarbeiten, kompililieren und dekompilieren usw.
Sondern bleib bei Deinem Ur-main-txt um dran weiter zu scripten und kompiliers nur zum testen und spielen.
Es sei denn, um die MissionBuilder-Konfigurationsdatei zu aktuallsieren
Für den SA MissionBuilder 0.33 gibts hin und wieder eine neue SASCM.INI
Hier zu finden
Alte angesammelte sa-main-script.txt s funktionieren dann nicht mehr.
Deshalb erst den script-text kompilieren und dann mit der neuen SASCM.INI dekompilieren, als Text speichern fertig.
Warum das ganze ?
Durch die neue ini werden viele bisher unbekannte codes entschlüsselt und verständlich dargestellt.
Außerdem wurde einiges geändert, vielleicht auch korregiert.
- (Die SASCM.INI vom gta-action-download ist nicht aktuell und nicht kompatibel zu meinen Scripten, die ich im Forum poste. Inzwischen gibt es noch aktuellere. Aber ich beziehe mich prinzipiell auf die SASCM.INI vom 1.September2005)
create_thread/einfügen eines Mod-scripts
- Der Thread ist das Basis-Script in der Main.scm
- Er wird in "create_thread", in Missionen oder Externscripten definiert
und bekommt einen Namen
- Als Beispiel wird das Hinzufügen eines Speicherpunkts beschrieben
- Das Save-script besteht aus
- 1. der create_thread-Zeile
- und
- 2. aus dem eigentlichen thread-script
- Die create_thread-Zeile zur Initialisierung des Scripts kann überall in der main.scm gesetzt werden
- Sinnvollerweise setzen wir sie in den Main-thread, da wo sich in der original Main auch die meisten anderen create_thread-Zeilen befinden, damit die Funktion schon gleich am Anfang aktiv wird
- suche nach dem obersten create_thread -Eintrag in der original Main und füge den fürs save-script dort ein:
- Das thread-script kommt in den Main Part
- suche nach:
- Schaffe eine Lücke über diesen Zeile und füge das save-script dort ein ein:
004F: create_thread ££SAVE_1
004F: create_thread ££SAVE_1
004F: create_thread ££ODDVEH_1
;;-------------Mission 0---------------
; Originally: Initial 1
:INITIAL_1
03A4: name_thread 'INITIAL'
:SAVE_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'SAVE'
0570: $sv02 = create_asset_radar_marker_with_icon 35 at 384.44 2544.108 16.66
018B: show_on_radar $sv02 2
:SAVE_2
0001: wait 0 ms
0213: $sv01 = create_pickup #PICKUPSAVE type 3 at 417.44 2538.108 10.1
:SAVE_5
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££SAVE_5
00D6: if 0
0214: pickup $sv01 picked_up
004D: jump_if_false ££SAVE_5
0050: gosub ££SAVE_14
0002: jump ££SAVE_2
:SAVE_14
00D6: if 0
0038: $ON_MISSION == 0 ;; integer values
004D: jump_if_false ££SAVE_17
0004: $ON_MISSION = 1 ;; integer values
01B4: set_player $PLAYER_CHAR frozen_state 0 (frozen)
0001: wait 350 ms
03D8: show_SAVE_screen
:SAVE_15
00D6: if 0
83D9: NOT save_done
004D: jump_if_false ££SAVE_16
0001: wait 0 ms
0002: jump ££SAVE_15
:SAVE_16
00A1: put_actor $PLAYER_ACTOR at 420.44 2538.108 10.0
01B4: set_player $PLAYER_CHAR frozen_state 1 (unfrozen)
0004: $ON_MISSION = 1 ;; integer values
0001: wait 350 ms
0004: $ON_MISSION = 0 ;; integer values
:SAVE_17
0051: return
;;-------------Mission 0---------------
- dieser Speicherpunkt ist im Haus auf dem Flugzeugfriedhof platziert
- ändere die
- Koordinaten-Einträge
- um ihn an deinem gewünschten Ort zu platzieren
- Du musst 3 Orte bestimmen, wenn der Savepoint in einem Innenraum sein soll.
- Du musst 2 Orte bestimmen, wenn der Savepoint auf dem Außengelände sein soll.
- A: für die Speichercassette
- B: für das Symbol auf der Karte
- Wenn Du es auf dem Außengelände machst, kannst Du für A un B die selben Coordinaten nehmen.
- C: Eine Stelle, etwas neben der Speicherkassette, wo CJ nach dem Speichern wieder ankommt.
- Ein Koordinatensatz besteht aus X-Coordinaten, Y-Coordinaten, Z-Coordinaten
- 00A1: put_actor $PLAYER_ACTOR at X Y Z
- 00A1: put_actor $PLAYER_ACTOR at 420.44 2538.108 10.0
- Speichere das jetzt als *.txt ab und vergib dabei einen neuen Namen
- Kompiliere das Script zur main.scm. und kopiers ins Spiel
- teste ob alles stimmt
- fertig, das wars
0213: $sv01 = create_pickup #PICKUPSAVE type 3 at 417.44 2538.108 10.1
0570: $sv02 = create_asset_radar_marker_with_icon 35 at 384.44 2544.108 16.66
00A1: put_actor $PLAYER_ACTOR at 420.44 2538.108 10.0
Einteilung und Aufbau der Main
- Das erste was im script zu stehen hat ist die MB version
- und dann gehts los:
- Nach Bart Waterduck ist die Main in 7 Segmente aufgeteilt
- Segment 1:
- ist der DEFINE MEMORY/Angabe der Speicherreservierung
- Segment 2:
- -eine Austellung der 3d objekte um sie mit ihrem Dateinamen in der main benutzen zu können
- -z.B. die Kräne oder andere Dinge, die in den IDE-Dateien definiert sind
- - maximal 394; in der original main sind es 389
- - die Gesamtzahl ist in der ersten Zeile anzugeben(DEFINE OBJECTS 389)
- Segment 3:
- -eine Aufstellung der Missionen.
- -die Gesamtzahl ist in der ersten Zeile anzugeben(DEFINE MISSIONS 135)
- Segment 4
- -eine Aufstellung der EXTERNAL_SCRIPTS
- - die Gesamtzahl ist in der ersten Zeile anzugeben(EXTERNAL_SCRIPTS 79)
- Segment 5 ist bisweilen unbekannt
- Segment 6 ist bisweilen unbekannt
- Segment 7,das eigentliche Script ist in 3 Abschnitte aufgeteilt
- dem Main-Part, der mit dem Main-thread beginnt
- in der decompilierten Main an dieser Stelle zu finden:
- Der Main Part endet dann da wo der Mission Part beginnt,
- hier:
- Nach den Missionen kommen die Extern Scripte
- hier:
- Der Kompiliervorgang erzeugt dann 2 Dateien,
- die Main.scm und die Extern_Scripte zur Script.img
- Wenn man die main aufs notwendigste reduziert, bleibt im Grunde nur noch der Main-Thread übrig
- Der Kern der main, wo der Vorhang aufgeht und die Spielfigur erscheint.
- Man spricht dann von einer
- Bei einer solchen Kurzfassung ohne Extern_Scripte erzeugt der Kompiliervorgang nur die main.scm
- hier die kompilierte Stripped main.scm
- Das Spiel ist spielbar.
- Missionen existieren nicht.
- Andere Features auch nicht. Kein Leben in den Läden, keine Girlfriends, keine Kräne, keine Waffen, und auch keine anderen Pickups, keine Minigames, keine Casinospiele, kein Billardspiel, kein Discotanzen,
- Kein Tuning, kein Basketball, keine Tore vor den Eingängen der Area 51, Getränkeautomaten funktionieren nicht, Keine Speichermöglichkeit, keine Symbole auf dem Radar.
- Alle Interioreingänge sind aktiv
DEFINE VERSION SA 0.33
DEFINE MEMORY 43800 ; Equals Mission Builder type global variable range $2 to $10949
:Second_Segment
DEFINE OBJECTS 389
DEFINE OBJECT (no name) ; This is an unused object. You can put anything here.
DEFINE OBJECT INFO ; Object number -1
DEFINE OBJECT KEYCARD ; Object number -2
DEFINE OBJECT AD_FLATDOOR ; Object number -3
;;usw.
:Third_Segment
DEFINE MISSIONS 135
DEFINE MISSION 0 AT ££INITIAL_1 ; originally: Initial 1
DEFINE MISSION 1 AT ££INITIL2_1 ; originally: Initial 2
DEFINE MISSION 2 AT ££INTRO_1 ; originally:
-usw.
:Fourth_Segment
DEFINE EXTERNAL_SCRIPTS 79
DEFINE EXTERNAL_SCRIPT_NAME PLAYER_PARACHUTE ; 0 player using parachute
DEFINE EXTERNAL_SCRIPT_NAME PARACHUTE ; 1 npc actors with parachutes
DEFINE EXTERNAL_SCRIPT_NAME BCESAR2 ; 2
DEFINE EXTERNAL_SCRIPT_NAME BCESAR3 ; 3
DEFINE EXTERNAL_SCRIPT_NAME SLOT_MACHINE ; 4
DEFINE EXTERNAL_SCRIPT_NAME ROULETTE ; 5
;;usw.
:Fifth_Segment
0002: jump ££Sixth_Segment
DEFINE UNKNOWN_FIFTH_SEGMENT
DEFINE UNKNOWN1 0
:Sixth_Segment
0002: jump ££MAIN_1
DEFINE UNKNOWN_SIXTH_SEGMENT
DEFINE UNKNOWN3 574
;-------------MAIN---------------
:MAIN_1
03A4: name_thread 'MAIN'
;-------------Mission 0---------------
;-------------------------------------------
DEFINE EXTERNAL_SCRIPT_START
Stripped main
DEFINE VERSION SA 0.33;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
0002: jump ££Second_Segment
DEFINE MEMORY 32 ; Equals Mission Builder type global variable range $2 to $3
:Second_Segment
0002: jump ££Third_Segment
DEFINE OBJECTS 1
DEFINE OBJECT (no name) ; This is an unused object. You can put anything here.
:Third_Segment
0002: jump ££Fourth_Segment
DEFINE MISSIONS 0
:Fourth_Segment
0002: jump ££Fifth_Segment
DEFINE EXTERNAL_SCRIPTS 0
:Fifth_Segment
0002: jump ££Sixth_Segment
DEFINE UNKNOWN_FIFTH_SEGMENT
DEFINE UNKNOWN1 0
:Sixth_Segment
0002: jump ££MAIN_1
DEFINE UNKNOWN_SIXTH_SEGMENT
DEFINE UNKNOWN3 0
;-------------MAIN---------------
:MAIN_1
03A4: name_thread 'MAIN'
016A: fade 0 () 0 ms
042C: set_total_missions_to 0
030D: set_total_mission_points_to 0
01F0: set_max_wanted_level_to 6
0111: set_wasted_busted_check_to 0 (disabled)
00C0: set_current_time 10 0
04E4: unknown_refresh_game_renderer_at 2494.5 -1668.5
03CB: set_camera 2494.5 -1668.5 13.4
0053: $PLAYER_CHAR = create_player #NULL at 2494.5 -1668.5 13.4
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
01F5: $PLAYER_ACTOR = create_emulated_actor_from_player $PLAYER_CHAR
0173: set_actor $PLAYER_ACTOR z_angle_to 180.0
0373: set_camera_directly_behind_player
070D: $PLAYER_CHAR
0629: change_stat 181 (islands unlocked) to 4 ; integer see statdisp.dat
01B6: set_weather 1
04BB: select_interior 0 ;; select render area
01B4: set_player $PLAYER_CHAR frozen_state 1 (unfrozen)
01B7: release_weather
016C: restart_if_wasted at 2494.5 -1668.5 13.4 angle 180.0 unknown 0
016D: restart_if_busted at 2494.5 -1668.5 13.4 angle 180.0 unknown 0
016A: fade 1 () 1000 ms
0001: wait 100 ms
03E6: remove_text_box
:MAIN_3
0001: wait 2500 ms
0002: jump ££MAIN_3
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 nicht mehr vorhanden
Die Funktionen der opcodes wurden erst nach und nach ausfindig gemacht,
mit Beschreibungen versehen und auf der
Data Base veröffentlicht.
Einige Leute wie Craig Kostelecky, spaceeinstein, Plynton
haben damit die sascm.ini, die MissionBuilder-Konfigurationsdatei aktualisiert
Leider kam es in aktualisierten sascm.ini s zu Parametervertauschungen, so daß
vorhanden Scripttexte mit aktualisierter sascm.ini nicht funktionierten.
Deshalb bleib ich beim Scripten bei der sascm.ini vom 1.9.2005
Das gilt auch für die Beispielscripte hier
Die aktuellen sascm.ini öffne ich dann mit dem Textediter
um opcodes für gewünschte funktionen zu finden
;---Code-Zeilen mit Interpretation
04E4: unknown_refresh_game_renderer_at 2494.5 -1668.5
03CB: set_camera 2494.5 -1668.5 13.4
0053: $PLAYER_CHAR = create_player #NULL at 2494.5 -1668.5 13.4
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
01F5: $PLAYER_ACTOR = create_emulated_actor_from_player $PLAYER_CHAR
0173: set_actor $PLAYER_ACTOR z_angle_to 180.0
0373: set_camera_directly_behind_player
014B: $MR1 = 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 $MR1 cars_to_generate_to 101
032B: $WP1 = create_weapon_pickup #AK47 15 ammo 3000 at 2490.0 -1662.0 13.5
032B: $WP2 = create_weapon_pickup #JETPACK 15 ammo 0 at 2492.0 -1662.0 13.5
0213: $OP1 = create_pickup #BODYARMOUR type 15 at 2494.0 -1662.0 13.5
0213: $OP2 = create_pickup #GUN_PARA type 15 at 2496.0 -1662.0 13.5
0213: $OP3 = create_pickup #BRIBE type 15 at 2498.0 -1662.0 13.5
;----Code-Zeilen ohne Interpretation
04E4: 2494.5 -1668.5
03CB: 2494.5 -1668.5 13.4
0053: $PLAYER_CHAR #NULL 2494.5 -1668.5 13.4
07AF: $PLAYER_GROUP $PLAYER_CHAR
01F5: $PLAYER_ACTOR $PLAYER_CHAR
0173: $PLAYER_ACTOR 180.0
0373:
014B: $MR1 #PCJ600 0 17 1 0 0 0 10000 2490.0 -1682.0 13.5 angle 90.0
014C: $MR1 101
032B: $WP1 #AK47 15 3000 2490.0 -1662.0 13.5
032B: $WP2 #JETPACK 15 0 2492.0 -1662.0 13.5
0213: $OP1 #BODYARMOUR 15 2494.0 -1662.0 13.5
0213: $OP2 #GUN_PARA 15 2496.0 -1662.0 13.5
0213: $OP3 #BRIBE 15 2498.0 -1662.0 13.5
DATA TYPE MEANING/Die Zeichen und ihre Bedeutung
$ : Definiert den dazugehörigen Eintrag zu einer Globalen 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 Globalen Variable für den folgenden code benutzt.
- weitere Beispiele:
- Global heißt: Die Globalen Variable ist in der gesamten Main abrufbar, egal wo sie definiert wurde und sie wird im Speicher aufbewahrt.
- Ich empfehle zur Gestaltung der Globalen Variable Buchstaben und Zahlen zu verwenden
- Z.B. so: $MR1 , $sv01 , $WP1 , $OP2
- Nach dem Dekompilieren gemodderter Main.scm werden Globalen Variable oftmals ungewöhnlich dargestellt.
- ...mit Punkt
- $10956.75
- Vermeidet es, wenns geht Scripttext zu kompilieren, wieder zu dekompilieren, am dekompilierten weiterzuarbeiten, kompililieren und dekompilieren usw.
- Sonder bleibt beim Ur-main-txt um dran weiter zu scripten und kompilierts nur zum testen und spielen.
014B: $MR1 = 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 $MR1 cars_to_generate_to 101
0053: $PLAYER_CHAR = create_player #NULL at 2485.22 -1672.941 13.73
01F5: $PLAYER_ACTOR = create_emulated_actor_from_player $PLAYER_CHAR
01BD: $16 = current_time_in_ms
0005: $BUY_ASSET_PICKUP_X = -1969.27 ;; floating-point values
0005: $BUY_ASSET_PICKUP_Y = 282.47 ;; floating-point values
0005: $BUY_ASSET_PICKUP_Z = 34.6 ;; floating-point values
02A7: $WANGS_AUTO_ASSET_PICKUP = create_icon_marker_and_sphere 31 at $BUY_ASSET_PICKUP_X $BUY_ASSET_PICKUP_Y $BUY_ASSET_PICKUP_Z
@ : Definiert den dazugehörigen Eintrag zu einer Lokalen Variable
- Von der Verwendung her das gleiche wie die Globalen Variable mit dem Unterschied,
- daß die Lokale Variable NICHT in der gesamten Main abrufbar ist, egal wo sie definiert wurde,
- sondern im einzelnen Script sozusagen eingeschlossen bleibt.
- Zur Gestaltung der Lokale Variable sind außschließlisch Zahlen zu verwenden
- In Threads und Extern_Scripte @0 bis @30
- In Missionen @0 bis @900
- und sie wird NICHT im Speicher aufbewahrt.
- 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
0006: @33 = 0 ;; integer values
:Sequenz
00D6: if 0
001B: 2000 > @33 ;; integer values
004D: jump_if_false ££weiter
# : Kennzeichnet den dazugehörigen Eintrag daß es sich um den Dateinamen eines Modells handelt
0247: request_model #BMYCG
0247: request_model #HMYCM
0247: request_model #SWATVAN
0247: request_model #M4
0247: request_model #COLT45
0247: request_model #BARREL4
06E9: request_car_component #NTO_B_S
029B: $2727 = init_object #MAGNOCRANE_01 at -1547.978 123.9883 26.9332
: : Doppelpunkt kennzeichnet Labels (Script-Adressen)
- z.B.
:MAIN_1
££ : wird für die globale Sprunganweisung zu Labels (Script-Adressen) benutzt.
- im MAIN part und mit create_thread-commands in Missionen und External Scripts welche threads im
- MAIN part starten.
- Z.B.
004D: jump_if_false ££SAVE_5
0050: gosub ££SAVE_14
0002: jump ££SAVE_1
004F: create_thread ££SAVE_1
£ : wird für die lokale Sprunganweisung in Missionen zu Labels (Script-Adressen) in Missionen
sowie für die lokale Sprunganweisung in External Scripts zu Labels (Script-Adressen) in External Scripts benutzt
- Z.B.
:M_35_1
0050: gosub £M_35_20
00D6: if 0
0112: wasted_or_busted
004D: jump_if_false £M_35_7
00BC: text_highpriority 'RACES25' 5000 ms 1
0002: jump £M_35_18
; ; Strichpunkt und alles was dahinter steht wird beim Kompilieren ignoriert
;;;--------- kann somit für Kommentare benutzt werden
Arbeiten mit der Stripped Main erleichtert das Scripten
- Wir stellen uns eine Basis - main zusammen, Stripped Main genannt,
- die gerade die nötigsten codes enthällt um CJ ins Spiel zu bringen
- Das erleichtert das Scripten und Testen der Scripts.
- Bei einer solchen Kurzfassung ohne Exter_Scripte erzeugt der Kompiliervorgang nur die main.scm
- hier die kompilierte Stripped main.scm
- Das Spiel ist spielbar.
- Missionen existieren nicht.
- Andere Features auch nicht. Kein Leben in den Läden, keine Girlfriends, keine Kräne, keine Waffen, und auch keine anderen Pickups, keine Minigames, keine Casinospiele, kein Billardspiel, kein Discotanzen,
- Kein Tuning, kein Basketball, keine Tore vor den Eingängen der Area 51, Getränkeautomaten funktionieren nicht, Keine Speichermöglichkeit, keine Symbole auf dem Radar.
- Alle Interioreingänge sind aktiv
- Zur Bestimmung, wo man das Spiel beginnt, wo die Kamera aktiviert, die Map gerendert und die Player-Figur erstellt wird,
- sind in diesen 3 Zeilen die Koordinaten einzugeben:
- dieser code:
- wandelt die Skinmodels um zur Player-Figur
- so wie es jetzt ist, ohne Einträge von Skins wird CJ mit dem Basis-Skin in Spiel gebracht, fast nackt
- Nehmt diesen code auch noch raus, dann ist die Player-Figur unsichtbar
- Zur Anweisung für Skins zur Umwandlung in die Player-Figur ist folgender code gedacht
- Der letzte Parameter, in diesem Code-Beispiel die 0 gibt die Körperregion an, den Bodypart
- 0 = der Oberkörper, 1 = der Kopf, 2 = die Beine, 3 = die Füße, das geht noch bis 17
- Nach den Skin-codes muss dann der Umwandlungs-code kommen
- Die Eintragsnamen für die Skins sind in der shopping.dat zu finden
- "JEANSDENIM"= texturename "JEANS"= modelname 2 = type
- Dieser Code-Eintrag bestimmt welche Map-Regionen freigeschaltet werden, 4 bedeuted ganz San Andreas ist zugänglich
- Der stat 181 regelt eigentlich nur die Aktivierung des Fahndungslevel (Wanted Level) bei Regionüberschreitung
- Ob überhaupt ein Fahndungslevel aktiviert wird, ist in diesem code festgelegt, der ganz am Anfang des Main-threads zu finden ist
- Dieser Code regelt die Kontrollierbarkeit des Spiels vom User
- von nun an kann man die Player-Figur bedienen
DEFINE VERSION SA 0.33;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
0002: jump ££Second_Segment
DEFINE MEMORY 32 ; Equals Mission Builder type global variable range $2 to $3
:Second_Segment
0002: jump ££Third_Segment
DEFINE OBJECTS 1
DEFINE OBJECT (no name) ; This is an unused object. You can put anything here.
:Third_Segment
0002: jump ££Fourth_Segment
DEFINE MISSIONS 0
:Fourth_Segment
0002: jump ££Fifth_Segment
DEFINE EXTERNAL_SCRIPTS 0
:Fifth_Segment
0002: jump ££Sixth_Segment
DEFINE UNKNOWN_FIFTH_SEGMENT
DEFINE UNKNOWN1 0
:Sixth_Segment
0002: jump ££MAIN_1
DEFINE UNKNOWN_SIXTH_SEGMENT
DEFINE UNKNOWN3 0
;-------------MAIN---------------
:MAIN_1
03A4: name_thread 'MAIN'
016A: fade 0 () 0 ms
042C: set_total_missions_to 0
030D: set_total_mission_points_to 0
01F0: set_max_wanted_level_to 6
0111: set_wasted_busted_check_to 0 (disabled)
00C0: set_current_time 10 0
04E4: unknown_refresh_game_renderer_at 2494.5 -1668.5
03CB: set_camera 2494.5 -1668.5 13.4
0053: $PLAYER_CHAR = create_player #NULL at 2494.5 -1668.5 13.4
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
01F5: $PLAYER_ACTOR = create_emulated_actor_from_player $PLAYER_CHAR
0173: set_actor $PLAYER_ACTOR z_angle_to 180.0
0373: set_camera_directly_behind_player
070D: $PLAYER_CHAR
0629: change_stat 181 (islands unlocked) to 4 ; integer see statdisp.dat
01B6: set_weather 1
04BB: select_interior 0 ;; select render area
01B4: set_player $PLAYER_CHAR frozen_state 1 (unfrozen)
01B7: release_weather
016C: restart_if_wasted at 2494.5 -1668.5 13.4 angle 180.0 unknown 0
016D: restart_if_busted at 2494.5 -1668.5 13.4 angle 180.0 unknown 0
016A: fade 1 () 1000 ms
0001: wait 100 ms
03E6: remove_text_box
:MAIN_3
0001: wait 2500 ms
0002: jump ££MAIN_3
04E4: unknown_refresh_game_renderer_at 2494.5 -1668.5
03CB: set_camera 2494.5 -1668.5 13.4
0053: $PLAYER_CHAR = create_player #NULL at 2494.5 -1668.5 13.4
070D: $PLAYER_CHAR
087B: set_player $PLAYER_CHAR clothes "bballjackrstar" "bbjack" 0
087B: set_player $PLAYER_CHAR clothes "bballjackrstar" "bbjack" 0
087B: set_player $PLAYER_CHAR clothes "JEANSDENIM" "JEANS" 2
087B: set_player $PLAYER_CHAR clothes "SNEAKERBINCBLK" "SNEAKER" 3
087B: set_player $PLAYER_CHAR clothes "PLAYER_FACE" "HEAD" 1
070D: $PLAYER_CHAR
0629: change_stat 181 (islands unlocked) to 4 ; integer see statdisp.dat
01F0: set_max_wanted_level_to 6
01B4: set_player $PLAYER_CHAR frozen_state 1 (unfrozen)
Einfügen eines Mod-scripts in die Stripped Main
Als Beispiel das Save-Script
- Das Save-script besteht aus
- 1. der create_thread-Zeile
- und
- 2. aus dem eigentlichen thread-script
- Die create_thread-Zeile kommt in den Main-Thread
- Das thread-script kommt nach dem Main-Thread
- Es ist egal ob Du die create_thread-Zeile gleich zu Beginn oder etwas später setzt.
- ABER AUF JEDENFALL NICHT IN DEN LOOP !
- hierhin:
- oder hierhin:
- Der Loop ist die Schleife
- von
- :MAIN_3
- zu
- 0002: jump ££MAIN_3
- und zurück zu :MAIN_3
- Und nach dem Main-Thread kann das save-script platziert werden:
- dieser Speicherpunkt ist im Haus auf dem Flugzeugfriedhof platziert
- ändere Koordinaten-Einträge
- um ihn an deinem gewünschten Ort zu platzieren
- wie hier beschrieben
- Im Save-script wird das Objekt #PICKUPSAVE benötigt
- Objekte müssen im Second_Segment, Objektaufstellung definiert werden,
- wenn ihr Objektname eingesetzt werden soll
;-------------MAIN---------------
:MAIN_1
03A4: name_thread 'MAIN'
004F: create_thread ££SAVE_1
016A: fade 0 () 0 ms
016A: fade 1 (back) 500 ms
004F: create_thread ££SAVE_1
:MAIN_3
0001: wait 2500 ms
0002: jump ££MAIN_3
:MAIN_3
0001: wait 2500 ms
0002: jump ££MAIN_3
:SAVE_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'SAVE'
0570: $sv02 = create_asset_radar_marker_with_icon 35 at 384.44 2544.108 16.66
018B: show_on_radar $sv02 2
:SAVE_2
0001: wait 0 ms
0213: $sv01 = create_pickup #PICKUPSAVE type 3 at 417.44 2538.108 10.1
:SAVE_5
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££SAVE_5
00D6: if 0
0214: pickup $sv01 picked_up
004D: jump_if_false ££SAVE_5
0050: gosub ££SAVE_14
0002: jump ££SAVE_2
:SAVE_14
00D6: if 0
0038: $ON_MISSION == 0 ;; integer values
004D: jump_if_false ££SAVE_17
0004: $ON_MISSION = 1 ;; integer values
01B4: set_player $PLAYER_CHAR frozen_state 0 (frozen)
0001: wait 350 ms
03D8: show_SAVE_screen
:SAVE_15
00D6: if 0
83D9: NOT save_done
004D: jump_if_false ££SAVE_16
0001: wait 0 ms
0002: jump ££SAVE_15
:SAVE_16
00A1: put_actor $PLAYER_ACTOR at 420.44 2538.108 10.0
01B4: set_player $PLAYER_CHAR frozen_state 1 (unfrozen)
0004: $ON_MISSION = 1 ;; integer values
0001: wait 350 ms
0004: $ON_MISSION = 0 ;; integer values
:SAVE_17
0051: return
so fügt man Objekte in die Definitionsliste hinzu:
- die Gesamtzahl ist in der ersten Zeile anzugeben(DEFINE OBJECTS 6)
- Der erste Listeneintrag ist unbenutzt, zählt aber aber mit, hätte die Object number -0, somit sinds insgesamt 6
- maximal 394; in der original main sind es 389
- Des weitern macht es Sinn die Mission 0 zu installieren.
:Second_Segment
0002: jump ££Third_Segment
DEFINE OBJECTS 6
DEFINE OBJECT (unbenutzt) ; This is an unused object. You can put anything here.
DEFINE OBJECT INFO ; Object number -1
DEFINE OBJECT KEYCARD ; Object number -2
DEFINE OBJECT PICKUPSAVE ; Object number -3
DEFINE OBJECT BODYARMOUR ; Object number -4
DEFINE OBJECT BRIBE ; Object number -5
so fügt man eine Mission hinzu:
- Missionen müssen im Second_Segment, Missionsaufstellung definiert werden,
- die Gesamtzahl ist in der ersten Zeile anzugeben(DEFINE MISSIONS 1)
- Definiert wird die Mission durch ihre Adresse mit der das Missions-Script beginnt (INITIAL_1)
- Die Mission 0 und die Mission 1 werden im Original nicht für Handlungen benutzt, sondern um haufenweise Settings zu setzen sowie parked cars, pickups, Objekte usw.
- Dieses Missions-Script ist sehr einfach gestrickt,
- es beginnt mit seiner Adresse und dem Namenseintrag
- beinhaltet nur Settings, die einfach durchlaufen werden und endet mit end_thread
- Missions-Scripte kommen in den Mission Part des 7. Segments
- in dieser Stripped Main ans unterste Ende
- Zur Aktivierung der Mission wird dann folgender code angewandt
- So, ich pack dann noch ne Latte codes in den Main-Thread, die wichtigsten skills, fightingstyle, set_on_mission_flag_to, Startgeld und andere
- Dann sieht die erarbeitete Stripped Main so aus:
:Third_Segment
0002: jump ££Fourth_Segment
DEFINE MISSIONS 1
DEFINE MISSION 0 AT ££INITIAL_1 ; originally: Initial 1
;-------------Mission 0---------------
; Originally: Initial 1
:INITIAL_1
03A4: name_thread 'INITIAL'
;;;setings
;;;setings
;;;setings
004E: end_thread
0417: start_mission 0
DEFINE VERSION SA 0.33;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
0002: jump ££Second_Segment
DEFINE MEMORY 3200 ; Equals Mission Builder type global variable range $2 to $8000
:Second_Segment
0002: jump ££Third_Segment
DEFINE OBJECTS 6
DEFINE OBJECT (unbenutzt) ; This is an unused object. You can put anything here.
DEFINE OBJECT INFO ; Object number -1
DEFINE OBJECT KEYCARD ; Object number -2
DEFINE OBJECT PICKUPSAVE ; Object number -3
DEFINE OBJECT BODYARMOUR ; Object number -4
DEFINE OBJECT BRIBE ; Object number -5
:Third_Segment
0002: jump ££Fourth_Segment
DEFINE MISSIONS 1
DEFINE MISSION 0 AT ££INITIAL_1 ; originally: Initial 1
:Fourth_Segment
0002: jump ££Fifth_Segment
DEFINE EXTERNAL_SCRIPTS 0
:Fifth_Segment
0002: jump ££Sixth_Segment
DEFINE UNKNOWN_FIFTH_SEGMENT
DEFINE UNKNOWN1 0
:Sixth_Segment
0002: jump ££MAIN_1
DEFINE UNKNOWN_SIXTH_SEGMENT
DEFINE UNKNOWN3 0
;-------------MAIN---------------
:MAIN_1
03A4: name_thread 'MAIN'
016A: fade 0 () 0 ms
042C: set_total_missions_to 0
030D: set_total_mission_points_to 0
01F0: set_max_wanted_level_to 6
0111: set_wasted_busted_check_to 0 (disabled)
00C0: set_current_time 10 0
04E4: unknown_refresh_game_renderer_at 2494.5 -1668.5
03CB: set_camera 2494.5 -1668.5 13.4
0053: $PLAYER_CHAR = create_player #NULL at 2494.5 -1668.5 13.4
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
01F5: $PLAYER_ACTOR = create_emulated_actor_from_player $PLAYER_CHAR
0173: set_actor $PLAYER_ACTOR z_angle_to 180.0
0373: set_camera_directly_behind_player
0629: change_stat 181 (islands unlocked) to 4 ; integer see statdisp.dat
0998: add_respect 1000
062A: change_stat 165 (energy) to 800.0 ; float
062A: change_stat 23 (muscle) to 800.0 ; float
062A: change_stat 21 (fat) to 200.0 ; float
062A: change_stat 160 (driving skill) to 1000.0 ; float
062A: change_stat 223 (pilot skill) to 1000.0 ; float
062A: change_stat 229 (bike skill) to 1000.0 ; float
062A: change_stat 230 (cycling skill) to 1000.0 ; float
0629: change_stat 225 (lung capasity) to 1000 ; integer see statdisp.dat
0629: change_stat 22 (stamina) to 1000 ; integer see statdisp.dat
0629: change_stat 156 (dance skill) to 1000 ; integer see statdisp.dat
062A: change_stat 81 (gambling skill) to 1000.0 ; integer see statdisp.dat
0629: change_stat 64 (respect) to 1000 ; integer see statdisp.dat
0629: change_stat 65 () to 1000 ; integer see statdisp.dat
062A: change_stat 69 (Weap skill: pistol) to 1000.0 ; float
062A: change_stat 70 (Weap skill: silence) to 1000.0 ; integer see statdisp.dat
062A: change_stat 71 (Weap skill: desert ) to 1000.0 ; integer see statdisp.dat
062A: change_stat 72 (Weap skill: shotgun) to 1000.0 ; integer see statdisp.dat
062A: change_stat 73 (Weap skill: sawn of) to 1000.0 ; integer see statdisp.dat
062A: change_stat 74 (Weap skill: combat ) to 1000.0 ; integer see statdisp.dat
062A: change_stat 75 (Weap skill: machine) to 1000.0 ; integer see statdisp.dat
062A: change_stat 76 (Weap skill: smg) to 1000.0 ; integer see statdisp.dat
062A: change_stat 77 (Weap skill: ak-47) to 1000.0 ; integer see statdisp.dat
062A: change_stat 78 (Weap skill: m4) to 1000.0 ; integer see statdisp.dat
062A: change_stat 79 (Weap skill: rifle) to 1000.0 ; integer see statdisp.dat
0629: change_stat 181 (islands unlocked) to 4 ; integer see statdisp.dat
0A1F: 24 500.0;Healthskill
055E: set_player $PLAYER_CHAR max_health += 150
055F: set_player $PLAYER_CHAR max_armour += 150
0223: set_actor $PLAYER_ACTOR health_to 250
035F: set_actor $PLAYER_ACTOR armour_to 250
0330: set_player $PLAYER_CHAR infinite_run_to 1 (true)
07FE: set_actor $PLAYER_ACTOR fighting_style_to 6 6
0572: set_taxi_boost_jump 1
087B: set_player $PLAYER_CHAR clothes "bballjackrstar" "bbjack" 0
087B: set_player $PLAYER_CHAR clothes "JEANSDENIM" "JEANS" 2
087B: set_player $PLAYER_CHAR clothes "SNEAKERBINCBLK" "SNEAKER" 3
087B: set_player $PLAYER_CHAR clothes "PLAYER_FACE" "HEAD" 1
070D: $PLAYER_CHAR
0109: player $PLAYER_CHAR money += 500000
08DE: 0 ; (Keep stuff after busted)(0=on/1=off)
08DD: 0 ; (Keep stuff after wasted)(0=on/1=off)
0180: set_on_mission_flag_to $ON_MISSION
02FA: garage 'BODLAWN' change_to_type 38
02FA: garage 'MODLAST' change_to_type 36
02FA: garage 'MDSSFSE' change_to_type 38
02FA: garage 'MDS1SFS' change_to_type 37
02FA: garage 'VECMOD' change_to_type 38
02FA: garage 'MICHDR' change_to_type 5
02FA: garage 'HBGDSFS' change_to_type 19
0237: gang_weapons 1 30 32 24
01B6: set_weather 1
04BB: select_interior 0 ;; select render area
01B4: set_player $PLAYER_CHAR frozen_state 1 (unfrozen)
01B7: release_weather
016C: restart_if_wasted at 2494.5 -1668.5 13.4 angle 180.0 unknown 0
016D: restart_if_busted at 2494.5 -1668.5 13.4 angle 180.0 unknown 0
0417: start_mission 0
004F: create_thread ££SAVE_1
016A: fade 1 () 1000 ms
0001: wait 100 ms
03E6: remove_text_box
:MAIN_3
0001: wait 2500 ms
0002: jump ££MAIN_3
:SAVE_1
03A4: name_thread 'SAVE'
0570: $sv02 = create_asset_radar_marker_with_icon 35 at 2496.8 -1700.1 24.39
018B: show_on_radar $sv02 2
:SAVE_2
0001: wait 0 ms
0213: $sv01 = create_pickup #PICKUPSAVE type 3 at 2491.3 -1699.7 1014.75
:SAVE_5
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££SAVE_5
00D6: if 0
0214: pickup $sv01 picked_up
004D: jump_if_false ££SAVE_5
0050: gosub ££SAVE_14
0002: jump ££SAVE_2
:SAVE_14
00D6: if 0
0038: $ON_MISSION == 0 ;; integer values
004D: jump_if_false ££SAVE_17
0004: $ON_MISSION = 1 ;; integer values
01B4: set_player $PLAYER_CHAR frozen_state 0 (frozen)
0001: wait 350 ms
03D8: show_SAVE_screen
:SAVE_15
00D6: if 0
83D9: NOT save_done
004D: jump_if_false ££SAVE_16
0001: wait 0 ms
0002: jump ££SAVE_15
:SAVE_16
00A1: put_actor $PLAYER_ACTOR at 2493.03 -1701.17 1014.8
01B4: set_player $PLAYER_CHAR frozen_state 1 (unfrozen)
0004: $ON_MISSION = 1 ;; integer values
0001: wait 350 ms
0004: $ON_MISSION = 0 ;; integer values
:SAVE_17
0051: return
;-------------Mission 0---------------
; Originally: Initial 1
:INITIAL_1
03A4: name_thread 'INITIAL'
014B: $MR1 = 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 $MR1 cars_to_generate_to 101
032B: $WP1 = create_weapon_pickup #AK47 15 ammo 3000 at 2490.0 -1662.0 13.5
032B: $WP2 = create_weapon_pickup #JETPACK 15 ammo 0 at 2492.0 -1662.0 13.5
0213: $OP1 = create_pickup #BODYARMOUR type 15 at 2494.0 -1662.0 13.5
0213: $OP2 = create_pickup #GUN_PARA type 15 at 2496.0 -1662.0 13.5
0213: $OP3 = create_pickup #BRIBE type 15 at 2498.0 -1662.0 13.5
004E: end_thread