Registrarse

[ASM] Premi Quantità Market

eMMe97

Usuario de platino


E dopo aver effettuato l'acquisto il cassiere vi comunica che avete ricevuto in regalo una Premier Ball perché avete acquistato più di 9 Poké Ball...sempre che stiate giocando a RSE, perché in FireRed questa Funzione non esiste, quindi implementiamola e MIGLIORIAMOLA! :D

Partendo da una routine di Spherical Ice, ho aggiornato nel tempo il codice estendendo la funzione a tutti gli oggetti.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Vediamo la routine:

.thumb

.equ rom, 0x08FFFFFF

main:
push {r4,r5,r6, lr}
lsl r0, r0, #0x18
lsr r4, r0, #0x18
lsl r0, r4, #2
add r0, r0, r4
lsl r0, r0, #3
ldr r1, =(0x03005098) @ tasks.args
add r5, r0, r1
ldr r0, =(0x030030F0) @ super
ldrh r1, [r0, #0x2E]
mov r0, #0x3
and r0, r1
cmp r0, #0
beq end

continue:
mov r0, #5
ldr r3, =(0x080722CC|1) @ audio_play
bl call_via_r3
mov r1, #0xA
ldrh r0, [r5, r1]
mov r1, #0
ldrh r3, =0xffff

trova:
ldr r6, =(tabella_obj + rom)
add r6, r6, r1
ldrh r6, [r6]
cmp r6, r3
beq no_premier_ball
cmp r0, r6 @item_ID
beq premio
add r1, #2
b trova

premio:
ldr r6, =(tabella_premi + rom)
add r6, r6, r1
ldrh r6, [r6] @id_oggetto_premio
b assegna


assegna:
mov r1, #2
ldrh r0, [r5, r1]
cmp r0, #0x9 @ Maximum quantity of Balls to not qualify for a Premier Ball
ble no_premier_ball
mov r0, r6 @ Regalo item ID
mov r1, #1 @ Quantity to give
ldr r3, =(0x0809A084|1) @ bag_add_item
bl call_via_r3
lsl r0, r0, #0x18
lsr r0, r0, #0x18
cmp r0, #1
bne no_premier_ball
ldr r1, =(messaggio + rom) @messaggio del premio
ldr r2, =(0x0809BF98|1)
mov r0, r4
ldr r3, =(0x0813F75C|1)
bl call_via_r3
b end

no_premier_ball:
mov r0, r4
ldr r3, =(0x0809BF98|1)
bl call_via_r3

end:
pop {r4,r5,r6}
pop {r0}
bx r0

call_via_r3:
bx r3

.align 2

tabella_obj:
.byte 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0xff , 0xff

tabella_premi:
.byte 0xc, 0x0, 0xc, 0x0, 0xc, 0x0, 0xff , 0xff

messaggio:
.byte 0xC2, 0xD5, 0xDD, 0x00, 0xD7, 0xE3, 0xE1, 0xE4, 0xE6, 0xD5, 0xE8, 0xE3, 0x00, 0xE4, 0xDD, 0x26, 0x00, 0xD8, 0xDD, 0x00, 0xAA, 0x00, 0xE4, 0xD9, 0xEE, 0xEE, 0xDD, 0xAB, 0xFE, 0xCB, 0xE9, 0xD9, 0xE7, 0xE8, 0xE3, 0x00, 0xE8, 0xDD, 0x00, 0xD8, 0xD5, 0x00, 0xD8, 0xDD, 0xE6, 0xDD, 0xE8, 0xE8, 0xE3, 0x00, 0xD5, 0xD8, 0x00, 0xE9, 0xE2, 0x00, 0xE6, 0xD9, 0xDB, 0xD5, 0xE0, 0xE3, 0xAB, 0xFF

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Prima di compilare la routine bisogna fare qualche precisazione e modifica.
La routine è estesa a qualsivoglia oggetto venduto nel market. Anche espandendo gli strumenti si può utilizzare questa routine, dato che riconosce ben 0xFFFE oggetti, ma capiamo bene come funziona.

Passiamo alla parte che dovrete editare voi.

.equ rom, 0x08FFFFFF
Al posto delle FFFFFF dovrete mettere l'offset di dove inserirete la routine.
esempio. Inserisco l'a routine all'offset 953000, quindi scriverò

.equ rom, 0x08953000


Oggetto che assegna il premio:
Questa routine non si ferma alla sola pokéball, ma si applica a qualsiasi oggetto, come già detto, spetta a noi decidere quale.
Ho già costruito la table una table con gli ID degli strumenti che vogliamo rendere "speciali" (non è detto che ci sia anche la pokéball). Ogni ID occupa 2 byte in ordine scambiato (cioè la pokéball che ha ID 4 va scritta così: 04 00) e va scritto uno dopo l'altro, la table termina con 0xFFFF

Come potete vedere alla voce tabella_obj ho già impostato le ultra, mega e pokéball come oggetti a cui assegnare il premio. Potete aggiungere altri oggetti, quanti ne volete.
es. se volessi aggiungere anche una pozione, otterrei:

tabella_obj:
.byte 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0xD, 0x0, 0xff , 0xff


Oggetto premio:
Nello stesso modo ed ordine assegniamo il premio indicato nella seconda table.

Come potete vedere alla voce tabella_premi ho già impostato per le ultra, mega e pokéball come oggetti premio la premierball. Potete aggiungere altri oggetti, quanti ne volete.
es. se volessi aggiungere come premio pozione di prima una masterball (premio assurdo lo so), otterrei:

tabella_premi:
.byte 0xc, 0x0, 0xc, 0x0, 0xc, 0x0, 0x1, 0x0, 0xff , 0xff


Messaggio premio:
Scorrendo nella routine trovare la parte messaggio. Qui dovete mettere il testo del messaggi del premio, in hex (potete aiutarvi con xse, per esempio).
Per facilitare la cosa ho già inserito il messaggio di base io: "Hai comprato più di 9 pezzi! Questo ti da diritto ad un regalo!"

Quando avrete eseguito questi passaggi, procedete a compilare la routine, inseritela nella ROM ed inserite il puntatore +1 all'offset 0x0809BF64. Salvate tutto e FINE!
Non servono script o altre cose, verrà fatto tutto in automatico.

N.B. I premi si sbloccano se si compra in una sola volta 10 o più unità di quello strumento. Se in una sola volta si comprano 20 o più strumenti, si riceverà sempre e solo 1 unità di quel premio, come nei giochi ufficiali.
 

Versekr Dark

Usuario mítico
Mensaje en ingles:

You bought more than 9 items!\n
you've earned an extra reward![pause]

You bought more than 9 units!\n
you've earned an extra reward![pause]

You bought more than 9 pieces!\n
you've earned an extra reward![pause]

You bought more than 9 objects!\n
you've earned an extra reward![pause]

You've bought more than 9 pieces!\n
this entitles you to a gift![pause]
 
Arriba