Ce script permet de simuler la fatigue dans NWN, il est modifiable à souhait et est garanti sans bug connu :
///////////////////////////////////////////////////
/*
Script by : Jedaï (erreurs signalées par Prophetia)
Script du système de fatigue
*/
///////////////////////////////////////////////////
//a mettre sur le OnClientEnter
void main()
{
object oPC = GetEnteringObject();
DeleteLocalInt( oPC, "bRecent_Rested" );
DeleteLocalInt( oPC, "nFatigue" );
DelayCommand( HoursToSeconds(12), ExecuteScript( "mod_fatigue", oPC ) );
//du code...
}
///////////////////////////////////////////////////
/*
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 = GetLocalInt( oPC, "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
DelayCommand( HoursToSeconds(12), ExecuteScript( "mod_fatigue", oPC ) );
//signale que le joueur s'est reposé récemment
SetLocalInt( oPC, "bRecent_Rested", TRUE );
//réinitialise la fatigue, le joueur est reposé et en forme
DeleteLocalInt( oPC, "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
SendMessageToPC( oPC, "Vous n'êtes pas vraiment fatigué en réalité et " +
"cette petite sieste ne vous reposera pas vraiment.");
}
//du code...si vous en avez
}
///////////////////////////////////////////////////
/*
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( GetLocalInt( oPC, "bRecent_Rested" ) )
{
DeleteLocalInt( oPC, "bRecent_Rested" );
return;
}
//on récupère la fatigue actuelle du joueur
int nF = GetLocalInt( oPC, "nFatigue" );
//on l'augmente de un
nF++;
//et on la restocke
SetLocalInt( oPC, "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 1 :
{
SendMessageToPC( oPC, "Après douze heures passées sans vous reposez, "+
"vous commencez à sentir la fatigue peser sur vos épaule, "+
"mais cela reste très supportable..." );
DelayCommand( HoursToSeconds(12), ExecuteScript( "mod_fatigue", oPC ) );
break;
}
case 2 :
{
SendMessageToPC( oPC, "Vous venez de passer 24h sans dormir, les premières "+
"atteintes de la fatigue viennent entamer vos forces, "+
"reposez-vous vite !" );
eFatigue = ExtraordinaryEffect( EffectAbilityDecrease( ABILITY_STRENGTH, 2 ) );
ApplyEffectToObject( DURATION_TYPE_PERMANENT, eFatigue, oPC );
DelayCommand( HoursToSeconds(6), ExecuteScript( "mod_fatigue", oPC ) );
break;
}
case 3 :
{
SendMessageToPC( oPC, "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 = ExtraordinaryEffect( EffectCurse( 3 ) );
ApplyEffectToObject( DURATION_TYPE_PERMANENT, eFatigue, oPC );
DelayCommand( HoursToSeconds(6), ExecuteScript( "mod_fatigue", oPC ) );
break;
}
case 4 :
{
SendMessageToPC( oPC, "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 = ExtraordinaryEffect( EffectCurse( 6 ) );
ApplyEffectToObject( DURATION_TYPE_PERMANENT, eFatigue, oPC );
DelayCommand( HoursToSeconds(3), ExecuteScript( "mod_fatigue", oPC ) );
break;
}
case 5 :
{
SendMessageToPC( oPC, "Zombifié par la fatigue, vous vous effondrez et "+
"rejoignez enfin les limbes accueillant du sommeil..." );
eFatigue = ExtraordinaryEffect( EffectSleep() );
ClearAllActions();
ActionRest();
ActionDoCommand( ApplyEffectToObject( DURATION_TYPE_TEMPORARY, eFatigue, oPC, 240.0 ) );
DelayCommand( HoursToSeconds(3), ExecuteScript( "mod_fatigue", oPC ) );
DelayCommand( 0.2, SetCommandable( FALSE, oPC ) );
DelayCommand( 250.0, SetCommandable( TRUE, oPC ) );
break;
}
default :
{
SendMessageToAllDMs("Problème avec le système de fatigue, joueur " + GetName( oPC ) +
". nFatigue vaut : " + IntToString( nF ) + ". Réinitialisation de "+
"la fatigue de ce joueur !" );
DeleteLocalInt( oPC, "nFatigue" );
DelayCommand( HoursToSeconds(12), ExecuteScript( "mod_fatigue", oPC ) );
}
}
}