Registrarse

[Rutina] [fr] modificar la experiencia ganada usando 2 vars de script

BluRose

chiste, chiste
no hay mucho que decir, solo hay una rutina

PD: este gif que muestra los resultos


Código:
/* Poner 00 48 00 47 XX+1 XX XX 08 a 0x21C38 */
.text
.align 2
.thumb
.thumb_func

EditarExperiencia:
    push {r1}
    ldr r0, .VarDenominador        /* Puedes cambiarlo al fondo */
    mov r3, pc
    add r3, #7
    mov lr, r3
    ldr r3, .VarGet
    bx r3
    cmp r0, #0
    beq _dontdividebyzero
_continue:
    push {r0}
    ldr r0, .VarNumerador
    mov r3, pc
    add r3, #7
    mov lr, r3
    ldr r3, .VarGet
    bx r3
_terminar:
    pop {r1-r2}
    mul r0, r2
    mov r3, pc
    add r3, #7
    mov lr, r3
    ldr r3, .Dividir
    bx r3
    ldr r2, .Volver
    bx r2

_dontdividebyzero:
    mov r0, #1
    b _continue

.align 2


.Volver:
    .word 0x08021C40 | 1
.VarNumerador:
    .word 0x40XX /* cambia esto */
.VarDenominador:
    .word 0x40XX /* cambia esto */
.VarGet:
    .word 0x0806E568 | 1
.Dividir:
    .word 0x081E4018 | 1

tengo un pastebin aquí con la rutina:

y eso debe ser todo. escoge dos vars, un para el numerador y otro para el denominador de la fracción por cual quieres multiplicar la experiencia. yo podría hacer otra rutina que pararía la gana de experiencia cuando el numerador es 0, pero al momento es todo que tengo para todos ustedes (ahora ganaría 1 punto de experiencia si los dos vars son 0)

yo recomiendo que tus numeros sean grandes
por ejemplo, no uses como 3 y 5 para numerador/denominador (si te gustaría 60% de la experiencia)
usa 60 y 100 y el juego daría valores más precisos

por dar un ejemplo, si tu pokemon fuera a ganar 18 puntos de exp y tu var numerador era 100 y tu var denominador era 50, tu pokemon ganaría 18 * 100 / 50 = 36 puntos

hay un bug interesante si permite que los pokemon ganen mas de alrededor de 56,000 exp. así ten cuidado por esto cuando lo usas

dime si hay problemas ajaja
que tengan buenos días
 
Última edición:

KERBEROS

Usuario de Platino
No hay comentarios?
es un buen sistema, me gusta que use variabe, pero, es compatible con variables de 5000 a 5fff?
 

BluRose

chiste, chiste
No hay comentarios?
es un buen sistema, me gusta que use variabe, pero, es compatible con variables de 5000 a 5fff?
si has implementado algun sistema de variables expandidos, debe estar bien
sin cambios los variables que se puede usar son algo como 0x4011-0x40FF pero sé que existen rutinas que cambia eso
 

Fran Agustín

Si el sol besa tus ojos, ni cuenta te das.
Miembro insignia
Buenas Blu, ¡qué gran aporte!
Es una rutina sencilla pero creo que puede dar mucho juego, ¡me encanta! Siempre es un placer ver aportes útiles por el foro.
Creo que el código en sí está bien organizado y se entiende.

Hay algunas cosas que has hecho distinto a la mayoría de rutinas que hay publicadas por el foro. No me malinterpretes, no es algo malo, pero lo explicaré brevemente en este comentario por si hay algún usuario despistado que no lo haya entendido.

Ejecutar una subrutina y regresar
Habitualmente, en las rutinas que hay por WaH lo vemos así:
Código:
    ldr rX, .offsetALaSubrutina
    bl linker
    (aquí el código que se ejecutará al regresar)

linker:
    bx rX
Se carga el offset y se usa la instrucción bl para regresar luego. Obviamente es el bx rX el que llama a la subrutina pero lo hemos separado en una etiqueta aparte (linker) para poder usar bl y así luego continuará ejecutándose en la instrucción siguiente.

Tú lo has hecho así:
Código:
    mov rX, pc
    add rX, #7
    mov lr, rX
    ldr rX, .offsetALaSubrutina
    bx rX
Es muy interesante verlo de esta forma pues es en extremo ilustrativa:
  1. mov rX, pc: Cargamos en nuestro registro X el valor del program counter (pc) que es la próxima instrucción a ejecutar.
  2. add rX, #7: Le sumamos la cantidad de bytes que ocupan los comandos siguientes, así el valor que tendrá rX es el offset al que queremos regresar luego de la subrutina.
  3. mov lr, rX: Y aquí asignamos ese offset al link register (lr), el registro que contiene precisamente el offset al cual regresar luego. Si recuerdo bien, al usar bl, también guardas el offset en el lr.
  4. El resto del código es igual: cargo el offset al que quiero ir y me dirijo allí con bx.
Te pregunto para salir un poco de mi ignorancia: ¿hay algún motivo en especial por el que lo hayas hecho así?


Ejecutar una subrutina en modo THUMB
Tanto al llamar a una subrutina desde nuestro código ASM como al usar el comando de scripting callasm, acostumbramos a "sumarle 1" al offset para indicarle al procesador que debe usar el set de instrucciones THUMB.
Si no me equivoco, el objetivo es que el último bit tengo como valor 1.

En las rutinas que hay por aquí, usualmente lo vemos así:
Código:
offsetALaSubrutina:
     .word 0xXXXXXXXX + 1
O también así:
Código:
    ldr rX, =(0xXXXXXXXX+1)
Tú lo has hecho así:
Código:
Volver:
    .word 0x08021C40 | 1
Es decir, usando la operación lógica OR en lugar de directamente sumar 1. El resultado final, obviamente es el mismo (ver disyunción lógica ante dudas).


En fin, eso es todo, no quiero extenderme demasiado. Espero haber sido lo suficientemente claro. ¡Un saludo!
 

BluRose

chiste, chiste
- snip -
Buenas Blu, ¡qué gran aporte!
Es una rutina sencilla pero creo que puede dar mucho juego, ¡me encanta! Siempre es un placer ver aportes útiles por el foro.
Creo que el código en sí está bien organizado y se entiende.

Hay algunas cosas que has hecho distinto a la mayoría de rutinas que hay publicadas por el foro. No me malinterpretes, no es algo malo, pero lo explicaré brevemente en este comentario por si hay algún usuario despistado que no lo haya entendido.

Ejecutar una subrutina y regresar
Habitualmente, en las rutinas que hay por WaH lo vemos así:
Código:
    ldr rX, .offsetALaSubrutina
    bl linker
    (aquí el código que se ejecutará al regresar)

linker:
    bx rX
Se carga el offset y se usa la instrucción bl para regresar luego. Obviamente es el bx rX el que llama a la subrutina pero lo hemos separado en una etiqueta aparte (linker) para poder usar bl y así luego continuará ejecutándose en la instrucción siguiente.

Tú lo has hecho así:
Código:
    mov rX, pc
    add rX, #7
    mov lr, rX
    ldr rX, .offsetALaSubrutina
    bx rX
Es muy interesante verlo de esta forma pues es en extremo ilustrativa:
  1. mov rX, pc: Cargamos en nuestro registro X el valor del program counter (pc) que es la próxima instrucción a ejecutar.
  2. add rX, #7: Le sumamos la cantidad de bytes que ocupan los comandos siguientes, así el valor que tendrá rX es el offset al que queremos regresar luego de la subrutina.
  3. mov lr, rX: Y aquí asignamos ese offset al link register (lr), el registro que contiene precisamente el offset al cual regresar luego. Si recuerdo bien, al usar bl, también guardas el offset en el lr.
  4. El resto del código es igual: cargo el offset al que quiero ir y me dirijo allí con bx.
Te pregunto para salir un poco de mi ignorancia: ¿hay algún motivo en especial por el que lo hayas hecho así?


Ejecutar una subrutina en modo THUMB
Tanto al llamar a una subrutina desde nuestro código ASM como al usar el comando de scripting callasm, acostumbramos a "sumarle 1" al offset para indicarle al procesador que debe usar el set de instrucciones THUMB.
Si no me equivoco, el objetivo es que el último bit tengo como valor 1.

En las rutinas que hay por aquí, usualmente lo vemos así:
Código:
offsetALaSubrutina:
     .word 0xXXXXXXXX + 1
O también así:
Código:
    ldr rX, =(0xXXXXXXXX+1)
Tú lo has hecho así:
Código:
Volver:
    .word 0x08021C40 | 1
Es decir, usando la operación lógica OR en lugar de directamente sumar 1. El resultado final, obviamente es el mismo (ver disyunción lógica ante dudas).


En fin, eso es todo, no quiero extenderme demasiado. Espero haber sido lo suficientemente claro. ¡Un saludo!
sólo decidí hacerlo así al momento. no tenía ningún motivo o algo así. sería mejor hacerlo con la manera que se hace porque usa menos bytes y probablemente ciclos también

pero gracias por responder ajaja

PD: una cosa con cual no estoy de acuerdo es el uso de
Código:
ldr rX, =(0xXXXXXXXX+1)
al menos se debe etiquetar 0xXXXXXXXX+1 y hacer algo así:
Código:
ldr rX, GetVarValue
bx rX

.align 2

GetVarValue:
    .word 0x0806E569
o aun
Código:
.equ GetVarValue, 0x0806E569

. . .

ldr rX, =(GetVarValue)
bx rX
esto para que se puede leer las rutinas más facilmente
 
Última edición:

GlomiBabel

Usuario de platino
hola yo necesito un sistema de obtener experiencia tipo parábola porque he oido que en niveles superiores la obtención de exp se ralentiza y seria un problema para mi hack rom ya que los niveles de entrenadores y gyms aumentan hasta el 90 en la liga. De hecho también tengo que resolver el problema de obediencia de los pokes. Dicho esto no se que son los vars, ni se donde tengo que copiar y pegar ese codigo.
 

Jaizu

Usuario mítico
hola yo necesito un sistema de obtener experiencia tipo parábola porque he oido que en niveles superiores la obtención de exp se ralentiza y seria un problema para mi hack rom ya que los niveles de entrenadores y gyms aumentan hasta el 90 en la liga. De hecho también tengo que resolver el problema de obediencia de los pokes. Dicho esto no se que son los vars, ni se donde tengo que copiar y pegar ese codigo.
Si no sabes ni lo que es una variable deberías olvidarte de las rutinas y de intentar hacer código propio y empezar por lo básico
 

GlomiBabel

Usuario de platino
Si no sabes ni lo que es una variable deberías olvidarte de las rutinas y de intentar hacer código propio y empezar por lo básico
hola, el hack rom ya está terminado, solo necesito modificar la curva de experiencia en niveles altos. Lo de hacer código propio y empezar por lo básico no entiendo a que te refieres, ya que no necesito hacer nada mas en el juego, solo quedaba por pulir el tema de la experiencia pero si no puedo lo dejo estar.
Mas que nada porque puedo estar malinterpretandote ya que leo muchos videotutoriales que quieren enseñar 50 cosas y lo mismo necesito algo muy concreto y nada más, por eso lo digo. Lo de aprender siempre está bien, pero aprender a hacer 50 cosas que no voy a necesitar no lo veo.
Sobre el tema de la experiencia si crees que es muy dificil para un novato está bien, olvidado está. De todas formas he leído que hay unas tablas de experiencia por niveles que modificandolas se puede modificar la cantidad de experiencia para subir de nivel. El tipo dice literalmente que es un camino facil pero no lo se.
Lo encontré en este foro y no se que tan dificil será.
aqui https://www.pokecommunity.com/threads/is-there-a-way-to-change-experience-curve.365026/
un tal dizzy egg dice: less easy and less tedious way: change exp needed for levels. There are 6 or 7 tables that have required exp for each level(starting from 0 to 99) for each of the experience group. That'd be tedious as well but I guess funnier, coz you can require like 3 millions exp. points to get to lvl 100.

Un saludo
 
Arriba