Aller au contenu


[Script] Associer un script à un sort


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

#1 Lord Mortim

Lord Mortim

    Spontanément magique


Posté 18 juin 2003 - 19:30

Le TESCS ne permet pas de le faire directement aussi faut-il passer par une petite astuce.

Méthode

Il existe plusieurs méthodes pour ce faire, voici, à mon avis la plus simple.

L'idée est de faire tourner un script global testant si le joueur est affecté par un sort que l'on aura créer à l'avance, cela à l'aide de la fonction GetSpellEffect. Si c'est le cas, le script global lancera le script que l'on souhaite associer au sort en question ou executera directement les instructions si elles sont assez courtes.

Exemple

Ici on va créer un sort qui affiche l'heure (c'est nul je sais mais c'est pour l'exemple :D ).

Etape 1

On créer un sort "horloge mystique" avec l'effet : Réduction de magie, perso, 0 points, 0 secondes.

Etape 2

On créer un script global "gestion_sort" :

Begin Gestion_Sort


; Si le joueur est affecté par le sort

if( player -> getSpellEffect "horloge mystique" == 1 )



    ; On affiche l'heure

     messageBox "Au troisième toc il sera %GameHour"



endif



End

Etape 3

Lancer le script global, soit à partir d'un autre script ou d'un dialogue, soit en l'insérant dans les "start script" si vous avez le tescs version tribunal.

Attention : Si vous utilisez l'option start script, votre mod sera Tribunal requis. Le mieux est donc de se débrouiller pour lancer votre script autrement dans la mesure du possible.

Approfondissement

Si vous souhaitez créer plusieurs sorts de ce type, vous vous rendrez vite compte que le script global devant tester l'activation des sorts deviendra vite lourd, avec une instruction minimum (le test d'activation) par sort ainsi "scripté" et par boucle d'exécution.

Ainsi si vous avez N sorts scripté, votre script global exécutera N instructions (les tests d'activation) par tour d'exécution lorsque le joueur n'utilise pas ces sorts.

Une façon simple d'optimiser cela consiste à ajouter à tout vos sorts un effet commun, dont on est à peu près sur qu'il n'affectera pas en permanence le joueur, et de faire un premier test sur cet effet avant de tester l'activation des sorts au cas par cas. On réduit ainsi le script à 1 instruction par boucle d'execution lorsque le joueur n'utilise pas ces sorts, ce qui est très interressant vu que la majeure partie du temps, les tests d'activation des sorts seront faux.

Notre script générique aura à peu près cette tête :

Begin Gestion_Sorts


; si le joueur n'est pas sous l'effet d'une réduction de magie, on est sur
;qu'il n'est sous l'effet d'aucun de nos sorts scriptés, donc inutile de continuer



if( player -> getEffect "sEffectDamageMagicka" )



     if( player -> getSpellEffect "sort1" == 1 )



          startscript script1



     elseif( player -> getSpellEffect "sort2" == 1 )



          startscript script2



     elseif...



          ...



     endif



endif



End

Et voilà, on a ainsi un script générique pour ajouter de nouveaux effets inédits.

Une application directe à cette méthode : la magie dégressive, ou ces sorts que l'on peut activer/désactiver.

L'algo :

Si le joueur lance le sort machin

     Si il possède la capacité machin_effets

          On lui enlève

     sinon

          On lui ajoute

Exemple tiré de Nova Magica pour le sort Ailes du Vent

Le sort Ailes du vent doit possèder l'effet lévitation 50 points sur le perso, et être dégressif, c'est à dire qu'il n'a pas de durée prédéfinie mais qu'il va drainer petit à petit a magie du joueur tant que celui-ci n'y met pas fin, en le relançant.

On crée un premier sort "_MD_Ailes du Vent" avec comme effets lévitation, perso, 50 points, 0 secondes, et Réduction de magie, perso, 0 points, 0 secondes. (Note : l'effet de lévitation n'est mis qu'à titre indicatif pour le joueur, l'effet de réduction pour les raisons d'optimisation citées plus haut).

On crée un deuxième sort "_MDe_Ailes du Vent" de type capacité, c'est à dire permanent, avec comme effet lévitation 50 points.

Dans notre script global, on implémente simplement l'algo donné plus haut :

Begin MagieDegressive



short concentration

short timer


; Si l'indicateur de concentration est supérieur à 0, c'est qu'un sort de
;magie degressive est actif, auquel cas on draine la magie du joueur.

if( concentration > 0 )

     set timer to ( timer + getSecondsPassed )

     if( timer >= 1 )

          player->modMagicka -1

     endif

endif


; Ici commencent les test d'activation des sorts

if( player -> getEffect "sEffectDamageMagicka" == 1 )



[...]



     if( player->getSpellEffects "_MD_AilesDuvent" )

         ; Si l'effet n'est pas actif

          if( player->getSpellEffects "_MDe_AilesDUVent" = 0 )

              ; on l'active et on met l'indicateur de concentration(perte de mana progressive) à 1

               player->addSpell "_MDe_AilesDuVent"

         ; s'il est déjà actif

          else

              ; on le désactive et on met le compteur de concentration à 0

               player->removeSpell "_MDe_AilesDuVent"

               Set concentration to 0

          endif

     endif

End





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

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