Neverwinter Nights, modding - scripts - manuales, todo sobre el NWN
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.


Pulse Control+D para no olvidar este enlace.
 
Pagina principalÍndicePortalÚltimas imágenesBuscarRegistrarseConectarsePagina principal

 

 Acción segun palabra mágica.

Ir abajo 
3 participantes
AutorMensaje
Jastro
Aprendiz
Aprendiz
Jastro


Masculino
Edad : 38
Localización : Islas Canarias
¿Que me Gusta? : Todo y Nada
Puntos de Actividad : 6374

Cantidad de envíos : 40
Fecha de inscripción : 11/08/2008

Nº. de Miembro : 11
Respeto por el Foro :
Acción segun palabra mágica. Left_bar_bleue100 / 100100 / 100Acción segun palabra mágica. Right_bar_bleue


Acción segun palabra mágica. Empty
MensajeTema: Acción segun palabra mágica.   Acción segun palabra mágica. I_icon_minitimeVie 10 Abr 2009, 10:03 pm

Buenas señores, llevo dias sufriendo para sacar esto a flote, lo comparto con ustedes para si a alguien le interesa Smile

¿Que hace este script?

Haremos que cuando nos acerquemos a un npc, le digamos una palabra clave y al decirla, ejecutara un script.

son varios scripts, en la criatura en cuestión.

# Guiones ; #Nombre script
- Onperception; js_percibe
- Onspawn; js_clave
- Userdefined; js_defined
###sin lugar; js_included

Deberia quedar asi:

Acción segun palabra mágica. 47987804

Script: js_percibe

Código:
#include "nw_i0_plot"
void main()
{
object oPC=GetNearestPC();

}

Script: js_clave

Código:
#include "NW_O2_CONINCLUDE"
#include "NW_I0_GENERIC"
#include "js_include"

void main()
{
    SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT);

//donde pone manolo cambiarlo por la palabra clave en cuestion, yo he puesto manolo para probar ^^
    SetKeyword(OBJECT_SELF, "**manolo**", "Mensaje que dira el npc tras oir la palabra", 0, 0, "nombrescript");//poned el nombre del script que querais que ejecute cuando diga la palabra magica. ponerlo con las ""
    SetListening(OBJECT_SELF,TRUE);
 }

script: js_include
Código:

int SetKeyword(object oNPC,
              string sPattern,
              string sResponse,
              int iPreAnim = 0,
              int iPostAnim = 0,
              string sScript = "",
              string sMoveTo = "",
              string sMisc = "",
              int iMisc = 0);


int SetKeywordShell(object oNPC,
                    string sPattern);



int SetKeywordConditional(object oNPC,
                          int iPattern,
                          string sVarObject,
                          string sVariable,
                          int iValue,
                          string sResponse,
                          int iPreAnim=0,
                          int iPostAnim=0,
                          string sScript="",
                          string sMoveTo="",
                          string sMisc="",
                          int iMisc=0);


void DisableKeyword(object oNPC, int iPattern);

void EnableKeyword(object oNPC, int iPattern);



int SetKeyword(object oNPC,
              string sPattern,
              string sResponse,
              int iPreAnim = 0,
              int iPostAnim = 0,
              string sScript = "",
              string sMoveTo = "",
              string sMisc = "",
              int iMisc = 0)

{

  int iPattern=GetLocalInt(oNPC, "KCS_PATTERNCOUNT");

  if (iPattern==0)
  {
    iPattern=5000;
  }
  else
  {
    iPattern++;
  }

  string sPatNum = IntToString(iPattern);

  SetListenPattern(oNPC, sPattern, iPattern);

  SetLocalString(oNPC, "KCS_RESP" + sPatNum, sResponse);

  if (iPreAnim)
  {
    SetLocalInt(oNPC, "KCS_PREA" + sPatNum, iPreAnim);
  }

  if (iPostAnim)
  {
    SetLocalInt(oNPC, "KCS_POSTA" + sPatNum, iPostAnim);
  }

  if (!(sScript==""))
  {
    SetLocalString(oNPC, "KCS_SCRIPT" + sPatNum, sScript);
  }

  if (!(sMoveTo==""))
  {
    SetLocalString(oNPC, "KCS_MOVETO" + sPatNum, sMoveTo);
  }

  if (!(sMisc==""))
  {
    SetLocalString(oNPC, "KCS_SMISC" + sPatNum, sMisc);
  }

  if (iMisc)
  {
    SetLocalInt(oNPC, "KCS_IMISC" + sPatNum, iMisc);
  }

  SetLocalInt(oNPC, "KCS_PATTERNCOUNT", iPattern);

  return iPattern;
}



int SetKeywordShell(object oNPC,
                    string sPattern)
{
  int iPattern=GetLocalInt(oNPC, "KCS_PATTERNCOUNT");

  if (iPattern==0)
  {
    iPattern=5000;
  }
  else
  {
    iPattern++;
  }

  string sPatNum = IntToString(iPattern);

  SetListenPattern(oNPC, sPattern, iPattern);
  SetLocalInt(oNPC, "KCS_TYPE" + sPatNum, 1);

  SetLocalInt(oNPC, "KCS_PATTERNCOUNT", iPattern);

  return iPattern;
}

int SetKeywordConditional(object oNPC,
                          int iPattern,
                          string sVarObject,
                          string sVariable,
                          int iValue,
                          string sResponse,
                          int iPreAnim=0,
                          int iPostAnim=0,
                          string sScript="",
                          string sMoveTo="",
                          string sMisc="",
                          int iMisc=0)
{
  string sPattern = IntToString(iPattern);
  int iOptCount = GetLocalInt(oNPC, "KCS_OPT" + sPattern);
  iOptCount++;
  string sOptCount = IntToString(iOptCount);
  SetLocalInt(oNPC, "KCS_OPT" + sPattern, iOptCount);
  SetLocalString(oNPC, "KCS_OPT" + sPattern + "OBJ" + sOptCount, sVarObject);
  SetLocalString(oNPC, "KCS_OPT" + sPattern + "VAR" + sOptCount, sVariable);
  SetLocalString(oNPC, "KCS_OPT" + sPattern + "RES" + sOptCount, sResponse);
  SetLocalInt(oNPC, "KCS_OPT" + sPattern + "VAL" + sOptCount, iValue);
  if (iPreAnim)
  {
    SetLocalInt(oNPC, "KCS_OPT" + sPattern + "PRE" + sOptCount, iPreAnim);
  }

  if (iPostAnim)
  {
    SetLocalInt(oNPC, "KCS_OPT" + sPattern + "PST" + sOptCount, iPostAnim);
  }

  if (!(sScript==""))
  {
    SetLocalString(oNPC, "KCS_OPT" + sPattern + "SCR" + sOptCount, sScript);
  }

  if (!(sMoveTo==""))
  {
    SetLocalString(oNPC, "KCS_OPT" + sPattern + "MOV" + sOptCount, sMoveTo);
  }

  if (!(sMisc==""))
  {
    SetLocalString(oNPC, "KCS_OPT" + sPattern + "SMI" + sOptCount, sMisc);
  }

  if (iMisc)
  {
    SetLocalInt(oNPC, "KCS_OPT" + sPattern + "IMI" + sOptCount, iMisc);
  }

  return iOptCount;
}

void DisableKeyword(object oNPC, int iPattern)
{
  SetLocalInt(oNPC, "KCS_DISABLE" + IntToString(iPattern), 1);
}

void EnableKeyword(object oNPC, int iPattern)
{
  DeleteLocalInt(oNPC, "KCS_DISABLE" + IntToString(iPattern));
}
Volver arriba Ir abajo
Jastro
Aprendiz
Aprendiz
Jastro


Masculino
Edad : 38
Localización : Islas Canarias
¿Que me Gusta? : Todo y Nada
Puntos de Actividad : 6374

Cantidad de envíos : 40
Fecha de inscripción : 11/08/2008

Nº. de Miembro : 11
Respeto por el Foro :
Acción segun palabra mágica. Left_bar_bleue100 / 100100 / 100Acción segun palabra mágica. Right_bar_bleue


Acción segun palabra mágica. Empty
MensajeTema: Re: Acción segun palabra mágica.   Acción segun palabra mágica. I_icon_minitimeVie 10 Abr 2009, 10:26 pm

Lo pongo en otro post porque decia que el mensaje era mu largo :S aqui esta el que falta

script: js_defined
Código:

//este script aunque tiene js delante (es para tenerlo localizado) esta creado por Devil^^
string PreString(string sString, string sSubStr)
{
    string sResult;

    if (!((sSubStr=="") || (sString=="")))
    {
      int iPos = FindSubString(sString,sSubStr);

      if (iPos >= 0)
      {
        sResult = GetSubString(sString,0,iPos);
      }
      else
      {
        sResult = sString;
      }
      return sResult;
    }
    else
    {
      return sString;
    }
}

string PostString(string sString, string sSubStr)
{

    string sResult;

    if (!((sSubStr=="") || (sString=="")))
    {
      int iPos = FindSubString(sString, sSubStr);
      int iLen = GetStringLength(sString);
      int iSubLen = GetStringLength(sSubStr);

      if (iPos >= 0)
      {
        sResult = GetSubString(sString, iPos+iSubLen, iLen-(iPos+iSubLen));
      }
      else
      {
        sResult = "";
      }
      return sResult;
    }
    else
    {
      return sString;
    }
}

string ReplaceString(string sString, string sToReplace, string sNewSubStr)
{
    if (sToReplace == "") return sString;

    string sResult = sString;


    while ((FindSubString(sResult, sToReplace)) >= 0)
    {
      sResult = PreString(sResult, sToReplace) + sNewSubStr + PostString(sResult, sToReplace);
    }

    return sResult;
}


string ReplaceTokens(string sString, object oPC)
{

  string sResult = sString;

  sResult = ReplaceString(sResult, "&N", PreString(GetName(oPC)," "));
  sResult = ReplaceString(sResult, "&F", GetName(oPC));
  int iTime=GetTimeHour();
  if (iTime < 12)
  {
    sResult = ReplaceString(sResult, "&T", "morning");
  }
  if (iTime >=12 && iTime <17)
  {
    sResult = ReplaceString(sResult, "&T", "afternoon");
  }
  if (iTime >=17)
  {
    sResult = ReplaceString(sResult, "&T", "evening");
  }

  if (GetGender(oPC)==GENDER_MALE)
  {
    sResult = ReplaceString(sResult, "&L", "Lord");
    sResult = ReplaceString(sResult, "&l", "lord");
    sResult = ReplaceString(sResult, "&S", "Sir");
    sResult = ReplaceString(sResult, "&s", "sir");
    sResult = ReplaceString(sResult, "&G", "Man");
    sResult = ReplaceString(sResult, "&g", "man");
  } else {
    sResult = ReplaceString(sResult, "&L", "Lady");
    sResult = ReplaceString(sResult, "&l", "lady");
    sResult = ReplaceString(sResult, "&S", "Madam");
    sResult = ReplaceString(sResult, "&s", "madam");
    sResult = ReplaceString(sResult, "&G", "Woman");
    sResult = ReplaceString(sResult, "&g", "woman");
  }

  string sRace, sRace2, sRace3, sRace4, sRace5, sRace6;
  switch (GetRacialType(oPC))
  {
    case RACIAL_TYPE_DWARF:    sRace="Dwarf"; sRace2="dwarf";
                              sRace3="Dwarven"; sRace4="dwarven";
                              sRace5="Dwarves"; sRace6="dwarves"; break;
    case RACIAL_TYPE_ELF:      sRace="Elf"; sRace2="elf";
                              sRace3="Elven"; sRace4="elven";
                              sRace5="Elves"; sRace6="elves"; break;
    case RACIAL_TYPE_GNOME:    sRace="Gnome"; sRace2="gnome";
                              sRace3="Gnomish"; sRace4="gnomish";
                              sRace5="Gnomes"; sRace6="gnomes"; break;
    case RACIAL_TYPE_HALFELF:  sRace="Half elf"; sRace2="half elf";
                              sRace3="Half elven"; sRace4="half elven";
                              sRace5="Half elves"; sRace6="half elves"; break;
    case RACIAL_TYPE_HALFLING: sRace="Halfling"; sRace2="halfling";
                              sRace3="Halfling"; sRace4="halfling";
                              sRace5="Halflings"; sRace6="halflings"; break;
    case RACIAL_TYPE_HALFORC:  sRace="Half orc"; sRace2="half orc";
                              sRace3="Half orcish"; sRace4="half orcish";
                              sRace5="Half orcs"; sRace6="half orcs"; break;
    case RACIAL_TYPE_HUMAN:    sRace="Human"; sRace2="human";
                              sRace3="Human"; sRace4="human";
                              sRace5="Humans"; sRace6="humans"; break;
  }

  sResult = ReplaceString(sResult, "&Rs", sRace);
  sResult = ReplaceString(sResult, "&rs", sRace2);
  sResult = ReplaceString(sResult, "&Rn", sRace3);
  sResult = ReplaceString(sResult, "&rn", sRace4);
  sResult = ReplaceString(sResult, "&Rp", sRace5);
  sResult = ReplaceString(sResult, "&rp", sRace6);

  return sResult;
}


void main()
{

  if (GetUserDefinedEventNumber() == 1004)
  {

    if (GetIsListening(OBJECT_SELF))
    {

      int iOkToListen=FALSE;
      object oPC = GetLastSpeaker();
      if (GetLocalInt(OBJECT_SELF, "KCS_LISTENTONPCS"))
      {
        if (GetLocalString(OBJECT_SELF, "KCS_NPCLISTENTAG")=="")
        {
          iOkToListen=TRUE;
        } else {
          iOkToListen=(GetTag(oPC)==GetLocalString(OBJECT_SELF, "KCS_NPCLISTENTAG"));
        }
      }
      if (GetIsPC(oPC))
      {
        iOkToListen=TRUE;
      }
      if (iOkToListen)
      {

        if (GetDistanceToObject(oPC) <= 60.0f)
        {

          int iPattern = GetListenPatternNumber();


          if (iPattern==-1)
          {
            iPattern=GetLocalInt(OBJECT_SELF, "KCS_DEFAULT");
          }

          string sPattern = IntToString(iPattern);

          if (GetLocalInt(OBJECT_SELF, "KCS_DISABLE" + sPattern)==0)
          {

            int iPreAnim, iPostAnim, iMisc;
            string sResponse, sMoveTo, sscript, sMisc;


            int iKeywordType = GetLocalInt(OBJECT_SELF, "KCS_TYPE" + sPattern);

            if (iKeywordType==0)
            {

              iPreAnim = GetLocalInt(OBJECT_SELF, "KCS_PREA" + sPattern);
              iPostAnim = GetLocalInt(OBJECT_SELF, "KCS_POSTA" + sPattern);
              sResponse = GetLocalString(OBJECT_SELF, "KCS_RESP" + sPattern);
              sMoveTo = GetLocalString(OBJECT_SELF, "KCS_MOVETO" + sPattern);
              sscript = GetLocalString(OBJECT_SELF, "KCS_script" + sPattern);
              sMisc = GetLocalString(OBJECT_SELF, "KCS_SMISC" + sPattern);
              iMisc = GetLocalInt(OBJECT_SELF, "KCS_IMISC" + sPattern);
            }

          if (iKeywordType==1)
            {


              int iOptCount, iCount, iVal, iUseOpt=0;
              string sObj, sVar, sOpt;
              object oObj;

              iOptCount = GetLocalInt(OBJECT_SELF, "KCS_OPT" + sPattern);

              iCount=1;
              while (iCount <= iOptCount)
              {
                sOpt = IntToString(iCount);
                sObj = GetLocalString(OBJECT_SELF, "KCS_OPT" + sPattern + "OBJ" + sOpt);
                if (GetStringLeft(sObj,4)=="KCS_")
                {
                  if (sObj == "KCS_OBJECT_SELF")
                  {
                    oObj = OBJECT_SELF;
                  }
                  if (sObj == "KCS_PCSPEAKER")
                  {
                    oObj = oPC;
                  }
                  if (sObj == "KCS_MODULE")
                  {
                    oObj = GetModule();
                  }
                  if (sObj == "KCS_AREA")
                  {
                    oObj = GetArea(OBJECT_SELF);
                  }
                } else {
                  oObj = GetObjectByTag(sObj);
                }
                if (GetIsObjectValid(oObj))
                {
                  sVar = GetLocalString(OBJECT_SELF, "KCS_OPT" + sPattern + "VAR" + sOpt);
                  iVal = GetLocalInt(OBJECT_SELF, "KCS_OPT" +  sPattern + "VAL" + sOpt);
                  if (GetStringLeft(sVar, 4)=="KCS_")
                  {
                    int iAbility=-1;
                    if (GetStringLeft(sVar,7)=="KCS_STR") { iAbility=ABILITY_STRENGTH; }
                    if (GetStringLeft(sVar,7)=="KCS_INT") { iAbility=ABILITY_INTELLIGENCE; }
                    if (GetStringLeft(sVar,7)=="KCS_WIS") { iAbility=ABILITY_WISDOM; }
                    if (GetStringLeft(sVar,7)=="KCS_CON") { iAbility=ABILITY_CONSTITUTION; }
                    if (GetStringLeft(sVar,7)=="KCS_DEX") { iAbility=ABILITY_DEXTERITY; }
                    if (GetStringLeft(sVar,7)=="KCS_CHA") { iAbility=ABILITY_CHARISMA; }
                    if (iAbility>=0)
                    {
                      if (GetStringRight(sVar,5)=="ABOVE") {
                        if (GetAbilityScore(oPC, iAbility) > iVal)
                        {
                          iUseOpt=iCount;
                        }
                      } else {
                        if (GetStringRight(sVar,5)=="BELOW") {
                          if (GetAbilityScore(oPC, iAbility) < iVal)
                          {
                            iUseOpt=iCount;
                          }
                        } else {
                          if (GetAbilityScore(oPC, iAbility) == iVal)
                          {
                            iUseOpt=iCount;
                          }
                        }
                      }
                    }
                    if ((sVar=="KCS_GOLD_ABOVE") || (sVar=="KCS_GOLD"))
                    {
                      if (GetGold(oPC) > iVal)
                      {
                        iUseOpt=iCount;
                      }
                    }

                    if (sVar=="KCS_GOLD_BELOW")
                    {
                      if (GetGold(oPC) < iVal)
                      {
                        iUseOpt=iCount;
                      }
                    }

                    if (sVar=="KCS_HITDICE_ABOVE")
                    {
                      if (GetHitDice(oPC) > iVal)
                      {
                        iUseOpt=iCount;
                      }
                    }
                    if (sVar=="KCS_HITDICE_BELOW")
                    {
                      if (GetHitDice(oPC) < iVal)
                      {
                        iUseOpt=iCount;
                      }
                    }
                    if (sVar=="KCS_ALIGNGE")
                    {
                      if (GetAlignmentGoodEvil(oPC)==iVal)
                      {
                        iUseOpt=iCount;
                      }
                    }
                    if (sVar=="KCS_ALIGNLC")
                    {
                      if (GetAlignmentLawChaos(oPC)==iVal)
                      {
                        iUseOpt=iCount;
                      }
                    }
                  } else {
                    if (GetLocalInt(oObj, sVar) == iVal)
                    {
                      iUseOpt=iCount;
                    }
                  }
                }
                iCount++;
              }
              if (iUseOpt>0)
              {
                sOpt = IntToString(iUseOpt);
                iPreAnim = GetLocalInt(OBJECT_SELF, "KCS_OPT" + sPattern + "PRE" + sOpt);
                iPostAnim = GetLocalInt(OBJECT_SELF, "KCS_OPT" + sPattern + "PST" + sOpt);
                sResponse = GetLocalString(OBJECT_SELF, "KCS_OPT" + sPattern + "RES" + sOpt);
                sMoveTo = GetLocalString(OBJECT_SELF, "KCS_OPT" + sPattern + "MOV" + sOpt);
                sscript = GetLocalString(OBJECT_SELF, "KCS_OPT" + sPattern + "SCR" + sOpt);
                sMisc = GetLocalString(OBJECT_SELF, "KCS_OPT" + sPattern + "SMI" + sOpt);
                iMisc = GetLocalInt(OBJECT_SELF, "KCS_OPT" + sPattern + "IMI" + sOpt);
              }
            }


            SetFacingPoint(GetPosition(oPC));


            if (iPreAnim)
            {
              ActionPlayAnimation(iPreAnim);
            }


            if (!(sResponse==""))
            {
              sResponse = ReplaceTokens(sResponse, oPC);
              ActionSpeakString(sResponse);
            }


            if (!(sMoveTo==""))
            {
              ActionMoveToLocation(GetLocation(GetWaypointByTag(sMoveTo)));
            }


            if (!(sscript==""))
            {
              SetLocalObject(OBJECT_SELF, "KCS_PCSPEAKER", oPC);
              if (!(iMisc==0))
              {
                SetLocalInt(OBJECT_SELF, "KCS_IMISC", iMisc);
              }
              if (!(sMisc==""))
              {
                SetLocalString(OBJECT_SELF, "KCS_SMISC", sMisc);
              }
              SetLocalInt(OBJECT_SELF, "KCS_LASTPATTERN", iPattern);
              AssignCommand(OBJECT_SELF, Executescript(sscript, OBJECT_SELF));
              AssignCommand(OBJECT_SELF, DeleteLocalObject(OBJECT_SELF, "KCS_PCSPEAKER"));
              if (!(iMisc==0))
              {
                AssignCommand(OBJECT_SELF, DeleteLocalInt(OBJECT_SELF, "KCS_IMISC"));
              }
              if (!(sMisc==""))
              {
                AssignCommand(OBJECT_SELF, DeleteLocalString(OBJECT_SELF, "KCS_SMISC"));
              }
            }


            if (iPostAnim)
            {
              ActionPlayAnimation(iPostAnim);
            }
          }
        }
      }
    }
  }
}



Espero que esto os sirva, he sufrido mucho para hacerlo funcionar xD

Un saludo
Volver arriba Ir abajo
Tolkien
Ex-Moderador/a
Ex-Moderador/a
Tolkien


Masculino
Edad : 42
Puntos de Actividad : 6363

Cantidad de envíos : 37
Fecha de inscripción : 22/03/2008

Nº. de Miembro : 2
Respeto por el Foro :
Acción segun palabra mágica. Left_bar_bleue100 / 100100 / 100Acción segun palabra mágica. Right_bar_bleue


Acción segun palabra mágica. Empty
MensajeTema: Re: Acción segun palabra mágica.   Acción segun palabra mágica. I_icon_minitimeSáb 11 Abr 2009, 6:05 pm

Gracias Jastro por aportar al Foro, muy bueno este script y un buen trabajo, te he dado dos puntos de reputacion, desde ahora puedes votar los post.

Salud para tod@s.
Volver arriba Ir abajo
Jastro
Aprendiz
Aprendiz
Jastro


Masculino
Edad : 38
Localización : Islas Canarias
¿Que me Gusta? : Todo y Nada
Puntos de Actividad : 6374

Cantidad de envíos : 40
Fecha de inscripción : 11/08/2008

Nº. de Miembro : 11
Respeto por el Foro :
Acción segun palabra mágica. Left_bar_bleue100 / 100100 / 100Acción segun palabra mágica. Right_bar_bleue


Acción segun palabra mágica. Empty
MensajeTema: Re: Acción segun palabra mágica.   Acción segun palabra mágica. I_icon_minitimeSáb 11 Abr 2009, 6:28 pm

Un placer ayudar, por ahi tengo scripts tb interesantes, que no hay en otros lados, ya lo pondre por aqui ^^


Un saludo y gracias :D
Volver arriba Ir abajo
Ender
Patos@
Patos@



Masculino
Edad : 32
Puntos de Actividad : 5672

Cantidad de envíos : 11
Fecha de inscripción : 31/08/2009

Nº. de Miembro : 100
Respeto por el Foro :
Acción segun palabra mágica. Left_bar_bleue100 / 100100 / 100Acción segun palabra mágica. Right_bar_bleue


Acción segun palabra mágica. Empty
MensajeTema: Re: Acción segun palabra mágica.   Acción segun palabra mágica. I_icon_minitimeLun 31 Ago 2009, 3:02 am

¿No es demasiado extenso?
Excepto que hayas metido otras condicionales como raza, alineamiento y diferentes palabras.

Pero con usar el listening y un executescript es más que suficiente, y todo en un sólo guión.
Volver arriba Ir abajo
Contenido patrocinado





Acción segun palabra mágica. Empty
MensajeTema: Re: Acción segun palabra mágica.   Acción segun palabra mágica. I_icon_minitime

Volver arriba Ir abajo
 
Acción segun palabra mágica.
Volver arriba 
Página 1 de 1.
 Temas similares
-

Permisos de este foro:No puedes responder a temas en este foro.
Neverwinter Nights, modding - scripts - manuales, todo sobre el NWN :: NWToolSet (Aurora) :: Scripting NWN :: Baul de Scripts-
Cambiar a: