[FONT="Source Code Pro"].thumb
@ -- Change these
.equ start_address, 0x29B110
@ --
.equ rom, 0x08000000
.equ pokemon_length, 0x64
.equ req_species, 0x0B
.equ req_held_item, 0x0C
.equ req_hp_ev, 0x1A
.equ req_atk_ev, 0x1B
.equ req_def_ev, 0x1C
.equ req_spe_ev, 0x1D
.equ req_spatk_ev, 0x1E
.equ req_spdef_ev, 0x1F
.equ req_happiness, 0x20
.equ req_catch_location, 0x23
.equ req_pokeball, 0x26
.equ item_luxuryball, 0x0B
.equ item_pomegberry, 0x99
.equ item_kelpsyberry, 0x9A
.equ item_qualotberry, 0x9B
.equ item_hondewberry, 0x9C
.equ item_grepaberry, 0x9D
.equ item_tomatoberry, 0x9E
.equ item_soothebell, 0xB8
.org start_address, 0xFF
ev_berries:
push {lr}
lsl r0, r0, #0x18
lsr r0, r0, #0x18
ldr r2, item_function_ptr
ldr r1, =(rom + dp05_ev_berries + 1)
str r1, [r2]
ldr r3, item_consume_maybe
bl call_via_r3
pop {r3}
call_via_r3:
bx r3
.align 2
item_consume_maybe: .word 0x080A16D0|1
.pool
dp05_ev_berries:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, sp, #0xC
str r1, [sp, #0]
lsl r0, r0, #0x18
lsr r0, r0, #0x18
mov r10, r0
get_selected_pokemon:
ldr r4, brm
ldrb r1, [r4, #9]
mov r0, #pokemon_length
mul r1, r0
ldr r0, party_player
add r5, r1, r0
determine_berry:
ldr r0, var_800E
ldrh r0, [r0]
lsl r0, r0, #0x10
lsr r0, r0, #0x10
sub r0, #(item_pomegberry - 1)
mov r7, r0
get_ev_req:
mov r0, r5
mov r1, r7
ldr r3, =(rom + get_ev_req_from_berry_id + 1)
bl call_via_r3
lsl r0, r0, #0x18
lsr r0, r0, #0x18
cmp r0, #0
beq no_effect
mov r6, r0
happiness_before:
mov r0, r5
mov r1, #req_happiness
ldr r3, get_attr
bl call_via_r3
lsl r0, r0, #0x10
lsr r0, r0, #0x10
ldr r1, var_8000
strh r0, [r1]
ev_value_before:
mov r0, r5
mov r1, r6
mov r2, #0
ldr r3, get_attr
bl call_via_r3
lsl r0, r0, #0x10
lsr r0, r0, #0x10
ldr r1, var_8001
strh r0, [r1]
use_berry:
mov r0, r5
mov r1, r6
ldr r3, =(rom + use_ev_berry + 1)
bl call_via_r3
lsl r0, r0, #0x18
lsr r4, r0, #0x18
ev_after:
mov r0, r5
mov r1, r6
mov r2, #0
ldr r3, get_attr
bl call_via_r3
lsl r0, r0, #0x10
lsr r0, r0, #0x10
mov r8, r0
happiness_after:
mov r0, r5
mov r1, #req_happiness
ldr r3, get_attr
bl call_via_r3
lsl r0, r0, #0x10
lsr r0, r0, #0x10
mov r9, r0
branch_for_effectiveness:
cmp r4, #0
bne no_effect
ldr r0, var_8000
ldrh r0, [r0]
cmp r0, r9
bne effect
ldr r1, var_8001
ldrh r1, [r1]
cmp r1, r8
bne effect
no_effect:
ldr r1, item_effectiveness
mov r0, #0
strb r0, [r1]
mov r0, #5
ldr r3, audio_play
bl call_via_r3
ldr r0, no_effect_str
mov r1, #1
ldr r3, item_menu_string
bl call_via_r3
mov r0, #2
ldr r3, bgid_mark_for_sync
bl call_via_r3
ldr r1, tasks
mov r2, r10
lsl r0, r2, #2
add r0, r10
lsl r0, r0, #3
add r0, r0, r1
ldr r1, [sp]
str r1, [r0]
b end
effect:
mov r0, r10
ldr r3, item_use_animation
bl call_via_r3
ldr r1, item_function_ptr
ldr r0, =(rom + berry_use + 1)
str r0, [r1]
end:
add sp, sp, #0xC
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
.align 2
item_function_ptr: .word 0x03005E98
.pool
berry_use:
push {r4-r7,lr}
lsl r0, r0, #0x18
lsr r5, r0, #0x18
ldr r1, item_effectiveness
mov r0, #1
strb r0, [r1]
sound_fx:
mov r0, #1
ldr r3, audio_play
bl call_via_r3
remove_item:
ldr r0, var_800E
ldrh r0, [r0]
mov r1, #1
ldr r3, bag_remove_item
bl call_via_r3
get_selected_pokemon_again:
ldr r4, brm
ldrb r1, [r4, #9]
mov r0, #pokemon_length
mul r1, r0
ldr r0, party_player
add r4, r1, r0
determine_berry_again:
ldr r0, var_800E
ldrh r0, [r0]
lsl r0, r0, #0x10
lsr r0, r0, #0x10
sub r0, #(item_pomegberry - 1)
mov r7, r0
get_ev_req_again:
mov r0, r4
mov r1, r7
ldr r3, =(rom + get_ev_req_from_berry_id + 1)
bl call_via_r3
lsl r0, r0, #0x18
lsr r1, r0, #0x18
ev_after_again:
mov r0, r4
mov r2, #0
ldr r3, get_attr
bl call_via_r3
lsl r0, r0, #0x10
lsr r0, r0, #0x10
mov r8, r0
happiness_after_again:
mov r0, r4
mov r1, #req_happiness
ldr r3, get_attr
bl call_via_r3
lsl r0, r0, #0x10
lsr r0, r0, #0x10
mov r9, r0
buffer_pkmn_nick_to_buffer2:
ldr r1, fcode_buffer2
mov r0, r4
ldr r3, buffer_pkmn_nick
bl call_via_r3
buffer_stat_name_to_buffer3:
ldr r1, fcode_buffer3
mov r0, r7
ldr r3, =(rom + buffer_stat_name + 1)
bl call_via_r3
branch_for_string:
ldr r0, var_8000
ldrh r0, [r0]
cmp r0, r9
beq happiness_at_max
ldr r0, var_8001
ldrh r0, [r0]
cmp r0, r8
beq ev_at_0
happiness_not_at_max_ev_above_0:
ldr r0, displayed_string
ldr r1, =(rom + happiness_not_at_max_ev_above_0_str)
ldr r3, fdecoder
bl call_via_r3
b load_displayed_string
ev_at_0:
ldr r0, displayed_string
ldr r1, =(rom + happiness_up_ev_cant_fall_str)
ldr r3, fdecoder
bl call_via_r3
b load_displayed_string
happiness_at_max:
ldr r0, displayed_string
ldr r1, =(rom + adore_ev_down_str)
ldr r3, fdecoder
bl call_via_r3
load_displayed_string:
ldr r0, displayed_string
print_item_message:
mov r1, #1
ldr r3, item_menu_string
bl call_via_r3
mov r0, #2
ldr r3, bgid_mark_for_sync
bl call_via_r3
ldr r1, tasks
mov r2, r5
lsl r0, r2, #2
add r0, r0, r5
lsl r0, r0, #3
add r0, r0, r1
ldr r1, item_menu_callback
str r1, [r0]
pop {r4-r7}
pop {r0}
bx r0
.align 2
get_ev_req_from_berry_id:
push {r4-r7,lr}
mov r4, r0
lsl r1, r1, #0x18
lsr r1, r1, #0x18
lsl r1, r1, #2
ldr r0, =(rom + ev_switch_table)
add r0, r0, r1
ldr r0, [r0]
mov pc, r0 @ switch jump
.align 2
ev_switch_table:
.word (rom + ev_switch_default)
.word (rom + case_ev_hp)
.word (rom + case_ev_atk)
.word (rom + case_ev_def)
.word (rom + case_ev_spatk)
.word (rom + case_ev_spdef)
.word (rom + case_ev_spe)
.align 2
ev_switch_default:
case_ev_hp:
mov r0, #req_hp_ev
b return_ev_req
case_ev_atk:
mov r0, #req_atk_ev
b return_ev_req
case_ev_def:
mov r0, #req_def_ev
b return_ev_req
case_ev_spe:
mov r0, #req_spe_ev
b return_ev_req
case_ev_spatk:
mov r0, #req_spatk_ev
b return_ev_req
case_ev_spdef:
mov r0, #req_spdef_ev
b return_ev_req
ev_return_0:
mov r0, #0
return_ev_req:
pop {r4-r7}
pop {r1}
bx r1
.align 2
buffer_stat_name:
push {lr}
mov r2, r1
lsl r0, r0, #0x18
lsr r0, r0, #0x18
cmp r0, #6
bgt return_stat_name
ldr r1, =(rom + stat_name_switch_table)
lsl r0, r0, #2
add r0, r0, r1
ldr r0, [r0]
mov pc, r0 @ switch jump
stat_name_switch_table:
.word (rom + stat_name_default)
.word (rom + case_hp_name)
.word (rom + case_atk_name)
.word (rom + case_def_name)
.word (rom + case_spatk_name)
.word (rom + case_spdef_name)
.word (rom + case_spe_name)
stat_name_default:
case_hp_name:
ldr r1, hp_name_str
b break_stat_name_switch
case_atk_name:
ldr r1, atk_name_str
b break_stat_name_switch
case_def_name:
ldr r1, def_name_str
b break_stat_name_switch
case_spe_name:
ldr r1, spe_name_str
b break_stat_name_switch
case_spatk_name:
ldr r1, spatk_name_str
b break_stat_name_switch
case_spdef_name:
ldr r1, spdef_name_str
break_stat_name_switch:
mov r0, r2
ldr r3, strcpy_xFF_terminated
bl call_via_r3
return_stat_name:
pop {r0}
bx r0
.align 2
use_ev_berry:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
lsl r1, r1, #0x18
lsr r1, r1, #0x18
mov r8, r0
mov r7, r1
get_relevant_ev_value:
mov r0, r8
mov r1, r7
mov r2, #0
ldr r3, get_attr
bl call_via_r3
lsl r0, r0, #0x10
lsr r0, r0, #0x10
check_ev:
cmp r0, #0
ble set_ev_unchanged_flag
subtract_ev:
mov r1, r0
sub r0, #10
cmp r0, r1
blo set_ev
mov r0, #0
set_ev:
mov r2, sp
strh r0, [r2]
mov r0, r8
mov r1, r7
ldr r3, set_attr
bl call_via_r3
recalc_stats:
mov r0, r8
ldr r3, recalculate_stats
bl call_via_r3
b get_happiness_value
set_ev_unchanged_flag:
mov r6, #1
get_happiness_value:
mov r0, r8
mov r1, #req_happiness
mov r2, #0
ldr r3, get_attr
bl call_via_r3
check_happiness:
cmp r0, #255
beq check_if_should_return_1
cmp r0, #199
bgt add_two_happiness
cmp r0, #99
bgt add_five_happiness
add_ten_happiness:
mov r6, #10
b remember_new_happiness
add_five_happiness:
mov r6, #5
b remember_new_happiness
add_two_happiness:
mov r6, #2
remember_new_happiness:
add r5, r6, r0
luxuryball_check:
mov r0, r8
mov r1, #req_pokeball
mov r2, #0
ldr r3, get_attr
bl call_via_r3
cmp r0, #item_luxuryball
bne metlocation_check
luxuryball_bonus:
add r5, #1
add r6, #1
metlocation_check:
mov r0, r8
mov r1, #req_catch_location
mov r2, #0
ldr r3, get_attr
bl call_via_r3
mov r4, r0
ldr r3, sav1_map_get_name
bl call_via_r3
lsl r0, r0, #0x18
lsr r0, r0, #0x18
cmp r4, r0
bne soothebell_check
metlocation_bonus:
add r5, #1
add r6, #1
soothebell_check:
mov r0, r8
mov r1, #req_held_item
mov r2, #0
ldr r3, get_attr
bl call_via_r3
lsl r0, r0, #0x10
lsr r0, r0, #0x10
mov r1, #item_soothebell
cmp r0, r1
bne add_happiness
soothebell_bonus:
lsr r0, r6, #1
add r5, r0
add_happiness:
mov r0, r5
cmp r0, #255
ble set_happiness
mov r0, #255
set_happiness:
mov r2, sp
strh r0, [r2]
mov r0, r8
mov r1, #req_happiness
ldr r3, set_attr
bl call_via_r3
return_0:
mov r0, #0
b finish_using_ev_berry
check_if_should_return_1:
cmp r5, #1
bne return_0
return_1:
mov r0, #1
finish_using_ev_berry:
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r1}
bx r1
happiness_not_at_max_ev_above_0_str:
.byte 0xFD, 0x02, 0x00, 0xE8, 0xE9, 0xE6, 0xE2, 0xD9, 0xD8, 0x00, 0xDA, 0xE6, 0xDD, 0xD9, 0xE2, 0xD8, 0xE0, 0xED, 0xAD, 0xFE, 0xCE, 0xDC, 0xD9, 0x00, 0xD6, 0xD5, 0xE7, 0xD9, 0x00, 0xFD, 0x03, 0x00, 0xDA, 0xD9, 0xE0, 0xE0, 0xAB, 0xFC, 0x09, 0xFF
@ "[PKMN] turned friendly.[NEWLINE]The base [STAT] fell![WAITKEYPRESS]"
happiness_up_ev_cant_fall_str:
.byte 0xFD, 0x02, 0x00, 0xE8, 0xE9, 0xE6, 0xE2, 0xD9, 0xD8, 0x00, 0xDA, 0xE6, 0xDD, 0xD9, 0xE2, 0xD8, 0xE0, 0xED, 0xAD, 0xFE, 0xCE, 0xDC, 0xD9, 0x00, 0xD6, 0xD5, 0xE7, 0xD9, 0x00, 0xFD, 0x03, 0x00, 0xD7, 0xD5, 0xE2, 0xB4, 0xE8, 0x00, 0xDA, 0xD5, 0xE0, 0xE0, 0xAB, 0xFC, 0x09, 0xFF
@ "[PKMN] turned friendly.[NEWLINE]The base [STAT] can't fall![WAITKEYPRESS]"
adore_ev_down_str:
.byte 0xFD, 0x02, 0x00, 0xD5, 0xD8, 0xE3, 0xE6, 0xD9, 0xE7, 0x00, 0xED, 0xE3, 0xE9, 0xAB, 0xFE, 0xCE, 0xDC, 0xD9, 0x00, 0xD6, 0xD5, 0xE7, 0xD9, 0x00, 0xFD, 0x03, 0x00, 0xDA, 0xD9, 0xE0, 0xE0, 0xAB, 0xFC, 0x09, 0xFF
@ "[PKMN] adores you![NEWLINE]The base [STAT] fell![WAITKEYPRESS]"
.align 2
fcode_buffer2: .word 0x02021CD0
fcode_buffer3: .word 0x02021CF0
displayed_string: .word 0x02021D18
party_player: .word 0x02024284
var_8000: .word 0x020370B8
var_8001: .word 0x020370BA
var_800E: .word 0x0203AD30
brm: .word 0x0203B0A0
item_effectiveness: .word 0x0203B0C0
tasks: .word 0x03005090
strcpy_xFF_terminated: .word 0x08008D84|1
fdecoder: .word 0x08008FCC|1
recalculate_stats: .word 0x0803E47C|1
get_attr: .word 0x0803FBE8|1
set_attr: .word 0x0804037C|1
sav1_map_get_name: .word 0x08056260|1
audio_play: .word 0x080722CC|1
bag_remove_item: .word 0x0809A1D8|1
bgid_mark_for_sync: .word 0x080F67A4|1
buffer_pkmn_nick: .word 0x081202E0|1
item_menu_string: .word 0x081202F8|1
item_use_animation: .word 0x08124DC0|1
item_menu_callback: .word 0x081255BC|1
hp_name_str: .word 0x084169C2 @ "HP"
spatk_name_str: .word 0x084169C5 @ "SP. ATK"
spdef_name_str: .word 0x084169CD @ "SP. DEF"
atk_name_str: .word 0x08417674 @ "ATTACK"
def_name_str: .word 0x0841767B @ "DEFENSE"
spe_name_str: .word 0x0841768D @ "SPEED"
no_effect_str: .word 0x084169DC @ "It won't have any effect."
[/FONT]