La reputation, les faction, et moi !

Répondre
Partager Rechercher
Bien, comme promis, je vais faire un petit recapitulatif de ce que je pense avoir compris des factions ets des reputations.

Attention, ce que j'en sait fonctionne pour moi, mais il demeure encore quelleques zone d'ombre.

Tout d'abords, commencont par quelques definitions :

Reputation
La facon que le autres objets (vivi, pas que les creature ^^) du jeu ont de reagir a votre presence et a vos action.

Faction
Groupe Unique qui est constitué de plusieurs objets (créatures et autres). Les reactions entre les factions sont gérées directement a partir de leur Repuation. Chaque faction peut reagir d'un facon differentes aux autres factions, et qui plus est, une relation entre 2 faction peut tres bien etre du type "je t'aime, moin non plus!")...

Standart Faction
C'est exactement pareil que les factions dont je viens de parler, mais en mieux, pasque ELLES, elles ont droit a un SetReputation (!! C'est po juste !)
Il y en a 5 de base :
- STANDARD_FACTION_COMMONER
- STANDARD_FACTION_DEFENDER
- STANDARD_FACTION_HOSTILE
- STANDARD_FACTION_MERCHANT

et la faction PC, qui en fait est une multi-faction, c'est pourquoi on ne peut la choisir en variable constantes.

Personnal Reputation
Voila une notion tres interessante, que l'on oublie regulierement lorsque l'on gère les factions. En fait, chaque créature est spawnée avec des reputations differentes pour chaque faction existante. La personnal reputation, c'est une reputation directe entre deux objets. Elle est plus forte que la Reputation InterFaction. En fait, c'est une adaptation de la reputation Interfaction. On peut même considerer que ingame que apres le spawn, OBJECT_SELF va acquerir une personnal Reputation de tout les objets du jeu, et ne plus traiter les factions (mais c'est FAUX , et on le verra plus loin).

Les fonctions de reputation

Tres important :
Elles sont assez bien fournit et permettent toutes sortes d'action sur les factions et les objets.(meme si il en manque une : SetFactionReputation...)

AdjustFactionReputation(object1, object2, int) :
Permet d'ajuster la reputation de comment 2 va voir 1.
Necessite #include "nw_i0_plot"

AdjustReputation(object1, object2, int) :
C'est exactement pareil, mais sans le Include... (allez comprendre oO!)


ChangeFaction(object1, object2) :
Permet d'inclure la creature de la faction1 pour le mettre dans la faction2

ChangeToStandardFaction(object, int) :
La meme chose, mais seulement avec l'une des 4 faction de base non-PC.

ClearPersonalReputation(object, object) :
Tres pratique ^^ : permet de reinitialiser une Repuation personnelle pour qu'elle colle a la Reputation de la faction.

GetFactionAverageReputation(object1, object2):
Focntionne en couple avec le Adjust... Cela permet de savoir comment objet 1 voit Objet 2. Cela va permettre, dans un script, de faire le Set. (voire plus loin...)

GetFactionEqual(object1, object2) :
Fonction de simplification qui permet de verifier si l'objet 1 qui approche est de la meme faction que l'objet 2.

GetIsEnemy(object1, object2)
Je pense que cela se passe de commentaire ^^

GetIsFriend(object1, object2)
...

GetIsNeutral(object, object)
Dans les 3 fonctions ci dessus, considerez objet2 comme etant OBJECT_SELF.

GetIsReactionTypeFriendly(object, object)
Un peu comme GetIsFriend. Ca permet entre autre de faire des script de non aggression... (boff boff...)

GetIsReactionTypeHostile(object, object)
pareil...

GetIsReactionTypeNeutral(object, object)
pareil...

GetReactionAdjustment(object)
Cette faction a un nom qui annonce beaucoup, mais en fait, ne sert que pour l'ajustement du prix d'un magasin en fonctionde la reputation(ie : alignement, et non reputation...oO) du PC. Interessant quand même...

GetReputation(object1, object2)
La reptation personnelle de objet 1 envers objet2

GetStandardFactionReputation(int, object)
Comme pour le GetAverageFactionRep, mais la, on a directement la reputation de la faction de objet envers la faction standart entrée.

SetIsEnemy(object)
Cela va en fait ajuster automatiquement la reputation de objet envers le declencheur du script a -100, et donc Hostile. cela va aussi declencher l'attaque.

SetIsTemporaryEnemy(object, object, int, float) :
La meme chose, mais parametrable, puisque l'on peut gerer une inimité temporaire. (ou une inimité entre 2 objet sans OBJECT_SELF dedans).

SetIsTemporaryFriend(object, object, int, float) :
Pareil...

SetIsTemporaryNeutral(object, object, int, float) :
...

SetPCDislike(object1, object2)
Je ne connais pas encore bien l'effet du dislike. si vous aviez plus d'info.

SetStandardFactionReputation(int1, int2, object) :
Permet de directement ajuster la faction int1 de l'objet au montant égal à int2. Cette fonction permet une gestion simple des alterations de reputation, puisque les ajustments de reputations suivants les actions effectués ne sont pas tous les mêmes, tandis que le Set lui va pouvoir definir un nombre controlé et maitrisé. (mais je m'égare...)

Pour finir :

A noter que lorsque l'on tue un monstre, la reputation de la faction diminue un peu (entre -2 et -5), mais que la perception de l'attaque par les membres alentours modifie a tous leur reputation personnelle. (d'ou les changement entre area... ~_^)


Pour ceux que ca interresse de faire un SetReputation pour des faction non-standart, je propose ceci :

Code PHP:

//int nAdjust = ce que vous voulez Set.

AdjustReputation(objet1,objet2nAdjust GetFactionAverageReputation(objet1,objet2)); 

voila... en esperant que ca aide.

Je repondrait a toutes les questions dont j'ai les reponses...
Quelqu'un a-t-il progressé sur ces grandes lignes présentées par eM ?

Et plus précisément, quelqu'un aurait-il trouvé le moyen de rendre agressif une seule cible envers une seule autre (et non, envers toute la faction) ?
Pour cette derniere question, je te conseille le SetIsTemporaryEnnemy (ou friend) qui ne va affecter que la cible.

(toutefois, celle ci va alerter sa faction lors du combat qui va s'en suivre, et va diminuer ta reputation a la mort.... Mieux vaut pour toi de lui attribuer une faction specifique ^^)
Oui, j'aurais du spécifier, comment rendre un seul PNJ agressif à l'encontre d'un seul PJ, et je précise, tout en passant par le DetermineCombatRound() afin de bénéficier de l'IA ?

Le SetTemporaryEnemy fonctionne comme le SetEnemy, délai en plus, non ? Donc, cela signifie que cela modifie uniquement le coefficient de réputation, et non de faction, de façon à modifier seulement le comportement de mon PNJ (et de lui seul) face à la faction PJ. Mais il est malheureusement bien agressif envers toute la faction PJ. Et quand bien même, ce ne serait pas le cas, il suffit que le PNJ tue le PJ en deux rounds, et que j'ai prévu un SetTemporary de 30 secondes, pour qu'il ait le temps de s'en prendre à un autre PJ.

Pour les patterns, admettons que je les supprime dans ce cas, et oublions les alertes entre PNJs.

En bref, je n'arrive pas à rendre de façon efficace un seul PNJ agressif à l'encontre d'un seul PJ. Y a-t-il quelque chose qui m'échappe ?
Il me semble qu'il y a un Parametre pour le ActionAttack() qui pourrait gerer ca, mais je ne suis pas sur.
(au pire : stockage d'un PC en LocalObject sur le NPC, et DetermineCombatRound sur GetLocalObject(...) sur le script de OnCombatRoundEnd...


En ce qui concerne les patternes, et la mort du PnJ, bon courage ^^;
Oui eM, j'en étais à peu près là. Il me semble que le ActionAttack, malheureusement, ne passe pas par le script générique d'IA (DetermineCombatRound). C'est une solution intermédiaire, si on veut faire exécuter une attaque physique simple. Par contre, il ne fonctionne que pour un round, donc on peut le relancer round après round. Mais j'aurais bien aimé conserver les bénéfices de l'IA du générique.

Bon, merci eM, je vais continuer à chercher une solution.
Comment récupérer le nom (ou la valeur à la limite puisque les STANDARD_FACTION_X sont des entiers) de la faction d'un NPC ?

J'aimerais effectuer un test sur le nom de la faction ("voleurs de la ville" par exemple) d’un NPC pour vérifier qu’il fait bien partit de cette faction.

Mais j'ai bien peur que cela ne soit pas possible.
Je te ferais la réponse que j'ai toujours faite à tous ceux qui ont des problèmes avec leurs factions non-standards : crée des "référent" pour chaque faction !

Exemple ici :
Tu crée un objet de la faction "voleurs de la ville", tu lui donne comme tag "voleurs_de_la_ville" et maintenant tu peux utiliser GetFactionEqual() pour déterminer si un objet est bien de cette faction...

Encore mieux, tu peux créer une nouvelle fonction :
Code PHP:

//cette fonction vérifie si oObj1 appartient bien
//à la faction sFactionName, 
//attention, on écrit le nom de la faction en remplaçant les ' ' par des '_'
int GetIsFactionobject oObj1string sFactionName);

int GetIsFactionobject oObj1string sFactionName)
{
   return 
GetFactionEqual(oObj1GetObjectByTagsFactionName  ) );

Evidemment, il faut créer un "référent" par faction, mais ça ne pose sûrement aucun problème, non ?
Citation :
AdjustFactionReputation(object1, object2, int) :
Permet d'ajuster la reputation de comment 2 va voir 1.
Necessite #include "nw_i0_plot"

AdjustReputation(object1, object2, int) :
C'est exactement pareil, mais sans le Include... (allez comprendre oO!)
Vi, c'est assez space :
Code PHP:

//::///////////////////////////////////////////////
//:: AdjustFactionReputation
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Adjusts all faction member's reputation visa via
    another faction.  Pass in a member from each
    faction.
*/
//:://////////////////////////////////////////////
//:: Created By: Presotn Watamaniuk
//:: Created On: Nov 15, 2001
//:://////////////////////////////////////////////
void AdjustFactionReputation(object oTargetCreatureobject oMemberOfSourceFactionint nAdjustment)
{
    
object oFaction GetFirstFactionMember(oTargetCreature);
    while(
GetIsObjectValid(oFaction))
    {
        
AdjustReputation(oTargetCreatureoMemberOfSourceFactionnAdjustment);
        
oFaction GetNextFactionMember(oTargetCreature);
    }
    
AdjustReputation(oTargetCreatureoMemberOfSourceFactionnAdjustment);

Tandis que le premier est bien censé faire :
Code PHP:

// Adjust how oSourceFactionMember's faction feels about oTarget by the
// specified amount.
// Note: This adjusts Faction Reputation, how the entire faction that
// oSourceFactionMember is in, feels about oTarget.
// * No return value
void AdjustReputation(object oTargetobject oSourceFactionMemberint nAdjustment
Donc je vois pas l'intérêt a priori.

Mais les groupes de PJ, spa considéré comme Faction quand tu fais un "GetFirstFactionMember" / "GetNext.." ? Il me semblait que si, auquel cas AdjustFactionReputation a davantage de sens.

Bon, à la base j'allais demander s'il y avait pas plus simple que la technique du "référent" pour toutes les factions personnalisées, mais vu la réponse de Jedaï je suppose que non. *Bougonne.*
Répondre

Connectés sur ce fil

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