COMO HACER PARA QUE EL TIEMPO TRANSCURRA NORMAL COMO EL BG?
Hola! ¿ como andan? Estoy haciendo un modulo que transcurre en la ciudad de Shadowdale (aunque creo que traducido dice el valle de las sombras, si es asi perdoname Elminster
) Y estoy haciendo un modulo pequeño donde hay una taberna, y un granero del Trono del Hierro (como aparece en uno de los modulos que se pueden bajar del kasaa). Lo que veo que el NWN en la campaña oficial no transcurre el tiempo como deberia, si te hechas a dormir, no adelanta 8 horas como hacia el Baldur´s Gate y esto es lo que estoy buscando. ¿Porque? Porque en la taverna de este modulo el “jefe de la barra” me da una mision donde dice hay una banda que asalta la caravanas a la medianoche, y yo quiero que respete esta caracteristica. De aca sale mi segunda pregunta ¿ Cómo hago para que los PNJ enemigos aparescan solomente a la hora indicada y no en otro horario? Se que es dificil, pero creo que tenemos que buscar hacer historias lo mas complejas posibles, y no solamente que esten basadas en el toma y da de espadazos (Tipo Diablo). El que me quiera preguntar que otra idea tengo sobre estas situaciones bienvenido sea! Y el que tenga alguna pregunta tambien, porque tengo experiencia programando en c++ ¿Como me gustaria poder compilar las librerias en el visual c, u otro programa? 
Neverwinter Nights
Lases ¡¡ OOOH Moradin señodr de los dwarfs !!

Gueno haber si tiees experiencia con el c++ esto tendrias ke tenerlo relativamente facil
la o las funciones para juguetear con el tiempo son :
[quote:90d80e7760=”lexycon”]
GetCalendarDay
GetCalendarMonth
GetCalendarYear
GetIsDawn
GetIsDay
GetIsDusk
GetIsNight
GetTimeHour
GetTimeMillisecond
GetTimeMinute
GetTimeSecond
HoursToSeconds
RoundsToSeconds
SetCalendar
SetTime
TurnsToSeconds
[/quote:90d80e7760]
[code:1:90d80e7760]
void main()
{
int nHour = GetTimeHour();
if (nHour != GetLocalInt(OBJECT_SELF, "nLastHour"))
{
SpeakString("Hour is: " + IntToString(nHour));
SetLocalInt(OBJECT_SELF, "nLastHour", nHour);
}
return;
}
[/code:1:90d80e7760]
Esto daria el valor de la hora, por ejemplo.
Por lo demas es que tocaras el evento OnRest de las propiedades del modulo, para que pasaran las 8 horas.
Gracias Gonar! ya se como empezar a solucionar el problema. No conoces algun programa donde pueda compilar las librerias? Porque con el compilador del nwn es muy lento, y para colmo yo tengo una maquina viejita PII 400
despues de compilar un par de veces me salen mensajes de error.
Y sobre programar el encuentro con PNj creados por mi es posible? Otra cosa que voy a intentar hacer es cuando un enemigo o Pnj te detecta salga de la posicion oculto(stealth), creo que le saca jugabilidad, uno “cree” que esta en las sombras y se come un par de flechas por confiado.
Sigue así buen enano y tendras mis bendiciones en todas las creaciones de tu forja!!!
Hola! esta es la solucion que yo he encontrado a mi problema que origino este post
ahi va:
[code:1:90da64c590]
#include "NW_02_CONINCLUDE"
#include "NW_IO_GENERIC"
void main()
{
//variables que tendran la hora,minutos,segundos,milisegundos.
int n Hour, nMinute,nSecond,nMillisecond;
//variable que tiene el PC
object oPC=GetLastRested();
if(GetIsPC(oPC) == TRUE)
{
nHour=GetTimeHour();
nMinute=GetTimeMinute();
nSecond=GetTimeSecond();
nMillisecond=GetTimeMillisecond();
//se suma ocho horas a la variable hour y se vuelve a guardar en ella
nHour=nHour+8;
//Se corrige el reloj con la nueva hora
SetTime(nHour,nMinute,nSecond,nMillisecond);
}
}
[/code:1:90da64c590]
¡Cuidado! este script tiene la siguiente falla, cuando se interrumpe el resting, suma ocho horas de igual modo, la solucion creo es que no se deberia poner la “nueva hora” hasta que el resting haya terminado, con un if tiene que alcanzar, no lo hice porque ando corto de tiempo
El lugar donde su ubica este script es OnrestPC del modulo.
Tu error ocurre por la siguiente causa.
.
El script que existe en onRest se ejecuta 4 veces entre ellas es al comenzar el descanso al interrumpirlo y al acabar ( de la otra no me acuerdo), entonces existe una funcion que te da el evento que ejecuta el script ( al igual que el onPerception )y en la definicion de dicha funcion tienes las constantes que devuelve, pos ahi lo tienes todo
Y si quieres que al interrumpir el descanso pasen no mas de 8 horas pero si algunas horas, en vez de sumarle 8 a nHours le sumas Random(6)+1 de la siguiente manera .
[code:1:10e98f2a07]nHours+=Random(6)+1;[/code:1:10
¡Muchas Gracias, LiRyCaL! Voy a probar tu respuesta, pero por lo que dices me doy cuenta que esta perfecta. La manera que yo habia encontrado era, que con un if se fijara si habia terminado de descansar y luego computara la suma de las horas, pero si interrumpia el rest el problema aun persistia.
Con la ayuda del amigo LiRyCaL he encontrado para que la funcion “descansar” funcione bien.
Luego de declarar las variables y de comprobar que el que descansa es el PC(post anteriores) hay que ingresar el siguiente codigo:
[code:1:210bbbcd57]int nBandera;
nBandera=GetLastRestEventType();
if(GetLastEventType() ==REST_EVENTTYPE_REST_FINISHED)
{
nHour=nHour+8;
SetTime(nHour,nMinute;nSecond,nMillisecond);
}
else if(GetLastEventType() ==REST_EVENTTYPE_REST_CANCELLED)
{
nHour+= Random(6)+1;
SetTime(nHour,nMinute;nSecond,nMillisecond);
Sinceramente para hacer eso ya complicas la cosa como un nudo que se anuda mas al intentar desanudarlo. TOMA YA ! tremendo trabalenguas.
Tendrias que usar Random() y posiciones de los jugadores, pero siempre y cuando el area sea del tipo de bosque o algo similar, en conclusion, complicado!.
Si es cierto, pero se que a programadores como vos le gustan los desafios, y yo te he ofrecido uno. Pero no importa, lo voy a dejar para mas adelante, ahora tengo otra idea, mira el post nuevo que voy a dejar.
¿porque no usas la figura de un avatar? ¿Estas haciendo algun modulo en particular? Nos vemos