[Script] Système de fatigue

Répondre
Partager Rechercher
Ce script permet de simuler la fatigue dans NWN, il est modifiable à souhait et est garanti sans bug connu :

Code PHP:

///////////////////////////////////////////////////
/*
Script by : Jedaï (erreurs signalées par Prophetia)

Script du système de fatigue
*/
///////////////////////////////////////////////////

//a mettre sur le OnClientEnter

void main()

{

    
object oPC GetEnteringObject();
    
    
DeleteLocalIntoPC"bRecent_Rested" );
    
DeleteLocalIntoPC"nFatigue" );
    
DelayCommandHoursToSeconds(12), ExecuteScript"mod_fatigue"oPC ) );

    
//du code...


Code PHP:

///////////////////////////////////////////////////
/*
Script by : Jedaï (erreurs signalées par Prophetia)

Script du système de fatigue
*/
///////////////////////////////////////////////////

//a mettre sur le OnRest

void main()
{
    
object oPC GetLastPCRested();
    
int nTypeRest GetLastRestEventType();
        
    
int nRR GetLocalIntoPC"bRecent_Rested" );
    
    
//Vérifie que le joueur ne s'est pas déjà reposé très récemment
    //et que le OnRest a bien été déclenché par le début d'un repos
    
if( (! nRR) && nTypeRest == REST_EVENTTYPE_REST_STARTED )
    {
        
//relance le script de fatigue, 12 h de jeu plus tard
        
DelayCommandHoursToSeconds(12), ExecuteScript"mod_fatigue"oPC ) );
        
//signale que le joueur s'est reposé récemment
        
SetLocalIntoPC"bRecent_Rested"TRUE );
        
//réinitialise la fatigue, le joueur est reposé et en forme
        
DeleteLocalIntoPC"nFatigue");
    }
    
//sinon, si le joueur s'est reposé récemment et qu'il s'agit bien
    //du début d'un repos
    
else if( nTypeRest == REST_EVENTTYPE_REST_STARTED )
    {
        
//signale au PJ que sa fatigue n'a pas été diminuée par ce repos
        
SendMessageToPCoPC"Vous n'êtes pas vraiment fatigué en réalité et " +
                              
"cette petite sieste ne vous reposera pas vraiment.");
    }
    
    
//du code...si vous en avez
    

Code PHP:

///////////////////////////////////////////////////
/*
Script by : Jedaï (erreurs signalées par Prophetia)

Script principal du système de fatigue
*/
///////////////////////////////////////////////////

//script "mod_fatigue"
//ne mettez ce script nulle part, compilez le juste 
//sous ce nom

void main()
{
    
object oPC OBJECT_SELF;
    
    
//si le PJ s'est reposé récemment, une copie du script a
    //été lancée par le OnRest, on stoppe donc l'exécution de
    //celui-ci et on signale que le PJ est de nouveau sujet à
    //la fatigue
    
if( GetLocalIntoPC"bRecent_Rested" ) )
    {
        
DeleteLocalIntoPC"bRecent_Rested" );
        return;
    }
    
    
//on récupère la fatigue actuelle du joueur
    
int nF GetLocalIntoPC"nFatigue" );
    
//on l'augmente de un
    
nF++;
    
//et on la restocke
    
SetLocalIntoPC"nFatigue"nF);
    
effect eFatigue;
    
    
//pièce principale du script, ce switch spécifie quels effets doivent
    //être appliqués au PJ, en fonction de sa fatigue
    //Ne pas oublier de TOUJOURS relancer le script dans chaque cas
    //par un DelayCommand()
    //Vous pouvez changez tous les effets, y compris aller jusqu'à la mort du PJ
    //Vous pouvez également changer le nombre de cas
    
switch( nF )
    {
    case 
:
    {
        
SendMessageToPCoPC"Après douze heures passées sans vous reposez, "+
                              
"vous commencez à sentir la fatigue peser sur vos épaule, "+
                              
"mais cela reste très supportable..." );
        
DelayCommandHoursToSeconds(12), ExecuteScript"mod_fatigue"oPC ) );
        break;
    }
    case 
:
    {
        
SendMessageToPCoPC"Vous venez de passer 24h sans dormir, les premières "+
                              
"atteintes de la fatigue viennent entamer vos forces, "+
                              
"reposez-vous vite !" );
        
eFatigue ExtraordinaryEffectEffectAbilityDecreaseABILITY_STRENGTH) );
        
ApplyEffectToObjectDURATION_TYPE_PERMANENTeFatigueoPC );
        
DelayCommandHoursToSeconds(6), ExecuteScript"mod_fatigue"oPC ) );
        break;
    }
    case 
:
    {
        
SendMessageToPCoPC"Vous êtes en train de passer une nuit blanche !"+
                              
"Dans votre état vous ne feriez même pas peur à un lapin"+
                              
"aveugle, qu'espérez vous donc faire ? Reposez vous "+
                              
"immédiatemment, à moins que vous ne teniez à tomber sur"+
                              
"place !" );
        
eFatigue ExtraordinaryEffectEffectCurse) );
        
ApplyEffectToObjectDURATION_TYPE_PERMANENTeFatigueoPC );
        
DelayCommandHoursToSeconds(6), ExecuteScript"mod_fatigue"oPC ) );
        break;
    }
    case 
:
    {
        
SendMessageToPCoPC"La fatigue vous ronge, vos paupière sont de plomb... "+
                              
"Vous titubez sans but, une poussée et vous tombez ! "+
                              
"Dans peu de temps vous ne pourrez plus soutenir les "+
                              
"assauts du sommeil et sombrerez dans l'inconscience..."+
                              
"Dormez tant que vous pouvez encore en décider consciemment..." );
        
eFatigue ExtraordinaryEffectEffectCurse) );
        
ApplyEffectToObjectDURATION_TYPE_PERMANENTeFatigueoPC );
        
DelayCommandHoursToSeconds(3), ExecuteScript"mod_fatigue"oPC ) );
        break;
    }
    case 
:
    {
        
SendMessageToPCoPC"Zombifié par la fatigue, vous vous effondrez et "+
                              
"rejoignez enfin les limbes accueillant du sommeil..." );
        
eFatigue ExtraordinaryEffectEffectSleep() );
        
ClearAllActions();
        
ActionRest();
        
ActionDoCommandApplyEffectToObjectDURATION_TYPE_TEMPORARYeFatigueoPC240.0 ) );
        
DelayCommandHoursToSeconds(3), ExecuteScript"mod_fatigue"oPC ) );
        
DelayCommand0.2SetCommandableFALSEoPC ) );
        
DelayCommand250.0SetCommandableTRUEoPC ) );
        break;
    }
    default :
    {
        
SendMessageToAllDMs("Problème avec le système de fatigue, joueur " GetNameoPC ) +
                     
". nFatigue vaut : " IntToStringnF ) + ". Réinitialisation de "+
                     
"la fatigue de ce joueur !" );
        
DeleteLocalIntoPC"nFatigue" );
        
DelayCommandHoursToSeconds(12), ExecuteScript"mod_fatigue"oPC ) );
    }
    }

Un truc que je ne comprend pas dans ce script (je dois être fatigué ^^)

où est ce que tu vire les effect de baisse de caractéristiques donnés ici ?
eFatigue = ExtraordinaryEffect( EffectAbilityDecrease( ABILITY_STRENGTH, 2 ) );
ApplyEffectToObject( DURATION_TYPE_PERMANENT, eFatigue, oPC );

D'après ce que j'en vois j'ai l'impressions qu'ils restent définitivement, mais je ne pense pas que ce soit le cas.

(Le script que j'ai fait est très similaire a celui ci, si ce n'est qu'il prend en compte la constitution du pc)
Eh bien je croyais que les effets disparaissaient avec le repos, mais on m'as récemment dit que ce n'était pas le cas lorsque les effets étaient Extraordinary(), je n'avais mis cette fonction que pour éviter une dissipation, mais effectivement si ça empêche que l'effet soit supprimé lors de la sieste, il faudrait rajouter un RemoveEffects() dans le OnRest, enfin c'est pas la mort...

Par contre le désavantage par rapport à ton script, c'est que l'on retire tous les effets d'un coup. Mais c'est surtout pour empêcher les excès que j'ai mis ce script alors....

L'avantage comme je te l'ai dit, c'est que le script est clair et facile à modifier.
euh... petit truc en passant Jedaï, je crois bien que les elfes sont imminisé a l'EffectSleep.

Reyand > exelente idée je suis en train de tester
Bof, aucune importance, ils auront pas la jolie animation, c'est tout, de toute façon je les fait se reposer avec ActionRest(), alors...

Excellente idée effectivement, suffit d'avoir six "créateurs d'effet" dans tout le module (un pour chaque caractéristique) et on peut retirer les effets en fonction de la caractéristiques, bien vu !!
Ce script fonctionne bien ? Car dans le Lexicon, il est dit :
Citation :
DelayCommand cannot be used across area transitions. If a DelayCommand is started in one area, the command that is delayed will be lost when the area is unloaded and a new area loaded.
Ce qui pose problème dans ce cas... Car le script de fatigue ne sera pas lancé toutes les 12h si le joueur change de zones...
De plus, le DelayCommand() ne fait-il pas autant lagger que le OnHeartBeat (j'avais vu ça dans un forum)?
mmmmmmmmmmmm......... pas bête du tout !

ca mérite reflexion. Si on lit ce qu'il y a marqué vi, alors c pas la peine d'espérer que ca marche.

Pour être franc, je n'ai jamais testé si le DelayCommand marchait après avior changé de zone.

Ben......... seul le test nous le dira ^^'

Si ca ne marche pas, on peut toujours utiliser ma biblio sur les time events (dispo quelque part dans sur les persistant), qui elle marchera, mais c'est un peu plus complexe a l'utilisation.
C'est quoi ces conneries ??!! Biensur que le DelayCommand fonctionne lors des transitions de zones ... !!! Fo vérifier ses sources avant de balancer de la désinformation !

Sinon, joli script, j'en ai fait un en plus complexe mais le principe est la : empêcher les GB de faire du zoning sans se reposer !

Prince Nexus.
En fait, il s'agit de dire que l'objet Area n'est plus valide pour les delay commande, donc tout les delay en attentes sur des items / placeable / creatures ne se declencheraient a priori pas.
(pour les joueurs, il devraient rester un support valide pour Delay

Par contre, ca m'etonne quand même. J'ai un peu de mal a y croire.
Citation :
Provient du message de Prince Nexus
C'est quoi ces conneries ??!! Biensur que le DelayCommand fonctionne lors des transitions de zones ... !!! Fo vérifier ses sources avant de balancer de la désinformation !
Prince Nexus.
Heu... TU es toujours aussi vulgaire, direct et ininterressant dans tes réponses ?
Parceque là, je ne cherche pas à démonter quoi que se soit et si tu dit que le Lexicon n'est pas une bonne source, je pense que tu te feras étripé par tous les autres scripteurs de NWN (après mon tour ! )
Pour ton information personnelle, ce que dit le Lexicon à propos de DelayCommand :
Citation :
Parameters
fSeconds
Number of seconds to delay the command by.
aActionToDelay
Action in the Action Queue to delay.

Description
Delay aActionToDelay by fSeconds. If an error occurs the log file will contain "DelayCommand failed.".

Remarks
DelayCommand() is no longer capped by a time limit of 1 game day.

Known Bugs
DelayCommand cannot be used across area transitions. If a DelayCommand is started in one area, the command that is delayed will be lost when the area is unloaded and a new area loaded. (This information was submitted in German; I've done my best translation so if someone finds this to be incorrect, please inform the Lexicon staff using one of the links below.)
mouais.....

1) ben commence par apprendre le nom et l'effet de tes fonction plutot que tjrs te référer a ce truc, et tu verra que tu vas vite commencer a programmer bcp plus vite.

2) Arrete d'être irespectueux envers mon pote Prince Nexus sinon vais me facher tout rouge

Nan serieusement, je veux bien croire que ce truc est très pratique, mais contrairement a ce que tu semble le croire, ce n'est (et c'est loin d'être) la bible des scripteurs, en tout cas de ce que j'en sais (et je ne pense pas qu'il soit prétencieux de ma part de dire que j'en sais quelque chose )
Bon je m'excuse pour le ton irrévérencieux du dernier message. Mais il est vrai, comme le dit Azrael, que le Lexicon est un ramassis de ragot sur les fonctions dispos. Tiens, prend la section sur les encounter par exemple : jamais vu autant de mensonges en si peu de lignes !
En revanche, il peut arriver que parfois ils aient juste.

Sinon, pour en revenir à ces delaycommand, comme j'en utilise bcp dans mes fonctions récursives, je peux t'affirmer que c'est une valeur sure ... au moins quelque chose qui marche ! (pas comme le ExportAllCharacters en Servervault qui n'est qu'une légende)


Prince Nexus.

PS: et si les DelayCommand ne fonctionnaient pas, comment tu ferais Azrael pour ton systeme d'event ? Pourtant il marche !!(perso j'adopte la solution ohb mais c'est en fait juste par commodité : les Delay sont moins lisibles dans le code)
bah les delay du timeevent sont pas fixé sur une créature, mais sur un waypoint statique qui reste dans la même zone, donc le système pourrait très bien marcher même si les delay commands était limités par zones
Citation :
Provient du message de KzimiR666
Heu... TU es toujours aussi vulgaire, direct et ininterressant dans tes réponses ?
Parceque là, je ne cherche pas à démonter quoi que se soit et si tu dit que le Lexicon n'est pas une bonne source, je pense que tu te feras étripé par tous les autres scripteurs de NWN (après mon tour ! )
Pour ton information personnelle, ce que dit le Lexicon à propos de DelayCommand :

Pour ma part, je ne pense pas du tout que le lexicon soit la bible des scripteurs, et loin de là. Et donc non, il ne se ferait pas étripé par les autres scripteurs obligatoirement, comme il y a déjà Azra et moi, donc cela en fait minimum 2 .

Personnellement, je m'en suis jamais servis depuis que je script, et je pense que je m'en servirai jamais même. L'éditeur de script me va très bien. Et si je comprends pas une fonction, je la test. Et si vraiment, je n'arrive pas à la comprendre, je demande avis aux autres scripteurs. Moi la bible des scripteurs, c'est la connaissance de tous les scripteurs, leurs conseils et leurs savoir.
Maintenant, chacun à sa manière de voir, mais à chaque fois que j'ai utilisé le lexicon, j'ai été déçu de ce que j'ai trouvé.
Et je pense que je m'en suis toujours sortis sans ce lexicon justement pour faire mes systèmes

RAAZ Touch !
Pareil, le Lexicon c'est à prendre avec des pincettes. Il y a des très bonnes choses (comme par exemple la description de chaque effet visuel) mais bon y'a aussi beaucoup de bêtises. Maintenant, le ExportAllChars en server vault n'a jamais été une légende, la preuve : je l'ai vu marcher

Le mieux pour apprendre à scripter, c'est de toutes façons de regarder des scripts déja fait, y'a pas de secret
Hum... Il est vrai que j'ai un peu exagéré par rapport au Lexicon... Cependant, je doute que le Lexicon raconte des bêtises, son auteur ayant été récompensé par Bioware et que Bioware aide maintenant à sa Mise à Jour...
Enfin bon... Apprendre à scripter est une chose, savoir en est une autre ! Et je pense que avant de demander aux autres, mieux vaut se renseigner sois même et le Lexicon est fait pour cela. Après, il est évident que chacun a sa propre méthode pour "travailler", moi, j'ai souvent le Lexicon ouvert car il permet de me faire gagner un temps considérable, notamment dans la recherche de fonctions.
Citation :
Provient du message de KzimiR666
Hum... Il est vrai que j'ai un peu exagéré par rapport au Lexicon... Cependant, je doute que le Lexicon raconte des bêtises, son auteur ayant été récompensé par Bioware et que Bioware aide maintenant à sa Mise à Jour...
Enfin bon... Apprendre à scripter est une chose, savoir en est une autre ! Et je pense que avant de demander aux autres, mieux vaut se renseigner sois même et le Lexicon est fait pour cela. Après, il est évident que chacun a sa propre méthode pour "travailler", moi, j'ai souvent le Lexicon ouvert car il permet de me faire gagner un temps considérable, notamment dans la recherche de fonctions.
Moi avant de demander aux autres, je réfléchis, j'essaye de comprendre, de trouver une réponse logique et je test .
Pas besoin du lexicon , mais de ma façon de comprendre le code, et mon expérience.
Mais comme tu dis chacun à sa façon de faire
Bah je faisais un tour par ici et je trouve un débat sur le Lexicon , alors mon avis pour ce qu'il vaut est le suivant :
Le Lexicon, c'est sympa comme aide mémoire pour quelqu'un qui n'a plus scripté depuis 3 mois et qui s'y remet pour deux jours, sinon l'éditeur de script est très largement suffisamment pour ceux qui lisent un minimum l'anglais et qui se sont un peu baladés déjà sur les forums.
Citation :
Provient du message de Jedaï
Bah je faisais un tour par ici et je trouve un débat sur le Lexicon , alors mon avis pour ce qu'il vaut est le suivant :
Le Lexicon, c'est sympa comme aide mémoire pour quelqu'un qui n'a plus scripté depuis 3 mois et qui s'y remet pour deux jours, sinon l'éditeur de script est très largement suffisamment pour ceux qui lisent un minimum l'anglais et qui se sont un peu baladés déjà sur les forums.
et je rajouterait que le lexicon, c'est vachement pratique pour les modo qui veulent aider depuis leur boulot, donc sur un poste sans NwN...


(nonon, je parle de personne en particulier... )
Répondre

Connectés sur ce fil

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