Potion de faiblesse

Répondre
Partager Rechercher
Salut, j'ai un souci pour créer une potion qui puisse augmenter certaines caractéristiques tout en en diminuant d'autres ... en effet je ne trouve pas dans les sorts ceux qui pourraient me permettre d'abaisser temporairement les caractéristiques du buveur.

Quelqu'un aurait-il une idée ?
Il faut utiliser les fonctions Effectxxx pour créer un effet.

Par exemple :
Code PHP:

// Create a Skill Decrease effect.
// * Returns an effect of type EFFECT_TYPE_INVALIDEFFECT if nSkill is invalid.
effect EffectSkillDecrease(int nSkillint nValue); 
On peut utiliser une des constantes SKILL_xxxx pour la variable nSkill par exemple SKILL_CONCENTRATION.

Il y a une bonne trentaine de fonctions Effectxxx au choix!

Ensuite l'appliquer à la cible, par exemple ce script rend ivre plus ou moins longtemps en fonction de la boisson bue :

Code PHP:

// apply effect based on the drink the player has chosen, the stronger drink, the longer the effect.
// 1 : beer, 2: wine, 3: ouzo

void main(int nDrink)
{
    
object oPC GetFirstPC();
    
effect eDrink EffectDazed();

    
float fDuration nDrink*3600.0f;
    
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeDrinkoPCfDuration); 

Merci pour cette réponse rapide.

J'ai bien vu un "Effectabilitydeacrease" mais je ne crois pas que ça corresponde à une baisse des caractéristiques (Force, Endurance , etc).

J'essaierai quand même pour voir comment ça fonctionne vraiment.
Pour les caractéristiques c'est bien EffectAbilityDecrease

en passant une constante ABILITY_xxxx, par exemple ABILITY_STRENGTH

Code PHP:

// Create an Ability Decrease effect.
// - nAbility: ABILITY_*
// - nModifyBy: This is the amount by which to decrement the ability
effect EffectAbilityDecrease(int nAbilityint nModifyBy); 
Je n'ai pas encore eu le temps de tester (je me disperse beaucoup trop ...) mais je me demandais si on pouvait affecter temporairement une valeur à une caractéristique (ce qui est en fait ce à quoi je veux arriver).

Je m'explique, par exemple un potion qui monte la force à 20 et qui diminue l'intelligence à 5 (quelle que soit la valeur de départ).
Tu peux utiliser GetAbilityScore pour déterminer la valeur de la caractéristique, il y a une option pour prendre en compte ou pas les bonus. Cela permet de calculer le nombre de points à ajouter ou retrancher.
Avec l'exemple pour l'intelligence sur le PJ, pour un effet de 1h :

Code PHP:

int nDelta GetAbilityScore(oPCABILITY_INTELLIGENCEFALSE) - // ne tient pas compte des bonus

if (nDelta>0)
{
     
effect eInt EffectAbilityDecrease(ABILTY_INTELLIGENCEnDelta);
     
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeIntoPC3600f);

C'est possible avec le système TagBased qui doit être activé dans ton module.
Voir : https://forums.jeuxonline.info/showthread.php?t=829017

Tu prends un objet de base "Objet divers, petit", tu lui affectes une icône de potion, le nom adéquat ...
Dans la rubrique propriétés de l'objet, tu sélectionnes "lancer un sort : pouvoir unique, sur soit uniquement, utilisation unique"
Tu affectes un tag spécifique à ton objet "tagdemonobjet"

Tu dois renommer ton script selon les options retenues dans l'activation du TagBased, par exemple "i_tagdemonobjet_ac"
Lors de l'activation de l'objet, le script sera activé automatiquement, sur l'utilisateur, une seule fois.
Je suis vraiment une quiche avec les scripts, j'ai essayé ce que tu m'as indiqué et voici le script auquel je suis arrivé:

Code PHP:

void main ()
{
object oPC GetFirstPC();
effect eInt;

int nDelta GetAbilityScore(oPCABILITY_INTELLIGENCEFALSE) - // ne tient pas compte des bonus
if (nDelta>0)
 {
     
effect eInt EffectAbilityDecrease(ABILTY_INTELLIGENCEnDelta);
     
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeIntoPC3600f);
}
 } 
J'obtiens une erreur parsing variable list sur la ligne "if (nDelta).
Par ailleurs, pour identifier qui utilise quel objet sur quelle cible dans le script, tu dois utiliser les commandes suivantes :
Code:
 object oPC     = GetItemActivator();
 object oItem   = GetItemActivated();
 object oTarget  = GetItemActivatedTarget();
Me revoila, j'ai essayé ce que tu me disais, voilà ce que ça donne:

Code PHP:

void main ()
{
object oPC GetFirstPC();
object oPC     GetItemActivator();
object oItem   GetItemActivated();
object oTarget  GetItemActivatedTarget();


int nDelta GetAbilityScore(oPCABILITY_INTELLIGENCEFALSE) - 5// ne tient pas compte des bonus
if (nDelta>0)

     
effect eInt EffectAbilityDecrease(ABILTY_INTELLIGENCEnDelta);
     
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeIntoPC3600f);
 } 
Mon problème c'est que j'obtiens une erreur "unknown state in compiler" sur la ligne "ApplyEffect".
Je ne sais pas si c'est que lié à ça, mais ton if n'englobe pas les deux lignes. Lorsqu'un if n'est pas suivi d'un crochet ouvrant (puis fermant plus loin) seule la ligne d'instruction suivant le if est contenue dans le if:
Code PHP:

if (nDelta>0)
// crochet ouvrant
   // cette ligne sera dans le bloc if
   
effect eInt EffectAbilityDecrease(ABILTY_INTELLIGENCEnDelta);
   
// cette ligne aussi
   
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeIntoPC3600f);
// crochet fermant 
Code PHP:

if (nDelta>0)
   
// cette ligne sera dans le bloc if
   
effect eInt EffectAbilityDecrease(ABILTY_INTELLIGENCEnDelta);
   
// pas cette ligne
   
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeIntoPC3600f); 
Du coup tu déclares une variable eInt qui n'existe que dans le bloc du if, puis tu l'utilises une ligne plus bas (hors du bloc if) où elle n'existe pas.

De plus tu déclares deux fois la variable oPC, ce qui n'est pas bon:
Code PHP:

object oPC GetFirstPC();
object oPC GetItemActivator(); 
Je suppose que tu veux la seconde ligne.

De même, tu déclares des variables oItem et oTarget que tu n'utilises pas, à quoi bon ?


Dernière modification par Lv4 ; 12/10/2011 à 12h44.
Code:
void main () 
{ 
object oPC     = GetItemActivator(); 
 
int nDelta = GetAbilityScore(oPC, ABILITY_INTELLIGENCE, FALSE) - 5; // ne tient pas compte des bonus 
if (nDelta>0) 
 {
    effect eInt = EffectAbilityDecrease(ABILTY_INTELLIGENCE, nDelta); 
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eInt, oPC, 3600f); 
 }
}  
 
Code PHP:

void main() 

    
object oPC GetItemActivator(); 
    
int nDelta GetAbilityScore(oPCABILITY_INTELLIGENCEFALSE) - 5// ne tient pas compte des bonus 
    
if (nDelta>0
     {
        
effect eInt EffectAbilityDecrease(ABILITY_INTELLIGENCEnDelta); 
        
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeIntoPC3600.0f);
     } 
C'est ma faute , quand on met des bouts de code à la volée sans les avoir compilés, on ne voit pas forcément les fautes.
Il manquait un I à ABILITY et il faut préciser 3600.0f
Double post pour dire que ça fonctionne parfaitement. J'ai quand même une question supplémentaire, comment puis-je faire baisser plusieurs caractéristiques ?

J'ai essayé de rajouter une commande
Code PHP:

int nDelta GetAbilityScore(oPCABILITY_WISDOMFALSE) - 5// ne tient pas compte des bonus 
    
if (nDelta>0
     {
        
effect eInt EffectAbilityDecrease(ABILITY_WISDOMnDelta); 
        
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeIntoPC3600.0f);
     } 
mais ça l'indique une erreur à la première ligne.
Une explication possible sachant que tu ne donnes pas le texte de l'erreur ...
Si tu as dupliqué les lignes dans le même script, ça veut dire que tu déclares 2 fois la variable nDelta, d'où une erreur à la compilation.
Donc tu ne dois mettre qu'une seule fois la déclaration "int".

Dans les règles de l'art, on déclare toutes les constantes et variables en début de script pour éviter ce genre d'aléa.
En fait j'ai voulu faire un test en vitesse et je ne me suis pas trop penché dessus. Cependant, si je ne peux mettre qu'une seule fois "int" comment puis rajouter d'autres modifications de caractéristiques ?

Edit: Ou, plus simplement, comment déclarer toutes les constantes et variables en début de script ?

Dernière modification par Lyendhal ; 19/10/2011 à 21h13.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés