Unownking
Usuario de platino
Buenas a todos, este es mi primer post, aunque os llevo leyendo un tiempecito, ya que recientemente he empezado a hacer mi primer hack serio (aunque hace lustros había hecho pinitos con el advance map) y se ha dado el caso de que necesitaba que un NPC interactuase de manera distinta según si le hablaba desde arriba o desde la izquierda.
No soy un hacha con esto del scripting, pero como no he encontrado ningún tutorial para newbies explicando esto que para otros puede resultar tan básico; comparto con vosotros el método que he encontrado yo después de devanarme los sesos para que no tengáis que hacerlo vosotros.
Llegué a pensar en poner el sprite a distinta alturas para crear el mismo efecto, pero esta solución me pareció extremadamente chapucera, así que me puse a investigar. Si estudiamos por ejemplo el script del NPC que hay en Ciudad Plateada que nos lleva a rastras al gym de Brock, nos encontraremos con este comando:
compare PLAYERFACING 0x4
if 0x1 call @offset
Ahora bien, si intentamos poner PLAYERFACING tal cual en nuestro script, XSE va a decir que nos peinemos. Ante esta situación yo me planteé la pregunta: ¿qué c0jones es PLAYERFACING?
Pues después de tanto buscar hallé en un rincón de internet esta publicación que aunque no lo aborda de manera demasiado concisa, me ayudó un poco a hacerme una idea y llegué a la conclusión de que se trata de una variable que almacena la posición actual del protagonista. Ahora bien, ¿qué variable es?
Indagando un poco más encontré en este repositorio que existe una variable llamada VAR_FACING, que es la 0x800C. Habida cuenta de esto, llegué a la conclusión de que PLAYERFACING es la variable 0x800C y 0x4 es el valor que tiene que adoptar para leer un offset u otro, en este caso 0x4 es "player mira a la derecha".
Así pues, di un salto de fe, hice mi script y lo compilé tal cual y... ¡Funcionó!
De momento he podido averiguar que el valor 0x1 es PLAYER FACING DOWN y 0x4 es PLAYER FACING RIGHT, así que UP y LEFT tienen que ser las que quedan en medio. Ignoro si existe algún valor más, pero yo creo que con estos 4 es más que de sobra para ir tirando.
Os dejo el script que he hecho yo, para que os hagáis una idea de cómo se ve:
#org @inicio
lockall
faceplayer
compare 0x800C 0x1 'aquí comparamos la variable PLAYERFACING con el valor 1, que es el prota mirando hacia abajo.
if 0X1 goto @iffacedown 'si el prota esta mirando hacia abajo al hablar al NPC, nos redirigirá al mensaje 1
msgbox @msj2 'si el prota está mirando en cualquier otra dirección, se reproducirá el mensaje 2
release
end
#org @iffacedown
msgbox @msj1
release
end
#org @msj1
= Estás mirando hacia abajo
#org @msj2
= Estás mirando en cualquier otra dirección
Recapitulamos:
PLAYERFACING es la variable 0x800C
Y los valores que puede tener son:
0x1: Jugador mirando hacia abajo.
0x2: Jugador mirando hacia arriba o hacia la izquierda.
0x3 Jugador mirando hacia arriba o hacia la izquierda.
0x4 Jugador mirando hacia la derecha.
No soy un hacha con esto del scripting, pero como no he encontrado ningún tutorial para newbies explicando esto que para otros puede resultar tan básico; comparto con vosotros el método que he encontrado yo después de devanarme los sesos para que no tengáis que hacerlo vosotros.
Llegué a pensar en poner el sprite a distinta alturas para crear el mismo efecto, pero esta solución me pareció extremadamente chapucera, así que me puse a investigar. Si estudiamos por ejemplo el script del NPC que hay en Ciudad Plateada que nos lleva a rastras al gym de Brock, nos encontraremos con este comando:
compare PLAYERFACING 0x4
if 0x1 call @offset
Ahora bien, si intentamos poner PLAYERFACING tal cual en nuestro script, XSE va a decir que nos peinemos. Ante esta situación yo me planteé la pregunta: ¿qué c0jones es PLAYERFACING?
Pues después de tanto buscar hallé en un rincón de internet esta publicación que aunque no lo aborda de manera demasiado concisa, me ayudó un poco a hacerme una idea y llegué a la conclusión de que se trata de una variable que almacena la posición actual del protagonista. Ahora bien, ¿qué variable es?
Indagando un poco más encontré en este repositorio que existe una variable llamada VAR_FACING, que es la 0x800C. Habida cuenta de esto, llegué a la conclusión de que PLAYERFACING es la variable 0x800C y 0x4 es el valor que tiene que adoptar para leer un offset u otro, en este caso 0x4 es "player mira a la derecha".
Así pues, di un salto de fe, hice mi script y lo compilé tal cual y... ¡Funcionó!
De momento he podido averiguar que el valor 0x1 es PLAYER FACING DOWN y 0x4 es PLAYER FACING RIGHT, así que UP y LEFT tienen que ser las que quedan en medio. Ignoro si existe algún valor más, pero yo creo que con estos 4 es más que de sobra para ir tirando.
Os dejo el script que he hecho yo, para que os hagáis una idea de cómo se ve:
#org @inicio
lockall
faceplayer
compare 0x800C 0x1 'aquí comparamos la variable PLAYERFACING con el valor 1, que es el prota mirando hacia abajo.
if 0X1 goto @iffacedown 'si el prota esta mirando hacia abajo al hablar al NPC, nos redirigirá al mensaje 1
msgbox @msj2 'si el prota está mirando en cualquier otra dirección, se reproducirá el mensaje 2
release
end
#org @iffacedown
msgbox @msj1
release
end
#org @msj1
= Estás mirando hacia abajo
#org @msj2
= Estás mirando en cualquier otra dirección
Recapitulamos:
PLAYERFACING es la variable 0x800C
Y los valores que puede tener son:
0x1: Jugador mirando hacia abajo.
0x2: Jugador mirando hacia arriba o hacia la izquierda.
0x3 Jugador mirando hacia arriba o hacia la izquierda.
0x4 Jugador mirando hacia la derecha.