Registrarse

[ASM] FR | Expandiendo la cantidad de objetos en la Mochila

Lunos

Enfrentando a La Organización
EDITO:
Este tema está un tanto desactualizado. Para una versión mas reciente de las mismas rutinas presentadas aquí, por favor revisen el post de @(G)old haciendo click aquí.

Post Original:

Holi.
Hoy aprenderemos a modificar la cantidad maxima de objetos permitidos en los bolsillos de nuestra mochila.
Antes de comenzar toca dar los creditos, que hoy se van para Skeli por haber compartido su rutina conmigo en Discord.
Sin mas que decir, empecemos.

Requisitos:
-ROM de Pokémon Fire Red v1.0 USA.
-Editor Hexadecimal (como siempre, yo usaré HxD)
-Algun script que nos entregue muchos objetos para comprobar que todo funcione bien.
-Compilador de HackMew
-Saveblock Hack de JPAN (¡OBLIGATORIO!)

Advertencia:
Tras hacer una expansión a la mochila, toda partida guardada quedará inutilizada.
Estarán forzados a empezar una nueva, si o tambien.


Instrucciones:

1) Abrimos nuestra ROM en nuestro editor hexadecimal e insertamos esta rutina compilada en el offset 1083F4:
10 B5 08 4C F1 20 A0 30 C0 00 FA F6 CD FB 20 60 00 28 06 D0 04 48 FA F6 C7 FB 60 60 00 28 00 D0 01 20 10 BD 18 AD 03 02 E3 11 00 00​
2) Copiamos la siguiente Rutina ASM y la pegamos en un archivo de texto:
.text
.align 2
.thumb
.thumb_func
.global item_pocket_hack

main:
ldr r1, =(0x203988C)
@regular items
ldr r0, ram_FREE_item
str r0, [r1]
mov r0, #0xC8 @400 regular items
lsl r0, r0, #0x1
strh r0, [r1, #0x4]
@key items
ldr r0, ram_FREE_keyitem
str r0, [r1, #0x8]
mov r0, #0x3C @60 key items
strb r0, [r1, #0xC]
@poke balls
ldr r0, ball_ram
str r0, [r1, #0x10]
mov r0, #0x1C @28 balls
strb r0, [r1, #0x14]
@tms
ldr r0, tm_ram
str r0, [r1, #0x18]
mov r0, #0x80 @128 TMs
strb r0, [r1, #0x1C]
@berries
ldr r0, berry_ram
str r0, [r1, #0x20]
add r1, #0x24
mov r0, #0x43 @67 berries
strb r0, [r1]
bx lr

.align 2
tm_ram: .word 0x202583C
berry_ram: .word 0x2025A3C
ram_FREE_keyitem: .word 0x203C7D0
ball_ram: .word 0x203C8C0
ram_FREE_item: .word 0x203C930
Como podran notar, las lineas que resalté son los nuevos limites que tendrán cada bolsillo de la mochila.

El asunto aqui es que las cantidades están divididas entre 2.
Con esta rutina, la cantidad maxima de objetos en el Bolsillo Objetos no son 200/0xC8, en verdad son 400.
¿Por qué? No tengo idea, yo de ASM no entiendo un carajo :p

El tema es que asi funcionan las cosas, y si quieren ajustar las cantidades maximas de cada bolsillo, pues tengan eso en cuenta y ponganse a curiosear.

3) Teniendo nuestra rutina lista la guardaremos con el nombre que queramos y la ponemos en la misma carpeta donde tenemos el compilador de HackMew.

4) Vamos a la carpeta, y hacemos: Shift+Click Derecho > Abrir Ventana de Comandos aqui
En la ventana de comandos escribimos: "thumb (nombre del archivo).txt", presionamos Enter y listo.
Se nos creará un archivo .bin con el mismo nombre que nuestro archivo de texto.
En ese archivo .bin nos vamos a 0x99E44, copiamos lo que hay ahi y lo ponemos en el offset 99E44 de nuestra ROM.

5) Guarden y prueben los cambios.

Dejaré por aqui una versión compilada de la rutina por defecto
Para los que prefieren saltarse los Pasos 2, 3 y 4, y no embolarse mucho.
Los limites son: 400 objetos comunes, 60 objetos clave, 28 poké balls, 128 MTs y 67 bayas.
10 49 0F 48 08 60 C8 20 40 00 88 80 0A 48 88 60 3C 20 08 73 09 48 08 61 1C 20 08 75 04 48 88 61 80 20 08 77 03 48 08 62 24 31 43 20 08 70 70 47 3C 58 02 02 3C 5A 02 02 D0 C7 03 02 C0 C8 03 02 30 C9 03 02 8C 98 03 02​
Aqui una pequeña muestra:


Y eso fue todo.​
 
Última edición:

Annatar

A la luz del quinto día, mira al este
Respuesta: FR | Otros | Expandiendo la cantidad de objetos en la Mochila

Pues es un método muy bueno para agregar nuevos objetos si tener que reemplazar ninguno nuevo. Sabía se podía hacer, pero no tenía ni la menor idea de como. A si que te estoy agradecido por haber traído esto a la comunidad.

¿Podrías poner cual es la rutina del principio sin compilar? Más que nada es para echarle un vistazo y aprender de como está hecho.
 

Lunos

Enfrentando a La Organización
Respuesta: FR | Otros | Expandiendo la cantidad de objetos en la Mochila

Pues es un método muy bueno para agregar nuevos objetos si tener que reemplazar ninguno nuevo. Sabía se podía hacer, pero no tenía ni la menor idea de como. A si que te estoy agradecido por haber traído esto a la comunidad.

¿Podrías poner cual es la rutina del principio sin compilar? Más que nada es para echarle un vistazo y aprender de como está hecho.
 
Respuesta: FR | Otros | Expandiendo la cantidad de objetos en la Mochila

A mi me da un Bug...
No se si tiene algún error o yo lo hice 100% Mal....

Conste use las Rutinas que dejaste por defecto y Fire Red Usa 1.0

Veras hice todo el Tutorial paso por paso, no me salte nada...
Cuando termine con el Asm me dirigí al A.M y XSE. Hice un Script para recibir unos 300 objetos y los recibí sin ningún problema todos estaban en la mochila, guarde la partida y cerré el Emulador. Cuando volví a entrar no había Nada de nada en la Mochila.

Yo creí no haber guardado y hice todo de nuevo y paso lo mismo una y otra vez. Entonces como le Hago? Tengo que modificar la Rutina? Tiene algún error?
Que alguien me Ayude!
 

Lunos

Enfrentando a La Organización
Respuesta: FR | Otros | Expandiendo la cantidad de objetos en la Mochila

A mi me da un Bug...
No se si tiene algún error o yo lo hice 100% Mal....

Conste use las Rutinas que dejaste por defecto y Fire Red Usa 1.0

Veras hice todo el Tutorial paso por paso, no me salte nada...
Cuando termine con el Asm me dirigí al A.M y XSE. Hice un Script para recibir unos 300 objetos y los recibí sin ningún problema todos estaban en la mochila, guarde la partida y cerré el Emulador. Cuando volví a entrar no había Nada de nada en la Mochila.

Yo creí no haber guardado y hice todo de nuevo y paso lo mismo una y otra vez. Entonces como le Hago? Tengo que modificar la Rutina? Tiene algún error?
Que alguien me Ayude!
Pues lo probé todo yo mismo, y tienes razón. El mismo problema me pasa a mi.

Aqui yo he cometido un error, y es que Skeli me anduvo hablando sobre ciertos bugs que encontró y como actualizó las rutinas que presentó en PokeCommunity, y yo como que me olvidé de traer todo eso aqui. Me disculpo, fue totalmente mi error.
Voy a andar re-escribiendo el post principal dentro de un rato, asi que si un Moderator lee esto y quiere cerrar el tema momentaneamente, no hay problema.

De nuevo, mil disculpas. Me aseguraré de tenerlo listo para hoy.


EDITO: Tras analizarlo todo con mas calma, me di cuenta de mi error.
En si todo funciona bien, pero olvidé mencionar que se necesita aplicar el Saveblock Hack de JPAN.
Soy un boludo, tras aplicar el parche y empezar una nueva partida, los objetos se guardan en la mochila correctamente.


Ya edité el post principal.
Una vez mas, me disculpo. Fue mi error totalmente.
 
Última edición:
Respuesta: FR | Otros | Expandiendo la cantidad de objetos en la Mochila

Bueno ahora si que me funciona :D

Y es un gusto el que hayas respondido y resuelto el Problema, no sabes cuanto espere por esto. Ya que es un buen Tutorial y seria un desperdicio el no usarlo. Al fin y al cabo creí que yo lo había hecho mal But resulto que faltaba algo. '^^

Descuida todos cometemos errores. Después de todos somos humanos no?
Lo que importa es que ya esta resuelto y ya no va a dar mas problemas.
Gracias por resolverlo. Fue un placer ayudarte)? xD
Saludos. @Lunos
 
Última edición:

Asmodeo Leviatan

¿La Iglesia inventó el Infierno? O es lo contrario
Respuesta: FR | Otros | Expandiendo la cantidad de objetos en la Mochila

wou! genial!
 

Mysterion.

Average RomHacker
Respuesta: FR | Otros | Expandiendo la cantidad de objetos en la Mochila

Creo que hace falta actualizar la rutina de expansión, que si bien la que posteó Lunos aqui mismo funciona, no está libre de bugs. He aquí la versión actualizada de Skeli. Traduciré el post original:

Expandiendo la Mochila Completamente[FR]

-Gran Edición: Las rutinas han sido reescritas desde 0 para funcionar completamente.

Esto ha sido hecho por partes y partes durante mucho tiempo (Creo que ya fue hecho para Emerald), por lo que Skeli decidió reescribir la rutina.

Pre-Requisitos
  • Rutina JPAN Save Block Recycle
    Código:
    .thumb
    .global JPAN_Save_Block_Recycle
    .equ rom, 0x8000000
    .equ offset, 0xA00000 @YOUR INSERT OFFSET HERE
    
    .org 0xD991E, 0xFF
    	bx r7
    
    .org 0xD995C, 0xFF
    .word Recycle_2 + rom + 1
    
    .org 0xD9EDC, 0xFF
    	ldr r0, .Pointer1
    	bx r0
    .align 2
    .Pointer1: .word Recycle_1 + rom + 1
    
    .org 0x3FEC9A, 0xFF
    .byte 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xE0, 0x1F, 0xF0, 0x0F, 0xD0, 0x2F, 0x98, 0xD, 0x0, 0x0, 0xF0, 0x0F, 0xF0, 0xF, 0xF0, 0xF, 0xE0, 0x1F, 0xF0, 0xF, 0xD0, 0x2F, 0xF0, 0xF, 0xC0, 0x3F, 0xF0, 0xF, 0xB0, 0x4F, 0xF0, 0xF, 0xA0, 0x5F, 0xF0, 0xF, 0x90, 0x6F, 0xF0, 0xF, 0x80, 0x7F, 0x50, 0x4
    
    .org offset, 0xFF
    Recycle_1:
    	ldr r1, [r4]
    	mov r3, #0xFF
    	lsl r3, #0x4
    	add r3, r1
    	ldrh r0, [r3, #0x4]
    	cmp r0, #0x0
    	beq Size1
    	cmp r0, #0x4
    	beq Size2
    	cmp r0, #0xD
    	beq Size3
    
    BigLoop:
    	cmp r5, #0xD
    	ble Return
    	mov r0, #0x1
    	pop {r3}
    	mov r8, r3
    	pop {r4-r7,pc}
    
    Size1:
    	mov r1, #0xCC
    	ldr r2, .Loc1
    	b SmallLoop
    
    Size2:
    	mov r1, #0x96
    	lsl r1, #0x2
    	ldr r2, .Loc2
    	b SmallLoop
    
    Size3:
    	mov r1, #0xBA
    	lsl r1, #0x4
    	ldr r2, .Loc3
    
    SmallLoop:
    	sub r3, #0x4
    	ldr r0, [r3]
    	str r0, [r2]
    	sub r2, #0x4
    	sub r1, #0x4
    	cmp r1, #0x0
    	bne SmallLoop
    	b BigLoop
    
    .align 2
    .Loc1: .word 0x203C1C8
    .Loc2: .word 0x203C420
    .Loc3: .word 0x203CFC0
    
    Return:
    	ldr r0, .Return
    	bx r0
    
    .align 2
    .Return: .word 0x80D9E71
    .word 0xFFFFFFFF
    
    Recycle_2:
    	mov r7, #0xFF
    	lsl r7, #0x4
    	add r7, r1, r7
    	strh r0, [r7, #0x6]
    	ldrh r6, [r7, #0x4]
    	cmp r6, #0x0
    	beq Size1_2
    	cmp r6, #0x4
    	beq Size2_2
    	cmp r6, #0xD
    	beq Size3_2
    	lsl r0, #0x0
    
    Return_2:
    	ldr r0, .Return2
    	bx r0
    
    .align 2
    .Return2: .word 0x80D9923
    
    Size1_2:
    	mov r3, #0xCC
    	ldr r2, .Loc1_2
    	b SmallLoop_2
    
    Size2_2:
    	mov r3, #0x96
    	lsl r3, #0x2
    	ldr r2, .Loc2_2
    	b SmallLoop_2
    
    Size3_2:
    	mov r3, #0xBA
    	lsl r3, #0x4
    	ldr r2, .Loc3_2
    
    SmallLoop_2:
    	sub r7, #0x4
    	ldr r0, [r2]
    	str r0, [r7]
    	sub r2, #0x4
    	sub r3, #0x4
    	cmp r3, #0x0
    	bne SmallLoop_2
    	b Return_2
    
    .align 2
    .Loc1_2: .word 0x203C1C8
    .Loc2_2: .word 0x203C420
    .Loc3_2: .word 0x203CFC0
    Instrucciones de Instalación:
    1. Cambia el .equ offset, 0xA00000por el offset donde insertarás esta rutina.
    2. Compila el código ASM.
    3. Abre el archivo .bin y copia todos los datos en 0xD991E, 0xD995C, 0xD9EDC 0x3FEC9A, y el offset de insercción elegido (el mismo offset acaba donde el archivo termina) hacia los mismos offsets en tu ROM.
  • La rutina del ataque Conversión actualizada:
    En la siguiente rutina, cambia la ubicación de la tabla de ataques al incio del código en caso de ser necesario (SI no has agregado nuevos ataques a tu hack probablemente no lo necesites). Ensambla la rutina, copia los datos del archivo .bin, y luego pega los datos en 0x28604 en tu ROM.

    O si eres un ASManco, copia y pega la versión compilada en 0x28604 en tu ROM:
    Código:
    F0 B5 1B 4F 18 48 19 49 09 78 58 22 51 43 40 18 03 1C 44 7D 85 7D 00 88 12 49 0C 22 50 43 09 18 08 78 A0 42 10 D0 A8 42 0E D0 58 75 98 75 04 1C 10 48 FD 21 01 70 03 21 41 70 84 70 FF 21 C1 70 39 68 05 31 39 60 F0 BD 3A 68 51 78 90 78 00 02 01 43 D0 78 00 04 01 43 10 79 00 06 01 43 39 60 F0 BD C0 46 06 0C 25 08 F0 3B 02 02 6B 3D 02 02 74 3D 02 02 B8 2A 02 02
    (Esta vesión compilada asume que no has insertado ningún nuevo ataque en tu juego)

    Rutina:
    Código:
    .thumb
    .global atk90_changetypestoenemyattacktype
    
    .equ Attack_Data, 0x250C04 @0x900000 para el parche MrDollSteak
    .equ rom, 0x8000000
    
    @Conversion: Insertar en 0x28604
    CheckMove:
    	push {r4-r7, lr}
    	ldr r7, .ScriptLoc
    	ldr r0, .BattleData
    	ldr r1, .UserBank
    	ldrb r1, [r1]
    	mov r2, #0x58
    	mul r1, r2
    	add r0, r1
    	mov r3, r0
    	ldrb r4, [r0, #0x15] @first type
    	ldrb r5, [r0, #0x16] @second type
    	ldrh r0, [r0] @First Move
    
    GetMoveType:
    	ldr r1, .MoveData
    	mov r2, #0xC
    	mul r0, r2
    	add r1, r0
    	ldrb r0, [r1]
    
    CheckTypeMatch:
    	cmp r0, r4
    	beq Failed
    	cmp r0, r5
    	beq Failed
    
    Store:
    	strb r0, [r3, #0x15]
    	strb r0, [r3, #0x16]
    
    Return:
    	mov r4, r0
    	ldr r0, =0x2022AB8
    	mov r1, #0xFD
    	strb r1, [r0]
    	mov r1, #0x3
    	strb r1, [r0, #0x1]
    	strb r4, [r0, #0x2]
    	mov r1, #0xFF
    	strb r1, [r0, #0x3]
    	ldr r1, [r7]
    	add r1, #0x5
    	str r1, [r7]
    	pop {r4-r7, pc}
    
    Failed:
    	ldr r2, [r7]
    	ldrb r1, [r2,#1]
    	ldrb r0, [r2,#2]
    	lsl r0, #8
    	orr r1, r0
    	ldrb r0, [r2,#3]
    	lsl r0, #0x10
    	orr r1, R0
    	ldrb r0, [r2,#4]
    	lsl r0, #0x18
    	orr r1, r0
    	str r1, [r7]
    	pop {r4-r7, pc}
    
    .align 2
    .MoveData: .word Attack_Data + 0x2  + rom
    .BattleData: .word 0x2023BE4 + 0xC
    .UserBank: .word 0x2023D6B
    .ScriptLoc: .word 0x2023D74

    ¿Porqué Conversión?
    Parte del espacio usado para la rutina vieja de Conversión es usado para expandir la mochila. Para liberar ese espacio, Conversión ha sido reescirta para actualizar su efecto al mismo a aprti de la sexta generación.

El código
Código:
.equ Total_Item_Amount, 700       [MENTION=26827]Camb[/MENTION]ia por la cantidad maxima de objetos

.equ Regular_Item_Num, 200       [MENTION=26827]Camb[/MENTION]ia por el numero de items del bosillo principal, dividido entre 2
.equ Key_Item_Num, 30       [MENTION=26827]Camb[/MENTION]ia por el numero de items del bosillo objetos clave, dividido entre 2
.equ Poke_Ball_Num, 14       [MENTION=26827]Camb[/MENTION]ia por el numero de items del bosillo Pokeballs, dividido entre 2
.equ TM_Num, 128       [MENTION=26827]Camb[/MENTION]ia por el numero total de MT y MO
.equ Berry_Num, 67       [MENTION=26827]Camb[/MENTION]ia porel numero total de bayas

@Al cambiar las direcciones de la RAM, asegurate que las mismas no sobreescriban nada.
@Por ejemplo, si quieres cambiar la Poke_Ball_Ram, debe ser cambiada a ua ubicacion
@en donde hayan en total (Poke_Ball_Num * 2 * 4) bytes de memoria libre.
.equ TM_Ram, 0x202583C       [MENTION=26827]Camb[/MENTION]ia por la direccion RAM para Tubo MT/MO
.equ Berry_Ram, 0x2025A3C       [MENTION=26827]Camb[/MENTION]ia por la direccion RAM para Saco Bayas
.equ Key_Item_Ram, 0x203C7D0       [MENTION=26827]Camb[/MENTION]ia por la direccion RAM para Bolsillo Obj Clave
.equ Poke_Ball_Ram, 0x203C8C0       [MENTION=26827]Camb[/MENTION]ia por la direccion RAM para Bolsillo Pokeballs
.equ Item_Ram, 0x203C930       [MENTION=26827]Camb[/MENTION]ia por la direccion RAM para el bolsillo principal

.equ Free_Ram, 0x203D900 @No lo cambies, a menos que no quieras esta ubicacion de RAM
.equ offset, 0x8D1980       [MENTION=26827]Camb[/MENTION]ia por una offset con espacio libre

.equ largest_pocket_size, Regular_Item_Num * 2
.equ largest_pocket_size_plus_one, largest_pocket_size + 1
.equ strings_size, largest_pocket_size_plus_one * 19

.equ rom, 0x8000000

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@HelperRoutine

.org 0x28760, 0xFF
GetItemAmount:
	push {r1,lr}
	ldr r0, .CurrentPocket
	ldrb r0, [r0]
	lsl r0, #0x1
	ldr r1, .ItemStorage
	ldrh r0, [r0, r1]
	pop {r1,pc}

.align 2
.CurrentPocket: .word 0x203AD02
.ItemStorage: .word Free_Ram

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Decryption and DMA Negation
@The first few of these actually decrypt the Pokemon Data because why not?

.org 0x3F906, 0xFF
mov r8, r8
str r0, [r2]
ldr r1, [r3, #0x4]
mov r8, r8

.org 0x3F92A, 0xFF
mov r8, r8
str r0, [r2]
ldr r1, [r3]
mov r8, r8

.org 0x3F94C, 0xFF
mov r0, #0x0
mov r8, r8
mov r8, r8

.org 0x3FDA8, 0xFF
b 0x3FDC2

.org 0x40530, 0xFF
b 0x40550

.org 0x40AE6, 0xFF
mov r8, r8

.org 0x4C062, 0xFF
mov r1, #0x0
mov r1, #0x0

.org 0x4C13C, 0xFF
mov r4, #0x0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

.org 0x6BDEC, 0xFF
	ldr r0, .BerryFix1Ptr
	bx r0
.align 2
.BerryFix1Ptr: .word BerryFix1Ptr + rom + 1

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Removal of Item Limiters

.org 0x98998, 0xFF
.word Total_Item_Amount

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Routines Related to Obtaining Items

.org 0x99DFC, 0xFF
ldrh r0, [r0, #0x4]

.org 0x99E1A, 0xFF
ldrh r4, [r4, #0x4]

.org 0x99E44, 0xFF
ldr r1, .BagPocket0

@Regular items
ldr r0, ram_FREE_item
str r0, [r1]
mov r0, #Regular_Item_Num
lsl r0, #0x1 @400 regular items
strh r0, [r1, #0x4]

@Key items
ldr r0, ram_FREE_keyitem
str r0, [r1, #0x8]
mov r0, #(Key_Item_Num * 2) @60 key items
strh r0, [r1, #0xC]

       [MENTION=41910]poke[/MENTION] balls
ldr r0, ball_ram
str r0, [r1, #0x10]
mov r0, #(Poke_Ball_Num * 2) @28 balls
strh r0, [r1, #0x14]

@Tms
ldr r0, tm_ram
str r0, [r1, #0x18]
mov r0, #TM_Num @128 TMs
strh r0, [r1, #0x1C]

@Berries
ldr r0, berry_ram
str r0, [r1, #0x20]
add r1, #0x24
mov r0, #Berry_Num @67 berries
strh r0, [r1]
bx lr

.align 2
.BagPocket0:		.word 0x203988C
tm_ram:			.word TM_Ram
berry_ram:		.word Berry_Ram
ram_FREE_keyitem:	.word Key_Item_Ram
ball_ram:		.word Poke_Ball_Ram
ram_FREE_item:		.word Item_Ram

.org 0x99ED8, 0xFF
ldrh r1, [r0, #0x4]

.org 0x99EEA, 0xFF
lsl r0, r2, #0x10
lsr r0, r0, #0x10

.org 0x99F16, 0xFF
ldrh r1, [r0, #0x4]

.org 0x99F32, 0xFF
lsl r0, r0, #0x10
lsl r2, r0, #0x10

.org 0x99F6E, 0xFF
ldrh r1, [r0, #0x4]

.org 0x99F9A, 0xFF
lsl r0, r0, #0x10
lsr r2, r0, #0x10
ldrh r0, [r3, #0x4]

.org 0x99FD4, 0xFF
CheckBerryInBagFix:
	ldr r4, .LastResult
	ldr r0, .CheckBerryBerryRam
	ldrh r0, [r0]
	cmp r0, #0x0
	beq NoBerriesInBag
	mov r0, #0x1
	strh r0, [r4]
	pop {r4,pc}

NoBerriesInBag:
	mov r0, #0x0
	strh r0, [r4]
	pop {r4,pc}

.align 2
.CheckBerryBerryRam: .word Berry_Ram
.LastResult: .word 0x020370D0

.org 0x9A02A, 0xFF
ldrh r1, [r0, #0x4]

.org 0x9A05E, 0xFF
lsl r0, r0, #0x10
lsr r2, r0, #0x10
ldrh r0, [r3, #0x4]

.org 0x9A06E, 0xFF
lsl r0, r0, #0x10
lsr r0, r0, #0x10

.org 0x9A0B6, 0xFF
ldrh r1, [r0, #0x4]

.org 0x9A0EA, 0xFF
lsl r0, r0, #0x10
lsr r2, r0, #0x10
ldrh r0, [r5, #0x4]

.org 0x9A110, 0xFF
lsl r0, r0, #0x10
lsr r1, r0, #0x10

.org 0x9A14C, 0xFF
lsl r0, r0, #0x10
lsr r1, r0, #0x10

.org 0x9A186, 0xFF
lsl r0, r0, #0x10
lsr r2, r0, #0x10

.org 0x9A204, 0xFF
ldrh r1, [r0, #0x4]

.org 0x9A24E, 0xFF
lsl r0, r0, #0x10
lsr r2, r0, #0x10
ldrh r0, [r6, #0x4]

.org 0x9A2E8, 0xFF
ldrh r1, [r1, #0x4]

.org 0x9A58E, 0xFF       [MENTION=26725]Shift[/MENTION]ing Items Up
lsl r1, #0x10
lsr r1, #0x10

.org 0x09A8A4, 0xFF
	lsl r0, #0x10
	lsr r0, #0x10
	ldr r1, .ItemLimit
	cmp r1, r0
	bge Return
	mov r0, #0x0
Return:
	bx lr

.align 2
.ItemLimit: .word Total_Item_Amount

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Routines Related to the Pokedex

@The original ram provided above for the berries overrites a copy of the Pokedex data.
@Thus, when the Berry Pouch is sorted upon opening it, garbage data from this dex
@data is loaded. These routines prevent this copy from being read from or written to.

BerryPokedexDataFix:
.org 0x104B34, 0xFF
b 0x104B56

.org 0x104B78, 0xFF
b 0x104BB0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Routines Related to Viewing Items in Bag

Bag_Allocate_Stuff: @Credits to azurile13
.org 0x1083F4, 0xFF
	push {r4,lr}
	ldr r4, .AllocationPointer
	ldr r0, .LargestSize
	lsl r0, #0x3
	bl 0x2B9C @malloc
	str r0, [r4]
	cmp r0, #0x0
	beq No
	ldr r0, .strings_size
	bl 0x2B9C @malloc
	str r0, [r4, #0x4]
	cmp r0, #0x0
	beq No
	mov r0, #0x1
	b End

No:
	mov r0, #0x0

End:
	pop {r4,pc}

.align 2
.LargestSize: .word largest_pocket_size_plus_one
.AllocationPointer: .word 0x0203AD18
.strings_size: .word strings_size

.org 0x108440, 0xFF
bl 0x28760 @GetItemAmount
b 0x10844A

.org 0x10847E, 0xFF @Shop is dis one
bl 0x28760 @GetItemAmount
b 0x108488

.org 0x1084C2, 0xFF
bl 0x28760 @GetItemAmount
b 0x1084CA

.org 0x1085D8, 0xFF
push {r1}
bl 0x28760 @GetItemAmount
pop {r1}
cmp r0, r5

.org 0x108698, 0xFF
ldr r5, .Thing
ldrh r1, [r5, #0x6]
push {r1}
bl 0x28760 @GetItemAmount
pop {r1}
.hword 0x0
cmp r0, r4

.org 0x10871C, 0xFF
.Thing: .word 0x203ACFC

.org 0x10881E, 0xFF
ldr r1, .Thing2
ldrh r1, [r1, #0x6]
push {r1}
bl 0x28760 @GetItemAmount
pop {r1}
.hword 0x0
cmp r2, r0

.org 0x108850, 0xFF
.Thing2: .word 0x203ACFC

.org 0x108894, 0xFF
push {r1}
bl 0x28760 @GetItemAmount
pop {r1}
add r1, #0xD

.org 0x108A1C, 0xFF @Up Cursor Bug 1
ldr r1, .OpenBagBugFix1Pointer
bx r1
.align 2
.OpenBagBugFix1Pointer: .word OpenBagBugFix1 + rom + 1

.org 0x108A40, 0xFF @Up Cursor Bug 2
ldr r0, .OpenBagBugFix2Pointer
bx r0
.align 2
.OpenBagBugFix2Pointer: .word OpenBagBugFix2 + rom + 1
.hword 0x0

.org 0x108AC0, 0xFF @Up Cursor Bug 3
ldr r0, .OpenBagBugFix3Pointer
bx r0
.align 2
.OpenBagBugFix3Pointer: .word OpenBagBugFix3 + rom + 1

.org 0x108DC8, 0xFF
ldr r1, .StoreItemPointer
bx r1
.align 2
.StoreItemPointer: .word StoreItem + rom + 1

ldr r0, .Bag_Pocket_0_2
add r4, r1, r0
ldr r0, [r4]
ldrh r1, [r4, #0x4]

.org 0x108DEA, 0xFF
ldrh r0, [r4, #0x4]

.org 0x108E0A, 0xFF
ldrh r0, [r4, #0x4]

.org 0x108E20, 0xFF
ldr r0, .GetSmallestItemAmountPointer
bx r0
.align 2
.GetSmallestItemAmountPointer: .word GetSmallestItemAmount + rom + 1

.org 0x108E3C, 0xFF
.Bag_Pocket_0_2: .word 0x203988C

.org 0x108E4C, 0xFF
pop {r4-r6,pc}

.org 0x108FB6, 0xFF
ldrh r5, [r5, #0x6]
push {r1}
bl 0x28760 @GetItemAmount
pop {r1}
.hword 0x0
cmp r1, r0

.org 0x10904A, 0xFF
	ldrh r1, [r5, #0x6]
	push {r1}
	bl 0x28760 @GetItemAmount
	pop {r1}
	.hword 0x0
	cmp r4, r0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@       [MENTION=41910]poke[/MENTION] Dude Stuff

.org 0x10ADDE, 0xFF
	ldr r0, .PokeDudeBackupRegularBagFixPtr
	bx r0
.align 2
.PokeDudeBackupRegularBagFixPtr: .word PokeDudeBackupRegularBagFix + rom + 1

.org 0x10AE78, 0xFF
	ldr r0, .PokeDudeBackupRegularBagClearPtr
	bx r0
.align 2
.PokeDudeBackupRegularBagClearPtr: .word PokeDudeBackupRegularBagClear + rom + 1

.org 0x10AEDA, 0xFF
	ldr r0, .PokeDudeBackupBagRestorePtr
	bx r0
.align 2
.PokeDudeBackupBagRestorePtr: .word PokeDudeBackupBagRestore + rom + 1

.org 0x132E76, 0xFF
	ldr r1, .PokeDudeBackupTMCasePtr
	bx r1
.align 2
.PokeDudeBackupTMCasePtr: .word PokeDudeBackupTMCase + rom + 1

.org 0x132EB0, 0xFF
	ldr r0, .PokeDudeClearTMCasePtr
	bx r0
.align 2
.PokeDudeClearTMCasePtr: .word PokeDudeClearTMCase + rom + 1

.org 0x13318C, 0xFF
	ldr r0, .PokeDudeRestoreTMCasePtr
	bx r0
.align 2
.PokeDudeRestoreTMCasePtr: .word PokeDudeRestoreTMCase + rom + 1

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Remove Help System

.org 0x13B8C2, 0xFF
b 0x13B900

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@More Berry Stuff

.org 0x13D1C4, 0xFF
	mov r0, #Berry_Num + 1
	lsl r0, #0x3

[B].org 0x13D33C, 0xFF
BerryNumFixesHook:
	ldr r0, .BerryNumFixesPtr
	bx r0
.align 2
.BerryNumFixesPtr: .word BerryNumFixes + rom + 1[/B]

BerryFix2Hook:
.org 0x14A490, 0xFF
	ldr r0, .BerryFix2Ptr
	bx r0
.align 2
.BerryFix2Ptr: .word BerryFix2 + rom + 1

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@New Routine

.org offset, 0xFF
StoreItem:
	push {r4-r6,lr}
	lsl r0, r0, #0x18
	lsr r5, r0, #0x18
	mov r4, #0x0

GetItemInBagCount:
	mov r6, #0x0
	lsl r0, r4, #0x3
	ldr r1, .Table
	add r0, r1
	ldrh r3, [r0, #0x4]
	lsl r3, #0x1
	ldr r0, [r0]
	mov r1, #0x0

Loop:
	cmp r1, r3
	beq StoreAmount
	ldrh r2, [r0]
	cmp r2, #0x0
	beq CheckNextItemJustInCase
	add r0, #0x4
	add r1, #0x1
	b Loop

CheckNextItemJustInCase:
	ldrh r2, [r0, #0x4]
	cmp r2, #0x0
	beq StoreAmount
	add r0, #0x4
	add r1, #0x1
	mov r6, #0x1
	b Loop	

StoreAmount:
	cmp r6, #0x0
	beq NotShopSkip
	sub r1, #0x1
NotShopSkip:
	ldr r0, .ItemStorage2
	lsl r2, r4, #0x1
	add r0, r2
	strh r1, [r0]
	add r4, #0x1
	cmp r4, #0x3
	beq ReturnToThing
	b GetItemInBagCount

ReturnToThing:
	lsl r1, r5, #0x3
	ldr r0, =0x8108DD1
	bx r0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

GetSmallestItemAmount:
	push {r1}
	ldr r0, .ItemStorage2
	lsl r1, r5, #0x1
	add r0, r1
	pop {r1}
	ldrh r0, [r0]
	ldr r3, =0x8108E29
	bx r3

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

OpenBagBugFix1:
	push {r0}
	lsl r0, r4, #0x1
	ldr r1, .ItemStorage2
	add r1, r0
	ldrh r1, [r1]
	pop {r0}
	add r0, r1, #0x1
	cmp r2, r0
	ldr r0, =0x8108A26 | 1
	bx r0

OpenBagBugFix2:
	lsl r3, r4, #0x1
	ldr r0, .ItemStorage2
	add r0, r3
	ldrh r0, [r0]
	add r3, r0, #0x1
	ldr r4, =0x8108A4C | 1
	bx r4

OpenBagBugFix3:
	lsl r1, r6, #0x1
	ldr r0, .ItemStorage2
	add r0, r1
	ldrh r0, [r0]
	add r0, #0x1
	ldr r1, =0x8108AC8 | 1
	bx r1

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

PokeDudeBackupRegularBagFix:
	ldr r5, .PokeDudeItemBackupPtr
	ldr r0, .NewMallocPokeDudeBagSpace
	bl Calloc
	str r0, [r5]
	ldr r1, =Item_Ram
	ldr r2, =Regular_Item_Num * 2 * 4
	mov r4, r2
	bl Memcpy

	ldr r0, [r5]
	add r0, r4
	ldr r1, =Key_Item_Ram
	ldr r2, =Key_Item_Num * 2 * 4
	add r4, r2
	bl Memcpy

	ldr r0, [r5]
	add r0, r4
	ldr r1, =Poke_Ball_Ram
	ldr r2, =Poke_Ball_Num * 2 * 4
	bl Memcpy

	ldr r4, .SaveBlock1
	ldr r0, =0x810AE22 | 1
	bx r0


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@0x810AE78 with r0
PokeDudeBackupRegularBagClear:
	ldr r0, =Item_Ram
	ldr r1, =Regular_Item_Num * 2
	bl RemoveNItems

	ldr r0, =Key_Item_Ram
	mov r1, #Key_Item_Num * 2
	bl RemoveNItems

	ldr r0, =Poke_Ball_Ram
	mov r1, #Poke_Ball_Num * 2
	bl RemoveNItems
	
	ldr r4, .SaveBlock1
	ldr r0, =0x810AEA4 | 1
	bx r0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@0x10AEDA with r0
PokeDudeBackupBagRestore:
	ldr r0, =Item_Ram
	ldr r1, [r5]
	ldr r2, =Regular_Item_Num * 2 * 4
	mov r4, r2
	bl Memcpy

	ldr r0, =Key_Item_Ram
	ldr r1, [r5]
	add r1, r4
	ldr r2, =Key_Item_Num * 2 * 4
	add r4, r2
	bl Memcpy

	ldr r0, =Poke_Ball_Ram
	ldr r1, [r5]
	add r1, r4
	ldr r2, =Poke_Ball_Num * 2 * 4
	bl Memcpy

	ldr r4, .SaveBlock1
	ldr r0, =0x810AF0C | 1
	bx r0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@0x8132E76 with r1
PokeDudeBackupTMCase:
	ldr r1, =TM_Ram
	ldr r2, =TM_Num * 4
	mov r5, r2
	bl Memcpy

	ldr r0, [r4]
	add r0, r5
	ldr r1, =Key_Item_Ram * 2 * 4
	ldr r2, =Key_Item_Num * 2 * 4
	bl Memcpy

	ldr r0, =0x8132E98 | 1
	bx r0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@0x132EB0 with r0
PokeDudeClearTMCase:
	ldr r0, =TM_Ram
	mov r1, #TM_Num
	bl RemoveNItems

	ldr r0, =Key_Item_Ram
	mov r1, #Key_Item_Num
	bl RemoveNItems

	ldr r0, =0x8132EC4 | 1
	bx r0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@0x813318C with r0
PokeDudeRestoreTMCase:
	ldr r0, =TM_Ram
	ldr r2, =TM_Num * 4
	bl Memcpy

	ldr r0, =Key_Item_Ram
	ldr r1, [r5]
	ldr r2, =Key_Item_Num * 2 * 4
	bl Memcpy

	ldr r0, =0x81331A4 | 1
	bx r0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

BerryFix1Ptr:
	cmp r6, #0x1
	bls BerryFix1Return
	mov r0, r5
	bl GetItemPocket
	cmp r0, #0x5 @Berry Pouch
	bne BerryFix1Return
	ldr r0, =0x806BDFC | 1
	bx r0

BerryFix1Return:
	ldr r0, =0x806BE22 | 1
	bx r0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@0x14A490 with r0
BerryFix2:
	cmp r6, #0x0
	beq BerryFix2Return
	mov r0, r4
	bl GetItemMystery2 @BerryId

BerryFix2Return:
	ldr r0, =0x814A4C2 | 1
	bx r0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@0x13D33C with r0
BerryNumFixes:
	mov r0, r5
	bl GetItemMystery2
	mov r1, r0
	mov r0, r6
	mov r2, #0x2
	ldr r3, =0x813D344 | 1
	bx r3

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Calloc:
	ldr r1, =0x8002BB0 | 1
	bx r1

Memcpy:
	ldr r3, =0x81E5E78 | 1
	bx r3

RemoveNItems:
	ldr r2, =0x809A274 | 1
	bx r2

GetItemPocket:
	ldr r1, =0x809A9D8 | 1
	bx r1

GetItemMystery2:
	ldr r1, =0x809A9B4 | 1
	bx r1

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

.align 2
.ItemStorage2: .word Free_Ram
.Table: .word TABLE + rom
.PokeDudeItemBackupPtr: .word 0x203AD2C
.NewMallocPokeDudeBagSpace: .word (Regular_Item_Num + Key_Item_Num + Poke_Ball_Num) * 2 * 4
.SaveBlock1: .word 0x3005008

.align 2
TABLE:
.word Item_Ram
.hword Regular_Item_Num, 0x0

.word Key_Item_Ram
.hword Key_Item_Num, 0x0

.word Poke_Ball_Ram
.hword Poke_Ball_Num, 0x0

.word 0xFFFFFFFF, 0xFFFFFFFF
La rutina de arriba está escrita de tal modo que, si la insertas tal cual, tendrás un espacio para:
  • 400 Objetos regulares
  • 60 Objetos clave
  • 28 Poke Balls
  • 128 MTs/MOs
  • 67 Bayas
Obviamente si no necesitas todos esos objetos, eres libre de cambiar las direcciones de RAM y la cantidad de objetos modificando las lineas al inicio de la rutina. Si expandes cualquiera de esos valores, asegurate de cambiar las direcciones de RAM necesarias.

Nota importante sobre las Bayas: Si planeas agregar nuevas bayas a tu juego, cada baya necesita ser modificada en el editor de objetos de G3T. bajo Mystery1/2, Cambia el valor de la segunda caja (Mystery 2) por el número de esa baya. Por ejemplo, El número de la Baya Aranja es 7. Los números de bayas pueden encontarse en Bulbapedia o cualquiera de las dos Wikidex.
Si no planeas expandir el número de bayas, en el código, cambia la linea Berry_Num a 43 y remueve la sección marcada en negrita BerryNumFixesHook. De lo contrario todas tus bayas serán mostradas con el número de baya 0 (O tambien puedes reasignar los números de bayas de la manera que mencioné).
Si expandes el número de bayas, permanecerán en un orden basado en su ID de objeto. en el próximo engine de Skeli una solución será presentada para este problema (Principalmente porque Skeli no quizo escribir un algoritmo de orden decente en ASM).

Instrucciones de Instalación:
  1. Modifica la rutina a tu gusto.
  2. Ensambla la rutina.
  3. Crea una copia del archivo .bin generado (deberías tener un segundo archivomas o menos llamado output.bin - Copia y llenar toda la copia con bytes FF.
  4. Crea un parche con Lunar IPS usando de base no modificada la copia del .bin (llena de FF) y usando la rutina original como el archivo modificado.
  5. Parchea tu ROM con el archivo IPS generado

Esto ha sido confirmado como funcional en Fire Red, mas Skeli no garantiza que funcione en hacks en progreso (Aunque cambiando la RAM apropiadamente si funciona, al menos a mi, Gold, me funciona al 100).

Este código además no rompe la compatibilad con la Poketele y el buscapeleas si en caso se quiere mantener esos objetos funcionales

Créditos

EDIT: Perdon si ven muchos dedazos. hice esto a la carrera y aqui en mi rancho eran las 12.30 AM cuando escribí esto.
 
Última edición:
Arriba