La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/11/2024 21:04:20


  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 : 30/01/2006 15:47:41 Sujet du message : Proposition de correctif IA NWN

L'intelligence artificielle, ou comment les monstres réagissent...
- Des archers qui continuent à vous tirer dessus alors que vous avez bu une potion d'invisibilité, des monstres qui continuent à vous poursuivre alors que vous avez passé le coin d'une maison et que vous les voyez en flou (perte de ligne de vue) : ces derniers s'arrêtent si vous êtes MdO mais pas si roublard...
- Pourquoi les petits niveaux ne prennent quasiment pas de risques en rejoignant une mélée ?

Proposition de correction n°1
fichier : x0_inc_generic.nss
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
Code :
// This function returns the target for this combat round.
// Normally, this will be the same target as the last round.
// The only time this changes is if the target is gone/killed
// or they are in dying mode.
object bkAcquireTarget()
{
object oLastTarget = GetAttackTarget();
int n;
// * for now no 'target switching' other
// * than what occurs in the OnDamaged and OnPerceived events
// * (I may roll their functionality into this function
if (GetIsObjectValid(oLastTarget) == TRUE
&& !GetAssociateState(NW_ASC_MODE_DYING, oLastTarget))
{
// ajout d'un test sur la perception qui semble absent ailleurs...
if( GetObjectSeen(oLastTarget) ){
n=0; //SpeakString("see Target") ;
}else{ if( GetObjectHeard(oLastTarget) ){
n=0; //SpeakString("hear Target") ;
}else{
SendMessageToAllDMs(GetName(OBJECT_SELF)+"do not see/hear Target") ;
if( GetIsPC(oLastTarget) ) SendMessageToPC(oLastTarget,GetName(OBJECT_SELF)+" vous a perdu de vue.");
ClearAllActions(TRUE) ;
ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 0.5);
ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT, 0.5);
ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD, 0.5);
ActionMoveToLocation(GetLocation(oLastTarget));
oLastTarget = ChooseNewTarget();
}
}
// fin de l'ajout
return oLastTarget;
} else {
oLastTarget = ChooseNewTarget();
}

// * If no valid target it means no enemies are nearby, resume normal behavior

il faut recompiler nw_c2_default2, nw_c2_default3

Proposition de correction n°2 "combat hardcore"
fichier nw_c2_default6.nss
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
//:Confused///
//:: Update Lylver 2005-07-xx (ptet avant)
//:: Debug AI
//:Confused///////////////////////// ////////////////////////
//:: NW_C2_DEFAULT6
//:: Default OnDamaged handler
/*
    If already fighting then ignore, else determine
    combat round
*/

//:Confused///////////////////////// ////////////////////////
//:: Copyright (c) 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 12/22/2002
//:Confused///////////////////////// ////////////////////////

#include "nw_i0_generic"

void main()
{
    if(GetFleeToExit()) {
        // We're supposed to run away, do nothing
    } else if (GetSpawnInCondition(NW_FLAG_SET_WARNINGS)) {
        // don't do anything?
    } else {
        object oDamager = GetLastDamager();
        if (!GetIsObjectValid(oDamager)) {
            // don't do anything, we don't have a valid damager
        } else if (!GetIsFighting(OBJECT_SELF)) {
            // If we're not fighting, determine combat round
            if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) {
                DetermineSpecialBehavior(oDamager);
            } else {
                if(!GetObjectSeen(oDamager)
                  && GetArea(OBJECT_SELF) == GetArea(oDamager)) {
                    // We don't see our attacker, go find them
                    ActionMoveToLocation(GetLocation(oDamager), TRUE);
                    ActionDoCommand(DetermineCombatRound());
                } else {
                    SetLocalObject(OBJECT_SELF,"LAST_DAMAGER",oDamager) ;
                    DetermineCombatRound();
                }
            }
        } else {
            // We are fighting already -- consider switching if we've been
            // attacked by a more powerful enemy
            object oTarget = GetAttackTarget();
            if (!GetIsObjectValid(oTarget))
                oTarget = GetAttemptedAttackTarget();
            if (!GetIsObjectValid(oTarget))
                oTarget = GetAttemptedSpellTarget();

            // If our target isn't valid
            // or our damager has just dealt us 25% or more
            //    of our hp in damager
            // or our damager is more than 2HD more powerful than our target
            // switch to attack the damager.
            if (!GetIsObjectValid(oTarget)
                || (
                    oTarget != oDamager
                    && (
                        GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4)
                        || ( (GetHitDice(oDamager) - 3) > GetHitDice(oTarget) &&
                        ( oDamager == GetLocalObject(OBJECT_SELF,"LAST_DAMAGER") ) ) // 2 fois et 3 niveaux au lieu de 2
                        )
                    )
                )
            {
                // Switch targets
                SetLocalObject(OBJECT_SELF,"LAST_DAMAGER",oDamager) ;
                DetermineCombatRound(oDamager);
            }
        }
    }

    // Send the user-defined event signal
    if(GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DAMAGED));
    }
}
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.


Testé en 2005 sur SoW.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé 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 55.046ms