Aller au contenu

[tuto] Le Language Scm


Messages recommandés

1. Matériel et conaissances nécessaires

 

1.1 Matériel : Vous aurez besoin de SannyBuilder et de San Andreas

 

1.2 Conaissances : Vous pouvez très bien partir de rien, moi même n'ayant absolument aucune autre notion de code que le SCM

 

2. Création d'un SCM basic

 

2.1 Démarrage : Démarrer SannyBuilder, charger le fichier main.scm contenu dans le dossier */San Andreas/data/script

 

Un chargement va s'effectuer le le main.scm sera chargé, vous pouvez constater la longueur considérable du code (Environ 535.000 lignes). Mais nous n'allons pas travailler sur ce main là, nous allons supprimer l'intégrallité du contenu du fichier (Ctrl + A > Supprimer).

 

Nous allons maintenant inserez ce que j'apelle un Main Basic, c'est un code très court qui ne contient aucune missions aucun paquet cachés etc... On à seulement gardé le scrict minimum.

 

{$VERSION 3.1.0000}

DEFINE OBJECTS 0 

DEFINE MISSIONS 0

DEFINE EXTERNAL_SCRIPTS 0 // Use -1 in order not to compile AAA script
DEFINE UNKNOWN_EMPTY_SEGMENT 0
DEFINE UNKNOWN_THREADS_MEMORY 0

//-------------MAIN---------------
thread 'MAIN' 
042C: set_total_missions_to 0
01F0: set_max_wanted_level_to 6 
00C0: set_current_time 8 0 
0997: (unknown) 1339
set_weather 0
set_wb_check_to 0 
fade 0 10 
select_interior 0 
04E4: unknown_refresh_game_renderer_at 2488.5623 -1666.8645 
Camera.SetAtPos(2488.5623, -1666.8645, 13.3757)
$PLAYER_CHAR = Player.Create(#NULL, 2488.56, -1668.86, 12.87)
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group 
$PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
Camera.SetBehindPlayer
Actor.Angle($PLAYER_ACTOR) = 262.0
wait 1
Player.SetClothes($PLAYER_CHAR, "VEST", "VEST", Torso)
Player.SetClothes($PLAYER_CHAR, "JEANSDENIM", "JEANS", Legs)
Player.SetClothes($PLAYER_CHAR, "SNEAKERBINCBLK", "SNEAKER", Shoes)
Player.SetClothes($PLAYER_CHAR, "PLAYER_FACE", "HEAD", Head)
Player.Build($PLAYER_CHAR)
wait 1
016C: restart_if_wasted at 2027.77 -1420.52 15.99 angle 137.0 unknown 0 
016D: restart_if_busted at 1550.6801 -1675.49 14.51 angle 90.0 unknown 0 
07FB: set_interior 'MADDOGS' accessible 0  // Madd Dogg's Crib
07FB: set_interior 'MDDOGS' accessible 0  // Madd Dogg's Crib
fade 1 1000

 

Inserez ce code dans le main et compliez (F7), cela permet d'enregistrer votre fichier en quelque sorte.

Démarrez une partie (F8 dans Sanny) ou par un racourci (SannyBuilder et le main peuvent rester ouvert).

 

Comme vous pouvez le voir vous commencez près de la maison de CJ et tout est normal sauf qu'il n'y à pas de video d'intro, de missions etc...

 

2.2 Premiers abords :

 

Nous allons maintenant de tenter de comprendre ce language, tout d'abord on remarque qu'il est en Anglais (logique) donc si vous avez du mal avec l'anglais utilisez un outil de traduction.

 

Prennons les choses dans l'ordre :

{$VERSION 3.1.0000}

DEFINE OBJECTS 0  

DEFINE MISSIONS 0

DEFINE EXTERNAL_SCRIPTS 0 // Use -1 in order not to compile AAA script
DEFINE UNKNOWN_EMPTY_SEGMENT 0
DEFINE UNKNOWN_THREADS_MEMORY 0

 

> Sans grand interet

{$VERSION 3.1.0000}

 

DÉFINIR LES OBJETS 0

DÉFINIR LES MISSIONS 0

DÉFINIR l'utilisation -1 de scripts externes 0 // pour ne pas compiler le manuscrit de D.C.A.

DÉFINISSENT UNKNOWN_EMPTY_SEGMENT 0

DÉFINIR UNKNOWN_THREADS_MEMORY 0

 

On passe à la suite qui va être plus qu'interessante, maintenant je ne fais plus une traduction Google (qui reste limité) mais je la fais moi même. Je ne garde que les lignes que j'ai compris / qui sont importantes

 

042C: set_total_missions_to 0
01F0: set_max_wanted_level_to 6 
00C0: set_current_time 8 0 
set_weather 0
fade 0 10 
select_interior 0 
$PLAYER_CHAR = Player.Create(#NULL, 2488.56, -1668.86, 12.87)
$PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
Camera.SetBehindPlayer
Actor.Angle($PLAYER_ACTOR) = 262.0
wait 1
Player.SetClothes($PLAYER_CHAR, "VEST", "VEST", Torso)
Player.SetClothes($PLAYER_CHAR, "JEANSDENIM", "JEANS", Legs)
Player.SetClothes($PLAYER_CHAR, "SNEAKERBINCBLK", "SNEAKER", Shoes)
Player.SetClothes($PLAYER_CHAR, "PLAYER_FACE", "HEAD", Head)
Player.Build($PLAYER_CHAR)
wait 1
016C: restart_if_wasted at 2027.77 -1420.52 15.99 angle 137.0 unknown 0 
016D: restart_if_busted at 1550.6801 -1675.49 14.51 angle 90.0 unknown 0 
07FB: set_interior 'MADDOGS' accessible 0  // Madd Dogg's Crib
fade 1 1000

 

042C: set_total_missions_to 0

042C : C'est le préfixe du code, parfois il n'y est pas car SannyBuilder raccourci l'Opcode

set_total_mission_to 0 : Il n'y a aucune mission

 

01F0: set_max_wanted_level_to 6 : Le niveau maximal de recherche est de 6 (si la valeur est à zero on ne peut plus avoir de police au trousses)

 

[...]

 

fade 0 10 : Fade = fondu, un fondu c'est quand on passe du transparent vers une couleur, d'une couleur vers du transparent ou d'une couleur vers du transparent. C'est une sorte de calque qu'on rajoute par dessus l'écran. Un fade 0 sera un fondu qui ira du transparent vers le noir. Un fade 1 sera un fondu qui ira du noir vers le transparent (par défault). La deuxième valeur est exprimé en milisecondes (1000 ms = 1s)

 

fade 0 10 : Fondu du transparent vers le noir en 10 milisecondes

fade 1 1000 : Fondu du noir vers le transparent en 1 seconde

 

[...]

 

$PLAYER_CHAR = Player.Create(#NULL, 2488.56, -1668.86, 12.87)

$PLAYER_CHAR = Joueur (nous) Cet opcode détermine l'endroit ou vous apparaitrez dans le jeu, les coordonées se font suivants les axe X Y et Z. (Dans l'exemple on apparaissera devant la maison de CJ)

 

[...]

 

016C: restart_if_wasted at 2027.77 -1420.52 15.99 angle 137.0 unknown 0

016D: restart_if_busted at 1550.6801 -1675.49 14.51 angle 90.0 unknown 0

 

Wasted = Mort

Busted = "Choppé"

 

--

 

De cette facon, la plupart des Opcodes sont compréhensibles, même si certains restent de mystères pour vous et aussi pour moi. (Vous pouvez toujours me demander par MP au cas ou je saurais)

 

--

Les valeurs de temps sont exprimées en milisecondes.

Opcode = Syntaxe d'une ligne, action ou constation, ensembles de toutes les choses possibles dans San Andreas.

 

By Vicolaships

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

Une suite est à venir, en attendant, j'aimerais avoir des commentaires. Mais si vous prenez le droit de critiquer mon tutorial, alors vous prenez le devoir d'expliquer pourquoi. Cela dit, dire que c'est bien fait toujours plaisir...

 

Merci d'avance !

Lien vers le commentaire
Partager sur d’autres sites

Déjà merci pour ce tuto, c'est très clair, je suis d'accord qu'on le déplace dans la partie tuto, mais je ne sais plus comment le faire. :-/

 

Ton explication est très claire, simple et efficace, j'ai tout pigé, donc on peut dire que n'importe qui devrait y arriver. :D J'aurais cependant aimé un peu plus d'explication en ce qui concerne :

 

select_interior 0

 

Player.SetClothes($PLAYER_CHAR, "VEST", "VEST", Torso)

J'ai pigé que c'est la veste qu'il a, mais je ne pige pas vraiment comment et d'où viennent les variables et qu'on termine en validant sa tenue par Player.Build($PLAYER_CHAR)

 

Vala, vivement la suite!

Lien vers le commentaire
Partager sur d’autres sites

select_interior 0

 

Cet Opcode veut dire : Choisir interieur 0 c'est a dire dehors, chaque batiment a un numero d'gnterieur. Donc si tu teleportes ton joueur dans un batiment il ne faut pas oublier de charger l'interieur batiment ou sinon ca affichera que dehors et tu marcheras sur des objets non affiches.

 

Pour avoir ce genre de renseignements il faut fouiller dans data, par exemple on peut trouver les IDs vehicule etc...

 

Bin je pense que ce dernier opcode fait juste la liaison entre les elements. Merci !

Lien vers le commentaire
Partager sur d’autres sites

Merci pour avoir encore raccourci mon main.scm basic ! :D mais je tient à signaler que les coders

ne pourrons plus utiliser des opcodes du genre :

 

Créer un objet

Créer un pickup (vies,étoiles,...)

 

Si mais il faut juste rajouter la définition de l'objet, ca fait quand même économiser 300 lignes :)

Je pense que mon deuxième tutorial sera publié ce soir, le thème sera : Création d'une mission simple

Lien vers le commentaire
Partager sur d’autres sites

Créér une mission simple

 

Ce tutorial est la suite du tutorial "Le language SCM". Il est conseillé de l'avoir lu pour pouvoir faire ce tutorial.

 

1. Création du SCM

  • Démarrez Sanny Builder
  • Crééz un SCM Basic (cf: tuto précédent)
  • Il va falloir ajouter une mission, c'est à dire un marqueur rouge de début de mission, mais aussi du contenu et une fin.
2. Création de la mission
  • Pour créér une mission, nous n'allons pas utilisez la ligne "DEFINE MISSIONS 0" et créé une mission comme dans le jeu, car pour certaines choses le jeu bug (je ne sais pas pourquoi), le genre de bug peut être par exemple lors de la création d'un personnage, on veut en créér un seul et le jeu en créér 3 :ph34r: (Ce qui entraine des bugs si vous dites à celui de monter dans un véhicule)

     

  • Nous allons tout simplement mettre notre mission (ou script) juste derrière le main et entre le "end_thread" qui signale la fin de lecture (si la mission est mise après elle ne sera pas lue).

     

    Mais on ne va pas mettre notre mission comme ca, entre 2 paragraphes, il va falloir créé ce que l'on appelle un "Label". Pour le créér, rien de plus simple > ":Nomdulabel123" (Lettres et chiffres acceptées).

    Pour une meilleur relecture on l'appellera : ":Mission01"

     

  • Pour créér une mission avec un marqueur il faut chercher l'ocpode qui permet de créé un marqueur, on pourrait chercher "marker" qui serait logique mais dans cas ce n'est pas logique, il faut chercher dans "sphere" jusqu'a trouver la ligne : "03BC: 20@ = create_sphere 2009.0 -1491.30 3.45 5.0"
Note: Pour chercher un Opcode, soit vous faites la combinaison Ctrl + Alt + 2 dans SannyBuilder soit vous faites la recherche dans le bloc note en ouvrant le fichier des Ocpodes (contenu dans le dossier de Sanny Builder)
  • Nous allons transformer l'ocpode en ce que j'appellerais un opcode "litéral" qui ne marche pas dans le jeu. Le principe est simple, transformer toutes les valeurs numériques en lettres.

     

    Ce qui donne : "03BC: X@ = create_sphere X Y Z B"

     

    X = Numero du marqueur (/de la sphere)

    X Y Z = Coordonées du marqueur

    B = Rayon de la sphere

Note: Les coordonnées sont toujours notées X, Y et Z qui corresepondent au 3 axes qui permettent de placer un objet dans un espace par rapport à un repère 0
  • Nous allons maintenant transformer l'opcode pour qu'il puisse marcher dans le jeu, un opcode littéral permet seulement d'y voir plus clair quand on ne le comprend pas.

    On prendra :

    X= 1

    X Y Z = 2485.5 -1658.86 12.88

    B = 2.0

Il faut ensuite inserez cette ligne derrière (et à la ligne) ":Mission01" mais avant "end_thread"

On rajouteras aussi un "wait 100" entre le label et l'opcode, dès fois sans le wait le jeu bug...

 

Note: Pour créér des coordonnées, j'utilise SA Place Manager qui est utilie mais il faut lancer le jeu à chaque foi pour créér des coordonées, ce qui est long...

  • Nous avons créé notre marqueur, si vous démarrez le jeu (Coordonnées de création de CJ :2480.0 -1658.86 12.88) et que vous allez dans le marqueur, rien ne se passe, logique...

  • Nous allons maintenant créér une condition, c'est un point essentiel pour coder, si vous ne savez pas créér une condition vous n'arriverez pratiquement à rien...

     

    Voici le mode de fonctionement d'une condition :

     

    :X

    if

    CONDITION

    jf @X

    EXECUTION

     

    X= Nom du label

     

    On créé toujours un nouveau label pour une condition. (on le met à la suite). Si le nom de label est "C123" alors la ligne "jf @Label" deviendra "jf @C123"

     

    En fait si je traduis en français "compréhensible" cela donne : Si la condition est remplie, alors passer à l'execution/ Si la condition est remplie, alors faire les actions.

    Un exemple : Si le joueur marche, alors donner au joueur 100$ (ce qui est un peu bête je le reconnais)

     

  • Maintenant, il faut adapter ce "script" pour qu'il fonctionne sous San Andreas, notre but (ce que vous ne savez pas encore) c'est de créér :

     

    Si le joueur est arreté sur le marqueur (a pied), alors démarrer une mission

    Mais "démarer une mission" c'est un peu simple, cela se traduit par : Fondu vers le noir, destruction du marqueur pendant le fondu, et fondu vers le transparent.

     

    Cela donne en cherchant dans les opcodes (J'ai pas tout mis en litéral)

     

    :Label

    wait 100

    if

    0101: actor A stopped_near_point X Y Z radius B B B' sphere 1

    jf @Label

    wait 250

    fade 0 500

    wait 1000

    03BD: destroy_sphere X@

    wait 1000

    fade 1 500

     

    A= Acteur dont la condition dépendra

    X Y Z = C'est les coordonées ou on à créé le marqueur

    B B B' = Là vous me direz que c'est bizarre un diamètre avec 3 coordonées. En fait les 2 premières on met la même chose, le dernier ce sera le plan Z (la hauteur) on met donc 10 comme ca même si la coordonée Z qu'on à prise est pas très précise ca marchera.

  • Passons aux valeurs numériques : (Même s'il y en avait déjà avant)

     

    :ConditionMission

    wait 100

    if

    0101: actor $PLAYER_ACTOR stopped_near_point 485.5 -1658.86 12.88 radius 2.0 2.0 10.0 sphere 1

    jf @ConditionMission

    wait 250

    fade 0 500

    wait 1000

    03BD: destroy_sphere 1@

    wait 1000

    fade 1 500

     

    Voilà qui est fait, on insere le label avant le "end_thread" et après le label "Mission01"

     

  • Du début jusqu'ici on obitient le petit (très petit) script suivant :

     

    :Mission01

    wait 100

    03BC: 1@ = create_sphere 2485.5 -1658.86 12.88 radius 2.0

     

    :ConditionMission

    wait 100

    if

    0101: actor $PLAYER_ACTOR stopped_near_point 2485.5 -1658.86 12.88 radius 2.0 2.0 10.0 sphere 1

    jf @ConditionMission

    wait 250

    fade 0 500

    wait 1000

    03BD: destroy_sphere 1@

    wait 1000

    fade 1 500

3. Contenu de la mission

... A venir...

 

--

La partie 2 du tutorial est a venir, mais c'est très long de faire ce genre de chose (j'y ai passé mon mercredi après midi). Si vous avez repéré quelque chose de fau, dites le moi par MP que je corrige ca dans le tutorial que j'enverai à Mimiduchat en entier plus tard.

Lien vers le commentaire
Partager sur d’autres sites

ça l'air bien, ça se complique un peu, jai pas encore vraiment testé, jai pas beaucoup de temps de libre.

 

j'ai hâte d'essayer tout ça

Si t'as un problème hésite pas à poser de questions.

 

Autrement ce que je voulais savoir c'est si vous préferiez la présentation du premier tutorial ou du second ? (C'est pas facile à présenter mine de rien...)

Lien vers le commentaire
Partager sur d’autres sites

salut,

BRAVO ! :clap: pour ces tutos jusqu'ici j'ai tout compris (enfin je croit :rolleyes: )

en plus cé tout très bien expliqué et bien organisé. Encore bravo !

 

Puisque tu voulait le savoir je trouve que le second tutorial est mieux au niveau de la présentation. Tu fait comme tu veut de moment qu'on arrive à comprendre :D

 

Continu comme ça car il me tarde la suite pour faire du contenu dans les missions. Pour l'instant j'ai essayé de comprendre comment on fait les développeurs de GTA mais j'ai rien pigé à leur code. Ils sont pas logique :blink: ou alors cé moi qui le suis pas :huh:

 

Bonne continuation...

Lien vers le commentaire
Partager sur d’autres sites

Continu comme ça car il me tarde la suite pour faire du contenu dans les missions. Pour l'instant j'ai essayé de comprendre comment on fait les développeurs de GTA mais j'ai rien pigé à leur code. Ils sont pas logique :blink: ou alors cé moi qui le suis pas :huh:

 

Bonne continuation...

 

Salut ! Merci, bin je présenterais mes prochains tutoriaux à la facon du 2e. Moi aussi je trouve que les codes sont parfois pas très logiques, mais ya pas besoin d'atteindre leur niveau pour faire une mission assez complexe...

 

PS: Bienvenue sur Macreacity :)

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
×
×
  • Créer...