Par contre tu peux alléger quelques parties du script.
Une chose qui me turlupine, c'est :
int new_generation = generation++;
Avec cette commande, la variable "generation" n'aura pas déjà augmenté de 1 avant d'être multipliée par 2 ? De mémoire, ça aurait donc pour effet de créer 4 créatures de niveau 2, puis 6 de niveau 3, puis 8 de niveau 4, etc...
La manière la plus sûre est d'augmenter generation après avoir déterminé le nombre de créatures qui apparaîtront (j'ai marqué nLevel par habitude, on ne se refait pas...).
Il me semble aussi que "DetermineCombatRound()" engage le combat. De ce fait, pas besoin d'un "ActionAttack()". Mais bon... rien ne vaut le test pour savoir :
#include "nw_i0_generic"
void main()
{
object attaquant = GetLastKiller();
object oSelf = OBJECT_SELF;
int nLevel = GetHitDice(oSelf);
int nbr = nLevel*2;
nLevel++;
effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_1);
int i,angle,rand,XP;
location lSelf = GetLocation(oSelf);
location new_loc,loc_rep;
object new_creat;
for(i=0;i++;i<nbr)
{
angle = Random(180);
rand = Random(1);
if(rand==1)
angle *= -1;
new_loc = GenerateNewLocationFromLocation(lSelf,5.0,IntToFloat(angle),1.0);
loc_rep = CalcSafeLocation(oSelf,new_loc,10.0,FALSE,FALSE);
new_creat = CreateObject(OBJECT_TYPE_CREATURE,"horreur multiple",loc_rep,TRUE);
XP = (nLevel*(nLevel-1))*500;
ResetCreatureLevelForXP(new_creat,XP,FALSE);
ForceRest(new_creat);
SetIsTemporaryEnemy(attaquant,new_creat);
AssignCommand(new_creat,DetermineCombatRound(attaquant));
DelayCommand(0.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,new_creat));
}
}