Registrarse

[ASM] FR | Ejecutar Script Cada x Segundos

MetalKaktus

A la luz del quinto día, mira al este
Miembro insignia
Hice un post hace poco de como conseguir ejecutar un script cada período de tiempo que queramos. Aunque para alguien que quiera aprender a fondo como funcionaba el sistema, aparte de tener ciertos errores, el tutorial era demasiado complejo.

Como la unidad de tiempo más práctica me parece el segundo he decidido dejar unas instrucciones claras de como implementar este sistema a una ROM de Fire Red.

Por lo tanto, el objetivo será ejecutar un script cada una cantidad de tiempo que queramos.

Código:
.text
.align 2
.thumb

main:
	push	{r0-r2}
	ldrh	r0, system_var
	ldr	r1, var_finder
	push	{r1}
	bl	linker
	pop	{r1}
	ldrh	r0, [r0]
	cmp	r0, #1
	bne	noCrash
	ldrh	r0, time_var
	bl	linker
	ldrh	r1, [r0]
	cmp	r1, #0
	bne	dec_time
	mov	r1, #(periodo que queramos, max 255)
	strh	r1, [r0]
	ldr 	r0, =(0x08[offset del script])
	bl 	script_routine
	b	noCrash

script_routine:
	ldr	r1, =(0x08069AE4 +1)
	bx	r1	

dec_time:
	sub	r1, #1
	strh	r1, [r0]
	b	noCrash

linker:
	bx	r1

noCrash:
	pop	{r0-r2}
	ldr     r1, [r2]
	add	r1, #0x11
	ldrb    r0, [r1]
	cmp     r0, #59
	bls     no_minute
	ldr	r0, =(0x0805489C +1)
	bx	r0

no_minute:
	ldr	r0, =(0x080548C4 +1)
	bx	r0

.align 2
	system_var:	.word 0x(ID del var para activar o desactivar el sistema)
	time_var:	.word 0x(variable pra contar el tiempo)
	var_finder:	.word (0x0806E454 +1)

En el offset 0x54894 pegad
Código:
00 49 08 47 XX XX XX 08
Donde XX XX XX es el offset +1 permutado de esta rutina:

Código:
07 B4 12 48 13 49 02 B4 00 F0 15 F8 02 BC 00 88 01 28 11 D1 0E 48 00 F0 0E F8 01 88 00 29 07 D1 XX 21 01 80 0C 48 00 F0 01 F8 05 E0 0B 49 08 47 01 39 01 80 00 E0 08 47 07 BC 11 68 11 31 08 78 3B 28 01 D9 06 48 00 47 06 48 00 47 YY YY 00 00 FE 40 00 00 55 E4 06 08 QQ QQ QQ 08 E5 9A 06 08 9D 48 05 08 C5 48 05 08
XX: La cantidad de segundos que queremos que sean el periodo menos un segundo (en hex claro)

YY YY: variable permutada que servirá para activar el sistema, para activarlo setear la var a 1, para desactivarlo sirve cualquier otro valor, aunque por habito, poned un 0.

ZZ ZZ: variable para llevar la cuenta del tiempo, usad una var para esto y después de activar el sistema no toquéis esta variable. Mientras el sistema este desactivado esta var podéis usarla para otra cosa. Si vais a activar el sistema haced un backup de su contenido.

QQ QQ QQ: offset permutado (NO sumar 1) del script que queramos ejecutar

El script para activar el sistema debe tener esta estructura:

Código:
#dynamic 0x800000
#org @start
setvar 0x(var para activar sistema) 1
setvar 0x(var de la cuenta del tiempo) (cantidad de periodo -1)
...
Y para desactivarlo:

Código:
#dynamic 0x800000
#org @start
setvar 0x(var para activar sistema) 0
...
Esto es todo, si queréis poder ejecutar mas de un script con este sistema simplemente usad el script al que llama la rutina como un switch case.

Byee
 
Última edición:

GaboExtreme

El Ayudante Infinito
Respuesta: [FR][ASM] Ejecutar Script Cada x Segundos

Excelente deverdad es algo que necesitaremos muchos de nosotros excitante aporte
 

IIWolfgangII

Usuario de oro
¡¡¡GENIAL!!! Realmente debo decirte que esto abre un centenar de posibilidades a que el Juego sea mas Dinámico, solo abra que probar y sacarle todo el jugo. MUCHAS GRACIAS POR EL TUTO
 

MetalKaktus

A la luz del quinto día, mira al este
Miembro insignia
Vuelvo a postear en este tema porque acabo de editarlo. Me parecía que la rutina que ejecutaba los scripts se podía mejorar para que dependiendo del valor de una variable vaya a ejecutar un script u otro, de esta forma usando esta unica rutina para toda la cantidad de scripts que queramos.

En el post principal queda mejor explicado.
 

MetalKaktus

A la luz del quinto día, mira al este
Miembro insignia
Vale, se que me repito un poco pero he vuelto a editar la rutina y ahora es mas sencilla, esta vez es la definitiva.
 

Nachoius

Caminante del cielo
genial bro, esto abre camino para muchas ideas y eventos temporales como el tanque de oxigeno cuando buceas! mis 10
 
Arriba