qna_rh
Thread Id: 18753
Thread Name: Usar una variable como parámetro en el XSE
#0
Tito Dafting301_4315♪ Kuchiki 24341
Buenas a todos. Tengo una duda con respecto a si se puede hacer esto. En otros lenguajes de programación, se puede hacer esto. Les muestro un ejemplo de Pascal.

begin
A:= 'queseyotioxdxd'
writeln(A)
readln
end.

Bien, en ese código lo que hice es darle un valor a A (Algo que se puede hacer en XSE perfectamente) y luego mostrarlo en pantalla. Esto pasa porque no puse directamente 'queseyotioxdxd' en el comando que sirve para mostrar texto en pantalla si no, que le puse el nombre de una variable. Esa es mi duda. Si se puede poner el nombre de una variable de alguna forma en los comandos del XSE para poder obtener resultados diferentes sin matarse scripteando.

Eso, saludos.
#1
cosarara97 12296
Que feo es pascal, no? xD
Bueno, pues un comando que tome un número como argumento no podrá tomar un número de flag o de variable. Aún así, hay 2 cosas que puedes hacer:
1 - Constantes:
Ej. si solo quieres darle un nombre a un número mágico, puedes hacerlo:
#define VIEJA 25
applymovement VIEJA @lalala

(bueno, creo que se puede hacer en XSE, por lo menos en ASC y PKSV se puede)
2 - Script en RAM:
Escribes el script, lo compilas, guardas el código compilado, descubres en qué byte queda el valor que quieres modificar, y buscas el offset de una variable en RAM.
Se trata de escribir el script en RAM (en OFFSET_RAM), leer el valor de una variable del juego y ponerlo como argumento de nuestro comando en OFFSET_RAM+N (Donde N es el número de bytes des del principio del script hasta el argumento). Luego ejecutar el script de la RAM.
Un poco de código:

writebytetooffset OFFSET_RAM BYTE1
writebytetooffset OFFSET_RAM+1 BYTE2
writebytetooffset OFFSET_RAM+2 BYTE3
.
.
.
loadbytefrompointer BANCO OFFSET_VARIABLE
setfarbyte BANCO OFFSET_RAM+N
.
.
.
goto OFFSET_RAM

(seguro que se puede hacer mejor en ASM, pero es que yo de ARM se poquito)
Tenemos el problema de que no hay un comando writefarbytetooffset, pero usando un banco como punto intermedio debería funcionar.
Nunca he hecho nada con bancos, pero en teoría deberían funcionar como variables temporales para scripts. Supongo que el banco 1 serviría.
Por cierto, no se si loadbytefrompointer y setfarbyte se llaman así en XSE, pero son el comando 0x12 y 0x13 respectivamente.

Bueno, divertido, no? Me gustaría que alguien nos iluminara con algo mucho más bonito, pero esto debería funcionar.

(Si eso luego edito)
#2
Tito Dafting301_4315♪ Kuchiki 24341
Qué bonita respuesta, me he quedado anonadado.

Lo de la constante no es, Cosarara. Eso ya lo sabía. La cosa es que los parámetros difieran dependiendo del valor de una variable (como en Pascal)
#3
Javi4315♪ 13374
Yo creo que sí se puede. Al menos creo haberlo hecho, pero en vez de preguntarlo sin más ¿Por qué no pruebas directamente? Claro que estamos hablando de que actúe como parámetro de un comando concreto y no de otra cosa...
#4
Tito Dafting301_4315♪ Kuchiki 24341
No creo que se pueda directamente, es decir, en vez de poner el parámetro pongo la variable? No creo que funcione.
#5
Javi4315♪ 13374
bufferpokemon 0x0 0x8005


Esa es una linea de mi tutorial de "takepokemon". Como ves, se guarda en el buffer el nombre de un pokémon correspondiente a un valor que no está directamente descrito, sino guardado en una variable. Como poderse, se puede en algunos casos, no voy a decir que en todos. Así que sigo pensando que lo mejor es que lo compruebes. Si no lo haces, nunca lo sabremos.

EDITO: También estuve haciendo unas pruebas para dar un pokemon aleatorio con un givepokemon. Obviamente, el valor aleatorio que se genera se guarda en una variable. En este caso, la LASTRESULT, pero que no deja de ser una variable. Y me fue posible cambiar el propio valor por el representado por la variable LASTRESULT en el givepokemon. Así que sí, se puede. Repito que no sé si siempre, pero se puede. Pero otra vez, compruébalo, es la única forma de salir de dudas.
#6
cosarara97 12296
Valor aleatorio en un givepokémon?
A ver, el tema es que algunos comandos cogen como argumento variables, otros cogen números literales, otros cogen números de banco, otros punteros, etc.
Lo que pregunta Dafting es si se puede poner una variable en un sitio en el que iría un número literal. Ejemplo:
callstd tipo
Donde tipo es una variable, en lugar de un número definido literalmente al compilar.
#7
Tito Dafting301_4315♪ Kuchiki 24341
Iniciado por cosarara97
Lo que pregunta Dafting es si se puede poner una variable en un sitio en el que iría un número literal.


El Cosarara sapbe.

Es exactamente lo que estoy preguntando.
#8
Javi4315♪ 13374
Iniciado por cosarara97
Valor aleatorio en un givepokémon?
A ver, el tema es que algunos comandos cogen como argumento variables, otros cogen números literales, otros cogen números de banco, otros punteros, etc.
Lo que pregunta Dafting es si se puede poner una variable en un sitio en el que iría un número literal. Ejemplo:
callstd tipo
Donde tipo es una variable, en lugar de un número definido literalmente al compilar.


Quizás eso es de lo que estés hablando tú, yo no. Yo hablo en general porque lo que yo he entendido es que si se puede poner una variable como parámetro de un comando. No otra cosa más específica. La diferencia es que yo acojo siempre la posibilidad de haberme equivocado y no ando por ahí con la prepotencia que llevas tú.

De todas formas me mato en que la respuesta no es un mensaje escrito en un foro, sino abrir XSE y comprobarlo. Esa es la respuesta y gracias a eso podemos responder muchas otras cosas aquí, gracias a haberlo comprobado antes.
#9
cosarara97 12296
Javi tiene razón:
Hay comandos que pueden tomar tanto una variable como un valor literal como argumento. El juego diferencia entre los 2 por lo alto que es el valor (coge variables de 0x4000 en adelante y estás seguro).