Tutorial sobre Scripts (Basico)

OP

Zαc

VaingloryRip♥
Mensajes
3.104
Reacciones
490
Puntos
996
Ubicación
~ÐÃИЇΣL
Bueno navengando en la Red me e Incontrado un tutorial de scripts muy bien explicado el Tutorial esta echo por Ciro,creditos a el por favor,Ahora lo hago en un nuevo tema para que varios que visitan la zona hack los puedan ver

Otra cosa para los que no saben donde poner estos codigos que hablan aqui ejemplo

#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
applymovement 0x1 @mov1
waitmovement 0x1
release
end

#org @frase

Tienen que ponerlo en un Blog de notas Click derecho>> Nuevo >> blog de notas o documento de texto

y esta es la herramienta con la que se copila nuestro script
Por favor, Acceder o Registrarse para tener acceso a los enlaces.



~~ NIVEL FÁCIL ~~
Creando y compilando nuestro primer Script]

Comencemos. Esto es, por supuesto, lo más basico.

  • Abre el Advance Map y ve a Options > Choose Script Editor. Luego ve a la carpeta donde tengas el XSE y haz doble click. Te aparecerá un mensajito, clickea en "Yes" (o "Sí").
    sinttulopqj.png
  • Sencillo, ¿no? Hasta el más novato de los novatos sabría hacerlo. Incluso Hitler. Ahora viene la parte que me gusta, la parte de nuestro querido XSE, un programa imprescindible para el rom hacking. Si no sabes usarlo olvidate del rom hacking. Vamos a abrir nuestro ROM con el XSE. Archivo > Abrir > Selecciona tu ROM (Forma más rápida: Ctrl + O > Selecciona tu ROM)
  • Bien, ahora ya tenemos asignado el XSE al Advance Map y abierto nuestro ROM con XSE. En el capítulo 1 enseñaré como crear un script, cómo compilarlo, y algunos comandos básicos. Con lo que vamos ahora será con...

La creación de un script

Bien, comencemos.

Código:
#dynamic 0x800000
Y tú te preguntaras: ¿Qué es #dynamic 0x800000? Muy sencillo. Eso es lo que debes poner al principio de TOOOOOOOOOOOOOODOS los scripts que hagas.

¿Qué ocurre si me olvido de poner el comando #dynamic?

No ocurre nada grave, no se te trabará el hack ni nada parecido. el XSE te avisará al compilarlo de que te has olvidado de ponerlo.

¿Y qué es compilar?

Eso está explicado más abajo, tú sigue leyendo tranquilamente.

Bien. Sigamos creando el script.

Código:
#dynamic 0x800000

#org @inicio
Vaya, ahora hemos añadido una cosa desconocida para mí, se llama #org @inicio. ¿Qué significa?

Eso es una cosa que deberás colocar también en TODOS LOS SCRIPTS. Sin el #dynamic y el #org @inicio no funcionará tu script, pero repito que el XSE te avisará.

¿Y por qué es @inicio?

Bueno, yo lo he puesto así porque es la costumbre, pero sin embargo puedes poner lo que tu quieras, siempre y cuando sea UNA SOLA PALABRA



¿Ha quedado claro? Una sola palabra, repito, una sola palabra. ¿Me estoy repitiendo mucho? Lo siento, pero este suele ser un fallo muy común.

Bien, ahora explicaré dos comandos esenciales. lock y faceplayer

Estos dos comandos son opcionales, y no tienes por qué ponerlos, pero dependiendo del script sí deben ponerse (para que quede bien). En ningún caso es obligatorio para que funcione el script, pero sí para que no dé algunos errores...
Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
Bien, procedamos con la explicación.

lock: se usa para bloquear un mini (si en el Advance Map tenías puesto que estuviese mirando alrededor, sin este comando seguirá mirando al mismo tiempo que habla contigo)

faceplayer: se usa para que, al hablar con un mini, éste te mire a la cara (si le tenías puesto que estuviese mirando hacia arriba y le hablas por abajo, se girará para mirarte)

Bien, ahora que creo que eso ya ha quedado aclarado (no os quedéis con la duda, preguntadme si hay algo que no entendéis, no me molestáis, al contrario, me gusta la participación), procederemos con la explicación del conocido msgbox.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
Muy bien, el msgbox es bien fácil de utilizar... sin embargo, ahí hay algo que falta, pero ¡no te preocupes! ¡Cada cosa a su tiempo! Para empezar, procederé a explicar ese "0x6".

El 0x6 es uno de los parámetros del msgbox. Ahora procederé a explicar todos y cada uno de ellos.

0x0: Mensaje de cuando te dan un objeto (se usa para el giveitem, ya lo explicaré)

0x1: Este es parecido al 0x0, pero es cuando te encuentras una de esas Pokéball tiradas por el suelo que contienen algo.

0x2: Este es igual al 0x6, la única diferencia es que este tiene el faceplayer "incluído". Es decir, el 0x6 es un mensaje normal y corriente, pero si usas el 0x2 no necesitarás poner el faceplayer, ya que el mini te mirará automáticamente.

0x3: Este se usa para un script de un cartel (por ejemplo, en el cartel donde pone "Casa de <<jugador>>", se usaría un msgbox 0x3)

0x4: Éste creo que abre una msgbox normal, pero que no se cierra hasta que pulses A

0x5: Este es fácil de hacer, abre un YES/NO box (ya lo explicaremos más adelante, no será difícil de aprender)

0x6: Este es uno de los más usados, es como el 0x2 pero sin el faceplayer incluído. Es una caja de texto normal.

0xA: Este se usa sólo en Pokémon Esmeralda, y es para ejecutar una llamada del Pokénavegador.

Bien, ahora vamos a explicar qué es "eso que falta".

A ver, revisemos el script de nuevo.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
¿Qué es lo que falta? ¿No lo notas? Bueno, hemos puesto @frase, pero... ¿dónde está la frase que queremos mostrar? Muy simple.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6

#org @frase
Aquí iría nuestro texto. ¿Cómo lo introducimos? Muuuuy fácil, pulsa Ctrl + T y se te abrirá un cuadro donde podrás escribir.
Sí, sólo nos faltaba eso. Definir la frase que queríamos poner. Recuerda pulsar Ctrl + T para escribir tu texto, del otro modo también es posible, pero muy difícil.

ajustedelinea.png


Bueno, hasta ahora ha sido muy sencillo nuestro primer script, ¿no? Y supongo que me habré explicado bien. Ahora vamos a finallizar nuestro script.

Código:
release

end
Como puedes ver, son comandos sencillos. Aquí la explicación.

release: permite a los minis volver a moverse (debes ponerlo SÓLO si pusiste el comando lock, sino gastarás bytes inútilmente)

end: su nombre lo indica todo. "Final". Cierra el script, se acaba todo. Se pone SIEMPRE.

Aquí tenéis una muestra de lo que sería un script básico (al lado de cada comando (los comandos son msgbox, release, end, etc.) he puesto un ' y un comentario, después de ' lo que se ponga no se incluye en el script, es para comentar)

Código:
#dynamic 0x800000 ' Dynamic busca una dirección a partir de 0x800000.

#org @inicio ' El puntero inicial
lock 'Bloquea el mini
faceplayer ' Mira al protagonista
msgbox @frase 0x6 ' Abre una caja de mensaje y muestra lo que hayamos puesto en @frase
release ' Sólo si se puso lock, para permitir que el mini se siga moviendo
end ' Finaliza el script

#org @frase ' Aquí está el puntero de la frase
= Ciro: ¡Guau, aquí hay mucha fruta,\nincluso hay 5 manzanas!\lCreo que me comeré una.\pMamá: Claro hijo, cómete las que\nquieras.     ' Y ésta es la tan ansiada frase
Compilando el Script y asignándolo a un mini

Bien. ¿Veis en el XSE un icono de dos tuercas unidas? Sí, sí, ese icono:
compileicon.png


Pues vale, hacemos click en él, y se nos abrirá una ventanita nueva.
compilebox.png


Muy bien, pues lo que está remarcado en azul es el offset principal, el offset que contiene los datos de todo el script. Luego haces click en "Copiar" (SIEMPRE con el primer puntero marcado de azulito), y luego a "Cerrar" (habremos terminado con el XSE)

A continuación, vais al Advance Map, y en "Ver eventos" hacéis click encima del mini. En la barra de la derecha, buscad donde dice "Script offset" y lo sustituís por lo que hayáis copiado antes (manteniendo siempre el $).

scriptbox.png


Bueno, he modificado este capítulo porque antes no se entendía demasiado bien (eran 3 míseras líneas), supongo que ahora estará mejor.
Comandos: Givepokemon, Giveitem, giveegg, givemoney, givecoins y removecoins]

Estos 4 comandos son sencillísimos de usar. A ver, hagamos un script con givepokemon.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
givepokemon 0x0 0x0 0x0 0x0 0x0 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
Bien, ahí tenemos el givepokemon, pero antes procedamos con su explicación

givepokemon: Muy simple. Te regala un Pokémon. El que quieras, al nivel que quieras y con el objeto que quieras.

¿Cómo relleno sus parámetros?

Muy fácil:

El primer 0x0: Número del Pokémon que quieras recibir. Tiene que ser el nº de la Pokédex nacional y ha de estar en hex (el XSE tiene calculadora)

Segundo 0x0: Nivel del Pokémon que quieras recibir, también en hex.

Tercer 0x0: Pulsa Ctrl + N para abrir una nueva pestaña en el XSE, y pulsa Ctrl + O. Luego ve a la carpeta donde tengas el XSE, y abre el archivo "stditems". Ahí tienes los números de los objetos.

¿Y qué hago yo con todos esos códigos que no sé para que sirven? Ah, pues eso es muy sencillo.

  • Pulsa Ctrl + F y en "Buscar" pones el nombre (en inglés y, si son varias palabras, juntarlas, ejemplo: Restura todo = FULLRESTORE), luego pulsas en "Buscar siguiente".
  • Una vez encontrado el objeto que queramos equiparle...
    objeto.png
  • Copiamos lo que va después del 0x, en mi caso sería 13, es el número del objeto. Volvemos al givepokemon y en el tercer 0x0, el del objeto, pegamos ese número (0x13)

Cuarto, quinto y sexto 0x0: Esos serán siempre 0x0, no los toques.

Bien, como con todo script, hay que poner un ejemplo. Supongamos que queremos recibir un Pidgey al nivel 12 con un Restaura todo equipado.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
givepokemon 0x10 0xC 0x13 0x0 0x0 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
No te preocupes, lo explicaré todo.

0x10: El número de Pidgey en la Pokédex nacional es 16, y 16 en hexadecimal es 10.

0xC: El nivel era 12, ¿no? 12 en hexadecimal es C, por lo que C se queda.

0x13: Aquí puse el restaura todo que expliqué antes.

0x0 0x0 0x0: Esto siempre va así.

Bueno, y aquí terminamos con el givepokemon. Ahora vamos con otros comandos que son mucho más sencillos.

NOTA IMPORTANTE: Al final de tu script, debes activar una flag (está explicado abajo, tú ponlo) para que el Pokémon se vea en el menú. En Ruby debes usar setflag 0x800, en FR setflag 0x828, en Esmeralda setflag 0x860.

Giveitem: Sirve para recibir un objeto.

¿Recuerdas el archivo que abrimos antes, donde el restaura todo era el número 13? Muy bien, todos esos números los usaremos también para el giveitem.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
giveitem 0x0 0x0 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
Bien, antes de explicar nada del giveitem quiero preguntaros algo. ¿No habéis notado algo distinto en el script? Sí, no he puesto el msgbox. ¿Recuerdas los tipos de msgbox que expliqué antes? Pues eso usaremos en el giveitem.

Ahora procederé a explicar los parámetros.

Primer 0x0: Aquí introduce el número del objeto a recibir, ya expliqué antes como mirarlo.

Segundo 0x0: Cantidad de objetos a recibir, en hexadecimal (Por ejemplo, 10 objetos = 0xA)

Tercer 0x0: Tipo de mensaje. Debes poner 0x1 si es para encontrar una Pokéball tirada por ahí y 0x0 si es alguien el que te da el objeto.

Y, una vez aclarado esto, procedamos con el simple giveegg.

Giveegg: Para recibir un huevo Pokémon.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
giveegg 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
"Y qué corto es", dirás tú. Pues sí, es un comando muy corto, de un único y simple parámetro, el mismo que el primer 0x0 del givepokemon.

Primer y único 0x0: Número de la Pokédex nacional en hex del Pokémon a recibir en huevo.

Procedamos con el antepenúltimo de los comandos del episodio 2: givemoney

givemoney: Simplemente, te da dinero. Como el dinero que ganas al salir victorioso de una batalla, o al vender algo. Veamos cómo es:

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
givemoney 0x0 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
¿Te esperabas que fuese un solo parámetro? Pues no.

Primer 0x0: Cantidad de dinero a recibir, como siempre, en hex.

Segundo 0x0: Aquí simplemente pon 0.

Vayamos con los dos últimos comandos: givecoins y removecoins.

Si alguien se pensaba que tenía algo que ver con el dinero, estaba equivocado. Bueno, en realidad, sí tiene que ver. Se refiere a las fichas del casino, las cuales se compran con dinero, ¿no?

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
givecoins 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
Primer y único 0x0: Número de fichas a recibir, como siempre, en hex.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
removecoins 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
Primer y único 0x0: Número de fichas a quitar.
YES/NO box]Esto es algo sencillísimo, siempre que hayas entendido el capítulo 1 no te costará entender este...

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x5
compare LASTRESULT 0x1
if 0x1 goto @inicio2
if 0x0 goto @inicio3
release
end

#org @inicio2
msgbox @frase2 0x6
end

#org @inicio3
msgbox @frase3 0x6
end

#org @frase
Aquí iría el texto donde estaría la caja.

#org @frase2
Esto es si dices que Sí

#org @frase3
Esto si dices que No.
Tú dirás: ¡¡Pero esto es mucho más largo que lo otro!!

Psé, que sea largo no quiere decir que sea difícil. Procedamos con la explicación.

msgbox @frase 0x5: Ya he explicado los tipos de msgbox antes. El 0x5 abre la caja de YES/NO, y @frase podría ser como "¿Quieres salami?"

compare LASTRESULT 0x1
if 0x1 goto @inicio2
if 0x0 goto @inicio3
: Bien, analicemos esas 3 partes. El lastresult simplemente ponlo, es necesario, ya que compara la opción que hayas escogido (YES/NO) Ahora vayamos con lo que probablemente entiendas más fácilmente. Analicemos a fondo las partes de cada if.

Primer if
0x1: Esto sería equivalente al "YES".
goto: Te envía al puntero que elijas después, en este caso @inicio2
@inicio2: Script que se ejecutará al decir que Sí. No tiene por qué ser una simple frase, de hecho, puedes meter otra YES/NO box, o un script largo, etc.
Segundo if
0x0: Esto sería equivalente al "NO".
goto: Te envía al puntero que elijas después, en este caso @inicio3
@inicio2: Script que se ejecutará al decir que No.

Bueno, ha quedado claro, ¿no?
Después simplemente creas lo demás a tu gusto. Creo que quedó claro, ¿no?
Comandos: Applymovement y waitmovement]

Antes de empezar con este capítulo iba a ir con otro, pero recibí una petición de un usuario que quería aprender el applymovement... así que aquí tenéis la explicación.

applymovement: sirve para movilizar un mini. Tú defines el movimiento... y el mini lo hace. La herramienta que yo uso para sacar los movimientos es "Move It"

waitmovement: explicado de manera simple, hace que hasta que un mini no termine de moverse el siguiente comando no se ejecute. Por supuesto, antes del waitmovement puedes poner cualquier cosa, eso depende del script que quieras realizar.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
applymovement 0x1 @mov1
waitmovement 0x1
release
end

#org @frase
= Hombre gordo: Mira, sé dar dos pasos\nhacia abajo

#org @mov
#raw 0x8 
#raw 0x8 ' Estos dos serían los pasos hacia abajo
#raw 0xFE 'Esto se pone SIEMPRE al final de cada applymovement, indica que se ha terminado el mov. y que el script puede continuar.
Guau, qué largo es, ¿no? Procedamos a explicar las cosas nuevas.

applymovement 0x1 @MOV: @MOV sería el puntero donde se indicarían los movimientos. 0x1 es el nº de la persona.

Obtener el número de la persona

Bien, primero abrimos el Advance Map, y con él nuestro hack.

mini1hf.png


Ahí tenemos nuestro dato principal. Ah, que no lo ves bien?

mini2z.png


Sí, en el "0x" debemos poner el número que haya ahí.

Recuerda que debe estar en hexadecimal (repito que el XSE tiene una calculadora incorporada)

Bueno, seguiré explicando todo eso. Ah, otra cosa, recuerda que el @MOV lo puedes cambiar, siempre y cuando sea una sola palabra, como el msgbox.

waitmovement 0x1: Lo mismo. El 0x1 se refiere al nº de persona en concreto.

¿Qué quiere decir eso?

Bueno, si pones 0x1, 0x2... el que sea, <<esperará>> por ese mini... sin embargo, si pones 0x0 esperará por cualquier applymovement.

#org @MOV
#raw 0x8
#raw 0x8
#raw 0xFE
: El #org @MOV algo parecido a un msgbox, y lo demás los movimientos (se pueden sacar del move it)

Bueno, y con esto termino de explicar applymovement y waitmovement.
Flags: ¡Mis scripts se repiten continuamente!]

Siento haber tardado tanto en postear este capítulo... pero bueno, aquí lo tenéis. ¿Recuerdas el givepokemon, giveitem, etc. que enseñé antes?
Pues claro, cada vez que hablas con esa persona te vuelve a dar un Pokémon/Objeto... vaya decepción, ¿no?
Bah, pero eso no nos importa, porque tenemos la ayuda de nuestras queridas flags!

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
givepokemon 0x1 0x5 0x0 0x0 0x0 0x0
release
end
Sí, ese script se repite inifinitamente. Cada vez que hables con esa persona, te dará el jodido Bulbasaur al nivel 5. Arreglemos eso.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
checkflag 0x2100
if 0x1 goto @inicio2
msgbox @frase 0x6
givepokemon 0x1 0x5 0x0 0x0 0x0 0x0
setflag 0x2100
release
end
Antes de nada, me gustaría decir que yo, por una manía que tengo, siempre uso desde la flag 2100 para arriba.

Ahora toca explicar los nuevos comandos (incluso el if que ya hemos usado)

checkflag 0x2100: Como su nombre indica, "checkea", mira si la flag del "0x" está activada.
if 0x1 goto @inicio2: Si (if) la flag está activada (0x1) irás (goto) a otro puntero (@inicio2). 0x0 sería si la flag estuviese desactivada.
setflag 0x2100: Activa la flag 2100, para que se cumpla el if. La flag se puede activar en otro script distinto, así hasta que no se hable con una persona no se pueda ir al inicio2 de esta persona, etc.

Psé, es algo fácil, ¿no? Completemos todo el script.
Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
checkflag 0x2100
if 0x1 goto @inicio2
msgbox @frase 0x6
givepokemon 0x1 0x5 0x0 0x0 0x0 0x0
setflag 0x2100
release
end

#org @frase
= Toma tu Pokémon, es un\nBulbasaur al nivel 5.

#org @inicio2
lock
faceplayer
msgbox @frase2 0x6
release
end

#org @frase2
= Pero bueno, ya te he dado a tu\nPokémon, ¿qué más quieres?
Por supuesto, las flags se pueden utilizar para un montón de cosas... pero en este capítulo sólo explicaremos esta. Recuerda, las flags no son infinitas, ahorra todas las posibles, utiliza la misma flag para todos los scripts posibles.

clearflag

El comando clearflag es un comando no tan usado como checkflag o setflag, lo que hace es desactiva la flag. Imaginemos que tenemos la flag 2100 activada, y que no la volveremos a usar.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
checkflag 0x2100
if 0x0 goto @inicio2
msgbox @frase 0x6
givepokemon 0x1 0x5 0x0 0x0 0x0 0x0
clearflag 0x2100
release
end

#org @frase
= Toma tu Pokémon, es un\nBulbasaur al nivel 5.

#org @inicio2
lock
faceplayer
msgbox @frase2 0x6
release
end

#org @frase2
= Pero bueno, ya te he dado a tu\nPokémon, ¿qué más quieres?
Veamos las cosas que han cambiado:

if 0x0 goto @inicio2: Al cambiar ese 1 por un 0, el checkflag y el if hacen que si la flag está desactivada vaya al puntero @inicio2. Como la flag 2100 estaba activada, te dará el Pokémon.

clearflag: ya he explicado la función de este comando. Ha desactivado la flag 2100, que no la volveremos a necesitar, para poder hacer este script.

Se entiende la función del checkflag, setflag y clearflag, ¿verdad?
Haciendo un script de gatillo]Antes de aprender cómo hacer un script de gatillo deberemos saber qué es, ¿no?

Script de Gatillo: S con fondo verde
29107217.png
que ejecuta un script al pisar la casilla en la que esté situada.

Sí, bueno, es muy bonito saber qué es... pero ¿cómo se programa?

Bueno, primero creamos uno nuevo. Hacemos click, y en esta barra...

sg2l.png


Perfecto, expliquemos cómo configurar eso.

Pos(X/Y): Eso es la posición del mapa en la que está el script, no lo toques, se pone automáticamente.

Primer Desconocido: En este siempre pondremos 0003

Var number: Aquí asignaremos una variable, pon, por ejemplo, 4050.

Var value: Como aún no he enseñado las variables, este campo lo dejaremos en blanco, pero más adelante sí lo usaremos.

Segundo desconocido: Siempre irá en blanco.

Script offset: Como en un script normal, aquí irá el offset del script.

Diferencias respecto a un Script normal

  • No puedes poner lock, ya que es al pisar una casilla y no bloquearías ningún mini.
  • Lo mismo con faceplayer, no hay nadie que te pueda mirar a la cara.
  • Usaremos variables (en el nivel fácil flags) para que no se repita.
Haciendo nuestro script de gatillo
Primero diseñemos un script normal y corriente.

Lo marcado en negro es lo que nunca debe haber en un script de gatillo. Como ya conocemos la utilidad de las flags, completaremos el script.

Código:
#dynamic 0x800000

#org @inicio
checkflag 0x2101
if 0x1 goto @inicio2
msgbox @frase 0x6
setflag 0x2101
end

#org @frase
= Hola

#org @inicio2
release
end
Pues ya está. ¿Por qué hemos dejado vacío el inicio2? Pues para que al volver a pisar la casilla no suceda nada.

Bueno, eso era todo, combinadlo con lo que habéis aprendido en los demás capítulos y podréis hacer un gran script de gatillo.
 
Última edición por un moderador:
OP

Zαc

VaingloryRip♥
Mensajes
3.104
Reacciones
490
Puntos
996
Ubicación
~ÐÃИЇΣL
Arriba Pie