La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 27/11/2024 05:16:28


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 06/05/2006 01:32:59 Sujet du message : Générateur de nombres aléatoires

Il y a un moment déjà j'ai pris connaissance de ceci
http://www.nwnlexicon.com/compiled/function.random.html
Je m'en suis pas vraiment préoccupé jusqu'à ce que récemment nous rencontrions des problèmes sur la génération d'effets de météo aléatoire.
Ceux-ci sont déclenchés au moment où les joueurs pénètrent dans certaines zones. Etant donné que le joueur n'a que peu d'intéraction sur ces évênements, il ne peut modifier leur cours, brisant une séquence pseudo-aléatoire en choisissant telle ou telle action.
Les séquences pseudo-aléatoires se répètent identiquement en fonction de chaque joueur : c'est devenu génant au point qu'on me demande si c'était une animation fixe et qu'on me sorte le décompte des timings.

J'ai un peu cherché sur IGNVault et j'ai trouvé quelques trucs compliqués dont je n'ai pu retrouver l'origine mathématique sérieuse. Je pense que certains se sont inspirés d'un brasseur(mélangeur) écrit en java mais ça m'a laissé perplexe. J'ai fouillé un peu et j'ai trouvé un classique que j'ai associé à une "graine" basée sur une des fonctions de temps pour le démarrage de la séquence.
La fonction est rendu globale en utilisant une variable sur l'objet module, supprimant l'effet pervers de la réinitialisation de la graine à l'entrée de chaque zone et sa dépendance (à ce que j'ai compris) envers le personnage qui y entre.
Peut-être pas top mais : elle est rapide, facile à implémenter.
Elle retourne des nombres entiers sur l'intervalle [1,32767].
Si vous voulez vous en servir pour simuler des jets de dés, procédez ainsi :
si Intervalle : [0,n-1]
int nDice = FloatToInt(ParkMiller()*n/32768.0);
Ca respectera assez fidèlement si on adapte la fonction et que les calculs sont faits sur des valeurs flottantes

NWScript :

//:: ////
//:: Created Lylver 2006-05-06
//:: Custom random function
//:: ////
float ParkMiller(){
  // Numbers will never need more than 32bits coding
  float fA = 16807.0 ;
  float fM = pow(2.0,31.0)-1 ; // hope it is 2147483647.0
  float fQ = 127773.0; // m div a, precomputed
  float fR = 2836.0; // m mod a, precomputed
  object oMod = GetModule();
  float fSeed = GetLocalFloat(oMod,"PARK_MILLER");
  //
  if( fSeed == 0.0 ) fSeed = 2.0*GetTimeMillisecond()+1.0;
  // Critical function to ensure no overflow of 32bits coding
  // Exact decimals : not needed => because we trunc
  float fHi = IntToFloat(FloatToInt(fSeed/fQ)); // Trunc decimals.
  float fLo = fSeed - fQ * fHi;
  float fTest = fA * fLo - fR * fHi;
  float fResult;
  if( fTest > 0.0 ){
      fResult = fTest;
  } else {
      fResult = fTest + fM;
  }
  SetLocalFloat(oMod,"PARK_MILLER",fResult); // to store permanently the exact Seed
  return fResult/pow(2.0,16.0); // limit to 15 bits
}
/*
void main()
{
  object oPC = GetLastUsedBy();
  int n;
  for( n=0; n<1299; n++) ParkMiller();
  SpeakString("Random number : "+FloatToString(ParkMille r()));
}
*/

Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 06/05/2006 02:25:52 Sujet du message :

Tu es sur du comportement décrit par le lexicon ?
Je viens d'essayer un module avec une zone vide, aucun script sauf un sur le OnEnter qui envoie 5 Random(100) au joueur qui entre.

En testant plusieurs fois avec le même joueur, je n'ai jamais eu de séries identiques. Pareil avec 2 zones vides avec un déclancheur pour les transitions.

Enfin le système de Bioware m'a souvent paru étrange au niveau de l'aléatoire donc merci pour ta fonction, ça m'a l'air excellent.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 06/05/2006 11:53:32 Sujet du message :

J'ai rien comrpis au script, et c'est pour ça que je n'y toucherais pas. Enfin, ce qui me parait bizzar, c'est que moi, mes fonctions Random marche trés bien Smile Donc je ne vois pas trop a quoi ça sert de faire un deuxieme random Razz.

Aufaite juste pour info en passant ; regarde ton script cette ligne normalement

for( n=0; n<1299; n++) ParkMiller();

elle bug, il y a quelque truc qui ce sont rajouter Confused
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 06/05/2006 12:15:43 Sujet du message :

Je suis absolument pas sûr du lexicon, ca dépend des patch nwn en général (là c'est 1.61 pour la description).
Par contre : je suis sûr de ce que me décrive les joueurs, je vois pas pourquoi j'irais me fatiguer à chercher des solutions compliquées.

BN : si t'es pas fichu de reconnaître des commentaires dans un script tu peux retourner dans ta localisation. Va flooder ailleurs.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 06/05/2006 13:54:05 Sujet du message :

C'est a moi que tu parle?!
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes
Répondre en citant
Posté le : 06/05/2006 14:13:11 Sujet du message :

On dirait bien oui... Je crois effectivement qu'il est inutile de faire un commentaire pour dire que tu ne comprends rien Black Knight. A part ça, prenez vos gouttes, respirez fort, et parlez plutôt de script (ce sujet-là est intéressant d'ailleurs !).
_________________
» Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 06/05/2006 16:02:46 Sujet du message :

Ok, donc la prochaine fois, j'éviterais de te dire l'erreur qu'il y a dans ton script, tiens la vla l'erreur de ton script :

for( n=0; n<1299; n++) ParkMiller();

maintenant regarde cette phrase avec le NWScript, ça evitera peut - être que l'editeur nous dise qu'il y a une erreur ...

Bon bye !
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes
Répondre en citant
Posté le : 06/05/2006 17:24:24 Sujet du message :

Mais de quoi tu parles enfin ???

1. La portion de code citée est en COMMENTAIRE, donc on se fiche de savoir si ça bug ou pas
2. Le soi-disant bug vient de la balise nwscript, on s'en doute bien
3. Le soi-disant bug n'a absolument rien à voir avec la question posée...

Réfléchis à deux fois avant de poster plutôt que de dire n'importe quoi !
_________________
» Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 66.385ms