JeuxOnLineForumsPlusConnectés : 865 (sites) | 1633 (forums)Créer un compte
Neverwinter Nights
Maskado
Répondre
Partager Outils Rechercher
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 

TouchAttackRanged

Je me souviens que jadis on reprochait à cette fonction Bioware de simplement effectuer un d20() sans autre forme de calcul.
Depuis je ne sais pas ce qu'il en est devenu, il faut dire que le code de cette fonction n'est pas accessible.
Me méfiant justement de ce que je ne connais pas, j'ai préféré écrire ma propre fonction pour les attaques de contact à distance utiles à certains sorts.

Code PHP:
//CA de la cible d'une attaque de contact a distance
int GetTouchAttackAC(object oTarget);

//Effectue une attaque de contact a distance de oAttacker sur oTarget
//2 = Critique, 1 = Touche, 0 = rate
int TouchRangedAttack(object oAttackerobject oTarget);

int GetTouchAttackAC(object oTarget)
{
 
int nDodge;
 if(
GetHasFeatEffect(FEAT_DODGEoTarget)) nDodge 1;
 
int nDex GetAbilityModifier(ABILITY_DEXTERITYoTarget);
 
int nAC nDex nDodge;
 
effect eParal GetFirstEffect(oTarget);
 while(
GetIsEffectValid(eParal))
 {
  if(
GetEffectType(eParal) == (EFFECT_TYPE_ENTANGLE || EFFECT_TYPE_PARALYZE 
   
|| EFFECT_TYPE_PETRIFY || EFFECT_TYPE_SLEEP || EFFECT_TYPE_STUNNED))
  {
   
nAC 0;
  }
  
eParal GetNextEffect(oTarget);
 }
 return 
nAC;
}

//BAB + Dex + Taille
int TouchRangedAttack(object oAttackerobject oTarget)
{
 
int nBAB GetBaseAttackBonus(oAttacker);
 
int nDex GetAbilityModifier(ABILITY_DEXTERITYoAttacker);
 
int nTaille GetCreatureSize(oTarget);
 
int nBTaille;
 switch(
nTaille)
 {
  case 
CREATURE_SIZE_TINY:
   
nBTaille = -4;
   break;
  case 
CREATURE_SIZE_SMALL:
   
nBTaille = -2;
   break;
  case 
CREATURE_SIZE_MEDIUM:
   
nBTaille 0;
   break;
  case 
CREATURE_SIZE_LARGE:
   
nBTaille 2;
   break;
  case 
CREATURE_SIZE_HUGE:
   
nBTaille 4;
   break;
  default:
   
nBTaille 0;
   break;
 }
 
int nD20 d20(1);
 if(
nD20 20)
  return 
2;
 else
 {
  
int nTouch nD20 nBAB nDex nBTaille;
  
int nAC GetTouchAttackAC(oTarget);
  if(
nTouch nAC)
   return 
1;
  else
   return 
0;
 }

[Edit pour lisibilité]
Lien direct vers le message - Vieux
Avatar de Caarheim/Mougeot
Caarheim/Mougeot [Epsi]
Alpha & Oméga
 
Avatar de Caarheim/Mougeot
 
Quelque petit probleme au niveau des regles :


_ tu oublie de rajouter 10 a la CA de la cible

_ c ___nTouch >= nAC___ et pas ___nTouch > nAC___

_ la taille ainsi que la race de la creature compte aussi bien dans la CA que dans les jet d attaque

_ le feat dodge ne fonctionne que sur un adversaire, normalement au choix sur papier que l on choisi a n importe quel moment dans le tour de jeu, et dans NWN marche sur la cible actuelle ou le dernier attaquant, mais donc pas sur tout les adversaires en meme temps. Mais comment testé si oTarget a mis dodge sur oAttacker ...
Lien direct vers le message - Vieux
Avatar de gaeriel/nekresh
gaeriel/nekresh
Empereur
 
Avatar de gaeriel/nekresh
 
Dolanor l'avait refait quand il a rescripte le sort rayon de givre. Faut regarder dans le persistants sur les scripts et la reecriture des sorts en particulier (y'avais meme une gestion du miss avec le rayon qui touchait a cote )
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Citation:
le feat dodge ne fonctionne que sur un adversaire, normalement au choix sur papier que l on choisi a n importe quel moment dans le tour de jeu, et dans NWN marche sur la cible actuelle ou le dernier attaquant, mais donc pas sur tout les adversaires en meme temps. Mais comment testé si oTarget a mis dodge sur oAttacker ...
Justement GetHasFeatEffect fait ça (cette fonction est différente de GetHasFeat)

** Les 10 de la CA et le >= c'est corrigé, merci de l'info.

** Pour la taille, des spécialistes de D&D me disent que ça ne s'applique que pour l'attaquant, et les livres de règles semblent leur donner raison.

Script corrigé:

Code PHP:
//CA de la cible d'une attaque de contact a distance
int GetTouchAttackAC(object oTarget);

//Effectue une attaque de contact a distance de oAttacker sur oTarget
//2 = Critique, 1 = Touche, 0 = rate
int TouchRangedAttack(object oAttackerobject oTarget);

int GetTouchAttackAC(object oTarget)
{
 
int nDodge;
 if(
GetHasFeatEffect(FEAT_DODGEoTarget)) nDodge 1;
 
int nDex GetAbilityModifier(ABILITY_DEXTERITYoTarget);
 
int nAC 10 nDex nDodge;
 
effect eParal GetFirstEffect(oTarget);
 while(
GetIsEffectValid(eParal))
 {
  if(
GetEffectType(eParal) == (EFFECT_TYPE_ENTANGLE || EFFECT_TYPE_PARALYZE 
  
|| EFFECT_TYPE_PETRIFY || EFFECT_TYPE_SLEEP || EFFECT_TYPE_STUNNED))
  {
   
nAC 10;
  }
  
eParal GetNextEffect(oTarget);
 }
 return 
nAC;
}

//BAB + Dex + Taille + Portee
int TouchRangedAttack(object oAttackerobject oTarget)
{
 
int nBAB GetBaseAttackBonus(oAttacker);
 
int nDex GetAbilityModifier(ABILITY_DEXTERITYoAttacker);
 
int nTaille GetCreatureSize(oTarget);
 
int nBTaille;
 switch(
nTaille)
 {
  case 
CREATURE_SIZE_TINY:
   
nBTaille = -4;
   break;
  case 
CREATURE_SIZE_SMALL:
   
nBTaille = -2;
   break;
  case 
CREATURE_SIZE_MEDIUM:
   
nBTaille 0;
   break;
  case 
CREATURE_SIZE_LARGE:
   
nBTaille 2;
   break;
  case 
CREATURE_SIZE_HUGE:
   
nBTaille 4;
   break;
  default:
   
nBTaille 0;
   break;
 }
 
int nD20 d20(1);
 if(
nD20 20)
  return 
2;
 else
 {
  
int nTouch nD20 nBAB nDex nBTaille;
  
int nAC GetTouchAttackAC(oTarget);
  if(
nTouch >= nAC)
   return 
1;
  else
   return 
0;
 }

Lien direct vers le message - Vieux
Avatar de gaeriel/nekresh
gaeriel/nekresh
Empereur
 
Avatar de gaeriel/nekresh
 
Je rajouterai un break dans le calcul de la CA :
Code PHP:
while(GetIsEffectValid(eParal))
 {
  if(
GetEffectType(eParal) == (EFFECT_TYPE_ENTANGLE || EFFECT_TYPE_PARALYZE 
  
|| EFFECT_TYPE_PETRIFY || EFFECT_TYPE_SLEEP || EFFECT_TYPE_STUNNED))
  {
   
nAC 10;
   break;
  }
  
eParal GetNextEffect(oTarget);
 } 
Afin de pouvoir economiser un minimum de temps processeur (c'est sans doute pas beaucoup mais pas beaucoup sur chaque script ca commence a faire pas mal )
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
En effet, l'utilisation du break est appropriée dans ce cas-ci.
Lien direct vers le message - Vieux
Avatar de gaeriel/nekresh
gaeriel/nekresh
Empereur
 
Avatar de gaeriel/nekresh
 
Tant qu'on y est sur l'optimisation, y a t'il une difference entre le while et le for ? (autre que le nombre de lignes ?)
On pourrait aussi bien ecrire :
Code PHP:
for (effect eParal GetFirstEffect(oTarget); GetIsEffectValid(eParal); eParal GetNextEffect(oTarget))
{
  [...]

Sinon c'est juste une question de comprehension.

edit: je veux faire le malin et je merde mon for (corrige)
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Le for agit sur un compteur, le while sur la valeur d'une comparaison, ce n'est pas du tout la même chose.

Dans l'exemple que tu donnes, la 2e expression des paramètres de la boucle for est le "break statement", donc la condition pour quitter la boucle.
Dans ton exemple, si l'effet n'est pas valide, on quitte. Ce qui n'est pas faux en soi, mais ça reviendrait alors à utiliser le while sans le break
Lien direct vers le message - Vieux
Avatar de gaeriel/nekresh
gaeriel/nekresh
Empereur
 
Avatar de gaeriel/nekresh
 
Nan, j'ai rien change. Ce qu'il y a dans le while est aussi dans le for. J'ai juste mis l'initialisation et l'incrementation sur la meme ligne que la condition. En gros, on a :
Code PHP:
for (effect eParal GetFirstEffect(oTarget); GetIsEffectValid(eParal); eParal GetNextEffect(oTarget))
{
 if(
GetEffectType(eParal) == (EFFECT_TYPE_ENTANGLE || EFFECT_TYPE_PARALYZE 
  
|| EFFECT_TYPE_PETRIFY || EFFECT_TYPE_SLEEP || EFFECT_TYPE_STUNNED))
  {
   
nAC 10;
   break;
  }

Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Comme ça ok, je pensais que tu voulais remplacer le while et le if en une seule fois

Le "break statement" du for n'est pas nécessaire dans ce cas-ci, car GetFirstEffect renvoit EffectInvalid si la cible ne possède pas d'effet actif.
Lien direct vers le message - Vieux
Avatar de gaeriel/nekresh
gaeriel/nekresh
Empereur
 
Avatar de gaeriel/nekresh
 
Ouais mais tu l'as pas fait.
De plus, je pense pas qu'il y ait d'optimisation pour le for par rapport au while. Je pense meme ue le for et le while compiles donnent la meme chose
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Certains aiment chicaner, chacun son truc.
Lien direct vers le message - Vieux
Avatar de Dolanor
Dolanor
Alpha & Oméga
 
Avatar de Dolanor
 
Citation:
Provient du message de gaeriel/nekresh
Dolanor l'avait refait quand il a rescripte le sort rayon de givre. Faut regarder dans le persistants sur les scripts et la reecriture des sorts en particulier (y'avais meme une gestion du miss avec le rayon qui touchait a cote )
Vi en effet, j'ai retrouvé le lien


http://forums.jeuxonline.info/showth...hreadid=194426

En fait mon touchrange gere la ca des moines qui evolue selon leur nivo et aussi leur bonus de sagesse a la CA
Par contre je ne gerais pas le 10 de ca face a des etats comme entangle ou autre petrification ou stun.

Enfin bon, ca reste de la bidouille tant que l'on ne peut pas obtenir le type de CA dans la CA totale d'un personnage.
C moins chiant d'enlever de la CA totale tous les bonus de CA d'armure naturelle, armure et bouclier plutot que de partir de 10 puis de rajouter au bonheur la chance (ce qui ne comprends pas les bonus de CA grace aux sorts ( un + 2 grace a une protection contre le mal, c pas a negliger pour un nivo 1) Mais cela revient a repertorier chaque sort de bonus de CA selon leur type de bonus et de mettre un enorme switch case pour verifier la presence d'un effet de CA sur un personnage pouvant servir contre l'attaque de toucher.

Moi je veux juste un : GetAcValue(object Target, int BonusType)
Apres on fait un GetACValue(oTarget, NATURAL_ARMOR) et on le déduit d'un GetACValue(oTarget, ALL_BONUS)

Enfin bon. C'est a bioware de bouger
Lien direct vers le message - Vieux
Avatar de Caarheim/Mougeot
Caarheim/Mougeot [Epsi]
Alpha & Oméga
 
Avatar de Caarheim/Mougeot
 
Citation:
Provient du message de Nissus/Nek/Delph
** Pour la taille, des spécialistes de D&D me disent que ça ne s'applique que pour l'attaquant, et les livres de règles semblent leur donner raison.
ATTACK BONUS
Your attack bonus with a melee weapon is:
Base attack bonus + Strength modifier + size modifier
With a ranged weapon, your attack bonus is:
Base attack bonus + Dexterity modifier + size modifier + range penalty

.....

ARMOR CLASS
Your Armor Class (AC) represents how hard it is for opponents to land a solid, damaging blow on you. It’s the attack roll result that an opponent needs to achieve to hit you. Your AC is equal to the following: 10 + armor bonus + shield bonus + Dexterity modifier + size modifier
Touch Attacks: Some attacks disregard armor, including shields and natural armor. In these cases, the attacker makes a touch attack roll (either ranged or melee). When you are the target of a touch attack, your AC doesn’t include any armor bonus, shield bonus, or natural armor bonus. All other modifiers, such as your size modifier, Dexterity modifier, and deflection bonus (if any) apply normally.

......

size modifier
Colossal -8
Gargantuan -4
Huge -2
Large -1
Medium 0
Small +1
Tiny +2
Diminutive +4
Fine +8

.......

En bref, le modificateur de taille influence le bonus d attaque de l attaqueur en fonction de sa taille, mais aussi la CA de la cible

Donc tes valeurs de modificateur en fonction de la taille de la cible sont deja le double de ce quil devrait etre, et tu ne prends pas en comptes la taille de l attaquant.


C'est qui tes specialiste ???

edit : oups, j ai pas dis que ca venait du SRD v3.5
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Ouais bon, faut p'tet penser à prendre les mêmes références si on veut comparer.

Entre le bouquin 3e Edition VF et un texte 3.5 VO....
Lien direct vers le message - Vieux
Répondre

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +2. Il est actuellement 17h39.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite