25024-GBA_|_Scripting_|_Bank_System_Script_by_Javi4315
#0
Javi4315♪ 13374
Ir a la versión 1.1
-----------------------------------------------
Quizás hayáis pensado alguna vez en crear un banco en vuestro juego. Pero claro, se necesitaría ASM. La única forma de hacerlo con scripts sería guardando el valor en una variable. Pero claro, el valor máximo de una variable es de 0xFFFF, que en decimal es 65535, ¿Un banco en el que sólo se puedan meter $65535? Podría ser, pero no quedaría bien.

Entonces, ayer estuve pensando y llegué a la conclusión de que se podía hacer perfectamente. No, no se necesita ASM. Lo haremos con variables. Pero no con una, sino con dos variables.

1. El vídeo

Es una verdadera obra de arte. Lástima que la calidad de la imagen sea tan mala, lo siento :P

YouTube Video

Ahí se demuestra que no hay ningún tipo de erro. En principio, al menos. Es conveniente verlo para ver el funcionamiento.

2. Funcionamiento teórico (importante)

No os asustéis por el título. Sólo voy a explicar un poco cómo funciona. Es imprescindible entenderlo.

En vez de una variable, vamos a usar dos. De esta manera, podemos guardar hasta 999.999 (si queremos utilizar el punto, si no podemos utilizar hasta el 99999999, más en realidad, pero no quedaría exacto, o quizás sí, eso depende de vosotros; de todas formas, podemos usar una tercera variable si queremos poner hasta 999.999.999 con los puntos incluidos).

Lo que vamos a hacer es dividir el número en dos. Los tres primeros números los guardaremos en una variable y los tres segundos los guardaremos en otra. Por ejemplo, si escogemos las variables 0x7FF0 y 0x7FF1, sería algo así:

XXX.YYY, de manera que los números Xs se guarden en la variable 0x7FF1 y los Ys 0x7FF0. No tiene mucha ciencia, es partir el número en dos difras y guardarlos en dos variables distintas.

Luego es cuestión de separar y unir mediante script. Esto es básicamente lo que pensé anoche. Lo difícil ha venido después al hacer el script, he estado esta mañana y parte de esta tarde esccribiéndolo. De hecho, reconozco que pensé que no iba a funcionar. Creí que sería descabellado hacer esto sin ASM, sinceramente.

3. Multichoices

Se puede hacer sin ellos, por supuesto, pero vamos, yo creo que usar multichoices es lo más correcto. Si queréis editar los multichoices, podéis descargar mi magistral herramienta Multichoice Editor v2.

Bueno, como podéis copiar y pegar directamente mi script, os dejo las especificaciones de los multichoices que he usado y los textos que les he puesto.

Iniciado por Multichoice 6

ADMIN. CUENTA
ABRIR CUENTA
SALIR


Iniciado por Multichoice 7

DEPOSITAR
RETIRAR
SALIR


Iniciado por Multichoice 17

[$]100
[$]1.000
[$]10.000
[$]100.000
SALIR

*Nota: Se debe entender que el multichoice es el número 17, pero en hex es el 0x11, no os confundáis a la hora de insertarlo.

*Nota 2: Poniendo el "[$]" en XSE y en Multichoice Editor se reemplaza en el juego por el símbolo del dinero.


Pero claro, vosotros podéis poner otra cosa o poner las opciones que queráis. Esto es por si queréis utilizar el sistema tal cual.

4. El script


#org @comienzo
lock
faceplayer
msgbox @1 0x6
multichoice 0x0 0x5 0x6 0x1 '=> Muestra el multichoice nº 6
compare LASTRESULT 0x0 '=> Estos compares determinan qué opción se ha seleccionado
if 0x1 goto @admin
compare LASTRESULT 0x1
if 0x1 goto @abrir
compare LASTRESULT 0x2
if 0x1 goto @salir1
release
end

#org @salir1 '=> Si elegimos la opción de salir, se oculta el dinero que pudiera estar mostrado y se acaba.
hidemoney 0x0 0x0
msgbox @2 0x6
release
end

#org @abrir '=> La opción de abrir una cuenta
msgbox @4 0x6
pause 0x5
spriteface 0x4 0x4
pause 0x50
faceplayer '=> Todos estos comandos de atrás son meramente decorativos, no tienen una función especial
compare 0x7FF1 0x1 '=> Como el mínimo que se puede tener en la cuenta es 1.000, el valor de la variable 0x7FF1 tiene que ser como mínimo 1, así que comrpueba si el valor es 1
if 0x4 goto @yatiene '=> Si el valor es mayor o igual a 1, es que ya tienes cuenta, por lo que no te deja crearla
showmoney 0x0 0x0 0x0 '=> Muestra tu dinero
msgbox @5 0x5 '=> Te pregunta si quieres abrir la cuenta
compare LASTRESULT 0x1
if 0x0 goto @noabrir
checkmoney 0x3E8 0x0 '=> Comprueba si tenemos los 1000 necesarios para abrir la cuenta
compare LASTRESULT 0x1
if 0x0 goto @nodinero
paymoney 0x3E8 0x0 '=> Si lo tenemos, los pagamos
setvar 0x7FF1 0x1 '=> El valor de la variable 0x7FF1 cambia a 1, por lo que ahora tenemos 1 en la 0x7FF1 y 0 en la 0x7FF0, por lo que al unirlo tenemos 1.000.
sound 0x15
updatemoney 0x0 0x0 0x0 '=> Se actualiza la caja que muestra el dinero
msgbox @8 0x6
hidemoney 0x0 0x0 '=> Quita la caja del dinero
spriteface 0x4 0x4
pause 0x80
faceplayer '=> Comandos decorativos
msgbox @9 0x5 '=> Te pregunta si quieres administrar la cuenta (no es importante)
compare LASTRESULT 0x1
if 0x1 goto @admin
msgbox @6 0x6 '=> Si decides no administrarla, se termina el script
release
end

#org @yatiene '=> Esto sucede si le das a crear cuenta pero ya tienes
msgbox @3 0x6
multichoice 0x0 0x5 0x6 0x1 '=> Muestra el multichoice nº 6
compare LASTRESULT 0x0 '=> Comprueba la opción seleccionada
if 0x1 goto @admin
compare LASTRESULT 0x1
if 0x1 goto @abrir
compare LASTRESULT 0x3
if 0x1 goto @salir1
release
end

#org @noabrir '=> Esto es si, cuando nos preguntó si queríamos abrir la cuenta, decimos que no
msgbox @6 0x6
hidemoney 0x0 0x0 '=> Cierra la caja del dinero
release
end

#org @nodinero '=> Esto pasa si no tenemos dinero para abrir la cuenta, nos dice que no tenemos suficiente y se acaba el script
msgbox @7 0x6
hidemoney 0x0 0x0
release
end


#org @admin '=> Esta es la opción de administrar la cuenta
msgbox @4 0x6
pause 0x5
spriteface 0x4 0x4
pause 0x50
faceplayer '=> Comandos decorativos
compare 0x7FF1 0x0 '=> Comprueba si el valor de 0x7FF1 es 0, si lo es, se entiende que no hay cuenta creada porque el mínimo en la cuenta es 1000.
if 0x1 goto @nocuenta '=> Si no hay cuenta sigue este puntero
msgbox @10 0x6
multichoice 0x0 0x5 0x7 0x1 '=> Muestra el multichoice nº 7
compare LASTRESULT 0x0
if 0x1 goto @depositar
compare LASTRESULT 0x1
if 0x1 goto @retirar
compare LASTRESULT 0x2
if 0x1 goto @salir1
release
end

#org @nocuenta '=> Esto es si le damos a administrar y no tenemos cuenta
msgbox @17 0x6
multichoice 0x0 0x5 0x6 0x1 '=> Muestra el multichoice nº 6
compare LASTRESULT 0x0
if 0x1 goto @admin
compare LASTRESULT 0x1
if 0x1 goto @abrir
compare LASTRESULT 0x3
if 0x1 goto @salir1
release
end

#org @depositar '=> Esta es la opción de depositar dinero
showmoney 0x0 0x0 0x0 '=> Muestra el dinero que tenemos
compare 0x7FF0 0x0 '=> Comprueba si la segunda mitad del dinero es 0, si lo es, va a otra opción para depositar ("depositar2")*
if 0x1 goto @depositar2
buffernumber 0x0 0x7FF1 '=> Se guarda la primera mitad del número en buffer1
buffernumber 0x1 0x7FF0 '=> Se guarda la segunda mitad del número en buffer2
msgbox @11 0x6
multichoice 0x0 0x5 0x11 0x1 '=> Se muestra el multichoice nº 17 (11 en hexadecimal)
compare LASTRESULT 0x0
if 0x1 goto @100
compare LASTRESULT 0x1
if 0x1 goto @1000
compare LASTRESULT 0x2
if 0x1 goto @10000
compare LASTRESULT 0x3
if 0x1 goto @100000
compare LASTRESULT 0x4
if 0x1 goto @admin
release
end

#org @depositar2 '=> La segunda opción de depositar
buffernumber 0x0 0x7FF1 '=> Guarda la primera mitad en la variable, pero la segunda ya va en el texto como "000"
msgbox @18 0x6
multichoice 0x0 0x5 0x11 0x1 '=> Muestra el multichoice nº 17 (11 en hex)
compare LASTRESULT 0x0
if 0x1 goto @100
compare LASTRESULT 0x1
if 0x1 goto @1000
compare LASTRESULT 0x2
if 0x1 goto @10000
compare LASTRESULT 0x3
if 0x1 goto @100000
compare LASTRESULT 0x4
if 0x1 goto @admin
release
end

#org @100000 '=> Esto es si elegimos depositar 100.000
compare 0x7FF1 0x384 '=> comprueba si la primera mitad del número es 900
if 0x4 goto @cuentallena '=> Si es mayor , no te deja meterlo porque se sobrepasarían los 999.999
checkmoney 0x186A0 0x0 '=> Comrpueba si tienes suficiente dinero
compare LASTRESULT 0x1
if 0x0 goto @nodinero2
paymoney 0x186A0 0x0 '=> Si tienes suficiente, los paga
sound 0x15
updatemoney 0x0 0x0 0x0
addvar 0x7FF1 0x64 '=> Se suman 100 (que es 64 en hex) a la variable, para sumar los 100.000 (recordemos que va partido en dos variables)
goto @depositar '=> Vuelve al pointer de @depositar
release
end

#org @10000 '=> Depositar 10.000
compare 0x7FF1 0x3DE '=> Lo mismo que en el anterior caso pero con 10.000
if 0x4 goto @cuentallena
checkmoney 0x2710 0x0
compare LASTRESULT 0x1
if 0x0 goto @nodinero2
paymoney 0x2710 0x0
sound 0x15
updatemoney 0x0 0x0 0x0
addvar 0x7FF1 0xA
goto @depositar
release
end

#org @1000 '=> Si eliges depositar 1.000
compare 0x7FF1 0x3E7 '=> Lo mismo que en el anterior caso pero con 1.000
if 0x1 goto @cuentallena
checkmoney 0x3E8 0x0
compare LASTRESULT 0x1
if 0x0 goto @nodinero2
paymoney 0x3E8 0x0
sound 0x15
updatemoney 0x0 0x0 0x0
addvar 0x7FF1 0x1
goto @depositar
release
end

#org @100 '=> Si eliges depositar 100
compare 0x7FF0 0x384 '=> Comprueba si podemos depositar los 100 sin exceder el máximo
if 0x4 call @ Comp1 '=> Esto es también la comprobación. Pero comprueba la otra variable (juntar con la @ porque si no, me menciona a un usuario)
checkmoney 0x64 0x0 '=> Comprueba si tenemos el dinero
compare LASTRESULT 0x1
if 0x0 goto @nodinero2
paymoney 0x64 0x0 '=> Si lo tenemos, lo paga
sound 0x15
updatemoney 0x0 0x0 0x0
addvar 0x7FF0 0x64 '=> Añade los 100 a la variable de la segunda mitad
compare 0x7FF0 0x3E7 '=> Comrpueba si excede los 1000
if 0x3 goto @depositar '=> Si no los excede, vuelve a @depositar
subvar 0x7FF0 0x3E8 '=> Si excede los 1000, los resta de la variable
addvar 0x7FF1 0x1 '=> Restados los 1000, le añade uno a la primera mitad para conformar los miles (recordar lo de que está partido en 2 variables)
goto @depositar '=> Salta a @depositar
release
end

#org @ Comp1 '=> La comprobación de la segunda variable, como dijimos antes (juntar con la @ porque si no, me menciona a un usuario)
compare 0x7FF1 0x3E7
if 0x1 goto @cuentallena
return

#org @cuentallena '=> Esto sucede si la cuenta no admite el dinero porque excedería el máximo
msgbox @13 0x6
hidemoney 0x0 0x0
goto @depositar
end

#org @nodinero2 '=> Esto pasa si no tienes dinero
msgbox @12 0x6
goto @depositar
end

#org @retirar '=> Esto es la opción de retirar dinero
showmoney 0x0 0x0 0x0
compare 0x7FF0 0x0 '=> Esto es igual que en @depositar, es la forma alternativa de retirar si el valor de la segunda parte es 0.
if 0x1 goto @retirar2
buffernumber 0x0 0x7FF1 '=> Se guardan los valores en los buffers
buffernumber 0x1 0x7FF0
msgbox @14 0x6
multichoice 0x0 0x5 0x11 0x1 '=> Se muestra el multichoice nº 17 (11 en hex)
compare LASTRESULT 0x0
if 0x1 goto @101
compare LASTRESULT 0x1
if 0x1 goto @1001
compare LASTRESULT 0x2
if 0x1 goto @10001
compare LASTRESULT 0x3
if 0x1 goto @100001
compare LASTRESULT 0x4
if 0x1 goto @admin
release
end

#org @retirar2 '=> La forma alternativa de retirar. Igual que la otra, no hace falta que la explique
buffernumber 0x0 0x7FF1
msgbox @19 0x6
multichoice 0x0 0x5 0x11 0x1
compare LASTRESULT 0x0
if 0x1 goto @101
compare LASTRESULT 0x1
if 0x1 goto @1001
compare LASTRESULT 0x2
if 0x1 goto @10001
compare LASTRESULT 0x3
if 0x1 goto @100001
compare LASTRESULT 0x4
if 0x1 goto @admin
release
end

#org @100001 '=> Esto es para retirar 100.000, se llama "100001" porque si no coincide el pointer con el de depositar
compare 0x7FF1 0x64 '=> Todo esto funciona igual que en depositar, comprueba si tenemos dinero en la cuenta suficiente y si tenemos espacio en nuestro dinero
if 0x3 goto @cuentavacia
checkmoney 0xDBB9F 0x0
compare LASTRESULT 0x1
if 0x4 goto @muchodinero
givemoney 0x186A0 0x0
sound 0x15
updatemoney 0x0 0x0 0x0
subvar 0x7FF1 0x64
goto @retirar
release
end

#org @10001 '=> Lo mismo que en el anterior pero con 10.000
compare 0x7FF1 0xA
if 0x3 goto @cuentavacia
checkmoney 0xF1B2F 0x0
compare LASTRESULT 0x1
if 0x4 goto @muchodinero
givemoney 0x2710 0x0
sound 0x15
updatemoney 0x0 0x0 0x0
subvar 0x7FF1 0xA
goto @retirar
release
end

#org @1001 '=> Lo mismo pero con 1.000
compare 0x7FF1 0x1
if 0x3 goto @cuentavacia
checkmoney 0xF3E57 0x0
compare LASTRESULT 0x1
if 0x4 goto @muchodinero
givemoney 0x3E8 0x0
sound 0x15
updatemoney 0x0 0x0 0x0
subvar 0x7FF1 0x1
goto @retirar
release
end

#org @101 '=> Esto es si elegimos 100
compare 0x7FF0 0x63 '=> Igual que cuando depositamos 100, pero para quitarlos, funciona igual en esencia
if 0x3 call @ Comp2 '=> (juntar con la @ porque si no, me menciona a un usuario)
checkmoney 0xF41Db 0x0
compare LASTRESULT 0x1
if 0x4 goto @muchodinero
givemoney 0x64 0x0
sound 0x15
updatemoney 0x0 0x0 0x0
compare 0x7FF0 0x63
if 0x3 goto @1012
subvar 0x7FF0 0x64
goto @retirar
release
end

#org @1012 '=> Esto es por si baja de 0, entonces pasa a ser 900 y se resta 1 a la primera mitad
addvar 0x7FF0 0x384
subvar 0x7FF1 0x1
goto @retirar
release
end

#org @ Comp2 '=> Comprueba si hay algo en la primera mitad, en caso de no haber nada en la segunda, es decir, si hay dinero para retirar 100 (juntar con la @ porque si no, me menciona a un usuario)
compare 0x7FF1 0x1
if 0x1 goto @cuentavacia
return

#org @cuentavacia '=> Esto sucede si no podemos retirar la cantidad seleccionada porque en la cuenta quedarían menos de 1.000
msgbox @15 0x6
hidemoney 0x0 0x0
goto @retirar
end

#org @muchodinero '=> Esto es si tienes tanto dinero "en mano" que no puedes retirarlo del banco porque excederías los 999.999
msgbox @16 0x6
goto @retirar
end

#org @1
= Buenos días, señor.\nBienvenido al Banco de Kanto.\p¿Qué desea hacer?

#org @2
= Vuelva siempre que quiera.\p¡Que tenga un buen día!

#org @3
= Lo siento mucho, señor, pero usted\nya tiene una cuenta.\lNo puede abrir más.\p¿Desea hacer algo?

#org @4
= Muy bien. Espere un momento.

#org @5
= Bien, para abrir una cuenta debe\ningresar una cantidad inicial de\l[$]1.000 ¿Está de acuerdo?

#org @6
= Como desee. Vuelva siempre que\nquiera.\p¡Que tenga un buen día!

#org @7
= Lo siento, señor, pero no tiene\nsuficiente dunero para abrir una\lcuenta.\p¡Que tenga un buen día!

#org @8
= Muy bien, abriremos su cuenta.\nEspere un momento.

#org @9
= Felicidades, señor, ya posee usted\nuna cuenta en nuestro banco.\p¿Desea administrarla?

#org @10
= ¿Qué movimiento desea realizar?

#org @11
= Su saldo es de [$]..\n¿Desea depositar algo?

#org @12
= No tiene suficiente dinero.

#org @13
= No hay espacio en la cuenta para\ndepositar esa cantidad.\pEl máximo para este tipo de\ncuentas es de [$]999.999.

#org @14
= Su saldo es de [$]..\n¿Desea retirar algo?

#org @15
= No puede quedar la cuenta con\nmenos de [$]1.000.

#org @16
= No puede retirar esa cantidad.\nLlevaría demasiado dinero encima.

#org @17
= No tienes una cuenta abierta, no\npuedes administrarla.\p¿Desea hacer algo?

#org @18
= Su saldo es de [$].000.\n¿Desea depositar algo?

#org @19
= Su saldo es de [$].000.\n¿Desea retirar algo?

*Esto es necesario explicarlo. Si el número es 1.100, al mostrar el valor de las variables saldrá bien. Pero si es 0, se mostrará "0", no "000", por lo que se mostraría como "1.0". Por eso va a otro sitio y se corrige ese supuesto.

El script se puede compilar tal cuál y funciona utilizando las variables 0x7FF0 y 0x7FF1, que es lo único que hay que tener en cuenta. Si no se sabe comprender el script totalmente es mejor no cambiar nada. A parte, para sumar valores menores a 1.000, es importante que sólo sean 100 si no se sabe programar correctamente otra cantidad.

Si se inserta con los comentarios, al llevar el apóstrofo ('), en principio XSE los debería tomar como comentarios y no influir en la inserción. Así que en teoría no es necesario quitarlos para compilar.

5. ¿Algo más?

Pues no, aunque estoy pensando en ampliar el sistema en algunos puntos, ya veremos si sale. De momento eso es todo lo que hay que hacer. Si el script es largo pero sencillo, en realidad.

6. Créditos

Pues siempre se piden créditos por los tiles, minis... Gráficos en general, ¿Pero por qué no por un script? Pues yo no es que quiera para nada los créditos, pero os aguantáis (?), créditos necesarios.