Construire un bombardement (multi et solo)
ou utiliser les notion de "vecteurs" et de variables "local".

Retour au sommaire

Tutorial, map et script écrits par : Tropheus


Imaginez-vous sous une pluie de bombes sans jamais pouvoir prévoir l'endroit où elles vont tombées. Et bien c'est ce que nous allons réaliser.

Bon tout d'abord, une petite mise au point.

Qu'est ce qu'une variable ? C'est tout simplement un nom qui permet de garder une valeur numérique sans écrire de nombre.

Qu'est ce qu'une variable "local" ? C'est une variable qui n'est utilisable que dans le thread où elle est créée.

Qu'est-ce qu'un vecteur (vector en anglais) ? C'est la définition d'un point dans l'espace, c'est à dire ses coordonnées. Ici comme on est dans un jeu en 3D le vecteur comporte 3 valeurs. Une valeur pour X, une pour Y et une pour Z (dans cet ordre.)

L'intérêt de combiner variable et vecteur c'est qu'on peut modifier à loisir les coordonnées du vecteur.

Pour plus de précision allez voir de ce côté. Langage MOHAA.

Bon mais revenons à nos moutons.

1/ Partie mapping.

Pour cela rien de particulier une map habituelle worldspawn, info_player_start, etc... Simplement, ici j'ai mis un petit brush au centre de la map (comme un pieu). Qui n'a rien de particulier sauf qu'on le transforme en "script_object" (brush sélectionné/clicdroit en 2D/script/object) Avec les key et value suivantes :
targetname / refer (ou tout autre nom)
Ce script_objet sera notre point de référence pour faire exploser les bombes. Nous les ferons exploser dans un périmètre de 200 unités mohaa à gauche, 200 à droite, 200 devant et 200 derrière soit un carré de 400 unités de côté (pas au-dela).


2/ Scripting.

Je pense que pour maintenant il est inutile de vous dire d'ouvrir notepad.Mais bon, ouvrez-le quand même !!!

a/ scripting solo

La map étant appelée "test_explo" vous allez appeler votre script "test_explo.scr". Et vous allez écrire ceci.

//mapping by Tropheus
//scripting by Tropheus

exec global/ai.scr
exec global/loadout.scr maps/test_explo.scr
main:
     level waittill prespawn
        exec global/ambient.scr test_explo
        exec global/exploder.scr
    level waittill spawn
        $player item weapons/colt45.tik
        $player ammo pistol 1000
        thread random_explode
    level.script="map/test_explo.scr"
end
//////////////////////////////
random_explode:
    local.target=$refer
    local.a=local.target.origin
    local.b=randomint (100)
        if (local.b < 25)
            {
            local.a[0]=local.a[0] - randomint (200)
            local.a[1]=local.a[1] - randomint (200)
            }
        else if (local.b < 50 && local.b >=25)
            {
            local.a[0]=local.a[0] + randomint (200)
            local.a[1]=local.a[1] + randomint (200)
            }
        else if (local.b > 50 && local.b <= 75)
            {
            local.a[0]=local.a[0] - randomint (200)
            local.a[1]=local.a[1] + randomint (200)
            }
        else if (local.b > 75)
            {
            local.a[0]=local.a[0] + randomint (200)
            local.a[1]=local.a[1] - randomint (200)
            }
    local.exp1=spawn "fx/scriptbazookaexplosion.tik"
    local.exp2=spawn "animate/fx_mortar_dirt.tik"
    local.exp3=spawn "animate/fx_mortar_higgins.tik"
    local.exp1.origin=local.a
    local.exp1 anim start
    local.exp2.origin=local.a
    local.exp2 anim start
    local.exp3.origin=local.a
    local.exp3 anim start
wait(1 + ((randomint(5))*.2))
    local.exp1 remove
    local.exp2 remove
    local.exp3 remove
goto random_explode
end

Ne vous prenez pas la tête, n'allez pas chercher de quoi vous détendre, voici la solution. Après seulement vous appalaudirez l'artiste.

//mapping by Tropheus//l'auteur
//scripting by Tropheus//l'auteur

exec global/ai.scr
exec global/loadout.scr maps/test_explo.scr
main:
level waittill prespawn
exec global/ambient.scr test_explo
exec global/exploder.scr//charge les scripts liés aux explosions
level waittill spawn
$player item weapons/colt45.tik
$player ammo pistol 1000
thread random_explode//envoie à la partie du script (thread) qui code les explosions. Si on décide d'activer le thread par un trigger il faut enlever cette ligne.
level.script="map/test_explo.scr"
end
//////////////////////////////codage des explosions////////////////////////////////////
random_explode://Nom du thread
//////définition des variables//////////
local.target=$refer//Ici on crée une première variable local "local.target" qui prend pour valeur le script_object ($refer)
local.a=local.target.origin//Ici on crée une seconde variable "local.a" qui va nous servir pour changer les coordonnées des explosions. "local.a" aura les valeurs de l'origine du script_object. C'est à dire ses coordonnées.
local.b=randomint (100)//Ici on crée une troisième variable "local.b" qui prendra une valeur entiére au hasard entre 0 et 100. Elle nous servira simplement pour définir au hasard la partie du carré qui sera visé.
//////calcul de l'endroit des explosions//////dans l'ordre du script, carré A puis C puis B puis D sur le schéma//////////
if (local.b < 25)//Si local.b est plus petit que 25 alors, mohaa utilisera cette partie du code => explosion dans A
{
local.a[0]=local.a[0] - randomint (200)//Ici grâce à [0] on a accès à l'abscisse (valeur X) du script_objet. "local.a[0] posséde au départ donc au départ la valeur de l'X du script_object, mais ici on lui assigne autre valeur qui sera cette valeur moins un nombre aléatoire compris entre 0 et 200.
local.a[1]=local.a[1] - randomint (200)//Idem pour Y. Ceci grâce à [1]
}
else if (local.b < 50 && local.b >=25)//Si "local.b" est compris entre "25" et "50"alors, mohaa utilisera cette partie du code => explosion dans C
{
local.a[0]=local.a[0] + randomint (200)//id mais avec + une valeur comprise entre 0 et 200
local.a[1]=local.a[1] + randomint (200)//id mais avec + une valeur comprise entre 0 et 200
}
else if (local.b > 50 && local.b <= 75)//Si "local.b" est compris entre "50" et "75" alors, mohaa utilisera cette partie du code => explosion dans B.
{
local.a[0]=local.a[0] - randomint (200)
local.a[1]=local.a[1] + randomint (200)
}
else if (local.b > 75)//Si "local.b" est supérieure a "75" alors, mohaa utilisera cette partie du code => explosion dans D.
{
local.a[0]=local.a[0] + randomint (200)
local.a[1]=local.a[1] - randomint (200)
}
////////définition des explosions////////////////////////
local.exp1=spawn "fx/scriptbazookaexplosion.tik"//on utilise encore une variable. La variable local.exp1 a la valeur "naissance" de la fx "bazookaexplosion".
local.exp2=spawn "animate/fx_mortar_dirt.tik"//idem mais avec la fx mortar_dirt.tik
local.exp3=spawn "animate/fx_mortar_higgins.tik"//idem mais avec la fx mortar_higgins.tik
Ici on fait un amalgame de 3 explosions une seule suffirait, mais les 3 combinées on a un meilleur rendu de l'explosion.
///////////////////Définition des endroits des explosions//////////////////

local.exp1.origin=local.a//L'origine (coordonnées) de la variable local.exp1 (qui est de faire apparaitre l'explosion du bazooka) prendra la valeur de local.a que l'on vient de modifier dans la partie au-dessus.
local.exp1 anim start//lance l'animation
local.exp2.origin=local.a//idem pour la seconde animation
local.exp2 anim start//lance l'animation
local.exp3.origin=local.a//idem pour la troisème animation
local.exp3 anim start//lance l'animation
wait(1 + ((randomint(5))*.2))//temps d'attente entre 2 série d'explosions là aussi au hasard mais avec toujour au moins 1 seconde entre chaque explosion. Mais avec l'ajout d'une valeur comprise entre 0 et 5 multiplier par 0.2 soit 1. Donc la série d'explosions suivante arrivera dans une durée comprise entre 1 et 2 (1+1) secondes.
local.exp1 remove//enlève la première animation
local.exp2 remove//enlève la seconde animation

local.exp3 remove//enlève la troisième animation
goto random_explode//on retourne au départ. On a une boucle.
end

Bon alors vous voyez, il n'y a pas de quoi devenir chèvre ou de fumer 5 paquets de cigarettes.

Téléchargez le pk3 solo.

b/ Scripting multiplayer

Toujours avec le même logiciel. Ecrivez ceci. Ici ce n'est pas la peine de d'expliquer, c'est la même chose qu'au-dessus.

//mapping : Tropheus
//scripting : Tropheus

main :
// set scoreboard messages

        setcvar "g_scoreboardpic" "none"
    level waittill prespawn

//*** Precache Dm Stuff

        exec global/DMprecache.scr
        thread random_explode

    level.script = maps/dm/test_explo_multi.scr
    level waittill spawn

end
/////////////////////////////////////
random_explode:
    local.target=$refer
    local.a=local.target.origin
    local.b=randomint (100)
        if (local.b < 25)
            {
            local.a[0]=local.a[0] - randomint (200)
            local.a[1]=local.a[1] - randomint (200)
            }
        else if (local.b < 50 && local.b >=25)
            {
            local.a[0]=local.a[0] + randomint (200)
            local.a[1]=local.a[1] + randomint (200)
            }
        else if (local.b > 50 && local.b <= 75)
            {
            local.a[0]=local.a[0] - randomint (200)
            local.a[1]=local.a[1] + randomint (200)
            }
        else if (local.b > 75)
            {
            local.a[0]=local.a[0] + randomint (200)
            local.a[1]=local.a[1] - randomint (200)
            }
    local.exp1=spawn "fx/scriptbazookaexplosion.tik"
    local.exp2=spawn "animate/fx_mortar_dirt.tik"
    local.exp3=spawn "animate/fx_mortar_higgins.tik"
    local.exp1.origin=local.a
    local.exp1 anim start
    local.exp2.origin=local.a
    local.exp2 anim start
    local.exp3.origin=local.a
    local.exp3 anim start
wait(1 + ((randomint(5))*.2))
    local.exp1 remove
    local.exp2 remove
    local.exp3 remove
goto random_explode
end

Voila de quoi vous faire bombarder en solo comme en multi.

Télécharger le pk3 multi

c/ Variantes.

Il se peut que vous soyez intéressé de faire exploser vos bombes dans un périmètre autour de votre joueur.

Rien de plus facile, au-debut du thread il suffit de changer la valeur de la variable local.target en ceci :

Local.target=$player

Vous pouvez faire la même chose avec n'importe quel objet, mais aussi avec un script_origin qui n'apparait pas à l'écran. La valeur étant le nom donné à l'objet.

Auteur Tropheus

Retour au sommaire