SA mission coding (voor beginners)

Hoofdpagina > Modding > Modding Tutorial List > SA mission coding (voor beginners)


In deze tutorial legt JGuntherS de basis uit van scripting in San Andreas. Hij gebruikt hiervoor San Andreas Mission Builder.

Benodigde tools

Voorbereiding & backups

Voordat je aan de slag gaat adviseert JGuntherS je om je data map van SA en je savegames te backuppen.

  • Unzip de Mission Builder in een map waar jij wilt.
  • Kopieer de bestanden peds.ide, vehicles.ide en default.ide uit de data map van SA naar de map waarin de Mission Builder is geunzipped.
  • Open het bestand SASCM.INI in de MB map (met kladblok of met de MissionBuilder zelf) en voeg deze regels toe (aan het eind):
:JGS1
0001: wait 100 ms
03A4: name_thread 'PANC_1'
0005: $2000 = 40.30668
0005: $2001 = 20.28515
0005: $2002 = 14.26602

:JGS1_0
02A7: $2003 = create_icon_marker_and_sphere  34 at  $2000 $2001 $2002
0004: $eiland_m1_on = 1

:JGS1_2
0001: wait 100 ms
00D6: if 0
0038:    $ON_MISSION == 0
004D: jump_if_false ££JGS1_5
00D6: if 1
0038:    $ON_MISSION == 0
0038:    $eiland_m1_on == 0
004D: jump_if_false ££JGS1_3
02A7: $2003 = create_icon_marker_and_sphere  34 at  $2000 $2001 $2002
0004: $eiland_m1_on = 1

:JGS1_3
00D6: if 0
0256:    player $PLAYER_CHAR defined
004D: jump ££JGS1_2   
00D6: if 0
00FF:    actor $PLAYER_ACTOR 0 ()near_point_on_foot $2000 $2001 $2002 radius 3.0 3.0 2.0
004D: jump_if_false ££JGS1_2
00D6: if 0
03EE:   player $PLAYER_CHAR controllable
004D: jump_if_false ££JGS1_2
0164: disable_marker $2003
0004: $eiland_m1_on = 0
00BA: text_styled 'JGS_M1'  1500 ms  2
0050: gosub ££PANCCAM
0417: start_mission 3

:JGS1_4
0001: wait 0 ms
00D6: if 0
0038:    $m_135_tried == 1
004D: jump_if_false ££JGS1_4
0004: $m_135_tried = 0
00D6: if 0
0038:    $m_135_done == 1
004D: jump_if_false ££JGS1_2
00BE: text_clear_all 
03E6: remove_text_box
01E3: text_1number_styled 'M_PASS'  1000  5000 ms  1
0318: set_latest_mission_passed 'PANCA_1'
030C: set_mission_points +=  1
0394: play_music  1
01BD: $184 = current_time_in_ms 
0109: player $PLAYER_CHAR money +=  1000
0110: clear_player $PLAYER_CHAR wanted_level
004E: end_thread

:JGS1_5
00D6: if 0
0038:    $eiland_m1_on == 1
004D: jump_if_false ££JGS1_2
0164: disable_marker $2003
0004: $eiland_m1_on = 0
0002: jump ££JGS1_2   

:PANCCAM
0002: jump ££PANCCAM5

:PANCCAM1
0169: set_fade_color  0  0  0
016A: fade  0 ()  500 ms

:PANCCAM2
00D6: if  0
016B:   fading
004D: jump_if_false ££PANCCAM3
0001: wait  0 ms
00BE: text_clear_all
03E6: remove_text_box
0002: jump ££PANCCAM2
 
:PANCCAM3
00D6: if  0
0256:   player $PLAYER_CHAR defined
004D: jump_if_false ££PANCCAM4
016A: fade  0 ()  0 ms
02EB: restore_camera_with_jumpcut
0687: $PLAYER_ACTOR 
016A: fade  0 ()  0 ms

:PANCCAM4
0051: return
           
:PANCCAM5
00D6: if  0
0256:   player $PLAYER_CHAR defined
004D: jump_if_false ££PANCCAM6
03E6: remove_text_box
01B4: set_player $PLAYER_CHAR frozen_state  0 (frozen)
0050: gosub ££PANCCAM1

:PANCCAM6
0051: return


JGuntherS gebruikt altijd deze thread (met een paar kleine aanpassinkjes) (Als je een deel van deze voorbeeldcode gebruikt zou het wel zo vriendelijk zijn er een verwijzing naar JGuntherS te zetten).

Compileren en in het spel zetten

  • Ga naar Run -> Compile en wees geduldig. Je kunt de status aflezen in de titelbalk. Mission Builder geeft een melding als hij klaar is met compileren.
  • Ga nu naar de map waarin je hem hebt laten decompileren. Daar staan nu de bestanden MAIN.SCM en SCRIPTS.IMG in. Kopieer deze bestanden naar data\scripts.

Testen

  • Dit is ongetwijfeld het makkelijkste deel, maar let op: je kunt je oude savegames niet meer gebruiken (hiervoor heb je een backup gemaakt). Ga naar de plek waar hij zou moeten staan en kijk of dat het geval is.

Problemen oplossen

  • V: Als ik compileer dan krijg ik een foutmelding over mijn #CHEETAH.
  • A: Controleer de spelling, of kijk of er iets mis is met vehicles.ide.
  • V: Als ik compileer dan krijg ik een foutmelding: Parameter 4 not set.
  • A: Je hebt waarschijnlijk komma's ingevuld, waar punten moeten staan in de coördinaten.
  • V: Als ik compileer dan krijg ik een foutmelding over DEFINE MEMORY.
  • A: Pas DEFINE MEMORY (staat op de 4e regel) aan tot de in de foutmelding aangegeven waarde (het mag ook hoger zijn).
  • V: In de MB kan hij INITIAL_1 niet vinden.
  • A: Zet je tekstcursor bovenaan en probeer het opnieuw.
  • V: Ik krijg Opcode out of range: 3004h address: 0000AC6h bij het decompileren.
  • A: Je hebt SASCM.INI niet aangepast.

Extra: een skateboard pick-up

Open melee.dat in de DATA-map van SA en zoek dit stuk:

#START_COMBO    SKATEBOARD
#       ANIMGROUP       sk8_1
#       RANGES  1.6
#       #-----------hit-----chain---radius--hitlevel----damage--hit-altHit--groundLoop
#       ATTACK1  11.0   20.0    0.5  H    10  1 2
#       ATTACK2  11.0   21.0    0.5  H    15  1 2
#       ATTACK3  15.0   99.0    0.5  H    25  1 2
#       AGROUND  10.0   20.0    0.5  G    25  3 3  7.0
#       AMOVING  6.0  10.0      1.0  HL   15  1 2
#       ABLOCK  100.0   100.0
#       #----------------
#       FLAGS  0x007
#END_COMBO


Haal alle hekjes aan het begin van de zinnen weg. Het resultaat is het volgende:

START_COMBO     SKATEBOARD
        ANIMGROUP       sk8_1
        RANGES  1.6
        #-----------hit-----chain---radius--hitlevel----damage--hit-altHit--groundLoop
        ATTACK1  11.0   20.0    0.5  H    10  1 2
         ATTACK2  11.0   21.0    0.5  H    15  1 2
        ATTACK3  15.0   99.0    0.5  H    25  1 2
        AGROUND  10.0   20.0    0.5  G    25  3 3  7.0
        AMOVING  6.0  10.0      1.0  HL   15  1 2
        ABLOCK  100.0   100.0
        #----------------
        FLAGS  0x007
END_COMBO

Sla dit op en open weapons.dat. Zoek het volgende stuk:

£ POOLCUE  MELEE        10.0  1.6       338     -1  1  BBALLBAT 1         1  null
£ KATANA  MELEE 10.0  1.6       339     -1  1  SWORD  1   1  null
#£ SKATEBOARD   MELEE   10.0  1.6       340     -1  1  SKATEBOARD       1         1  null
£ CHAINSAW  MELEE       10.0  1.6       341     -1  1  CHAINSAW 1         201  null

Verwijder het hekje voor de regel met het skateboard:

£ POOLCUE  MELEE        10.0  1.6       338     -1  1  BBALLBAT 1         1  null
£ KATANA  MELEE 10.0  1.6       339     -1  1  SWORD  1   1  null
£ SKATEBOARD    MELEE   10.0  1.6       340     -1  1  SKATEBOARD       1         1  null
£ CHAINSAW  MELEE       10.0  1.6       341     -1  1  CHAINSAW 1         201  null

Sla dit bestand op en open het bestand default.ide. Zoek het volgende stuk:

337, shovel, shovel, null, 1, 50, 0
338, poolcue, poolcue, null, 1, 50, 0
339, katana, katana, null, 1, 50, 0
#340, skateboard, skateboard, null, 1, 50, 0
341, chnsaw, chnsaw, chainsaw, 1, 50, 0

Verwijder weer het hekje voor de skateboard regel:

337, shovel, shovel, null, 1, 50, 0
338, poolcue, poolcue, null, 1, 50, 0
339, katana, katana, null, 1, 50, 0
340, skateboard, skateboard, null, 1, 50, 0
341, chnsaw, chnsaw, chainsaw, 1, 50, 0

Sla dit bestand op. Nu kunnen we een skateboard pick-up creëren in het script. De wapencode voor het skateboard is: #SKATEBOARD. De code om de pick-up te maken wordt dan:

0213: $mijn_skateboard = create_pickup #SKATEBOARD type 15 at 2492.378 -1667.843 13.34375

Zet deze regel op de plek van de vorige hoofdstukken.