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 22:19:27


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Kétil Dimzad
Ecuyer
Inscrit le: 10 Oct 2003
Messages: 62
Localisation: Fijj'Bool City
Répondre en citant
Posté le : 04/01/2004 02:04:09 Sujet du message : [SCRIPT] Help, systeme de casse des objets en combat

Salut à tous,

Voilà je voudrai un script qui me permette d'introduire la notion de casse des objets en combat.

Je suis une quiche en script

Mais bon, me suis coller sur l'editeur de script puisque mon ami Script Générator ne peut pas satisfaire ma demande

Je suis arrivé à ça, ça compile mais ça marche pas



NWScript :




// Se place sur le OnHeartBeat du module, c'est chiant mais je vois pas
// comment lancer le script autrement.



void main()
{

object oPC = GetLastHostileActor();

if (!GetIsPC(oPC)) return;

//---------------------------- --------------------

if (d2()>1)
  return; //Si return ici, le script stope ou les autres tests sont faits ?

    object oItem = GetItemInSlot(INVENTORY_SLOT_ARMS, oPC);
            if(GetIsObjectValid(oItem))

DestroyObject(oItem, 0.0);

FloatingTextStringOnCreature("1--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------

if (d2()>1)
  return;

            oItem = GetItemInSlot(INVENTORY_SLOT_BELT, oPC);
            if(GetIsObjectValid(oItem))
DestroyObject(oItem, 0.0);
FloatingTextStringOnCreature("2--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------

  if (d2()>1)
      return;
            oItem = GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC);
            if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("3--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------
  if (d2()>1)
      return;
            oItem = GetItemInSlot(INVENTORY_SLOT_BOOTS, oPC);
          if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("4--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------
    if (d2()>1)
      return;
            oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
          if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("5--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------
    if (d2()>1)
      return;
            oItem = GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC);
            if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("6--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------
    if (d2()>1)
      return;
            oItem = GetItemInSlot(INVENTORY_SLOT_HEAD, oPC);
          if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("7--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------
    if (d2()>1)
      return;
            oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
          if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("8--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------
    if (d2()>1)
      return;
            oItem = GetItemInSlot(INVENTORY_SLOT_LEFTRING, oPC);
          if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("9--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------

if (d2()>1)
    return;
            oItem = GetItemInSlot(INVENTORY_SLOT_NECK, oPC);
            if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("9--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------

      if (d2()>1)
          return;
            oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
            if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("10--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------

      if (d2()>1)
        return;
            oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oPC);
          if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("11--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------

      if (d2()>1)
        return;
            oItem = GetItemInSlot(INVENTORY_SLOT_ARROWS, oPC);
            if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("12--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------

      if (d2()>1)
          return;
            oItem = GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC);
            if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("13--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------

      if (d2()>1)
          return;
            oItem = GetItemInSlot(INVENTORY_SLOT_BULLETS, oPC);
            if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("14--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------

      if (d2()>1)
          return;
            oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oPC);
            if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("15--Une piece de votre equipement s'est brisee", oPC);

//---------------------------- --------------------

      if (d2()>1)
          return;
            oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC);
            if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("16--Une piece de votre equipement s'est brisee", oPC);


//---------------------------- --------------------

      if (d2()>1)
          return;
            oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC);
            if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("17--Une piece de votre equipement s'est brisee", oPC);


//---------------------------- --------------------

      if (d2()>1)
          return;
            oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC);
            if(GetIsObjectValid(oItem))
            DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("18--Une piece de votre equipement s'est brisee", oPC);

}

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.



Donc mon but, c'est que à chaque round de combat (enfin toutes les 6 secondes puisque OnHeartBeat ) il y ait un test pour toutes les parties équipées ( et seulement équipées ) du perso, et une proba que l'objet se brise.
La proba est à 50% sur ce script de manière à pouvoir tester.

Vala, si quelqu'un pouvait m'aider....
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
Longbow
Grand Sage du Conseil
Inscrit le: 10 Déc 2003
Messages: 638
Localisation: Orléans
Répondre en citant
Posté le : 04/01/2004 03:47:56 Sujet du message :

Hum... Hum...
Effectivement solliciter le OnHearBeat de ton module n'est pas une très bonne idée...

Pourquoi ne pas utiliser le OnPhysicalAttack puisque nous sommes dans le cas d'un combat... touché ou non...

Je te propose ceci...ca compile, ca fonctionne mais je ne suis pas sûr que ce soit ce que tu recherches vraiment (3h du mat)... En tout cas, cela évite le OnHeartBeat du module.

NWScript :


void main()
{
object oPC = GetLastAttacker();
object oItem;
    if (GetIsPC(oPC))
    {
    if (d2()>1)
      return;
      oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
          if(GetIsObjectValid(oItem))
            {DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("", oPC);}


    if (d2()>1)
      return;
            oItem = GetItemInSlot(INVENTORY_SLOT_HEAD, oPC);
          if(GetIsObjectValid(oItem))
            {DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("", oPC);}

//---------------------------- --------------------
    if (d2()>1)
      return;
            oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
          if(GetIsObjectValid(oItem))
            {DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("", oPC);}

//---------------------------- --------------------
    if (d2()>1)
          return;
            oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
            if(GetIsObjectValid(oItem))
            {DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("", oPC);}

//---------------------------- --------------------
      if (d2()>1)
          return;
            {oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oPC);
            if(GetIsObjectValid(oItem))
            {DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("", oPC);}

//---------------------------- --------------------

      if (d2()>1)
          return;
            oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC);
            if(GetIsObjectValid(oItem))
            {DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("", oPC);}


//---------------------------- --------------------
    if (d2()>1)
          return;
            oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC);
            if(GetIsObjectValid(oItem))
            {DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("", oPC);}


//---------------------------- --------------------

      if (d2()>1)
          return;
            oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC);
            if(GetIsObjectValid(oItem))
            {DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("", oPC);}

        }
    }
    // Sinon le script de Bioware
    else
    {
    ExecuteScript("nw_c2_default5", OBJECT_SELF);
    }
}
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.

_________________
Rex illeteratus
Quasi Asinus Coronatus
Jean de Salisbury
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Tzeentsh
Ecuyer
Inscrit le: 01 Déc 2002
Messages: 41
Répondre en citant
Posté le : 04/01/2004 07:53:58 Sujet du message :

Tu devrais plutot utiliser le OnDamaged des monstres pour ce genre de script (ou le OnHit qui arrive avec HotU).
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Longbow
Grand Sage du Conseil
Inscrit le: 10 Déc 2003
Messages: 638
Localisation: Orléans
Répondre en citant
Posté le : 04/01/2004 11:30:08 Sujet du message :

Hum... Hum...

Dans ce cas utiliser la commande
NWScript :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.


La question étant de savoir si un objet ne peut-être brisé que s'il touche ou s'il sert... Hors dans le cas d'un casque, il ne serait pas très logique de le briser parce qu'on a frappé...
Je réserverais ce script aux équipements offensifs (en excluant d'ailleurs les armes à distances:)
BASE_ITEM_DART
BASE_ITEM_HEAVYCROSSBOW
BASE_ITEM_LONGBOW
... etc

Bref tu as les éléments à toi de voir l'usage...
_________________
Rex illeteratus
Quasi Asinus Coronatus
Jean de Salisbury
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Kétil Dimzad
Ecuyer
Inscrit le: 10 Oct 2003
Messages: 62
Localisation: Fijj'Bool City
Répondre en citant
Posté le : 04/01/2004 11:56:55 Sujet du message :

merci a vous pour vos reponses. J'ai modifié un peu le script, pour que la localisation de l'objet cassé soit plus aléatoire.

NWScript :


void main()
{
object oPC = GetLastAttacker();
object oItem;
int nLoc;

    if (!GetIsPC(oPC)) return;

if (d100()<=1 && d100()<=1 && d100()<=1 && d100()<=1 && d100()<=1 ) // Une chance sur 500 de casser
  {
    int nLoc = d20();
  if ( nLoc == 1 )



      {
      oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
          if(GetIsObjectValid(oItem))
            { DestroyObject(oItem, 0.0);
              FloatingTextStringOnCreature("", oPC);
            }

      }

    if ( nLoc == 2 )
      {

      oItem = GetItemInSlot(INVENTORY_SLOT_HEAD, oPC);
          if(GetIsObjectValid(oItem))
            { DestroyObject(oItem, 0.0);
              FloatingTextStringOnCreature("", oPC);
            }

      }


if ( nLoc == 3 )
      {

      oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
          if(GetIsObjectValid(oItem))
            { DestroyObject(oItem, 0.0);
              FloatingTextStringOnCreature("", oPC);
            }

      }


if ( nLoc == 4 )
      {


      oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
            if(GetIsObjectValid(oItem))
            { DestroyObject(oItem, 0.0);
              FloatingTextStringOnCreature("", oPC);
            }


      }


if ( nLoc == 5 )
      {


      oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oPC);
            if(GetIsObjectValid(oItem))
            { DestroyObject(oItem, 0.0);
              FloatingTextStringOnCreature("", oPC);
            }

      }



if ( nLoc == 6 )
      {

      oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC);
            if(GetIsObjectValid(oItem))
            { DestroyObject(oItem, 0.0);
              FloatingTextStringOnCreature("", oPC);
            }


      }


if ( nLoc == 7 )
      {

      oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC);
            if(GetIsObjectValid(oItem))
            { DestroyObject(oItem, 0.0);
              FloatingTextStringOnCreature("", oPC);
            }
      }

if ( nLoc == 8 )
      {

      oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC);
            if(GetIsObjectValid(oItem))
            { DestroyObject(oItem, 0.0);
              FloatingTextStringOnCreature("", oPC);
            }

      }


if ( nLoc == 9 )
    {


    object oItem = GetItemInSlot(INVENTORY_SLOT_ARMS, oPC);
            if(GetIsObjectValid(oItem))
              {
              DestroyObject(oItem, 0.0);
              FloatingTextStringOnCreature("ARMS--Une piece de votre equipement s'est brisee", oPC);
              }
    }


if ( nLoc == 10 )
{

oItem = GetItemInSlot(INVENTORY_SLOT_BELT, oPC);
            if(GetIsObjectValid(oItem))
                  {
                  DestroyObject(oItem, 0.0);
                  FloatingTextStringOnCreature("BELT--Une piece de votre equipement s'est brisee", oPC);
                  }
}


if ( nLoc == 11 )
{

oItem = GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC);
            if(GetIsObjectValid(oItem))
            { DestroyObject(oItem, 0.0);
              FloatingTextStringOnCreature("BOLTS--Une piece de votre equipement s'est brisee", oPC);
            }
}


if ( nLoc == 12 )
{

oItem = GetItemInSlot(INVENTORY_SLOT_BOOTS, oPC);
          if(GetIsObjectValid(oItem))
            { DestroyObject(oItem, 0.0);
              FloatingTextStringOnCreature("BOOTS--Une piece de votre equipement s'est brisee", oPC);
            }

}

if ( nLoc == 13 )
{

oItem = GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC);
            if(GetIsObjectValid(oItem))
          { DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("CLOAK--Une piece de votre equipement s'est brisee", oPC);
          }
}

if ( nLoc == 14 )
{

oItem = GetItemInSlot(INVENTORY_SLOT_LEFTRING, oPC);
          if(GetIsObjectValid(oItem))
        { DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("LEFTRING--Une piece de votre equipement s'est brisee", oPC);
        }

}

if ( nLoc == 15 )
  {

oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oPC);
          if(GetIsObjectValid(oItem))
          { DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("RIGHTRING--Une piece de votre equipement s'est brisee", oPC);
          }
    }

if ( nLoc == 16 )
  {

oItem = GetItemInSlot(INVENTORY_SLOT_NECK, oPC);
            if(GetIsObjectValid(oItem))
          { DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("NECK--Une piece de votre equipement s'est brisee", oPC);
          }

    }

if ( nLoc == 17 )
  {

oItem = GetItemInSlot(INVENTORY_SLOT_ARROWS, oPC);
            if(GetIsObjectValid(oItem))
            { DestroyObject(oItem, 0.0);
              FloatingTextStringOnCreature("ARROWS--Une piece de votre equipement s'est brisee", oPC);
            }
  }

if ( nLoc == 18 )
  {

    oItem = GetItemInSlot(INVENTORY_SLOT_BULLETS, oPC);
            if(GetIsObjectValid(oItem))
          { DestroyObject(oItem, 0.0);
            FloatingTextStringOnCreature("BULLETS--Une piece de votre equipement s'est brisee", oPC);
          }

  }

if ( nLoc == 19 )
  {
  FloatingTextStringOnCreature("Votre equipement souffre du combat bien qu'il n'y ait pas de casse...", oPC);
  }


if ( nLoc == 20 )
  {
  FloatingTextStringOnCreature("Votre equipement souffre du combat bien qu'il n'y ait pas de casse...", oPC);
  }



// Sinon le script de Bioware
    else
    {
    ExecuteScript("nw_c2_default5", OBJECT_SELF);
    }
}

}

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.



Pour répondre à LongBow, dans la mesure ou les joueurs ne sont pas censé s'y connaitre en nwscript et surtout qu'il ne sont pas censé connaitre les scripts du module, ce n'est qu'un détail.

Je souhaite juste simulé le fait qu'en combat, ils puissent casser de l'equipement.

Je ne prend que l'equipement équipé et donc visible par les ennemis. Pour ce qui est d'un casque par exemple c'est sur que si le joueur tire a distance et casse un casque c'est pas super terrible au niveau du realisme mais bon.... Je vois pas trop comment envisager un tel cas de figure au niveau des scripts.

Vala vala

Maintenant, j'aimerai un dernier renseignement, comment utilise-t-on ces constantes dans les scripts :

NWScript :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.


J'aimerai que lorsqu'un joueur casse un objet, il y ait un bruit d'objet cassé et que son perso lache un juron.

Merci encore.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
Lavok
Légende vivante
Inscrit le: 22 Oct 2002
Messages: 434
Localisation: Sphère planaire
Répondre en citant
Posté le : 04/01/2004 13:37:58 Sujet du message :


Kétil Dimzad a écrit :
if (d100()<=1 && d100()<=1 && d100()<=1 && d100()<=1 && d100()<=1 )
// Une chance sur 500 de casser
Non, pas vraiment. En fait, c'est une chance sur 10 milliards (100 exposant 5) Very Happy... Utilises plutôt un bon vieux 'if(Random(500)==0)' Wink.
_________________
ToB : Une seule chose semble certaine : tant que le trône de sang de Bhaal restera vide, le chaos règnera.

Moi : Une seule chose semble certaine : tant que la tête de singe de Bush restera vide, le chaos règnera.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Kétil Dimzad
Ecuyer
Inscrit le: 10 Oct 2003
Messages: 62
Localisation: Fijj'Bool City
Répondre en citant
Posté le : 04/01/2004 14:33:47 Sujet du message :

lol merci lavok Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
Longbow
Grand Sage du Conseil
Inscrit le: 10 Déc 2003
Messages: 638
Localisation: Orléans
Répondre en citant
Posté le : 04/01/2004 14:35:31 Sujet du message :

Hum... Hum...

Voyons ces deux commandes (au fait, tu connais sans doute le livre de référence de tout scripteur:

le Lexicon
)

int TALKVOLUME_TALK

est utilisé pour indiquer quelle intensité a la voix (murmure, Crier...) dans les fonctions SpeakString() ou ActionSpeakString.. Pour TALK, à la limite pas besoin, c'est le niveau sonore par défault.

int VOICE_CHAT_BORED

est utilisé avec par exemple
NWScript :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.

_________________
Rex illeteratus
Quasi Asinus Coronatus
Jean de Salisbury
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur 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 113.994ms