25075-GBA_|_Scripting_|_People_AI_System_Script_by_Javi4315
#0
Javi4315♪ 13374
Vaya, Javi, me sorprende un nuevo tutorial tuyo en tan poco tiempo. Pero tengo dos importantes dudas que me corroen ¿Para qué sirve este nuevo manual tan interesante? ¿Y, sobre todo, qué te ha dado ahora para escribir los títulos en ese idioma que invade nuestro amado Gibraltar?

Hola, querido yo mismo. Respondiendo a tus preguntas, esto es un sistema que diseñé para mi hack y que podéis ver si lo jugáis, se trata de un sistema que, dependiendo de la hora que sea, haya una determinada persona en la calle o no, o esté en una posición u otra. Sobre lo segundo, tiene más musicalidad (?) :P


Teoría

Vamos a ver. No podéis negarme que es raro si vais a hablar con una persona aleatoria a las 12:00 y esté en el mismo lugar y en el mismo sitio 10 horas después. Más si insertáis una sistema día/noche. Vas por la mañana y te dice: "¡Cómo brilla el Sol hoy!". Bien, pero es que vas en plena noche y te suelta lo mismo. Es raro. A parte, ¿Qué hace un señor todo el día en la calle? ¿No debería estar en casa a cierta hora? ¿No se ausenta del pueblo en ningún momento? ¿Para ir a la escuela? ¿Para ir a trabajar?

Bueno, pues este sistema pretende que cada persona esté en un lugar determinado dependiendo de la hora. O que dependiendo de la hora diga una cosa u otra (o no).

Un ejemplo de mi hack. En Ciudad Orquídea está el casino. Pero no puedes jugar sin fichas, igual que no puedes tener fichas sin un monedero. Pues el monedero te lo da un hombre. Ese hombre sólo aparece sentado en un banco por las noches (entre las 00:00 y las 4:00). Para conseguir el monedero, tienes que ir a hablar con él a esa hora, porque no aparece en ningún otro momento del día. Bueno, pues de eso se trata.


Para entenderlo mejor

Para el que no se haya enterado muy bien todavía, dejo la imagen de un mapa de mi hack y explico diferentes eventos:



1. El chico con la gorra amarilla que está arriba sólo es visible a primeras horas de la noche. Está escondido, fumando.
2. El hombre gordo aparece 3 veces. Eso se debe a que aparece en 3 periodos del día distintos, en distintas zonas y habla sobre distintas cosas. El resto de las horas está en casa (igual que el de la gorra amarilla).
3. La mujer rubia sólo aparece por la tarde porque "le gusta ver el atardecer".
4. La pokéball que se encuentra detrás de la tienda sólo se puede alcanzar si el tendero se quita. Obviamente en determinados momentos del día, el tendero no estará y podremos acceder a la pokéball.
5. El policía aparece de noche y de madrugada para vigilar la zona de manera más intensa. El resto del día no hay presencia policial.

Eso son algunos ejemplos. Se pueden hacer muchas cosas, a parte de estar hablando de un sistema mucho más realista.


Real Time Clock (RTC)

Para que los eventos funcionen dependiendo de la hora, debemos insertar el RTC al juego. Esto se puede hacer con la herramienta DNS, que también sirve para insertar el sistema día/noche. Se puede insertar el RTC sin necesidad de insertar el sistema día/noche, para el que quiera que siempre sea de día (que nunca lo entenderé xD).

Pues nada, abrís la herramienta, cargáis el rom y le dais a "Insert RTC".


¿Cómo lo hago?

Este es el script que yo uso en mi hack:

#dynamic 0x800000

#org @comienzo
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x7
if 0x1 goto @1
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x8
if 0x1 goto @1
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x9
if 0x1 goto @1
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0xA
if 0x1 goto @1
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0xB
if 0x1 goto @2
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0xC
if 0x1 goto @2
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0xD
if 0x1 goto @2
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0xE
if 0x1 goto @2
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0xF
if 0x1 goto @3
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x10
if 0x1 goto @3
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x11
if 0x1 goto @3
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x12
if 0x1 goto @4
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x13
if 0x1 goto @4
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x14
if 0x1 goto @4
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x15
if 0x1 goto @4
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x16
if 0x1 goto @5
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x17
if 0x1 goto @5
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x0
if 0x1 goto @6
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x1
if 0x1 goto @6
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x2
if 0x1 goto @6
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x3
if 0x1 goto @6
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x4
if 0x1 goto @7
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x5
if 0x1 goto @7
copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x6
if 0x1 goto @7
end

#org @1
clearflag 0x500
setflag 0x501
setflag 0x502
setflag 0x503
setflag 0x504
setflag 0x505
setflag 0x506
end

#org @2
setflag 0x500
clearflag 0x501
setflag 0x502
setflag 0x503
setflag 0x504
setflag 0x505
setflag 0x506
end

#org @3
setflag 0x500
setflag 0x501
clearflag 0x502
setflag 0x503
setflag 0x504
setflag 0x505
setflag 0x506
end

#org @4
setflag 0x500
setflag 0x501
setflag 0x502
clearflag 0x503
setflag 0x504
setflag 0x505
setflag 0x506
end

#org @5
setflag 0x500
setflag 0x501
setflag 0x502
setflag 0x503
clearflag 0x504
setflag 0x505
setflag 0x506
end

#org @6
setflag 0x500
setflag 0x501
setflag 0x502
setflag 0x503
setflag 0x504
clearflag 0x505
setflag 0x506
end

#org @7
setflag 0x500
setflag 0x501
setflag 0x502
setflag 0x503
setflag 0x504
setflag 0x505
clearflag 0x506
end

copybyte 0x20370D0 0x3005542
compare LASTRESULT 0x(hora en hex)
if 0x1 goto @(pointer)

Lo que hace esto es copiar el byte de la ram que guarda la hora a otro byte de la ram vacío. De ese modo conseguimos guardarlo en LASTRESULT. Con el compare, comprobamos si es una determinada hora (en hex). Por último, si es esa hora, nos lleva a un pointer que queramos.

Yo he divido el día en 7 partes, cada una representada por una flag. De esta manera, en cada uno de los punteros se activan todas las flags excepto una que se desactiva. Esta flag que se desactiva es la que representa ese periodo del día. Todos los minis que tengamos con otras flags, se supone que aparecen en otro momento, entonces, al estar la flag activada, desaparece. Sólo aparecerán los minis con la flag que desactivamos.

Por supuesto, vosotros podéis partir más el día, o partirlo menos. Eso como queráis.

Si vais a utilizar el script tal como está, estas son las flags y las horas:

500 - 7:00 a 11:00
501 - 11:00 a 15:00
502 - 15:00 a 18:00
503 - 18:00 a 22:00
504 - 22:00 a 0:00
505 - 0:00 a 4:00
506 - 4:00 a 7:00


Por ejemplo, si le asignáis a un mini la flag 0x500, el mini aparecerá entre las 7:00 y las 11:00.

Ahora vamos a implementarlo. Lo único que tenemos que hacer es poner un script de nivel de tipo 05 en todos los mapas que lo necesitemos. En principio, sobra con ponerlo en todos los mapas de pueblos, ciudades y rutas. En las casas y eso no tiene por qué ser necesario, pero también lo podéis poner si queréis, depende de vuestras necesidades. Obviamente, no hace falta que lo compiléis un montón de veces, con compilarlo una vez y poner en todos los mapas el script con el mismo offset es suficiente.

Bueno, pues lo compilamos. Creamos el script de nivel tipo 05 en el mapa. Le asignamos el offset de nuestro script. Ahora guardamos y pulsamos ctrl+H para ver el cabezal en modo profesional. Vamos a "Map Script Offset" y copiamos el offset que nos da. Ahora vamos a XSE, ponemos el offset, marcamos la casilla de script de nivel (el último icono) y decompilamos. Ahora vemos si al principio del script hay algún "#raw 0xFFFF" y si lo hay, lo cambiamos a "#raw 0x0" y compilamos. Esto del "Map Script Offset" es porque a veces se produce ese error y no funcionan bien los scripts de nivel, así que se comprueban y, si todo está bien, hemos acabado.