Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

question technik: quete a 3 objets

Par fauxninja le 27/12/2002 à 13:18:50 (#2888396)

Salut, j'aimerai savoir ce qu'il vau mieu faire pour faire donner une recompense a un joueur en l'echange de 3 objet.

j'ai fai 3 " if " enchainé, mais ca plante, ca done la recompense en chaine....

Par TheRack le 27/12/2002 à 14:31:14 (#2888919)

fais un truc du genre :

if (("1ère condition") && ("2ème condition") && ("3ème condition"))
{
"donne récompense"
}

Par coolstar le 27/12/2002 à 16:26:44 (#2889675)

Tout à fait! (ma formulation préférée d'ailleurs!) ;)


Cependant, en observant précisément comment les gars de NWN s'y prennent, j'ai découvert qu'ils employaient une autre méthode... tout aussi élémentaire en y réfléchissant bien... mais je ne saisi pas encore quelle peut être la plus pertinente en définitive... :D


int StartingConditional()
{
object oPC = GetPCSpeaker();

// Si l'un ou l'autre des Objets n'est pas Valide, le 'startingConditional' est rejeté :
if(!GetIsObjectValid(GetItemPossessedBy(oPC, "item_01")))
return FALSE; // Rejet pour 'Condition' non respectée
if(!GetIsObjectValid(GetItemPossessedBy(oPC, "item_02")))
return FALSE; // Idem
if(!GetIsObjectValid(GetItemPossessedBy(oPC, "item_03")))
return FALSE; // Idem

return TRUE; // Si aucun Objet ne fait défaut alors la 'Condition' est Validée...
}



En fait, pour être plus précis, NWN utilise une autre formulation que '(!GetIsBobjectValid(GetItemPossessedBy(oPC, "item_02")))'... (Cf. l'Assistant script!) :maboule:

//::///////////////////////////////////////////////
//:: FileName sc_037
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Script Wizard
//:: Created On: 28/01/2003 06:06:49
//:://////////////////////////////////////////////
#include "nw_i0_tool"

int StartingConditional()
{

// Vérifier que le PJ qui parle possède ces objets dans son inventaire
if(!CheckPartyForItem(GetPCSpeaker(), "item_01"))
return FALSE;
if(!CheckPartyForItem(GetPCSpeaker(), "item_02"))
return FALSE;
if(!CheckPartyForItem(GetPCSpeaker(), "item_02"))
return FALSE;

return TRUE;
}


Sachant que l'Expression 'CheckPartyForItem' émane de l'Include #include "nw_i0_tool"... faisant la même chose, mais traitant à priori en plus tous les membres de la même Faction pour ce faire (donc tous les PC d'un même groupe ici!)... Ce qui Valide la Condition du moment que les PCs répondent seuls ou à plusieurs aux exigences... :blabla:

///////////////////////////////////////////////////////////////////////////////
//
// CheckPartyForItem
//
///////////////////////////////////////////////////////////////////////////////
// Checks everyone in the party for an item
///////////////////////////////////////////////////////////////////////////////
// Created By: Brent, September 13, 2001
///////////////////////////////////////////////////////////////////////////////

int CheckPartyForItem(object oMember, string sItem)
{
object oPartyMember = GetFirstFactionMember(oMember, TRUE);
while (GetIsObjectValid(oPartyMember) == TRUE)
{
if(HasItem(oPartyMember, sItem))
return TRUE;
oPartyMember = GetNextFactionMember(oMember, TRUE);
}

return FALSE;
}





(Bon ok, j'arrête!) :p



EDIT
---------------------
Pour faute de frappe stupide!
---------------------

Par RAT le 28/12/2002 à 4:19:22 (#2893551)

Normalement tu peux le rendre plus simple avec une seule condition cool :):):D



int startingConditional()
{
object oPC = GetPCSpeaker();

// Si l'un ou l'autre des Objets n'est pas Valide, le 'startingConditional' est rejeté :
if((!GetIsBobjectValid(GetItemPossessedBy(oPC, "item_01")))
|| (!GetIsBobjectValid(GetItemPossessedBy(oPC, "item_02")))
|| (!GetIsBobjectValid(GetItemPossessedBy(oPC, "item_03"))))
return FALSE; // Rejet pour 'Condition' non respectée




return TRUE; // Si aucun Objet ne fait défaut alors la 'Condition' est Validée...
}



si bien sur il faut que l'une des trois conditions soit vrai pour qu'elle passe sinon s'il faut que les Trois conditions ne doivent pas être valide pour faire un return false alors il faut remplacer le || par && .

Enfin voilou :)):)

juste pour optimiser un peu :).

Par Jedaï le 28/12/2002 à 11:24:37 (#2894230)

Oui mais là c'est juste une optimisation au niveau de l'expression : au niveau de l'exécution le script de Bioware est préférable. Ceci parce que le "||" n'est pas optimisé : il ne renvoie pas TRUE dès que l'une des conditions est remplie....:(

En fait la meilleure solution, c'est encore le script avec les "&&" car ceux-ci bizarrement sont optimisés :eek: : dès qu'une condition est fausse, ils renvoient FALSE. Donc ce script est approximativement autant optimisé que celui de Bioware point de vue exécution et plus lisible et logique "à l'oeil" !:D

Par coolstar le 28/12/2002 à 15:15:37 (#2895498)

D'où ma formule préférée! :D




PS: Vi vi Rat! je pense que coolsar avait remarqué ton truc aussi... ;)

Par coolstar le 28/12/2002 à 16:51:43 (#2896022)

En définitive, voilà comment j'écrirais plutôt les choses... :D


int StartingConditional()
{
// DECLARATION DES VARIABLES :
object oPC = GetPCSpeaker(); // PC en Conversation;
object oItem01 = GetItemPossessedBy(oPC, "item_01"); // Y Chercher "item_01"
object oItem02 = GetItemPossessedBy(oPC, "item_02"); // Y Chercher "item_02"
object oItem03 = GetItemPossessedBy(oPC, "item_03"); // Y Chercher "item_03"

// "return TRUE" : si les 3 'Conditions' sont Validés simulatanement...
return (GetIsObjectValid(oItem01) && GetIsObjectValid(oItem02) && GetIsObjectValid(oItem03));
}





PS: Tu sais, je n'aime vraiment pas ta façon d'employer ainsi les "||" Rat... ça met vraiment le cerveau à l'envers de tout inverser ainsi
(comme disait Jedaï, facilitons donc la Lecture!)... :maboule:

JOL Archives 1.0.1
@ JOL / JeuxOnLine