jet pour toucher / bonus de base a l'attaque

Répondre
Partager Rechercher
J'aurai besoin de scripter un "jet pour toucher" (1D20 + Bonus de For/Dex + Bonus de base a l'attaque).
Je sais récupérer le bonus de force et de dex (pour les armes de corps a corps / a distance) mais pas le Bonus de base a l'attaque dépendant du niveau et de la classe.

Quelqu'un aurait un moyen de faire ca ?
Tu peux peut-etre utiliser les fonctions TouchAttackMelee et TouchAttackRanged, qui te font toutes seules un jet d'attaque en prenant en compte tous les bonus.

Sinon pour récupérer le bab, je sais pas...
Ah, je n'avais pas fait attention a ces fonctions, je vais regarder ce qu'elles renvoient.

[Edit]
Apres verification, ce n'est pas vraiment ce que je cherche. En fait j'ai besoin du "score" realisé, pas de savoir si tel ou tel CA sera touchée ... (bon la je ne suis pas tres clair, en fait j'ai besoin du resultat "D20 + Bonus")
[/Edit]

[Re-Edit]
Apres recherche directement sur les Forums de bioware, il semblerai que l'on soit obligé de recalculer le bonus de base a l'attaque en fonction des classes.
J'ai trouvé cette fonction :

Code PHP:

// Get the base <span class="highlight">attack</span> bonus of oTarget
int MTGetBAB(object oTarget OBJECT_SELF)
{
  
int class, leveltotalitemp;
  
temp 0;
  for(
i=1;i<=3;i++)
  {
    
level GetLevelByPosition(i);
    switch(
GetClassByPosition(i))
    {
      case 
CLASS_TYPE_BARBARIAN: class = 1; break;
      case 
CLASS_TYPE_BARD: class = 2; break;
      case 
CLASS_TYPE_CLERIC: class = 2; break;
      case 
CLASS_TYPE_DRUID: class = 2; break;
      case 
CLASS_TYPE_FIGHTER: class = 1; break;
      case 
CLASS_TYPE_MONK: class = 2; break;
      case 
CLASS_TYPE_PALADIN: class = 1; break;
      case 
CLASS_TYPE_RANGER: class = 1; break;
      case 
CLASS_TYPE_ROGUE: class = 2; break;
      case 
CLASS_TYPE_SORCERER: class = 3; break;
      case 
CLASS_TYPE_WIZARD: class = 3; break;
      case 
CLASS_TYPE_ABERRATION: class = 2; break;
      case 
CLASS_TYPE_ANIMAL: class = 2; break;
      case 
CLASS_TYPE_CONSTRUCT: class = 2; break;
      case 
CLASS_TYPE_HUMANOID: class = 2; break;
      case 
CLASS_TYPE_MONSTROUS: class = 1; break;
      case 
CLASS_TYPE_ELEMENTAL: class = 2; break;
      case 
CLASS_TYPE_FEY: class = 3; break;
      case 
CLASS_TYPE_DRAGON: class = 1; break;
      case 
CLASS_TYPE_UNDEAD: class = 3; break;
      case 
CLASS_TYPE_COMMONER: class = 3; break;
      case 
CLASS_TYPE_BEAST: class = 2; break;
      case 
CLASS_TYPE_GIANT: class = 2; break;
      case 
CLASS_TYPE_MAGICAL_BEAST: class = 1; break;
      case 
CLASS_TYPE_OUTSIDER: class = 1; break;
      case 
CLASS_TYPE_SHAPECHANGER: class = 2; break;
      case 
CLASS_TYPE_VERMIN: class = 2; break;
      default: class = 
0; break;
    }
    switch(class)
    {
      case 
1temp level; break;
      case 
2temp FloatToInt(level 0.75); break;
      case 
3temp FloatToInt(level 0.5); break;
      default: 
temp 0;
    }
    
total += temp;
  }
  return 
total;



Reste a prendre en compte les feats et le bonus de l'arme...
(et a ne pas en oublier)

[/Re-Edit]
Question
Citation :
Provient du message de Iridian
[Edit]
Apres verification, ce n'est pas vraiment ce que je cherche. En fait j'ai besoin du "score" realisé, pas de savoir si tel ou tel CA sera touchée ... (bon la je ne suis pas tres clair, en fait j'ai besoin du resultat "D20 + Bonus")
[/Edit]
Quelle en est l'application?
Citation :
Provient du message de Alastor
Quelle en est l'application?
Mettre en compétition les PJs dans un concourt de tir a l'arc ou le score ne serai pas basé sur les dégâts mais bien sur la précision.

Je voudrais pouvoir faire :
Score = Moyenne des 5 meilleurs tirs sur 10 tirs
avec
Tir = 1D20 + bonus pour toucher

Le problème c'est qu'a priori on ne peu récupérer "bonus pour toucher" .... je vais donc le recalculer de manière approximative.

En plus de la fonction ci dessus, je comptes utiliser celle ci :
(attention fonction non testé et écrite sous notepad )
Code PHP:

int BonusPourToucherADistance(object oPC){
    
int iBonus 0;
    
object oArme GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);

    
//gestion des armes de predilection
    
switch (GetBaseItemType(oArme))
        case 
BASE_ITEM_DART: if(GetHasFeat(FEAT_WEAPON_FOCUS_DART,oPC)){iBonus=iBonus+1;} break;
        case 
BASE_ITEM_HEAVY_CROSSBOW: if(GetHasFeat(FEAT_WEAPON_FOCUS_HEAVY_CROSSBOW,oPC)){iBonus=iBonus+1;} break;
        case 
BASE_ITEM_LIGHT_CROSSBOW: if(GetHasFeat(FEAT_WEAPON_FOCUS_LIGHT_CROSSBOW,oPC)){iBonus=iBonus+1;} break;
        case 
BASE_ITEM_LONGBOW: if(GetHasFeat(FEAT_WEAPON_FOCUS_LONGBOW,oPC)){iBonus=iBonus+1;} break;
        case 
BASE_ITEM_SHORTBOW: if(GetHasFeat(FEAT_WEAPON_FOCUS_SHORTBOW,oPC)){iBonus=iBonus+1;} break;
        case 
BASE_ITEM_SHURIKEN: if(GetHasFeat(FEAT_WEAPON_FOCUS_SHURIKEN,oPC)){iBonus=iBonus+1;} break;
        case 
BASE_ITEM_THROWING_AXE: if(GetHasFeat(FEAT_WEAPON_FOCUS_THROWING_AXE,oPC)){iBonus=iBonus+1;} break;
    }

    
//gestion tir a bout portant (qui donne un bonus de +1 a moins de 15 pieds avec les armes a distance)
    
if (GetHasFeat(FEAT_POINT_BLANK_SHOT,oPC)){iBonus=iBonus+1;}

                
iBonus=iBonus GetAbilityModifier(ABILITY_DEXTERITY,oPC);
    return 
iBonus;

A moins evidemment qu'une bonne ame ai une solution plus econome en lignes
Arrow
Citation :
A moins evidemment qu'une bonne ame ai une solution plus econome en lignes
En virant toutes les lignes d'armes de mêlées par exemple?

Sauf si tu autorises le type à lancer son épée à 2 mains dans la cible.

Ca évite aussi de devoir prendre en compte le talent "botte secrète" (FEAT_WEAPON_FINESSE) qui ne joue que sur les armes de mêlées (et dans le cas où le bonus de dex excède celui de force); et donc de grandement alléger la fonction int BonusCarac(object oPC).
(sauf erreur, ça donne ça)



Code PHP:

int BonusCarac(object oPC){
    
//recuperation du score de dex (la force n'étant pas prise en compte les bonus aux armes de jets)
    
    
int iDex GetAbilityModifier(ABILITY_DEXTERITY,oPC);

        return 
iDex;
    
}

int BonusFeat(object oPC){
    
int iBonus 0;
    
object oArme GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);

    
//gestion des armes de predilection pour les armes de tirs
    
switch (GetBaseItemType(oArme))
        
        case 
BASE_ITEM_SLING: if(GetHasFeat(FEAT_WEAPON_FOCUS_SLING,oPC)){iBonus=iBonus+1;} break;    
        case 
BASE_ITEM_DART: if(GetHasFeat(FEAT_WEAPON_FOCUS_DART,oPC)){iBonus=iBonus+1;} break;
        case 
BASE_ITEM_HEAVY_CROSSBOW: if(GetHasFeat(FEAT_WEAPON_FOCUS_HEAVY_CROSSBOW,oPC)){iBonus=iBonus+1;} break;
        case 
BASE_ITEM_LIGHT_CROSSBOW: if(GetHasFeat(FEAT_WEAPON_FOCUS_LIGHT_CROSSBOW,oPC)){iBonus=iBonus+1;} break;
        case 
BASE_ITEM_LONGBOW: if(GetHasFeat(FEAT_WEAPON_FOCUS_LONGBOW,oPC)){iBonus=iBonus+1;} break;
        case 
BASE_ITEM_SHORTBOW: if(GetHasFeat(FEAT_WEAPON_FOCUS_SHORTBOW,oPC)){iBonus=iBonus+1;} break;
        case 
BASE_ITEM_SHURIKEN: if(GetHasFeat(FEAT_WEAPON_FOCUS_SHURIKEN,oPC)){iBonus=iBonus+1;} break;
        case 
BASE_ITEM_THROWING_AXE: if(GetHasFeat(FEAT_WEAPON_FOCUS_THROWING_AXE,oPC)){iBonus=iBonus+1;} break;
    }

    
//gestion tir a bout portant (qui donne un bonus de +1 a moins de 15m aveC les armes a distance)
    
if (GetWeaponRanged(oArme) && GetHasFeat(FEAT_POINT_BLANK_SHOT,oPC)){iBonus=iBonus+1;}

    return 
iBonus;

Citation :
Provient du message de Alastor
En virant toutes les lignes d'armes de mêlées par exemple?
Sauf si tu autorises le type à lancer son épée à 2 mains dans la cible.
Ca évite aussi de devoir prendre en compte le talent "botte secrète" (FEAT_WEAPON_FINESSE) qui ne joue que sur les armes de mêlées (et dans le cas où le bonus de dex excède celui de force); et donc de grandement alléger la fonction int BonusCarac(object oPC)
Par exemple , mais je pensais surtout a une éventuelle astuce pour que le moteur calcule ca pour nous
Mais a priori il faudra faire sans ...
*va mettre a jour les fonction si dessus*
Fonction GetBAB()
Voila la fonction GetBAB(object oTarget) qui permet d'obtenir le BAB (bonus de base a l'attaque) de n'importe quelle creature selon son niveau. (selon les regles officielles D&D)

J'ai obtenu laplus grosse part de ce code grâce a Jasperre sur le forum de script de bioware mais je lui ai enlevé les parties qui ne me servaient pas (il calculait directement tous les bonus en fonction des feats, de l'arme portée etc, je ne voulait que le BAB).
Et c'est grâce a lui que le code s'adapte pour toutes les creatures car il tient compte des "classes" de monstres.

Code PHP:

//: GetBAB function
//: Original code from Jasperre
//: Modified By: Dolanor


// Returns an EXTIMATED, TOP BAB - IE, what thier primary attack will hit at.
// Returns the Attack Bonus - what thier primary attack *probably* hits at.
int GetBAB(object oTarget)
{
    
int nBAB1 GetLevelByClass(CLASS_TYPE_RANGERoTarget)
        + 
GetLevelByClass(CLASS_TYPE_FIGHTERoTarget)
        + 
GetLevelByClass(CLASS_TYPE_PALADINoTarget)
        + 
GetLevelByClass(CLASS_TYPE_BARBARIANoTarget)
        + 
GetLevelByClass(CLASS_TYPE_DRAGONoTarget)
        + 
GetLevelByClass(CLASS_TYPE_OUTSIDERoTarget)
        + 
GetLevelByClass(CLASS_TYPE_MONSTROUSoTarget);
    
int nBAB2 GetLevelByClass(CLASS_TYPE_ABERRATIONoTarget)
        + 
GetLevelByClass(CLASS_TYPE_ANIMALoTarget)
        + 
GetLevelByClass(CLASS_TYPE_BARDoTarget)
        + 
GetLevelByClass(CLASS_TYPE_BEASToTarget)
        + 
GetLevelByClass(CLASS_TYPE_CLERICoTarget)
        + 
GetLevelByClass(CLASS_TYPE_CONSTRUCToTarget)
        + 
GetLevelByClass(CLASS_TYPE_DRUIDoTarget)
        + 
GetLevelByClass(CLASS_TYPE_ELEMENTALoTarget)
        + 
GetLevelByClass(CLASS_TYPE_GIANToTarget)
        + 
GetLevelByClass(CLASS_TYPE_HUMANOIDoTarget)
        + 
GetLevelByClass(CLASS_TYPE_MAGICAL_BEASToTarget)
        + 
GetLevelByClass(CLASS_TYPE_MONKoTarget)
        + 
GetLevelByClass(CLASS_TYPE_ROGUEoTarget)
        + 
GetLevelByClass(CLASS_TYPE_SHAPECHANGERoTarget)
        + 
GetLevelByClass(CLASS_TYPE_VERMINoTarget);
    
int nBAB3 GetLevelByClass(CLASS_TYPE_COMMONERoTarget)
        + 
GetLevelByClass(CLASS_TYPE_FEYoTarget)
        + 
GetLevelByClass(CLASS_TYPE_UNDEADoTarget)
        + 
GetLevelByClass(CLASS_TYPE_SORCERERoTarget)
        + 
GetLevelByClass(CLASS_TYPE_WIZARDoTarget);
    
int nBAB nBAB1 + (nBAB2 4) + (nBAB3 2);

    return 
nBAB;


Voila ma deuxieme Fonction : GetBABByClass(object oTarget, int nTypeClass)
Elle permet d'obtenir le BAB d'une classe particuliere pour une creature (si la personne ne possede pas cette classe, le renvoyé BAB sera de 0)
(et celle ci je l'ai faite seule, pas qu'on pense que je sois une pure merde...Quoi c pas difficile ce code ?? j'vous merde, na )


Code PHP:

int GetBABByClass(object oTargetint nTypeClass)
{
    
int nBAB GetLevelByClass(nTypeClassoTarget);
    
int ndivisor 1;
    switch(
nTypeClass)
    {
        
//Classes guerrieres
        
case CLASS_TYPE_RANGER:
           break;
        case 
CLASS_TYPE_FIGHTER:
            break;
        case 
CLASS_TYPE_PALADIN:
           break;
        case 
CLASS_TYPE_BARBARIAN:
            break;
        case 
CLASS_TYPE_DRAGON:
           break;
        case 
CLASS_TYPE_OUTSIDER:
            break;
        case 
CLASS_TYPE_MONSTROUS:
           break;
        
//Classes divines
        
case CLASS_TYPE_ABERRATION:
            
nBAB = (nBAB 3/4);
            break;
        case 
CLASS_TYPE_ANIMAL:
            
nBAB = (nBAB 3/4);
            break;
        case 
CLASS_TYPE_BARD:
            
nBAB = (nBAB 3/4);
            break;
        case 
CLASS_TYPE_BEAST:
            
nBAB = (nBAB 3/4);
            break;
        case 
CLASS_TYPE_CLERIC:
            
nBAB = (nBAB 3/4);
            break;
        case 
CLASS_TYPE_CONSTRUCT:
            
nBAB = (nBAB 3/4);
            break;
        case 
CLASS_TYPE_DRUID:
            
nBAB = (nBAB 3/4);
            break;
        case 
CLASS_TYPE_ELEMENTAL:
            
nBAB = (nBAB 3/4);
            break;
        case 
CLASS_TYPE_GIANT:
            
nBAB = (nBAB 3/4);
            break;
        case 
CLASS_TYPE_HUMANOID:
            
nBAB = (nBAB 3/4);
            break;
        case 
CLASS_TYPE_MAGICAL_BEAST:
            break;
        case 
CLASS_TYPE_MONK:
            
nBAB = (nBAB 3/4);
            break;
        case 
CLASS_TYPE_ROGUE:
            
nBAB = (nBAB 3/4);
            break;
        case 
CLASS_TYPE_SHAPECHANGER:
            
nBAB = (nBAB 3/4);
            break;
        case 
CLASS_TYPE_VERMIN:
            
nBAB = (nBAB 3/4);
            break;
        
//Classe magique profanes
        
case CLASS_TYPE_COMMONER:
            
nBAB = (nBAB 2);
            break;
        case 
CLASS_TYPE_FEY:
            
nBAB = (nBAB 2);
            break;
        case 
CLASS_TYPE_UNDEAD:
            
nBAB = (nBAB 2);
            break;
        case 
CLASS_TYPE_SORCERER:
            
nBAB = (nBAB 2);
            break;
        case 
CLASS_TYPE_WIZARD:
            
nBAB = (nBAB 2);
            break;
     }
        return 
nBAB;

Cela peut servir pour plein de chose, mais plus specialement pour le projet de sorts, car la 1ere fonction permet de gerer le jet de contact a distance necessaire pour les attaques de rayon ou autre fleche acide.
Re: Fonction GetBAB()
Citation :
Provient du message de Dolanor
J'ai obtenu laplus grosse part de ce code grâce a Jasperre sur le forum de script de bioware mais je lui ai enlevé les parties qui ne me servaient pas (il calculait directement tous les bonus en fonction des feats, de l'arme portée etc, je ne voulait que le BAB).
Et c'est grâce a lui que le code s'adapte pour toutes les creatures car il tient compte des "classes" de monstres.
Dolanor, faudra pas oublier de réintégrer le bonus du don "Tir à bout portant" pour le jet de toucher à distance, si jamais un PJ possède le don
Houlala stop ... Un petit moment de réflexion svp !!!
Après moult tests, je me suis rendu compte de la chose suivante :
Le BBA (Bonus de Base à l'Attaque) EST pris en compte dans le calcul du jet de toucher à distance ! Je sais pas si c'est propre à un patchage récent, mais je suis sûr et certain au vu de mes derniers tests : Mon ensorceleur niv.1 avec 18 en dex faisait un jet d'attaque de toucher à distance avec un D20 + 4 ... Et lorsque je l'ai monté niv.4 , il touchait avec un D20 + 6. Je l'ai ensuite multiclassé avec un niveau de guerrier (pour voir si le BBA d'un multiclassé était correctement pris en compte) et là, il est monté à D20+7 ... Donc à priori no problème de ce côté là. Par contre, là où il y a un SERIEUX problème, c'est que du côté de la classe d'Armure de l'adversaire, là oui, rien n'est pris en compte à part la CA de base (CA=10). Donc je sais pas si on pourrait réussir à utiliser ce qui est déjà pris en compte par la commande TouchAttackRanged tout en scriptant juste "par dessus" la prise en compte des différents bonus de CA cités (Parade, Esquive, Taille, etc...). ça pourrait alléger le script au final .

Par ailleurs, j'ai aussi testé la commande TouchAttackMelee et elle par contre, n'a pas de bugs : elle prend bien compte les bonus de CA cités (heureusement d'ailleurs, car sinon il y aurait des sorts l'utilisant déjà comme "Mise à mal" qui seraient devenus vraiment trop ultimes )
Ah ben quand je l'ai testé chez moi, le BAB n'etait pas pris en compte : moine 2/mage 18 : jet de toucher = 1d20 + 4
Sachant que j'ai 16 en dexterité, c plutot pourri comme score, non ?

Par contre je n'avais pas vu ce sujet auparavant. Donc excusez le doublon (et pourtant je fais des recherches )

Citation :
Solaufein a écrit :
Dolanor, faudra pas oublier de réintégrer le bonus du don "Tir à bout portant" pour le jet de toucher à distance, si jamais un PJ possède le don
Oui oui, mais ca n'a rien a voir avec ce code la.
Le jet total sera 1d20 + BAB + Bonus de dex + Bonus divers

Et dans bonus divers y'aura les differents dons comptabilisés pour ce jet special
Répondre

Connectés sur ce fil

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