Aller au contenu


Photo
- - - - -

[sa] Création D'une Mission Simple


  • Veuillez vous connecter pour répondre
Aucune réponse à ce sujet

#1 Vicolaships

Vicolaships

    .:: MacreaCodeur ::.

  • MacreaCitizen
  • PipPipPipPipPip
  • 2422 messages

Posté 26 August 2008 - 01:10 PM

Création d'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 SannyBuilder puis créez 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

2.1 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éer un seul et le jeu en créer 3 (Ce qui entraine des bugs si vous dites à celui de monter dans un véhicule)

2.2 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éer, rien de plus simple > ":Nomdulabel123" (Lettres et chiffres acceptées). Pour une meilleur relecture on l'appellera : ":Mission01"

2.3 Pour créer une mission avec un marqueur il faut chercher l'ocpode qui permet de créer un marqueur, on pourrait chercher "marker" qui serait logique mais dans cas ce n'est pas logique, il faut chercher dans "sphere" jusqu'à 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 , le principe est simple, transformer toutes les valeurs numériques en lettres pour mieux comprendre :
Ce qui donne : "03BC: X'@ = create_sphere X Y Z B"
X' = Numéro du marqueur (/de la sphere)
X Y Z = Coordonnées du marqueur
B = Rayon de la sphere

Note: Les coordonnées sont toujours notées X, Y et Z qui correspondent 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 insérer 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 Ctrl + Alt + 1 (jeu lancé) dans SannyBuilder.

2.4 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éer une condition, c'est un point essentiel pour coder, si vous ne savez pas créer une condition vous n'arriverez pratiquement à rien...

Voici le mode de fonctionnement d'une condition :
Code
: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'exécution/ Si la condition est remplie, alors faire les actions.
Un exemple : Si le joueur marche, alors donner au joueur 100$.

2.5 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éer :
Si le joueur est arrêté sur le marqueur (a pied), alors démarrer une mission. Mais "démarrer 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 littéral)
Code
: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 500wait 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 coordonné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 coordonné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)
Code
: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

2.6 Voilà qui est fait, on insère le label avant le "end_thread" et après le label "Mission01". Du début jusqu'ici on obtient le petit (très petit) script suivant :
Code
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

3.1 Maintenant que nous avons notre début de missions il faut y ajouter du contenu, je vous propose quelque chose de très simple: Un personnage est créé et on doit se battre contre lui, si le joueur tue l'ennemi il remporte 500$ et un Uzi et s'il se fait tuer il réapparait avec seulement 50 de vies.

3.2 Tout d'abord il va falloir créer l'ennemi, on va le créer pendant le fade pour ne pas le voir se créé, voilà la suite d'opcodes :
Code
Model.Load(#X)
038B: load_requested_models
wait 10
009A: $A = create_actor 23 #X at X Y Z

Pour savoir quel personnage prendre on va utiliser le fichier peds.ide (GTA SA > Data). On choisira le piéton BALLAS1.

Ce qui nous donnera la suite d'ocpodes :
Code
Model.Load(#BALLAS1)
038B: load_requested_models
wait 10
009A: $ENNEMI = create_actor 23 #BALLAS1 at 2485.5 -1650.0 13.0

3.3 Maintenant il faut donner à l'acteur une arme et lui dire d'attaquer, pour donner une arme on utilisera la suite d'ocpode suivante :
Code
Model.Load(#X)
038B: load_requested_models
wait 10
01B2: give_actor $ENNEMI weapon X ammo Z

On charge le modèle de l'arme avant de l'utiliser sinon l'arme n'apparaitra pas et dès que le joueur essayera de l'utiliser le jeu bugera.
Pour savoir les noms d'armes on utilise le fichier "[SA] Weapon numbers.txt" fourni avec SannyBuilder (Dossier help)

On donnera a l'ennemi une batte :
Code
Model.Load(#BAT)
038B: load_requested_models
wait 10
01B2: give_actor $ENNEMI weapon 5 ammo 1


3.4 Autant regrouper le tout pour faire plus court et plus lisible, ce qui donne :
Code
Model.Load(#BALLAS1)
Model.Load(#BAT)
038B: load_requested_models
wait 10
009A: $ENNEMI = create_actor 23 #BALLAS1 at 2485.5 -1650.0 13.0
01B2: give_actor $ENNEMI weapon 5 ammo 1

3.5 Maintenant nous allons dire à cet ennemi d'attaquer le joueur car pour l'instant il ne fait rien. On créera aussi un marker sur celui-ci pour voir la cible
On utilisera l'opcode :05E2: AS_actor $ENNEMI kill_actor $PLAYER_ACTOR
Il est préférable de le placer après le fade pour ne pas se faire attaquer pendant que l'écran est noir

On utilisera l'opcode : 0187: $MARKER_ENNEMI = create_marker_above_actor $ENNEMI
On le met avant ou après le fade, comme on veut...

> Ne pas oublier de mettre des "wait 10" ou sinon le jeu buggera

3.6 Maintenant il va falloir faire 2 conditions en même temps, c'est là que ce compliquent les choses...
Si le joueur tue l'ennemi alors mission accomplie et le joueur gagne 500$ et un UZI et s'il se fait tuer il réapparait avec seulement 50 de vies.

On va utiliser la suite d'opcode ci-dessous :
Code
...
Create_thread @Joueur_gagne
Create_thread @Joueur_perd

:Joueur_gagne
03A4: name_thread 'GAGNE'
wait 100
if
Actor.Dead($ENNEMI)
jf @Joueur_gagne
wait 10
Marker.Disable($MARKER_ENNEMI)
wait 1000
Model.Load(#MICRO_UZI)
038B: load_requested_models
wait 10
01B2: give_actor $PLAYER_ACTOR weapon 28 ammo 1000
jump @Fin

:Joueur_perd
03A4: name_thread 'PERD'
wait 100
if
Actor.Dead($PLAYER_ACTOR)
jf @Joueur_perd
wait 10
Marker.Disable($MARKER_ENNEMI)
00BA: text_styled 'M_FAIL' 5000 ms 1 // Mission ratée !
wait 10000
0223: set_actor $PLAYER_ACTOR health_to 50
wait 500
jump @Fin

:Fin
wait 100
end_thread_named 'GAGNE'
wait 100
end_thread_named 'PERD'
wait 100
05BE: AS_kill_actor $ENNEMI

Le create_thread sert à lire plusieurs labels en même temps (d'habitude ils sont lus à la suite). C'est à dire que les labels Joueur_gagne et Joueur_perd seront lus en même temps

Le jump @Fin sert à ce que si le label Joueur_gagne est activé le label Joueur_perd ne soit pas lu 2 fois. Et le label @Fin désactive les deux labels précédents grâce à la fonction end_thread_label


Par Vicolaships





0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)