La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 23/11/2024 22:59:39
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
Djezebel Héros Messages: 252 |
Bonjour !
Je tente de faire un script pour jouer au Kabu mais je n'y arrive pas trop, donc je sollicite votre aide. D'abord les règles : Le but : arriver à atteindre le chiffre "9" en unités (9, 19, 29). Le déroulement du jeu : Ca se joue à deux (le PNJ et le joueur) avec un jeu de cartes sans figures et sans Joker(de 1 à 10). Chacun prend une carte et obtient un nombre. Suivant ce nombre, il peut choisir de prendre une autre carte qui s'ajoutera à la première. Et ainsi jusqu'à trois cartes. Celui qui se rapproche le plus du 9 a gagné et l'autre lui doit 5 pièces d'or. Exemple : Le PNJ obtient un 3 et le joueur un 4. Le PNJ et le joueur rejouent. Le PNJ obtient un 4 et le joueur un 7 donc : Le PNJ a 7 (3+4) et le joueur 11 (4+17) Le PNJ reste là, le joueur reprend une carte : Le joueur obtient un 8 : Le PNJ a 7 et le joueur 8. Le joueur a gagné. Dans le dialogue, je pensais mettre des tokens. Quelque chose dans ce genre : - J'obtiens un <CUSTOM3003> et vous obtenez un <CUSTOM3004>. Voulez-vous une autre carte ? - Oui - Non Sur le non on donne le résultat, et sur le "oui" on retire... Mais voilà, comment ajouter tout ça ? J'ai fais une "ébauche" dans le OnCondition de la phrase avec les Custom : NWScript :
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. Mais ensuite ? comment faire en sorte que ce soit "sauvegardé", va-t-il falloir faire plein de scripts pour chaque phrase ? N'est-il pas possible de faire une sorte de boucle ? Merci de votre attention ! PS : Si vous avez des idées de jeux de cartes ou de paris pour les tavernes, n'hésitez pas à les ajouter dans ce post. |
Revenir en haut | |
Ivellios Légende vivante Messages: 447 Localisation: Poitiers |
Tu utilise les variables locales.
SetLocalInt, GetLocalInt, avec sa tu sauvegarde ou restitue un nombre enregistré. Exemple Les deux joueurs (PJ/PNJ) piochent une carte : 3 et 4 : NWScript :
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. Ils repiochent : 4 et 7 : NWScript :
SetLocalInt(oSelf, "PNJ", GetLocalInt(oSelf, "PNJ") + 4); SetLocalInt(oSelf, "PJ", GetLocalInt(oSelf, "PJ") + 7); Ils repiochent : 7 et 8 : NWScript :
SetLocalInt(oSelf, "PNJ", GetLocalInt(oSelf, "PNJ") + 7); SetLocalInt(oSelf, "PJ", GetLocalInt(oSelf, "PJ") + 8 ); Ici j'ai mit directement les valeures pour que tu comprenne bien, mais sinon ils faut les remplacer par la valeur de ta carte. Ensuite entre chaque test tu fait si le chiffre < 9 && != 9 (sinon gagné) tu fait TonNombre%10 ça retournera le chiffre des unités. Tu resteste si c'est != 9 (sinon c'est gagné) et à la fin si personne à gagné tu fait la différence et tu regarde qui est le plus près (en fesant attention au chiffre des unités des nombres comme 10 ou 20 ^^). En très large c'est ça... _________________ Scripts, systèmes, fonctions,... c'est par ici... Pyjama pour castor, une vocation, un avenir sûr |
Revenir en haut | |
Djezebel Héros Messages: 252 |
J'arrive un peu à déblayer, merci
J'arriverai à mettre un nombre aléatoire mais j'ai plusieurs endroits où ça bloque : - Je n'ai pas très bien compris comment récupérer le chiffre des unités - Comment faire si un chiffre sort à chaque fois (bien que les probabilités soient faibles : il n'y a que 4 cartes avec le même nombre). - Comment faire pour que le PNJ s'arrête si son chiffre est entre 6 et 9 ? (qu'il dise qu'il ne veut plus de carte, mais que le PJ puisse prendre à nouveau une carte) |
Revenir en haut | |
Ivellios Légende vivante Messages: 447 Localisation: Poitiers |
Tous ce que tu demande c'est des tests classiques.
Pour récupérer le chiffre des unités il faut utiliser opérateur reste de division (%) 7%10 = 7 19%10 = 9 22%10 = 2 26%10 = 6 etc Pour pas piocher deux fois le même nombre c'est une boucle. _________________ Scripts, systèmes, fonctions,... c'est par ici... Pyjama pour castor, une vocation, un avenir sûr |
Revenir en haut | |
Djezebel Héros Messages: 252 |
Bon, les maths n'étant pas mon fort, je poste l'avancée de mes recherches.
Voici ce que j'ai déjà comme dialogue : - [PNJ] *mélange les cartes, les distribue, s'en donne une et vous en donne une* J'obtiens un <CUSTOM3003> et vous un <CUSTOM3004> ! Voulez-vous une autre carte ? -- [PJ]Oui --- [PNJ] Moi aussi, j'obtiens donc un <CUSTOM3003> et vous un <CUSTOM3004>. Voulez-vous une dernière carte ? ---- [PJ] Oui. ----- [PNJ] Moi aussi, j'obtiens donc un <CUSTOM3003> et vous un <CUSTOM3004>. Le gagnant est <CUSTOM3005>. ----- [PNJ] C'est bon pour moi. Je garde mon <CUSTOM3003> et vous obtenez un <CUSTOM3004>. Le gagnant est <CUSTOM3005>. --- [PJ] Non ----- [PNJ] En ce cas vous gardez votre <CUSTOM3004>. J'ai un <CUSTOM3003>. Le gagnant est donc <CUSTOM3005> (etc...) Pour l'instant, je n'ai fais que la condition de la première phrase. Ca donne ça : NWScript :
int StartingConditional() { object oSelf = OBJECT_SELF; int nCartePNJ = d10(); int nCartePJ = d10(); if(GetLocalInt(oSelf, "retirage") != 1) //Si le PNJ a besoin de retirer { SetLocalInt(oSelf, "PNJ", nCartePNJ ); } SetLocalInt(oSelf, "PJ", nCartePJ ); if ( 6 < nCartePNJ%10 < 9 ) { SetLocalInt(oSelf, "retirage", 1); // Fait "normalement" en sorte que le PNJ ne retirera pas une carte } SetCustomToken(3003, IntToString(nCartePNJ)); SetCustomToken(3004, IntToString(nCartePJ)); return TRUE; } Ca fonctionne pour la première phrase... mais ensuite je suis perdue. Si vous avez des idées... |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
Intéressant comme problème.
Je pense que tu peux t'en tirer grosso modo sur un seul script pour le jeu (plus quelques uns tout petits en actions conséquentes des réponse du PJ). Il faut pas mal de variables locales en fait : - Une qui donne le tour de la partie. - Deux pour savoir si le PJ ou le PNJ ont arrété de tirer à un tour précédent. - Deux pour les scores. - 5 (max) pour les cartes déjà tirées. Puis tu boucles sur le premier noeud de dialogue PNJ, et tu fais tout dans le startingconditional du script. Le custom token comprend 2 parties : une sur l'avancée de la partie (cartes tirées à ce tour et scores ou résultat du jeu si 3ème tour) l'autre c'est une question sur les choix du PJ : tirer une carte (si il a pas arrété avant et si c'est pas le 3ème tour) ou faire une nouvelle partie (si elle est finie). Théoriquement ça doit suffire (j'ai pas fini, j'essaye). Le dialogue en gros : -[PNJ] <CUSTOM54841> --[PJ] oui (condition : tire encore des cartes) --[PJ] non (condition : tire encore des cartes) --[PJ] Continuer (condition : ne tire plus de carte) chaque réponse du PJ boucle sur la première réplique du PNJ. Dont le starting conditionnal renvoie FALSE seulement si le PJ décide de ne pas rejouer à la fin d'une partie. C'pas simple quand même. Je te dis si j'y arrive. Pour le moment ça ça peut déjà t'aider : la fonction qui tire une carte en vérifiant qu'elle ait pas été tirée avant : NWScript :
int Carte(int nSorties) { int nRandom = Random(40)+1; while (nRandom == GetLocalInt(OBJECT_SELF,"CARTE0") || nRandom == GetLocalInt(OBJECT_SELF,"CARTE1") || nRandom == GetLocalInt(OBJECT_SELF,"CARTE2") || nRandom == GetLocalInt(OBJECT_SELF,"CARTE3") || nRandom == GetLocalInt(OBJECT_SELF,"CARTE4") ) { nRandom = Random(40)+1; } SetLocalInt(OBJECT_SELF,"CARTE"+IntToString(nSorties),nRandom); nRandom = nRandom%10; if (nRandom == 0) nRandom = 10; return nRandom; } nSortie c'est le nombre de cartes déjà tirées. (bien sur penser à remettre tout à 0 à la fin d'une partie.) le début de mon script conditional : NWScript :
int StartingConditional() { int nPartie = GetLocalInt(OBJECT_SELF,"PARTIEENCOURS"); int nPNJ = Carte(nPartie*2); int nPC = Carte(nPartie*2+1); if (nPartie ==0)//premier round { SetCustomToken(70212,"Vous tirez un "+IntToString(nPC)+", et votre adversaire un "+IntToString(nPNJ)+". Voulez vous une autre carte ?"); SetLocalInt(OBJECT_SELF,"SCOREKABUPNJ",nPNJ); SetLocalInt(OBJECT_SELF,"SCOREKABUPC",nPC); if (Score(nPNJ)==0) SetLocalInt(OBJECT_SELF,"PNJCONTINUE",FALSE); //score renvoie la difference avec le nombre le plus proche se terminant par 9 else SetLocalInt(OBJECT_SELF,"PNJCONTINUE",TRUE); SetLocalInt(OBJECT_SELF,"PJCONTINUE",TRUE); // pas fini pour les tours suivants } return TRUE; //pour le moment... } Si ça peut t'aider. Je te tiens au courant si je m'en sors. |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
Bon ça a l'air de marcher.
Dialogue (la partie qui nous interesse, avant il y a le "bonjour tu veux jouer avec moi dis ? S'il te plait.") -[PNJ]<CUSTOM70212> (1) --[PJ]Oui (2) ----(1) --[PJ]Non (3) ----(1) --[PJ]Continuer (4) ----(1) Sur la condition de (2) et (3) : NWScript :
int StartingConditional() { int iResult; iResult = GetLocalInt(OBJECT_SELF,"PJCONTINUE"); return iResult; } Sur la condition de (4) : NWScript :
int StartingConditional() { int iResult; iResult =!GetLocalInt(OBJECT_SELF,"PJCONTINUE"); return iResult; } Sur l'action conséquente de (3) : NWScript :
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. et le gros bout sur la condition de 1 : NWScript :
int Carte(int nSorties) { int nRandom = Random(40)+1; while (nRandom == GetLocalInt(OBJECT_SELF,"CARTE0") || nRandom == GetLocalInt(OBJECT_SELF,"CARTE1") || nRandom == GetLocalInt(OBJECT_SELF,"CARTE2") || nRandom == GetLocalInt(OBJECT_SELF,"CARTE3") || nRandom == GetLocalInt(OBJECT_SELF,"CARTE4") ) { nRandom = Random(40)+1; } SetLocalInt(OBJECT_SELF,"CARTE"+IntToString(nSorties),nRandom); nRandom = nRandom%10; if (nRandom == 0) nRandom = 10; return nRandom; } int Score(int nResult) { int iScore,iMin; iMin = abs(nResult-9); iScore = abs(nResult-19); if (iScore<iMin) iMin = iScore; iScore = abs(29-nResult); if (iScore<iMin) iMin = iScore; return iMin; } void Reset() { int i; SetLocalInt(OBJECT_SELF,"PARTIEENCOURS",0); for (i=0;i<5;i++) { SetLocalInt(OBJECT_SELF,"CARTE"+IntToString(i),0); } SetLocalInt(OBJECT_SELF,"SCOREKABUPNJ",0); SetLocalInt(OBJECT_SELF,"SCOREKABUPC",0); } int StartingConditional() { int nPartie = GetLocalInt(OBJECT_SELF,"PARTIEENCOURS"); int nPNJ = Carte(nPartie*2); int nPC = Carte(nPartie*2+1); if (nPartie == 10 ) { Reset(); if (!GetLocalInt(OBJECT_SELF,"PJCONTINUE")) return FALSE; //le PJ veut plus jouer, fin du dialogue nPartie = 0; } if (nPartie ==0)//premier round { SetCustomToken(70212,"Vous tirez un "+IntToString(nPC)+", et votre adversaire un "+IntToString(nPNJ)+". Voulez vous une autre carte ?"); SetLocalInt(OBJECT_SELF,"SCOREKABUPNJ",nPNJ); SetLocalInt(OBJECT_SELF,"SCOREKABUPC",nPC); if (Score(nPNJ)==0) SetLocalInt(OBJECT_SELF,"PNJCONTINUE",FALSE); //si j'ai un 9 j'arrete else SetLocalInt(OBJECT_SELF,"PNJCONTINUE",TRUE); SetLocalInt(OBJECT_SELF,"PJCONTINUE",TRUE); } else { string sText=""; int nScorePC = GetLocalInt(OBJECT_SELF,"SCOREKABUPC"); int nScorePNJ = GetLocalInt(OBJECT_SELF,"SCOREKABUPNJ"); if (GetLocalInt(OBJECT_SELF,"PJCONTINUE")==TRUE) { nScorePC+=nPC; sText = "Vous tirez un "+IntToString(nPC)+" pour un total de "+IntToString(nScorePC)+" et v"; SetLocalInt(OBJECT_SELF,"SCOREKABUPC",nScorePC); } else sText = "Votre score est de "+IntToString(nScorePC)+". V"; if (GetLocalInt(OBJECT_SELF,"PNJCONTINUE")==TRUE) { nScorePNJ+=nPNJ; sText = sText + "otre adversaire tire un "+ IntToString(nPNJ) + " pour un total de " +IntToString(nScorePNJ)+"."; SetLocalInt(OBJECT_SELF,"SCOREKABUPNJ",nScorePNJ); } else sText += "otre adversaire a un total de "+IntToString(nScorePNJ)+"."; if (nPartie == 1) { nPNJ = Score(nScorePNJ); nPC = Score(nScorePC); if (nPNJ == 0 || (nPNJ<nPC && !GetLocalInt(OBJECT_SELF,"PJCONTINUE")) || (nPNJ<nPC && nPNJ <=2) ) //ca devrait suffire, j'arrete { SetLocalInt(OBJECT_SELF,"PNJCONTINUE",FALSE); sText += "Votre adversaire ne tire plus de cartes."; } } if (nPartie == 2 || (GetLocalInt(OBJECT_SELF,"PJCONTINUE")==FALSE && GetLocalInt(OBJECT_SELF,"PNJCONTINUE")==FALSE)) //soit 3eme tour soit les 2 ont arrete, la partie est finie { sText+= " La partie est finie."; if (Score(nScorePNJ) == Score(nScorePC)) sText += " Match nul ! Voulez vous rejouer ?"; else if (Score(nScorePC)<Score(nScorePNJ)) { sText += "Vous avez gagne ! Voulez vous rejouer ?"; GiveGoldToCreature(GetPCSpeaker(),15); } else { sText += " Vous avez perdu ! Voulez vous rejouer ?"; TakeGoldFromCreature(15,GetPCSpeaker()); } SetLocalInt(OBJECT_SELF,"PJCONTINUE",TRUE); nPartie = 9; }// fin de la partie else sText += "Voulez vous une autre carte ?"; SetCustomToken(70212,sText); } nPartie++; SetLocalInt(OBJECT_SELF,"PARTIEENCOURS",nPartie); return TRUE; } Faudra ptet améliorer les choix du PNJ sur sa tactique c'est un peu basique là. Et rajouter ptet un script si le dialogue est interompu (là ça mettrait un beau bordel) en gros recopier le Reset() dedans. Mais ça a l'air d'être pas mal déjà. |
Revenir en haut | |
Djezebel Héros Messages: 252 |
C'est déjà excellent J'ai réussi à le faire marcher.
Par contre, j'ai des trucs bizarres, tu pourras peut-être me dire quel est le problème : Quand le PJ a 5 et le PNJ 22 : le PNJ gagne... Pourquoi ? Car 9 - 5 = 4 et 29 - 22 = 7 ... donc c'est celui qui a le 5 qui devrait gagner... Pareil pour le 10 et 8, ça donne match nul. Or normalement, 10 = 0 (donc 9 points pour aller jusqu'à 9) et de 8 juste 1, donc le 8 est sensé gagné. 16 - 12 => match nul 6 - 10 => Perdu Des idées ? En tout cas c'est déjà fantastique d'avoir pu faire ça Merci pour ton investissement ! PS : Tu crois que tu serais capable de faire un blackjack ? ^^ C'est plus facile je crois, le but est d'arriver au 21 sans le dépasser, on a le droit à autant de cartes qu'on veut. (je vais tenter de le faire mais je ne garantie rien) Merci pour tout ! |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
Ben de rien ça m'amuse !
Ben c'est juste du au fait que j'ai pas compris les règles ! J'avais pas pigé qu'il fallait être en dessous, pour moi 8 et 10 c'est 1 point different de 9 pareil. Gné ! Donc en gros remplace la fonction Score() par NWScript :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.
Ca devrait être plus correct déjà. (mais ça change la tactique du pnj je pense du coup, enfin faut voir ce que ça donne) Pour le blackjack ça devrait être dans le même genre non ? Quasiment la même chose, sans la limite de round (et y a les figures dedans non ?) Si t'y arrives pas je te ferai ça mais tu devrais t'en tirer. |
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
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