Vorbereitung und Umgang mit dem SABuilder033

  1. 1. Entferne den Schreibschutz vom Grand Theft Auto San Andreas-Installationsverzeichnis und allen darin befindlichen Unterordner und Dateien.
  2. 2.Saug Dir den Missionbuilder SABuilder033 und entpacke den Download-file irgendwo auf Deine Festplatte
  3. SABuilder033
  4. 3.Leg im Programmordner namens SA Builder einen neuen Ordner an und benenne diesen: Original SCM
  5. 4.Kopiere in den Ordner Original SCM folgende Originaldateien des Spiels:

    MAIN.SCM
    SCRIPT.IMG
  6. und in den Ordner SA Builder folgende Originaldateien

    default.ide
    vehicles.ide
    peds.ide

  7. 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

  8. 6.Aktiviere den Missionbuilder (Doppeklick auf SABuilder033.exe)

  9. 7.Klicke auf den Menueschalter Compiler und mach den Haken weg bei Disable Custom ID when Decompiling

  10. 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.

  11. 9.Bevor Du irgend etwas machst, Benutze die Suchfunktion und suche nach:
  12. create_emulated_actor_from_player
  1. Da muss jetzt folgendes stehen:
  2. 01F5: $PLAYER_ACTOR = create_emulated_actor_from_player $PLAYER_CHAR
  3. und NICHT
  4. 01F5: $3 = create_emulated_actor_from_player $2
  1. sonst lies Punkt 7. nochmal
    Wenns stimmt, speichere es unverzüglich ab als OriginalSAmain.txt. Am besten wieder in den Ordner OriginalSCM.

  1. Um mission scripting zu lernen, sollte man als erstes versuchen das Script zu verstehen.
    D.h.
  2. - die Readme.txt, die beim Missionbuilder dabei ist, gründlich lesen.
  3. - parked cars und pickups für Waffen und andere Objekte ins Spiel setzen und im Spiel testen.
  4. - ein Scriptmod in Form eines "THREAD" einbauen und im Spiel testen.
  5. - 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.

  6. 10. Erste Übung:
  7. parked cars einfügen
  8. 11. erfordert:
  9. Koordinaten auslesen
  10. 12. Abschluss:
  11. speichern und kompilieren
nothing

parked cars und Waffen-pickups

  1. Zuerst stellt sich die Frage: Wo kommt was hin?
  2. parked cars bevorzuge Ich in der Mission 0 zu setzen.
  3. 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.
  1. Benutze die Suchfunktion und suche nach:
  2. ;;-------------Mission 0---------------
    
    ; Originally: Initial 1
    
    :INITIAL_1
    03A4: name_thread 'INITIAL'
  3. Schaffe eine Lücke unter diesen Zeilen und füge folgenden code ein:
  4. 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

  5. speichere, kompiliere und teste im Spiel

  6. Beschreibung des parked car-codes

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



  1. 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 vorkommen

bei 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 sein

bei 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 erscheint

beim 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


nothing

 

Koordinaten auslesen

  1. 11.Saug Dir den San Andreas Place Manager
  2. und benutze ihn parallel zum Spiel, um die Koordinaten auszulesen, damit Du die Sache an den gewünschten Ort rücken kannst.

  3. 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.

  4. Klick im Place Manager auf "add place", kopiere die Koordinaten und übertrage sie ins script

  5. Für einen Ort im Spiel zu definieren sind 3 Koordinaten-Einträge nötig
  6. X-Coordinaten, Y-Coordinaten, Z-Coordinaten

  7. Hier dürfen nur kommagetrennte Werte (floating points value)eingetragen werden
    wobei anstatt eines Kommas, ein Punkt . zu setzen ist.

  8. Ü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

  1. 12.Speichere das jetzt als *.txt ab und vergib dabei einen neuen Namen

  2. 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

  3. Wenn Du die Dateien nicht findest, dann achte auf die
    Meldung die bei erfolgreichem Kompilieren ausgegeben wird

  4. Da wird der Pfad angegeben, wohin die MAIN.SCM und SCRIPT.IMG kompiliert wurde

  5. Wenn die Fehlermeldung kommt, daß Define Memory nicht reicht, dann erhöhe ihn. Und zwar steht ganz am
    Anfang des Scripts:
  6. DEFINE MEMORY 43800
  7. Mach z.B. DEFINE MEMORY 44800 daraus. Speichere dann und kompiliere nochmal.
  8. Das wars. Probiers jetzt aus im Spiel.

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

  1. 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.
  2. (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

  1. Der Thread ist das Basis-Script in der Main.scm

  2. Er wird in "create_thread", in Missionen oder Externscripten definiert
    und bekommt einen Namen
  3. Als Beispiel wird das Hinzufügen eines Speicherpunkts beschrieben

  4. Das Save-script besteht aus

  5. 1. der create_thread-Zeile

  6. 004F: create_thread ££SAVE_1
  7. und

  8. 2. aus dem eigentlichen thread-script

  9. Die create_thread-Zeile zur Initialisierung des Scripts kann überall in der main.scm gesetzt werden
  10. 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
  11. suche nach dem obersten create_thread -Eintrag in der original Main und füge den fürs save-script dort ein:
  12. 004F: create_thread ££SAVE_1 
    004F: create_thread ££ODDVEH_1
  13. Das thread-script kommt in den Main Part
  14. suche nach:
  15. ;;-------------Mission 0---------------
    ; Originally: Initial 1
    
    :INITIAL_1
    03A4: name_thread 'INITIAL'
  16. Schaffe eine Lücke über diesen Zeile und füge das save-script dort ein ein:
  17. :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---------------
  1. dieser Speicherpunkt ist im Haus auf dem Flugzeugfriedhof platziert
  2. ändere die
  3. Koordinaten-Einträge
  4. um ihn an deinem gewünschten Ort zu platzieren
  5. Du musst 3 Orte bestimmen, wenn der Savepoint in einem Innenraum sein soll.
  6. Du musst 2 Orte bestimmen, wenn der Savepoint auf dem Außengelände sein soll.
  7. A: für die Speichercassette
  8. 0213: $sv01 = create_pickup #PICKUPSAVE type 3 at 417.44 2538.108 10.1

  9. B: für das Symbol auf der Karte
  10. 0570: $sv02 = create_asset_radar_marker_with_icon 35 at 384.44 2544.108 16.66

  11. Wenn Du es auf dem Außengelände machst, kannst Du für A un B die selben Coordinaten nehmen.
  12. C: Eine Stelle, etwas neben der Speicherkassette, wo CJ nach dem Speichern wieder ankommt.
  13. 00A1: put_actor $PLAYER_ACTOR at 420.44 2538.108 10.0
  14. Ein Koordinatensatz besteht aus X-Coordinaten, Y-Coordinaten, Z-Coordinaten
  15. 00A1: put_actor $PLAYER_ACTOR at X Y Z
  16. 00A1: put_actor $PLAYER_ACTOR at 420.44 2538.108 10.0
  17. Speichere das jetzt als *.txt ab und vergib dabei einen neuen Namen
  18. Kompiliere das Script zur main.scm. und kopiers ins Spiel
  19. teste ob alles stimmt
  20. fertig, das wars

Einteilung und Aufbau der Main

  1. Das erste was im script zu stehen hat ist die MB version
  2. DEFINE VERSION SA 0.33
  3. und dann gehts los:
  4. Nach Bart Waterduck ist die Main in 7 Segmente aufgeteilt
  5. Segment 1:
  6. ist der DEFINE MEMORY/Angabe der Speicherreservierung
  7. DEFINE MEMORY 43800 ; Equals Mission Builder type global variable range $2 to $10949
  8. Segment 2:
  9. :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.
  10. -eine Austellung der 3d objekte um sie mit ihrem Dateinamen in der main benutzen zu können
  11. -z.B. die Kräne oder andere Dinge, die in den IDE-Dateien definiert sind
  12. - maximal 394; in der original main sind es 389
  13. - die Gesamtzahl ist in der ersten Zeile anzugeben(DEFINE OBJECTS 389)
  14. Segment 3:
  15. :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.
  16. -eine Aufstellung der Missionen.
  17. -die Gesamtzahl ist in der ersten Zeile anzugeben(DEFINE MISSIONS 135)
  18. Segment 4
  19. :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.
  20. -eine Aufstellung der EXTERNAL_SCRIPTS
  21. - die Gesamtzahl ist in der ersten Zeile anzugeben(EXTERNAL_SCRIPTS 79)
  22. Segment 5 ist bisweilen unbekannt
  23. Segment 6 ist bisweilen unbekannt
  24. :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
  25. Segment 7,das eigentliche Script ist in 3 Abschnitte aufgeteilt
  26. dem Main-Part, der mit dem Main-thread beginnt
  27. in der decompilierten Main an dieser Stelle zu finden:
  28. ;-------------MAIN---------------
    
    :MAIN_1
    03A4: name_thread 'MAIN'
  29. Der Main Part endet dann da wo der Mission Part beginnt,
  30. hier:
  31. ;-------------Mission 0---------------
  32. Nach den Missionen kommen die Extern Scripte
  33. hier:
  34. ;-------------------------------------------
    DEFINE EXTERNAL_SCRIPT_START
  35. Der Kompiliervorgang erzeugt dann 2 Dateien,
  36. die Main.scm und die Extern_Scripte zur Script.img
  37. Wenn man die main aufs notwendigste reduziert, bleibt im Grunde nur noch der Main-Thread übrig
  38. Der Kern der main, wo der Vorhang aufgeht und die Spielfigur erscheint.
  39. Man spricht dann von einer

  40. 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
  41. Bei einer solchen Kurzfassung ohne Extern_Scripte erzeugt der Kompiliervorgang nur die main.scm
  42. hier die kompilierte Stripped main.scm
  43. Das Spiel ist spielbar.
  44. Missionen existieren nicht.
  45. 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,
  46. 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.
  47. Alle Interioreingänge sind aktiv
nothing

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 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
nothing

DATA TYPE MEANING/Die Zeichen und ihre Bedeutung

$ : Definiert den dazugehörigen Eintrag zu einer Globalen 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: $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
  5. im weiteren wird diese Globalen Variable für den folgenden code benutzt.
  6. 014C: set_parked_car_generator $MR1 cars_to_generate_to 101
  7. weitere Beispiele:
  8. 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
  9. Global heißt: Die Globalen Variable ist in der gesamten Main abrufbar, egal wo sie definiert wurde und sie wird im Speicher aufbewahrt.
  10. Ich empfehle zur Gestaltung der Globalen Variable Buchstaben und Zahlen zu verwenden
  11. Z.B. so: $MR1 , $sv01 , $WP1 , $OP2
  12. Nach dem Dekompilieren gemodderter Main.scm werden Globalen Variable oftmals ungewöhnlich dargestellt.
  13. ...mit Punkt
  14. $10956.75
  15. Vermeidet es, wenns geht Scripttext zu kompilieren, wieder zu dekompilieren, am dekompilierten weiterzuarbeiten, kompililieren und dekompilieren usw.
  16. Sonder bleibt beim Ur-main-txt um dran weiter zu scripten und kompilierts nur zum testen und spielen.

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

  1. Von der Verwendung her das gleiche wie die Globalen Variable mit dem Unterschied,
  2. daß die Lokale Variable NICHT in der gesamten Main abrufbar ist, egal wo sie definiert wurde,
  3. sondern im einzelnen Script sozusagen eingeschlossen bleibt.
  4. Zur Gestaltung der Lokale Variable sind außschließlisch Zahlen zu verwenden
  5. In Threads und Extern_Scripte @0 bis @30
  6. In Missionen @0 bis @900
  7. und sie wird NICHT im Speicher aufbewahrt.
  8. 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
  9. 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)

  1. z.B.
  2. :MAIN_1

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

  1. im MAIN part und mit create_thread-commands in Missionen und External Scripts welche threads im
  2. MAIN part starten.
  3. Z.B.
  4. 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

  1. Z.B.
  2. :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

nothing

Arbeiten mit der Stripped Main erleichtert das Scripten

  1. Wir stellen uns eine Basis - main zusammen, Stripped Main genannt,
  2. die gerade die nötigsten codes enthällt um CJ ins Spiel zu bringen
  3. Das erleichtert das Scripten und Testen der Scripts.
  4. Bei einer solchen Kurzfassung ohne Exter_Scripte erzeugt der Kompiliervorgang nur die main.scm
  5. hier die kompilierte Stripped main.scm
  6. Das Spiel ist spielbar.
  7. Missionen existieren nicht.
  8. 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,
  9. 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.
  10. Alle Interioreingänge sind aktiv
  11. 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


  12. Zur Bestimmung, wo man das Spiel beginnt, wo die Kamera aktiviert, die Map gerendert und die Player-Figur erstellt wird,
  13. sind in diesen 3 Zeilen die Koordinaten einzugeben:
  14. 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

  15. dieser code:
  16. 070D: $PLAYER_CHAR
  17. wandelt die Skinmodels um zur Player-Figur
  18. so wie es jetzt ist, ohne Einträge von Skins wird CJ mit dem Basis-Skin in Spiel gebracht, fast nackt
  19. Nehmt diesen code auch noch raus, dann ist die Player-Figur unsichtbar
  20. Zur Anweisung für Skins zur Umwandlung in die Player-Figur ist folgender code gedacht
  21. 087B: set_player $PLAYER_CHAR clothes "bballjackrstar" "bbjack"  0
  22. Der letzte Parameter, in diesem Code-Beispiel die 0 gibt die Körperregion an, den Bodypart
  23. 0 = der Oberkörper, 1 = der Kopf, 2 = die Beine, 3 = die Füße, das geht noch bis 17
  24. Nach den Skin-codes muss dann der Umwandlungs-code kommen
  25. 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
  26. Die Eintragsnamen für die Skins sind in der shopping.dat zu finden
  27. "JEANSDENIM"= texturename "JEANS"= modelname 2 = type
  28. Dieser Code-Eintrag bestimmt welche Map-Regionen freigeschaltet werden, 4 bedeuted ganz San Andreas ist zugänglich
  29. 0629: change_stat  181 (islands unlocked) to  4  ; integer see statdisp.dat
  30. Der stat 181 regelt eigentlich nur die Aktivierung des Fahndungslevel (Wanted Level) bei Regionüberschreitung
  31. Ob überhaupt ein Fahndungslevel aktiviert wird, ist in diesem code festgelegt, der ganz am Anfang des Main-threads zu finden ist
  32. 01F0: set_max_wanted_level_to  6

  33. Dieser Code regelt die Kontrollierbarkeit des Spiels vom User
  34. 01B4: set_player $PLAYER_CHAR frozen_state  1 (unfrozen)
  35. von nun an kann man die Player-Figur bedienen

Einfügen eines Mod-scripts in die Stripped Main

Als Beispiel das Save-Script

  1. Das Save-script besteht aus
  2. 1. der create_thread-Zeile
  3. und
  4. 2. aus dem eigentlichen thread-script
  5. Die create_thread-Zeile kommt in den Main-Thread
  6. Das thread-script kommt nach dem Main-Thread
  7. Es ist egal ob Du die create_thread-Zeile gleich zu Beginn oder etwas später setzt.
  8. ABER AUF JEDENFALL NICHT IN DEN LOOP !
  9. hierhin:
  10. ;-------------MAIN---------------
    
    :MAIN_1
    03A4: name_thread 'MAIN'
    004F: create_thread ££SAVE_1
    016A: fade 0 () 0 ms
  11. oder hierhin:
  12. 016A: fade 1 (back) 500 ms
    004F: create_thread ££SAVE_1
    
    :MAIN_3
    0001: wait 2500 ms
    0002: jump ££MAIN_3
  13. Der Loop ist die Schleife
  14. von
  15. :MAIN_3
  16. zu
  17. 0002: jump ££MAIN_3
  18. und zurück zu :MAIN_3
  19. Und nach dem Main-Thread kann das save-script platziert werden:
  20. :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
  21. dieser Speicherpunkt ist im Haus auf dem Flugzeugfriedhof platziert
  22. ändere Koordinaten-Einträge
  23. um ihn an deinem gewünschten Ort zu platzieren
  24. wie hier beschrieben

  25. Im Save-script wird das Objekt #PICKUPSAVE benötigt
  26. Objekte müssen im Second_Segment, Objektaufstellung definiert werden,
  27. wenn ihr Objektname eingesetzt werden soll

so fügt man Objekte in die Definitionsliste hinzu:

    :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
  1. die Gesamtzahl ist in der ersten Zeile anzugeben(DEFINE OBJECTS 6)
  2. Der erste Listeneintrag ist unbenutzt, zählt aber aber mit, hätte die Object number -0, somit sinds insgesamt 6
  3. maximal 394; in der original main sind es 389

  4. Des weitern macht es Sinn die Mission 0 zu installieren.

so fügt man eine Mission hinzu:

  1. Missionen müssen im Second_Segment, Missionsaufstellung definiert werden,
  2. :Third_Segment
    0002: jump ££Fourth_Segment
    DEFINE MISSIONS  1
    DEFINE MISSION 0 AT ££INITIAL_1   ; originally: Initial 1
  3. die Gesamtzahl ist in der ersten Zeile anzugeben(DEFINE MISSIONS 1)
  4. Definiert wird die Mission durch ihre Adresse mit der das Missions-Script beginnt (INITIAL_1)
  5. 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.
  6. Dieses Missions-Script ist sehr einfach gestrickt,
  7. es beginnt mit seiner Adresse und dem Namenseintrag
  8. beinhaltet nur Settings, die einfach durchlaufen werden und endet mit end_thread
  9. ;-------------Mission 0---------------
    ; Originally: Initial 1
    
    :INITIAL_1
    03A4: name_thread 'INITIAL'
    
    ;;;setings
    ;;;setings
    ;;;setings
    
    004E: end_thread
  10. Missions-Scripte kommen in den Mission Part des 7. Segments
  11. in dieser Stripped Main ans unterste Ende
  12. Zur Aktivierung der Mission wird dann folgender code angewandt
  13. 0417: start_mission  0


  14. So, ich pack dann noch ne Latte codes in den Main-Thread, die wichtigsten skills, fightingstyle, set_on_mission_flag_to, Startgeld und andere
  15. Dann sieht die erarbeitete Stripped Main so aus:
  16. 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
nothing