JeuxOnLineForumsPlusConnectés : 631 (sites) | 1122 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Répondre
Partager Outils Rechercher
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Coucou,

Cela fait un moment que je n'ai plus touché à ce script, mais je pense que ça devrait marcher avec ça:

Code PHP:
//Nombre de PV perdus par round
int nAgonie 1;
//Nombre de PV gagnes par round en etant stabilise
int nRecup 1;
//Delai en secondes entre la perte de PV (6.0 = 1 round)
float fDelai 6.0;
//DC du Jet de Vigueur permettant de se stabiliser
int nDCFort 14;
//% de chance d'etre stabilise (entre 1 et 6; 6=100%)
int nStab 1;

void dying(object oDyingeffect eSaigner)
{
    
int nPv GetCurrentHitPoints(oDying);
    if(
nPv <= -10)
    {
        
effect eMort EffectDeath(FALSEFALSE);
        
SpeakString("Vous etes mort.");
        
PlayVoiceChat(VOICE_CHAT_DEATHoDying);
        
ApplyEffectToObject(DURATION_TYPE_INSTANTeMortoDying);
        return;
    }
    if (
oDying != OBJECT_INVALID && nPv 0)
    {
        
SpeakString("Vous sortez de l'inconscience.");
        
PlayVoiceChat(VOICE_CHAT_LAUGHoDying);
        
SetPlotFlag(oDyingFALSE);
        
ClearAllActions();
        return;
    }
    if (
oDying != OBJECT_INVALID && nPv <= && nPv > -10)
    {
        
effect eAntiDmg EffectDamageImmunityDecrease(DAMAGE_TYPE_MAGICAL100);
        
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeAntiDmgoDying0.5);
        
ApplyEffectToObject(DURATION_TYPE_INSTANTeSaigneroDying);
        
SendMessageToPC(oDying"Vous sombrez dans l'inconscience.");
        
PlayVoiceChat(VOICE_CHAT_NEARDEATHoDying);
        
SetPlotFlag(oDyingTRUE);
        
int nStvig FortitudeSave(oDyingnDCFort);
        
int nChanceStab;
        switch(
nStvig)
        {
            case 
0:
                
nChanceStab d10(1);
                break;
            case 
1:
                
nChanceStab d6(1);
                break;
            default:
                
nChanceStab d10(1);
                break;
        }
        if(
nChanceStab <= nStab)
        {
            
int nBonusCon GetAbilityModifier(ABILITY_CONSTITUTIONoDying);
            
int nStabilise = (nBonusCon nRecup);
            
SendMessageToPC(oDying"Vous etes stabilise.");
            
effect eStabilise EffectHeal(nStabilise);
            
ApplyEffectToObject(DURATION_TYPE_INSTANTeStabiliseoDying);
        }
            else
        {
            
DelayCommand(fDelaidying(oDyingeSaigner));
        }
    }
}

void main()
{
    
object oDying GetLastPlayerDying();
    
effect eSaigner EffectDamage(nAgonie);
    
PlayVoiceChat(VOICE_CHAT_HEALMEoDying);
    
DelayCommand(fDelaidying(oDyingeSaigner));

Lien direct vers le message - Vieux
Avatar de Loekit
Loekit
Alpha & Oméga
 
Avatar de Loekit
 
Bien, j'arrive avec mes gros sabots vu que j'ai l'intention de me construire un petit module perso pour mon LAN avec le tit frère et je lis un peu ce qui se passe ici et je tombe sur ce script.
Alors je tiens à préciser que je n'ai pas encore lu les tutos (oui, c'est mal, j'ai un peu commencé à vrai dire) donc ne me grondez pas .

Bon, je voudrais quelques explications sur l'utilisation du switch/case. Je sais qu'il y en a déjà eu (parce que je les ai lues... c'est malin un tigre ) mais elles ne me semblent pas répondre à mon interrogation.
Je vais mettre mes interrogations en commentaire.

Code PHP:
int nStvig FortitudeSave(oDyingnDCFort);
//si j'ai bien compris, cette ligne effectue un test de vigueur et retourne 0 ou 1.
//Bon pour commencer, il n'y a pas un "type boolean" à la place du int ?
//(C'est pas que l'utilisation du 0 ou du 1 me dérange mais j'ai mes petites habitudes de prog moi).

int nChanceStab;
//Déclaration d'une variable entière ici si je ne me trompe pas.

switch(nStvig)
{
case 
0:
     
nChanceStab d10(1); break;

case 
1:
     
nChanceStab d6(1); break;

default:
     
nChanceStab d10(1); break;
}

//Interêt du switch/case ici ? un simple if n'aurait-il pas suffit ?
//Du genre :

if (nStvig//nStvig boolean si ça existe.
//Sinon, le C (c'est bien du C ou approchant non ?) ne considère-t-il pas le 0 ou 1 comme boolean
//(donc lui appliquant les traitements réservés aux booleans) ?
//Dans le pire des cas, un test (nStvig == 1) fait l'affaire.
{
nChanceStab d6(1);
//Si le test est réussi, la proba est de 1/6
}
else
{
nChanceStab d10(1);
//Dans tous les autres cas, la proba est de 1/10

Bref, c'est plus une question de simplicité de code ici, je ne vois pas de justification au switch/case. Une question d'éthique en somme. Pourquoi sortir le marteau de guerre +2 quand une simple pression du pouce suffit ?
Je m'égare, mais y-a-t-il une justification/subtilité que j'aurais omise ?

Et sinon, accessoirement, vous faites comment les indentations de votre code. Les tab ne passent pas et les espaces non plus apparement (enfin, j'ai ai mis 5 et ça fait rien ).
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
- En NWScript un Booléen est considéré de la même manière qu'un Integer.

- Le NWScript n'est pas du C, même si il y a des similitudes, tu ne peux pas appliquer tout ce que tu utilises en C ici.

Concernant l'utilisation du switch, oui un IF est plus simple dans le cas présent.
Au départ le script devait effectuer un jet de vigueur, et selon la marge de réussite ou d'erreur, appliquer plus ou moins de chance à la stabilisation. Le switch était donc utile, vu qu'il fallait un cas pour chaque marge de 1 à partir du DC.
Par la suite, la fonction "FortitudeSave" a été utilisée, afin de simplifier le système, et le switch a été purgé des cas inutiles.
Bien entendu il n'était plus nécessaire, mais la structure est restée, un peu comme une route pavée dans une section asphaltée.
Côté performance, c'est pareil, un switch ou un if pour un si petit test, ça change rien. Le switch n'est en fait qu'une astuce permettant d'y voir plus clair lors de tests multiples (mais bon ça je ne l'apprends à personne); mais ici il est vrai que ça fait quelques caractères en trop dans le script..... merci donc de venir te soucier de la pureté de nos scripts, je t'engagerais bien comme script-éboueur si tu t'ennuies
Lien direct vers le message - Vieux
Avatar de Loekit
Loekit
Alpha & Oméga
 
Avatar de Loekit
 
Merci.
Nan mais en fait je me demandais si il y avait un truc que je n'avais pas vu et qui aurait justifié l'utilisation du switch. Ton explication répond parfaitement à mon problème .
Merci pour les réponses .
Lien direct vers le message - Vieux
IXXI Squalthor IXXI
Dauphin / Dauphine
 
Bonjour

Est-ce que vous auriez par hasard un script d'agonie qui redonne des pv avec un jet de chance et qui empêcherais les monstres de continuer de le fracasser ? Impossible de trouver ça et j'en ai cruellement besoin

Merci
Lien direct vers le message - Vieux
Azmathiel
Alpha & Oméga
 
Depuis la version 1.30, les monstres ne regardent plus stupidement leur victime récupérer en attendant qu'elle revienne les occire, et c'est tant mieux.

Par contre du coup, tous ces scripts de récupération ne sont plus très utiles. Si tu veux donner une chance au PJ qui se la joue solo de revivre sur place, il te faut contourner le problème en supprimant, par exemple, les spawns qui l'ont vaincu. Ca va se gérer dans le OnPlayerDying() en scrutant toute la zone et en les supprimant ou en baissant l'IA des monstres au niveau de celle d'un légume. A toi de voir si ces choix t'intéressent.
Lien direct vers le message - Vieux
Avatar de Mastokk
JOL Mastokk
Alpha & Oméga
 
Avatar de Mastokk
 
Ou peut être en les faisant s'éloigner du PJ une fois qu'il agonise. Il me semble qu'il y a une fonction qui permet de faire ça. Je crois qu'on peut s'en servir pour faire fuir des animaux sauvages.

Voilà, je l'ai trouvé sur le Lexicon :

Code PHP:
    void ActionMoveAwayFromLocation(
    
location locMoveAwayFrom,
    
int bRun FALSE,
    
float fMoveAwayRange 40.0f
); 
A voir si ça fonctionne en combat (au pire tu passes un coup de ClearAllActions avant).
Lien direct vers le message - Vieux
Garrath
Alpha & Oméga
 
A mon avis cela ne suffira pas...
Il faut aussi rendre la creature neutre vis a vis du mourant... sinon son IA le fera reattaquer...
Lien direct vers le message - Vieux
Avatar de Deyonara
Deyonara
Alpha & Oméga
 
Avatar de Deyonara
 
Je crois que le monstre considère un cadavre ayant 0 points de vie ou moins, comme inintéressant s'il s'est arrêté de le taper pour une raison ou une autre. Un ClearAllActions() avant de le faire partir pourrait résoudre ce problème.

Cependant, un joueur agonisant en dessous de 0 points de vie, qui n'en perd ni n'en regagne, se verrait condamné à agoniser un très long moment. Mais alors... très long. Il faut donc lui mettre le panneau de mort, au moment de son décès théorique, c'est à dire 0 points de vie, soit dans le OnPlayerDying. Si le joueur se sent d'attendre une après-midi qu'un autre joueur vienne le rez, il ne pourra s'en prendre qu'à lui-même.
Lien direct vers le message - Vieux
Avatar de Mastokk
JOL Mastokk
Alpha & Oméga
 
Avatar de Mastokk
 
Citation:
Envoyé par Garrath
A mon avis cela ne suffira pas...
Il faut aussi rendre la creature neutre vis a vis du mourant... sinon son IA le fera reattaquer...
En modifiant le fMoveAwayRange, on doit pouvoir le faire s'éloigner suffisamment pour qu'il sorte du range de perception (bon bien sûr, si on est dans un espace clos, de faible surface, ça ne fonctionnera pas ), il y a peut être moyen de l'empêcher de ré-attaquer.
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > OnPlayerDying
   

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +1. Il est actuellement 14h04.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite