Registrarse

[ASM] Deportivas + bici funcional

Xuuki

holi
Se que existe un tema aqui explicando la rutina de Coolboyman, pero tiene varios detalles que hacen que no quede muy bien que digamos, tales como el poder correr en todos lados y el mas importante, el no poder usar la bici.

Bien pues si quieren ver la rutina original aqui les dejo el link
http://www.pokecommunity.com/showthread.php?t=206689

y aqui la traduccion por parte de @Gallego13
http://whackahack.com/foro/t-15493/gbc-asm-poniendo-zapatillas-deportivas

Cabe aclarar que mi rutina esta basada en la original de coolboyman, pero si ven cualquiera de los 2 links que les puse y la comparan con la mia, notaran la diferencia entre ambas.

Sin mas rodeos comencemos:

Lo primero que haremos es desactivar el contador de de pasos a una mayor velocidad, que aunque no se si afecte o no, es mejor prevenir

Asi que iremos a $97BFA y cambiaremos 21 EC D9 por 21 E4 7B

Lo siguiente es indicar los pointers de las rutinas que usaremos, asi que nos dirigiremos a $10000 y cambiamos CD 17 40 por CD 10 7E

Aqui lo que hacemos es cambiar la direccion a la cual se va a llamar, en este caso ahora va a llamar al offset $13E10

Ahora vamos a $10417 y remplazamos FA 82 D6 FE por CD 39 7E C9

Aunque no lo parezca, ya hemos hecho cambios en las rutinas, osea, hemos aplicado algo de asm, claro, aunque "traducido" a hex

Pero, eso no servira sin las siguientes rutinas, las cuales haran que podamos usar las deportivas al pulsar el boton B y la bici sin ningun problema

Código:
$13e10:
[I]call $4017[/I] -- llama al offset $10017, es el offset que originalmente era llamado en el offset $10000

[I]ld a,(D682) -- [/I]carga en "a" el contenido de la RAM ubicada en [B]$D682[/B], el cual determina el tipo de "movimiento" en el que se encuentre el personaje

[I]cp a,04 --[/I] lo compara con 04, que es el valor de cuando surfeamos

[I]jr z,$1E --[/I] si la comparacion anterior es cierta, saltamos "1E" bytes (fin de la rutina)

[I]cp a,01 -- [/I]si la comparacion anterior es falsa, ahora lo compara con 01, que es el valor de cuando montamos la bici

[I]jr z,$1A -- [/I]si la comparacion anterior es verdadera, saltamos "1A" bytes (fin de la rutina)[I]

call $2D63 -- [/I]si no es ninguno de los valores anteriores, hacemos una llamada al offset [B]$2D63[/B], en este offset hay una rutina que comprueba los "permisos" del mapa, osea que comprueba si podemos usar la bici o no (lo mismo pasa con vuelo y por ende, pasara lo mismo con las deportivas)

[I]cp a,04 -- [/I]lo compara con 04, el cual corresponde a cuando estamos en una cueva
[I]
jr z,$09 --[/I] si la comparacion anterior es verdadera, saltamos "09" bytes
[I]
cp a,06[/I] [I]-- [/I]lo compara con 06, el cual corresponde a cuando estamos en una caseta/portal (la que sirve de separacion entre un mapa y una ruta)
[I]
jr z,$05 --[/I] si la comparacion anterior es verdadera, saltamos "05" bytes[I]

call $23CD -- [/I]si no es alguno de los valores anteriores, hacemos una llamada al offset [B]$23CD[/B], en este offset hay una rutina que comprueba los permisos exteriores, con lo cual se incluye las ciudades/pueblos y las rutas
[I]
jr nz,$0A -- [/I]si no es cualquiera de los anteriores, saltamos "0A" bytes (fin de la rutina), en otras palabras esta comprobaciones haran que no podamos usar las deportivas en interiores a excepcion de cuevas y casetas
[I]
ld de,CF29 --[/I] carga en "de" el contenido de la RAM ubicado en [B]$CF29[/B], el cual determina cual boton esta pulsado
[I]
ld a,(de) -- [/I]carga el contenido de "de" en "a"
[I]
and 02 -- [/I]verifica que solo sea 02,que corresponde al boton B
[I]
ld de,D682 -- [/I]carga nuevamente [B]$D682[/B] en "de"
[I]
ld (de),a -- [/I]carga "a" en "de"
[I]
ret[/I] -- fin de la rutina
para facilitar la tarea, copiar todo eso e insertar en $13E10
Código:
CD 17 40 FA 82 D6 FE 04 28 1E FE 01 28 1A CD 63 2D FE 04 28 09 FE 06 28 05 CD CD 23 20 0A 11 29 CF 1A E6 02 11 82 D6 12 C9
Comparandola con la rutina de Collboyman, podria decir que ya esta terminado, pero si la probamos en un rom obtendremos un bonito bug que hara que se nos "crashe" el juego, esto se puede solucionar regresando los valores ubicados en $10417 a a su valor inicial, pero esto conlleva a otro bug un tanto menor (comparado con el crasheo del juego seria minimo), el bug es que cuando entramos a una zona con hielo, no nos deslizaremos como pasa normalmente, es por eso que se cambian los valores y se incluye una nueva rutina

Código:
$13E39
[I]ld a,(D682) -- [/I]cargamos el contenido de la RAM ubicada en [B]$D682[/B], en "a", como se menciono antes, aquie es donde se ubica el "movimiento2 del personaje (normal, bici, surf)
[I]
cp a,02 -- [/I]comprueba si es 02, que corresponde a "deslizarse" en el hielo
[I]
jr nz,$02 -- [/I]si no es 02, salta 02 bytes [I]

and a --  [/I]si es 02, verifica "a"? (no entiendo bien este comando XD)
[I]
ret -- [/I]fin de la rutina[I]

ld a,(CF32)[/I] -- carga en "a" el contenido de la RAM ubicado en [B]$CF32[/B], el cual determina la accion del tile en el que nos encontramos
[I]
cp a,23 -- [/I]lo compara con 23, el cual corresponde al hielo
[I]
jr z,$02 -- [/I]si lo anterior es cierto, saltamos 02 bytes
[I]
and a[/I] -- si no es 02, verifica "a"? (creo que ya lo dije)[I]
ret [/I][I][I]-- [/I]fin de la rutina
scf -- [/I]"set flag carry", con esto nos deslizaremos si estamos en el hielo
[I]
ret[/I] [I] -- [/I]fin de la rutina
En hex igualmente, onsertar en $13E39
Código:
FA 82 D6 FE 02 20 02 A7 C9 FA 32 CF FE 23 28 02 A7 C9 37 C9
Ahora si, ya esta la rutina funcional y sin bug (creo)

bueno, hay un bug casi insignificante, que es al momento de mantener presionado "B" y la tecla de direccion hacia una pared o algo en lo que no podamos avanzar, el mini no muestra animacion(se queda estatico), pero eso no implica que no podamos movernos

Otra cosa, si se tiene aplicado el parche de seleccion de generos, ir al offset $17FFC (aproximadamente, ya que yo lo tengo ahi, pero creo que @chamber lo cambio)y buscar 00 5E 01 58 04 53 08 34 FF y remplazar 08 34 por 02 5E

Ahora si, eso es todo
creditos a Koolboyman por su rutina original, a @Gallego13 por traerla aqui y a @chamber por facilitarme los offsets que comprueban los permisos de los mapas
 

Aguiar

Colega de los colegas
Miembro del equipo
Staff
Respuesta: [GBC][ASM]Deportivas mas Bici funcional

En mi vida toqué GBC y dudo que lo haga, pero si es el caso esto va a ayudar mucho.
Gracias por la currada que os metisteis!
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: [GBC][ASM]Deportivas mas Bici funcional

Al final todo fue mas sencillo Javcdark.

Mirando en desensamble de crystal y gracias a un chico de Skeetendo veo que lo que define la velocidad del sprite esta en la rutina TryStep y lo unico que hay que intervenir es que la opcion de "caminar" para que compruebe si se esta pulsando B, de ser asi, aplica la velocidad de la bici, de este modo en apariencia no ocurre ningun bug y no se tiene que modificar ninguna otra rutina extra. A continuacion te dejo la rutina original donde se inserta nuestro parche:

Código:
TryStep: ; $1016B

; Surfing actually calls TrySurfStep directly instead of passing through here.
	ld a, [PlayerState]
	cp PLAYER_SURF
	jr z, TrySurfStep
	cp PLAYER_SURF_PIKA
	jr z, TrySurfStep

	call CheckLandPermissions
	jr c, .asm_801be

	call IsNPCInFront
	and a
	jr z, .asm_801be
	cp 2
	jr z, .asm_801be

	ld a, [StandingTile]
	call CheckIceTile
	jr nc, .ice

; Downhill riding is slower when not moving down.
	call CheckRiding
	jr nz, .asm_801ae

	ld hl, BikeFlags
	bit 2, [hl] ; downhill
	jr z, .fast

	ld a, [WalkingDirection]
	cp DOWN
	jr z, .fast

	ld a, STEP_WALK
	call DoStep
	scf
	ret

.fast
	ld a, STEP_BIKE
	call DoStep
	scf
	ret

.asm_801ae
	ld a, STEP_WALK-----------$101AE ; Aqui va el parche
	call DoStep
	scf
	ret

.ice
	ld a, STEP_ICE
	call DoStep
	scf
	ret

; unused?
	xor a
	ret

.asm_801be
	xor a
	ret
Esta es mi version de la rutina:

Código:
$101AE
call @extension
scf
ret


org 04:7E03//$13E03
@extension

call $2D63//GetMapPermission
cp a,04//Cave
jr z,@siguiente
cp a,06//Indoor
jr z,@siguiente

call $23CD//CheckOutdoorMap
jr nz,@Walk

@siguiente
ld a,[$CF29]//let's game know, that you're pushing "B"
bit 2,a
and a,$02
jr z,@Walk

ld a,$02//STEP_BIKE ; run
call $425F//DoStep
ret

@Walk
ld a,$01//STEP_WALK
call $425F//DoStep
ret
 
Última edición:

Xuuki

holi
Respuesta: [GBC][ASM]Deportivas mas Bici funcional

cosas de la vida, la vi esta mañana cuando iba a postearla en skeetendo, do todas formas ambas son funcionales :)
 

H.B.P

Emperador Kaktiácero
Miembro de honor
Respuesta: GBC | ASM | Deportivas + bici funcional

Me parece increible que hayan tan pocos comentarios en este tema, este aporte se pide a gritos desde hace milenios, pues todos sabemos lo lento que resulta todo en los juegos Pokémon de GBC, así que te doy mi más sincero agradecimiento. Eso sí, @aerdna chan, tengo una pequeña pregunta que hacerte y espero que no sea demasiado desafortunada, ¿sería posible modular la velocidad a la que se desplaza el jugador cuando usa las deportivas? Nunca me quedó del todo claro si estamos limitados a ciertos límites de velocidad o si, por el contrario, podemos aplicar el grado que queramos.
 

Noctul~

Usuario de Platino
Respuesta: GBC | ASM | Deportivas + bici funcional

Que buen aporte has traido, sirve mucho para los que usen GBC ya que de esta forma avanzaran mas rapido, muchas gracias @aerdna chan
 

Fran

Profesional de WaH
Que aportazo! No?
Nunca me imagine esto ;)
Quiza no es nada nuevo, pero mola un monton tener esro en GBC!
Saludos!
 

Axel

Leyenda de WaH
Respuesta: GBC | ASM | Deportivas + bici funcional

¡Impresionante! No conocía la existencia de este tutorial, sin duda un gran recurso. Esto seguro que nos evita algunos dolores de cabeza. ¡Muchas gracias!​
 

Asmodeo Leviatan

¿La Iglesia inventó el Infierno? O es lo contrario
Respuesta: GBC | ASM | Deportivas + bici funcional

No toco GBC pero esto se ve bien, es largo XD pero si algun dia utilizo GBC esto bendria de pelos!
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: GBC | ASM | Deportivas + bici funcional

No toco GBC pero esto se ve bien, es largo XD pero si algun dia utilizo GBC esto bendria de pelos!
Considerando que hoy en dia los ROM Hackers de los juegos de Gen. 1 y 2 utilizan los proyectos de desensamblaje Pokered y Pokecrystal unicamente, dudo que esto siga siendo de utilidad a dia de hoy, a menos de que esta rutina funcione con ellos tambien.
 

Asmodeo Leviatan

¿La Iglesia inventó el Infierno? O es lo contrario
Respuesta: GBC | ASM | Deportivas + bici funcional

Considerando que hoy en dia los ROM Hackers de los juegos de Gen. 1 y 2 utilizan los proyectos de desensamblaje Pokered y Pokecrystal unicamente, dudo que esto siga siendo de utilidad a dia de hoy, a menos de que esta rutina funcione con ellos tambien.


mmmm... pues como no utilizo GBC no se cuales son las room bases para hakear dicho sistema... ademas que tendria que aprender desde el principio :)
 
Arriba