summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYamaArashi <YamaArashi@users.noreply.github.com>2016-10-28 12:44:32 -0700
committerGitHub <noreply@github.com>2016-10-28 12:44:32 -0700
commitb350c7e9fa867af2871ac2c6b92f95e8bb77617c (patch)
treedfa26bc0b921e09ed0adcaeb2c7988511bf5bbf1
parent4c74840c08660db73df40febe94dde07b2dfe4f8 (diff)
parent0c7d1385e8747383295d7df37ab10c440d20b603 (diff)
Merge pull request #75 from yenatch/master
Decompile berry.c.
-rw-r--r--Makefile13
-rw-r--r--asm/berry.s1089
-rw-r--r--constants/songs.s2
-rw-r--r--data/maps/Route118/header.s2
-rw-r--r--ld_script.txt2
-rw-r--r--src/berry.c471
6 files changed, 483 insertions, 1096 deletions
diff --git a/Makefile b/Makefile
index 1340f0f15..eb88fdd51 100644
--- a/Makefile
+++ b/Makefile
@@ -18,13 +18,10 @@ LIBGCC := tools/agbcc/lib/libgcc.a
SHA1 := sha1sum -c
GFX := tools/gbagfx/gbagfx
-
AIF := tools/aif2pcm/aif2pcm
-
+MID := tools/mid2agb/mid2agb
SCANINC := tools/scaninc/scaninc
-
PREPROC := tools/preproc/preproc
-
RAMSCRGEN := tools/ramscrgen/ramscrgen
REVISION := 0
@@ -90,7 +87,6 @@ asm/item.o \
asm/matuda_debug_menu.o \
asm/contest.o \
asm/shop.o \
-asm/berry.o \
asm/script_menu.o \
asm/naming_screen.o \
asm/money.o \
@@ -248,6 +244,7 @@ include misc.mk
%.png: ;
%.pal: ;
%.aif: ;
+
%.1bpp: %.png ; $(GFX) $< $@
%.4bpp: %.png ; $(GFX) $< $@
%.8bpp: %.png ; $(GFX) $< $@
@@ -256,6 +253,8 @@ include misc.mk
%.rl: % ; $(GFX) $< $@
%.pcm: %.aif ; $(AIF) $< $@
%.bin: %.aif ; $(AIF) $< $@
+sound/songs/%.s: sound/songs/%.mid
+ cd $(@D) && ../../$(MID) $(<F)
src/libc.o: CC1 := tools/agbcc/bin/old_agbcc
src/libc.o: CFLAGS := -O2
@@ -278,7 +277,11 @@ $(C_OBJS): %.o : %.c
@printf ".text\n\t.align\t2, 0\n" >> $*.s
$(AS) $(ASFLAGS) -o $@ $*.s
+ifeq ($(NODEP),)
%.o: dep = $(shell $(SCANINC) $*.s)
+else
+%.o: dep :=
+endif
$(ASM_OBJS): %.o: %.s $$(dep)
$(AS) $(ASFLAGS) --defsym $(VERSION)=1 --defsym REVISION=$(REVISION) -o $@ $<
diff --git a/asm/berry.s b/asm/berry.s
deleted file mode 100644
index 21e4b52e1..000000000
--- a/asm/berry.s
+++ /dev/null
@@ -1,1089 +0,0 @@
- .include "constants/gba_constants.s"
- .include "constants/species_constants.s"
- .include "asm/macros.s"
-
- .syntax unified
-
- .text
-
- thumb_func_start unref_sub_80B4884
-unref_sub_80B4884: @ 80B4884
- push {lr}
- sub sp, 0x4
- mov r1, sp
- movs r0, 0
- strh r0, [r1]
- ldr r1, _080B48A0 @ =gSaveBlock1 + 0x3160
- ldr r2, _080B48A4 @ =0x01000298
- mov r0, sp
- bl CpuSet
- add sp, 0x4
- pop {r0}
- bx r0
- .align 2, 0
-_080B48A0: .4byte gSaveBlock1 + 0x3160
-_080B48A4: .4byte 0x01000298
- thumb_func_end unref_sub_80B4884
-
- thumb_func_start sub_80B48A8
-sub_80B48A8: @ 80B48A8
- push {r4-r6,lr}
- adds r5, r0, 0
- ldr r3, _080B48E0 @ =gSaveBlock1 + 0x3160
- movs r2, 0
- ldr r6, _080B48E4 @ =0x0000052f
- ldr r0, _080B48E8 @ =0xffffcea0
- adds r4, r3, r0
-_080B48B6:
- adds r0, r3, r2
- adds r1, r5, r2
- ldrb r1, [r1]
- strb r1, [r0]
- adds r2, 0x1
- cmp r2, r6
- bls _080B48B6
- ldr r2, _080B48EC @ =0x0000316c
- adds r1, r4, r2
- ldr r2, _080B48F0 @ =0x0000361c
- adds r0, r4, r2
- str r0, [r1]
- ldr r0, _080B48F4 @ =0x00003170
- adds r1, r4, r0
- adds r2, 0x2D
- adds r0, r4, r2
- str r0, [r1]
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080B48E0: .4byte gSaveBlock1 + 0x3160
-_080B48E4: .4byte 0x0000052f
-_080B48E8: .4byte 0xffffcea0
-_080B48EC: .4byte 0x0000316c
-_080B48F0: .4byte 0x0000361c
-_080B48F4: .4byte 0x00003170
- thumb_func_end sub_80B48A8
-
- thumb_func_start sub_80B48F8
-sub_80B48F8: @ 80B48F8
- push {r4-r7,lr}
- ldr r3, _080B4934 @ =gSaveBlock1
- ldr r1, _080B4938 @ =0x0000316c
- adds r4, r3, r1
- ldr r6, [r4]
- adds r1, 0x4
- adds r2, r3, r1
- ldr r7, [r2]
- movs r1, 0
- str r1, [r4]
- str r1, [r2]
- adds r4, r0, 0
- movs r2, 0
- ldr r5, _080B493C @ =0x0000052b
-_080B4914:
- adds r0, r4, r1
- ldrb r0, [r0]
- adds r2, r0
- adds r1, 0x1
- cmp r1, r5
- bls _080B4914
- ldr r1, _080B4938 @ =0x0000316c
- adds r0, r3, r1
- str r6, [r0]
- adds r1, 0x4
- adds r0, r3, r1
- str r7, [r0]
- adds r0, r2, 0
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_080B4934: .4byte gSaveBlock1
-_080B4938: .4byte 0x0000316c
-_080B493C: .4byte 0x0000052b
- thumb_func_end sub_80B48F8
-
- thumb_func_start sub_80B4940
-sub_80B4940: @ 80B4940
- push {r4,lr}
- ldr r4, _080B4970 @ =gSaveBlock1
- ldr r1, _080B4974 @ =0x00003174
- adds r0, r4, r1
- ldrb r0, [r0]
- cmp r0, 0
- beq _080B4984
- ldr r2, _080B4978 @ =0x0000316a
- adds r0, r4, r2
- ldrb r0, [r0]
- cmp r0, 0
- beq _080B4984
- ldr r1, _080B497C @ =0x00003160
- adds r0, r4, r1
- bl sub_80B48F8
- ldr r2, _080B4980 @ =0x0000368c
- adds r1, r4, r2
- ldr r1, [r1]
- cmp r0, r1
- bne _080B4984
- movs r0, 0x1
- b _080B4986
- .align 2, 0
-_080B4970: .4byte gSaveBlock1
-_080B4974: .4byte 0x00003174
-_080B4978: .4byte 0x0000316a
-_080B497C: .4byte 0x00003160
-_080B4980: .4byte 0x0000368c
-_080B4984:
- movs r0, 0
-_080B4986:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_80B4940
-
- thumb_func_start GetBerryInfo
-GetBerryInfo: @ 80B498C
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x2B
- bne _080B49A8
- bl sub_80B4940
- cmp r0, 0
- beq _080B49A8
- ldr r0, _080B49A4 @ =gSaveBlock1 + 0x3160
- b _080B49BE
- .align 2, 0
-_080B49A4: .4byte gSaveBlock1 + 0x3160
-_080B49A8:
- subs r0, r4, 0x1
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x2A
- bls _080B49B4
- movs r4, 0x1
-_080B49B4:
- lsls r0, r4, 3
- subs r0, r4
- lsls r0, 2
- ldr r1, _080B49C4 @ =gBerries - 0x1C
- adds r0, r1
-_080B49BE:
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080B49C4: .4byte gBerries - 0x1C
- thumb_func_end GetBerryInfo
-
- thumb_func_start GetBerryTreeInfo
-GetBerryTreeInfo: @ 80B49C8
- lsls r0, 24
- lsrs r0, 21
- ldr r1, _080B49D4 @ =gSaveBlock1 + 0x1608
- adds r0, r1
- bx lr
- .align 2, 0
-_080B49D4: .4byte gSaveBlock1 + 0x1608
- thumb_func_end GetBerryTreeInfo
-
- thumb_func_start FieldObjectInteractionWaterBerryTree
-FieldObjectInteractionWaterBerryTree: @ 80B49D8
- push {lr}
- ldr r0, _080B4A00 @ =gSelectedMapObject
- ldrb r0, [r0]
- bl FieldObjectGetBerryTreeId
- lsls r0, 24
- lsrs r0, 24
- bl GetBerryTreeInfo
- adds r2, r0, 0
- ldrb r0, [r2, 0x1]
- lsls r0, 25
- lsrs r0, 25
- cmp r0, 0x2
- beq _080B4A14
- cmp r0, 0x2
- bgt _080B4A04
- cmp r0, 0x1
- beq _080B4A0E
- b _080B4A2A
- .align 2, 0
-_080B4A00: .4byte gSelectedMapObject
-_080B4A04:
- cmp r0, 0x3
- beq _080B4A1A
- cmp r0, 0x4
- beq _080B4A20
- b _080B4A2A
-_080B4A0E:
- ldrb r0, [r2, 0x5]
- movs r1, 0x10
- b _080B4A24
-_080B4A14:
- ldrb r0, [r2, 0x5]
- movs r1, 0x20
- b _080B4A24
-_080B4A1A:
- ldrb r0, [r2, 0x5]
- movs r1, 0x40
- b _080B4A24
-_080B4A20:
- ldrb r0, [r2, 0x5]
- movs r1, 0x80
-_080B4A24:
- orrs r0, r1
- strb r0, [r2, 0x5]
- b _080B4A2E
-_080B4A2A:
- movs r0, 0
- b _080B4A30
-_080B4A2E:
- movs r0, 0x1
-_080B4A30:
- pop {r1}
- bx r1
- thumb_func_end FieldObjectInteractionWaterBerryTree
-
- thumb_func_start IsPlayerFacingPlantedBerryTree
-IsPlayerFacingPlantedBerryTree: @ 80B4A34
- push {lr}
- bl GetFieldObjectScriptPointerForComparison
- ldr r1, _080B4A5C @ =BerryTreeScript
- cmp r0, r1
- bne _080B4A64
- ldr r0, _080B4A60 @ =gSelectedMapObject
- ldrb r0, [r0]
- bl FieldObjectGetBerryTreeId
- lsls r0, 24
- lsrs r0, 24
- bl GetStageByBerryTreeId
- lsls r0, 24
- cmp r0, 0
- bne _080B4A64
- movs r0, 0x1
- b _080B4A66
- .align 2, 0
-_080B4A5C: .4byte BerryTreeScript
-_080B4A60: .4byte gSelectedMapObject
-_080B4A64:
- movs r0, 0
-_080B4A66:
- pop {r1}
- bx r1
- thumb_func_end IsPlayerFacingPlantedBerryTree
-
- thumb_func_start WaterBerryTree
-WaterBerryTree: @ 80B4A6C
- push {lr}
- bl GetFieldObjectScriptPointerForComparison
- ldr r1, _080B4A84 @ =BerryTreeScript
- cmp r0, r1
- bne _080B4A88
- bl FieldObjectInteractionWaterBerryTree
- lsls r0, 24
- lsrs r0, 24
- b _080B4A8A
- .align 2, 0
-_080B4A84: .4byte BerryTreeScript
-_080B4A88:
- movs r0, 0
-_080B4A8A:
- pop {r1}
- bx r1
- thumb_func_end WaterBerryTree
-
- thumb_func_start sub_80B4A90
-sub_80B4A90: @ 80B4A90
- push {r4,lr}
- ldr r1, _080B4AB4 @ =gSaveBlock1
- ldr r0, _080B4AB8 @ =gUnknown_083CD780
- ldr r3, [r0]
- ldr r4, [r0, 0x4]
- movs r2, 0x7F
- movs r0, 0xD0
- lsls r0, 5
- adds r1, r0
-_080B4AA2:
- str r3, [r1]
- str r4, [r1, 0x4]
- subs r1, 0x8
- subs r2, 0x1
- cmp r2, 0
- bge _080B4AA2
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080B4AB4: .4byte gSaveBlock1
-_080B4AB8: .4byte gUnknown_083CD780
- thumb_func_end sub_80B4A90
-
- thumb_func_start BerryTreeGrow
-BerryTreeGrow: @ 80B4ABC
- push {r4,lr}
- adds r4, r0, 0
- ldrb r1, [r4, 0x1]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- beq _080B4ACE
-_080B4ACA:
- movs r0, 0
- b _080B4B5A
-_080B4ACE:
- lsls r0, r1, 25
- lsrs r0, 25
- cmp r0, 0x5
- bhi _080B4B58
- lsls r0, 2
- ldr r1, _080B4AE0 @ =_080B4AE4
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_080B4AE0: .4byte _080B4AE4
- .align 2, 0
-_080B4AE4:
- .4byte _080B4ACA
- .4byte _080B4B04
- .4byte _080B4B04
- .4byte _080B4B04
- .4byte _080B4AFC
- .4byte _080B4B1C
-_080B4AFC:
- adds r0, r4, 0
- bl CalcBerryYield
- strb r0, [r4, 0x4]
-_080B4B04:
- ldrb r2, [r4, 0x1]
- lsls r1, r2, 25
- lsrs r1, 25
- adds r1, 0x1
- movs r0, 0x7F
- ands r1, r0
- movs r0, 0x80
- negs r0, r0
- ands r0, r2
- orrs r0, r1
- strb r0, [r4, 0x1]
- b _080B4B58
-_080B4B1C:
- ldrb r0, [r4, 0x5]
- movs r1, 0x11
- negs r1, r1
- ands r1, r0
- movs r0, 0x21
- negs r0, r0
- ands r1, r0
- subs r0, 0x20
- ands r1, r0
- movs r0, 0x7F
- ands r1, r0
- movs r0, 0
- strb r0, [r4, 0x4]
- ldrb r2, [r4, 0x1]
- subs r0, 0x80
- ands r0, r2
- movs r2, 0x2
- orrs r0, r2
- strb r0, [r4, 0x1]
- adds r1, 0x1
- movs r0, 0xF
- ands r1, r0
- strb r1, [r4, 0x5]
- cmp r1, 0xA
- bne _080B4B58
- ldr r0, _080B4B60 @ =gUnknown_083CD780
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [r4]
- str r1, [r4, 0x4]
-_080B4B58:
- movs r0, 0x1
-_080B4B5A:
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080B4B60: .4byte gUnknown_083CD780
- thumb_func_end BerryTreeGrow
-
- thumb_func_start BerryTreeTimeUpdate
-BerryTreeTimeUpdate: @ 80B4B64
- push {r4-r7,lr}
- adds r6, r0, 0
- movs r2, 0
-_080B4B6A:
- lsls r0, r2, 3
- ldr r1, _080B4BAC @ =gSaveBlock1 + 0x1608
- adds r4, r0, r1
- ldrb r0, [r4]
- adds r7, r2, 0x1
- cmp r0, 0
- beq _080B4BF8
- ldrb r1, [r4, 0x1]
- movs r0, 0x7F
- ands r0, r1
- cmp r0, 0
- beq _080B4BF8
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _080B4BF8
- ldrb r0, [r4]
- bl GetStageDurationByBerryType
- lsls r0, 16
- lsrs r0, 16
- lsls r1, r0, 3
- adds r1, r0
- lsls r1, 3
- subs r1, r0
- cmp r6, r1
- blt _080B4BB4
- ldr r0, _080B4BB0 @ =gUnknown_083CD780
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [r4]
- str r1, [r4, 0x4]
- b _080B4BF8
- .align 2, 0
-_080B4BAC: .4byte gSaveBlock1 + 0x1608
-_080B4BB0: .4byte gUnknown_083CD780
-_080B4BB4:
- adds r5, r6, 0
- cmp r5, 0
- beq _080B4BF8
- ldrh r1, [r4, 0x2]
- cmp r1, r5
- ble _080B4BC4
- subs r0, r1, r5
- b _080B4BF6
-_080B4BC4:
- subs r5, r1
- ldrb r0, [r4]
- bl GetStageDurationByBerryType
- strh r0, [r4, 0x2]
- adds r0, r4, 0
- bl BerryTreeGrow
- cmp r0, 0
- beq _080B4BF8
- ldrb r1, [r4, 0x1]
- movs r0, 0x7F
- ands r0, r1
- cmp r0, 0x5
- bne _080B4BE8
- ldrh r0, [r4, 0x2]
- lsls r0, 2
- strh r0, [r4, 0x2]
-_080B4BE8:
- cmp r5, 0
- beq _080B4BF8
- ldrh r0, [r4, 0x2]
- adds r1, r0, 0
- cmp r0, r5
- ble _080B4BC4
- subs r0, r5
-_080B4BF6:
- strh r0, [r4, 0x2]
-_080B4BF8:
- adds r2, r7, 0
- cmp r2, 0x7F
- ble _080B4B6A
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end BerryTreeTimeUpdate
-
- thumb_func_start PlantBerryTree
-PlantBerryTree: @ 80B4C04
- push {r4-r7,lr}
- adds r4, r1, 0
- adds r5, r2, 0
- lsls r0, 24
- lsrs r0, 24
- lsls r4, 24
- lsrs r4, 24
- lsls r5, 24
- lsrs r5, 24
- lsls r3, 24
- lsrs r7, r3, 24
- bl GetBerryTreeInfo
- adds r6, r0, 0
- ldr r0, _080B4C68 @ =gUnknown_083CD780
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [r6]
- str r1, [r6, 0x4]
- strb r4, [r6]
- adds r0, r4, 0
- bl GetStageDurationByBerryType
- strh r0, [r6, 0x2]
- movs r1, 0x7F
- ands r1, r5
- ldrb r2, [r6, 0x1]
- movs r0, 0x80
- negs r0, r0
- ands r0, r2
- orrs r0, r1
- strb r0, [r6, 0x1]
- cmp r5, 0x5
- bne _080B4C56
- adds r0, r6, 0
- bl CalcBerryYield
- strb r0, [r6, 0x4]
- ldrh r0, [r6, 0x2]
- lsls r0, 2
- strh r0, [r6, 0x2]
-_080B4C56:
- cmp r7, 0
- bne _080B4C62
- ldrb r0, [r6, 0x1]
- movs r1, 0x80
- orrs r0, r1
- strb r0, [r6, 0x1]
-_080B4C62:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080B4C68: .4byte gUnknown_083CD780
- thumb_func_end PlantBerryTree
-
- thumb_func_start RemoveBerryTree
-RemoveBerryTree: @ 80B4C6C
- lsls r0, 24
- ldr r1, _080B4C84 @ =gSaveBlock1
- lsrs r0, 21
- ldr r2, _080B4C88 @ =0x00001608
- adds r1, r2
- adds r0, r1
- ldr r1, _080B4C8C @ =gUnknown_083CD780
- ldr r2, [r1, 0x4]
- ldr r1, [r1]
- str r1, [r0]
- str r2, [r0, 0x4]
- bx lr
- .align 2, 0
-_080B4C84: .4byte gSaveBlock1
-_080B4C88: .4byte 0x00001608
-_080B4C8C: .4byte gUnknown_083CD780
- thumb_func_end RemoveBerryTree
-
- thumb_func_start GetBerryTypeByBerryTreeId
-GetBerryTypeByBerryTreeId: @ 80B4C90
- lsls r0, 24
- ldr r1, _080B4CA0 @ =gSaveBlock1
- lsrs r0, 21
- adds r0, r1
- ldr r1, _080B4CA4 @ =0x00001608
- adds r0, r1
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_080B4CA0: .4byte gSaveBlock1
-_080B4CA4: .4byte 0x00001608
- thumb_func_end GetBerryTypeByBerryTreeId
-
- thumb_func_start GetStageByBerryTreeId
-GetStageByBerryTreeId: @ 80B4CA8
- lsls r0, 24
- ldr r1, _080B4CBC @ =gSaveBlock1
- lsrs r0, 21
- adds r0, r1
- ldr r1, _080B4CC0 @ =0x00001609
- adds r0, r1
- ldrb r0, [r0]
- lsls r0, 25
- lsrs r0, 25
- bx lr
- .align 2, 0
-_080B4CBC: .4byte gSaveBlock1
-_080B4CC0: .4byte 0x00001609
- thumb_func_end GetStageByBerryTreeId
-
- thumb_func_start ItemIdToBerryType
-ItemIdToBerryType: @ 80B4CC4
- push {lr}
- lsls r0, 16
- lsrs r1, r0, 16
- ldr r2, _080B4CE0 @ =0xff7b0000
- adds r0, r2
- lsrs r0, 16
- cmp r0, 0x2A
- bhi _080B4CE4
- adds r0, r1, 0
- adds r0, 0x7C
- lsls r0, 24
- lsrs r0, 24
- b _080B4CE6
- .align 2, 0
-_080B4CE0: .4byte 0xff7b0000
-_080B4CE4:
- movs r0, 0x1
-_080B4CE6:
- pop {r1}
- bx r1
- thumb_func_end ItemIdToBerryType
-
- thumb_func_start BerryTypeToItemId
-BerryTypeToItemId: @ 80B4CEC
- push {lr}
- lsls r0, 16
- lsrs r1, r0, 16
- ldr r2, _080B4D08 @ =0xffff0000
- adds r0, r2
- lsrs r0, 16
- cmp r0, 0x2A
- bhi _080B4D0C
- adds r0, r1, 0
- adds r0, 0x84
- lsls r0, 16
- lsrs r0, 16
- b _080B4D0E
- .align 2, 0
-_080B4D08: .4byte 0xffff0000
-_080B4D0C:
- movs r0, 0x85
-_080B4D0E:
- pop {r1}
- bx r1
- thumb_func_end BerryTypeToItemId
-
- thumb_func_start GetBerryNameByBerryType
-GetBerryNameByBerryType: @ 80B4D14
- push {r4,lr}
- adds r4, r1, 0
- lsls r0, 24
- lsrs r0, 24
- bl GetBerryInfo
- adds r1, r0, 0
- adds r0, r4, 0
- movs r2, 0x6
- bl memcpy
- movs r0, 0xFF
- strb r0, [r4, 0x6]
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end GetBerryNameByBerryType
-
- thumb_func_start ResetBerryTreeSparkleFlag
-ResetBerryTreeSparkleFlag: @ 80B4D34
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- bl GetBerryTreeInfo
- ldrb r2, [r0, 0x1]
- movs r1, 0x7F
- ands r1, r2
- strb r1, [r0, 0x1]
- pop {r0}
- bx r0
- thumb_func_end ResetBerryTreeSparkleFlag
-
- thumb_func_start BerryTreeGetNumStagesWatered
-BerryTreeGetNumStagesWatered: @ 80B4D4C
- push {lr}
- ldrb r2, [r0, 0x5]
- movs r0, 0x10
- ands r0, r2
- lsls r0, 24
- lsrs r0, 24
- negs r0, r0
- lsrs r1, r0, 31
- movs r0, 0x20
- ands r0, r2
- cmp r0, 0
- beq _080B4D66
- adds r1, 0x1
-_080B4D66:
- movs r0, 0x40
- ands r0, r2
- cmp r0, 0
- beq _080B4D74
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
-_080B4D74:
- movs r0, 0x80
- ands r0, r2
- cmp r0, 0
- beq _080B4D82
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
-_080B4D82:
- adds r0, r1, 0
- pop {r1}
- bx r1
- thumb_func_end BerryTreeGetNumStagesWatered
-
- thumb_func_start GetNumStagesWateredByBerryTreeId
-GetNumStagesWateredByBerryTreeId: @ 80B4D88
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- bl GetBerryTreeInfo
- bl BerryTreeGetNumStagesWatered
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- thumb_func_end GetNumStagesWateredByBerryTreeId
-
- thumb_func_start CalcBerryYieldInternal
-CalcBerryYieldInternal: @ 80B4DA0
- push {r4-r6,lr}
- lsls r0, 16
- lsrs r0, 16
- lsls r1, 16
- lsrs r6, r1, 16
- lsls r2, 24
- lsrs r2, 24
- cmp r2, 0
- bne _080B4DB6
- lsls r0, r6, 24
- b _080B4DEA
-_080B4DB6:
- subs r1, r0, r6
- subs r0, r2, 0x1
- adds r5, r1, 0
- muls r5, r0
- adds r4, r1, 0
- muls r4, r2
- bl Random
- lsls r0, 16
- lsrs r0, 16
- subs r4, r5
- adds r4, 0x1
- adds r1, r4, 0
- bl __umodsi3
- adds r5, r0
- movs r0, 0x3
- ands r0, r5
- cmp r0, 0x1
- bls _080B4DE4
- lsrs r0, r5, 2
- adds r0, 0x1
- b _080B4DE6
-_080B4DE4:
- lsrs r0, r5, 2
-_080B4DE6:
- adds r0, r6
- lsls r0, 24
-_080B4DEA:
- lsrs r0, 24
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end CalcBerryYieldInternal
-
- thumb_func_start CalcBerryYield
-CalcBerryYield: @ 80B4DF4
- push {r4-r6,lr}
- adds r4, r0, 0
- ldrb r0, [r4]
- bl GetBerryInfo
- ldrb r6, [r0, 0xB]
- ldrb r5, [r0, 0xA]
- adds r0, r4, 0
- bl BerryTreeGetNumStagesWatered
- adds r2, r0, 0
- lsls r2, 24
- lsrs r2, 24
- adds r0, r5, 0
- adds r1, r6, 0
- bl CalcBerryYieldInternal
- lsls r0, 24
- lsrs r0, 24
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end CalcBerryYield
-
- thumb_func_start GetBerryCountByBerryTreeId
-GetBerryCountByBerryTreeId: @ 80B4E20
- lsls r0, 24
- ldr r1, _080B4E30 @ =gSaveBlock1
- lsrs r0, 21
- adds r0, r1
- ldr r1, _080B4E34 @ =0x0000160c
- adds r0, r1
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_080B4E30: .4byte gSaveBlock1
-_080B4E34: .4byte 0x0000160c
- thumb_func_end GetBerryCountByBerryTreeId
-
- thumb_func_start GetStageDurationByBerryType
-GetStageDurationByBerryType: @ 80B4E38
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- bl GetBerryInfo
- ldrb r1, [r0, 0x14]
- lsls r0, r1, 4
- subs r0, r1
- lsls r0, 18
- lsrs r0, 16
- pop {r1}
- bx r1
- thumb_func_end GetStageDurationByBerryType
-
- thumb_func_start FieldObjectInteractionGetBerryTreeData
-FieldObjectInteractionGetBerryTreeData: @ 80B4E50
- push {r4-r6,lr}
- ldr r0, _080B4E8C @ =gSelectedMapObject
- ldrb r0, [r0]
- bl FieldObjectGetBerryTreeId
- lsls r0, 24
- lsrs r5, r0, 24
- adds r0, r5, 0
- bl GetBerryTypeByBerryTreeId
- lsls r0, 24
- lsrs r6, r0, 24
- adds r0, r5, 0
- bl ResetBerryTreeSparkleFlag
- ldr r0, _080B4E90 @ =gUnknown_0202E8DE
- ldrb r0, [r0]
- ldr r2, _080B4E94 @ =gSaveBlock1
- ldrb r1, [r2, 0x5]
- ldrb r2, [r2, 0x4]
- bl sub_8060234
- lsls r0, 24
- cmp r0, 0
- beq _080B4E9C
- ldr r1, _080B4E98 @ =gUnknown_0202E8CC
- movs r0, 0xFF
- strh r0, [r1]
- b _080B4EAA
- .align 2, 0
-_080B4E8C: .4byte gSelectedMapObject
-_080B4E90: .4byte gUnknown_0202E8DE
-_080B4E94: .4byte gSaveBlock1
-_080B4E98: .4byte gUnknown_0202E8CC
-_080B4E9C:
- ldr r4, _080B4ED4 @ =gUnknown_0202E8CC
- adds r0, r5, 0
- bl GetStageByBerryTreeId
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r4]
-_080B4EAA:
- ldr r4, _080B4ED8 @ =gUnknown_0202E8CE
- adds r0, r5, 0
- bl GetNumStagesWateredByBerryTreeId
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r4]
- ldr r4, _080B4EDC @ =gUnknown_0202E8D0
- adds r0, r5, 0
- bl GetBerryCountByBerryTreeId
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r4]
- ldr r1, _080B4EE0 @ =gStringVar1
- adds r0, r6, 0
- bl GetBerryNameByBerryType
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080B4ED4: .4byte gUnknown_0202E8CC
-_080B4ED8: .4byte gUnknown_0202E8CE
-_080B4EDC: .4byte gUnknown_0202E8D0
-_080B4EE0: .4byte gStringVar1
- thumb_func_end FieldObjectInteractionGetBerryTreeData
-
- thumb_func_start sub_80B4EE4
-sub_80B4EE4: @ 80B4EE4
- push {lr}
- ldr r0, _080B4EF0 @ =sub_80A68CC
- bl SetMainCallback2
- pop {r0}
- bx r0
- .align 2, 0
-_080B4EF0: .4byte sub_80A68CC
- thumb_func_end sub_80B4EE4
-
- thumb_func_start FieldObjectInteractionPlantBerryTree
-FieldObjectInteractionPlantBerryTree: @ 80B4EF4
- push {r4,lr}
- ldr r0, _080B4F24 @ =word_203855E
- ldrh r0, [r0]
- bl ItemIdToBerryType
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- ldr r0, _080B4F28 @ =gSelectedMapObject
- ldrb r0, [r0]
- bl FieldObjectGetBerryTreeId
- lsls r0, 24
- lsrs r0, 24
- adds r1, r4, 0
- movs r2, 0x1
- movs r3, 0x1
- bl PlantBerryTree
- bl FieldObjectInteractionGetBerryTreeData
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080B4F24: .4byte word_203855E
-_080B4F28: .4byte gSelectedMapObject
- thumb_func_end FieldObjectInteractionPlantBerryTree
-
- thumb_func_start FieldObjectInteractionPickBerryTree
-FieldObjectInteractionPickBerryTree: @ 80B4F2C
- push {r4-r6,lr}
- ldr r0, _080B4F70 @ =gSelectedMapObject
- ldrb r0, [r0]
- bl FieldObjectGetBerryTreeId
- adds r5, r0, 0
- lsls r5, 24
- lsrs r5, 24
- adds r0, r5, 0
- bl GetBerryTypeByBerryTreeId
- lsls r0, 24
- lsrs r0, 24
- ldr r6, _080B4F74 @ =gUnknown_0202E8CC
- bl BerryTypeToItemId
- adds r4, r0, 0
- lsls r4, 16
- lsrs r4, 16
- adds r0, r5, 0
- bl GetBerryCountByBerryTreeId
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl AddBagItem
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r6]
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080B4F70: .4byte gSelectedMapObject
-_080B4F74: .4byte gUnknown_0202E8CC
- thumb_func_end FieldObjectInteractionPickBerryTree
-
- thumb_func_start FieldObjectInteractionRemoveBerryTree
-FieldObjectInteractionRemoveBerryTree: @ 80B4F78
- push {lr}
- ldr r0, _080B4F9C @ =gSelectedMapObject
- ldrb r0, [r0]
- bl FieldObjectGetBerryTreeId
- lsls r0, 24
- lsrs r0, 24
- bl RemoveBerryTree
- ldr r0, _080B4FA0 @ =gUnknown_0202E8DE
- ldrb r0, [r0]
- ldr r2, _080B4FA4 @ =gSaveBlock1
- ldrb r1, [r2, 0x5]
- ldrb r2, [r2, 0x4]
- bl sub_8060288
- pop {r0}
- bx r0
- .align 2, 0
-_080B4F9C: .4byte gSelectedMapObject
-_080B4FA0: .4byte gUnknown_0202E8DE
-_080B4FA4: .4byte gSaveBlock1
- thumb_func_end FieldObjectInteractionRemoveBerryTree
-
- thumb_func_start PlayerHasBerries
-PlayerHasBerries: @ 80B4FA8
- push {lr}
- movs r0, 0x4
- bl IsBagPocketNonEmpty
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- thumb_func_end PlayerHasBerries
-
- thumb_func_start ResetBerryTreeSparkleFlags
-ResetBerryTreeSparkleFlags: @ 80B4FB8
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- mov r4, sp
- adds r4, 0x2
- mov r0, sp
- adds r1, r4, 0
- bl GetCameraCoords
- mov r0, sp
- ldrh r2, [r0]
- ldrh r1, [r4]
- adds r1, 0x3
- adds r3, r2, 0
- adds r3, 0xE
- lsls r1, 16
- movs r5, 0x80
- lsls r5, 12
- adds r0, r1, r5
- lsrs r0, 16
- mov r10, r0
- mov r5, sp
- lsls r2, 16
- asrs r2, 16
- mov r9, r2
- ldr r4, _080B5050 @ =gMapObjects
- lsls r3, 16
- asrs r3, 16
- mov r8, r3
- asrs r7, r1, 16
- movs r6, 0xF
-_080B4FFC:
- ldrb r0, [r4]
- lsls r0, 31
- cmp r0, 0
- beq _080B5038
- ldrb r0, [r4, 0x6]
- cmp r0, 0xC
- bne _080B5038
- ldrh r0, [r4, 0x10]
- strh r0, [r5]
- ldrh r0, [r4, 0x12]
- mov r1, sp
- strh r0, [r1, 0x2]
- movs r2, 0
- ldrsh r1, [r5, r2]
- cmp r9, r1
- bgt _080B5038
- cmp r1, r8
- bgt _080B5038
- lsls r0, 16
- asrs r1, r0, 16
- cmp r7, r1
- bgt _080B5038
- mov r2, r10
- lsls r0, r2, 16
- asrs r0, 16
- cmp r1, r0
- bgt _080B5038
- ldrb r0, [r4, 0x1D]
- bl ResetBerryTreeSparkleFlag
-_080B5038:
- adds r4, 0x24
- subs r6, 0x1
- cmp r6, 0
- bge _080B4FFC
- add sp, 0x4
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080B5050: .4byte gMapObjects
- thumb_func_end ResetBerryTreeSparkleFlags
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/constants/songs.s b/constants/songs.s
index 42c9d23e2..a89376983 100644
--- a/constants/songs.s
+++ b/constants/songs.s
@@ -365,3 +365,5 @@
.equiv BGM_BATTLE35, 464
.equiv BGM_BATTLE38, 465
.equiv BGM_BATTLE30, 466
+
+ .equiv BGM_ROUTE_118, 0x7fff
diff --git a/data/maps/Route118/header.s b/data/maps/Route118/header.s
index 6b8ec4763..5b1190621 100644
--- a/data/maps/Route118/header.s
+++ b/data/maps/Route118/header.s
@@ -3,7 +3,7 @@ Route118:: @ 83057E4
.4byte Route118_MapEvents
.4byte Route118_MapScripts
.4byte Route118_MapConnections
- .2byte 0x7fff
+ .2byte BGM_ROUTE_118
.2byte 34
.byte 33
.byte 0
diff --git a/ld_script.txt b/ld_script.txt
index 2bff38424..a0d6fd441 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -114,7 +114,7 @@ SECTIONS {
asm/matuda_debug_menu.o(.text);
asm/contest.o(.text);
asm/shop.o(.text);
- asm/berry.o(.text);
+ src/berry.o(.text);
asm/script_menu.o(.text);
asm/naming_screen.o(.text);
asm/money.o(.text);
diff --git a/src/berry.c b/src/berry.c
new file mode 100644
index 000000000..11d261790
--- /dev/null
+++ b/src/berry.c
@@ -0,0 +1,471 @@
+#include "global.h"
+
+#define FIRST_BERRY 0x85 // ITEM_CHERI_BERRY
+#define LAST_BERRY 0xaf // ITEM_ENIGMA_BERRY
+
+extern u8 GetStageByBerryTreeId(u8);
+extern u16 GetStageDurationByBerryType(u8);
+extern void SetMainCallback2(void*);
+extern void sub_80A68CC();
+extern u16 Random(void);
+extern u8 sub_8060234(u8, u8, u8);
+extern u8 AddBagItem(u16, u8);
+extern void sub_8060288(u8, u8, u8);
+extern u8 IsBagPocketNonEmpty(u8);
+extern void GetCameraCoords(s16*, s16*);
+extern u8 FieldObjectGetBerryTreeId(u8);
+extern u8 *GetFieldObjectScriptPointerForComparison();
+
+extern struct Berry gBerries[];
+extern u8 BerryTreeScript;
+extern struct BerryTree gUnknown_083CD780;
+extern u16 gUnknown_0202E8DE;
+extern u16 gUnknown_0202E8CC;
+extern u16 gUnknown_0202E8CE;
+extern u16 gUnknown_0202E8D0;
+
+u8 CalcBerryYield(struct BerryTree *tree);
+
+void unref_sub_80B4884(void)
+{
+ CpuFill16(0, &gSaveBlock1.enigmaBerry, sizeof(gSaveBlock1.enigmaBerry));
+}
+
+// setEnigmaBerry
+void sub_80B48A8(u8 *src)
+{
+ u8 *dest;
+ struct SaveBlock1 *saveBlock;
+ unsigned int i;
+ dest = (u8*)&gSaveBlock1.enigmaBerry;
+ saveBlock = &gSaveBlock1;
+ for (i = 0; i < sizeof(gSaveBlock1.enigmaBerry); i++)
+ {
+ dest[i] = src[i];
+ }
+ gSaveBlock1.enigmaBerry.berry.description1 = gSaveBlock1.enigmaBerry.description1;
+ gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2;
+}
+
+// checksum
+u32 sub_80B48F8(struct EnigmaBerry *enigmaBerry)
+{
+ u8 *description1;
+ u8 *description2;
+ unsigned int i;
+ u32 checksum;
+ u8 *dest;
+
+ description1 = gSaveBlock1.enigmaBerry.berry.description1;
+ description2 = gSaveBlock1.enigmaBerry.berry.description2;
+ gSaveBlock1.enigmaBerry.berry.description1 = 0;
+ gSaveBlock1.enigmaBerry.berry.description2 = 0;
+
+ dest = (u8*)enigmaBerry;
+ checksum = 0;
+ for (i = 0; i < ((int)&gSaveBlock1.enigmaBerry.checksum - (int)&gSaveBlock1.enigmaBerry); i++)
+ {
+ checksum += dest[i];
+ }
+
+ gSaveBlock1.enigmaBerry.berry.description1 = description1;
+ gSaveBlock1.enigmaBerry.berry.description2 = description2;
+
+ return checksum;
+}
+
+int sub_80B4940(void)
+{
+ if (!gSaveBlock1.enigmaBerry.berry.stageDuration)
+ return 0;
+ if (!gSaveBlock1.enigmaBerry.berry.maxYield)
+ return 0;
+ if (sub_80B48F8(&gSaveBlock1.enigmaBerry) != gSaveBlock1.enigmaBerry.checksum)
+ return 0;
+ return 1;
+}
+
+struct Berry *GetBerryInfo(u8 berry)
+{
+ if ((u8)berry == 0x2b)
+ {
+ if (sub_80B4940())
+ return &gSaveBlock1.enigmaBerry.berry;
+ }
+ if ((u8)(berry - 1) > 0x2a)
+ {
+ berry = 1;
+ }
+ return &gBerries[berry - 1];
+}
+
+struct BerryTree *GetBerryTreeInfo(u8 id)
+{
+ return &gSaveBlock1.berryTrees[id];
+}
+
+int FieldObjectInteractionWaterBerryTree(void)
+{
+ struct BerryTree *tree = GetBerryTreeInfo(FieldObjectGetBerryTreeId(gSelectedMapObject));
+ switch (tree->stage)
+ {
+ case 1:
+ tree->watered1 = 1;
+ break;
+ case 2:
+ tree->watered2 = 1;
+ break;
+ case 3:
+ tree->watered3 = 1;
+ break;
+ case 4:
+ tree->watered4 = 1;
+ break;
+ default:
+ return 0;
+ }
+ return 1;
+}
+
+int IsPlayerFacingPlantedBerryTree(void)
+{
+ if (GetFieldObjectScriptPointerForComparison() == &BerryTreeScript)
+ if (GetStageByBerryTreeId(FieldObjectGetBerryTreeId(gSelectedMapObject)) == 0)
+ return 1;
+ return 0;
+}
+
+u8 WaterBerryTree(void)
+{
+ if (GetFieldObjectScriptPointerForComparison() != &BerryTreeScript)
+ return 0;
+ return FieldObjectInteractionWaterBerryTree();
+}
+
+void sub_80B4A90(void)
+{
+ int i;
+ struct SaveBlock1 *saveBlock1 = &gSaveBlock1;
+ struct BerryTree berryTree = gUnknown_083CD780;
+ for (i = 127; i >= 0; i--)
+ {
+ saveBlock1->berryTrees[i] = berryTree;
+ }
+}
+
+int BerryTreeGrow(struct BerryTree *tree)
+{
+ if (tree->growthSparkle)
+ return 0;
+ switch (tree->stage)
+ {
+ case 0:
+ return 0;
+ case 4:
+ tree->berryYield = CalcBerryYield(tree);
+ case 1:
+ case 2:
+ case 3:
+ tree->stage++;
+ break;
+ case 5:
+ tree->watered1 = 0;
+ tree->watered2 = 0;
+ tree->watered3 = 0;
+ tree->watered4 = 0;
+ tree->berryYield = 0;
+ tree->stage = 2;
+ if (++tree->regrowthCount == 10)
+ *tree = gUnknown_083CD780;
+ break;
+ }
+ return 1;
+}
+
+void BerryTreeTimeUpdate(int time)
+{
+ int i;
+ struct BerryTree *tree;
+ int time2;
+ for (i = 0; i <= 0x7f; i++)
+ {
+ tree = &gSaveBlock1.berryTrees[i];
+
+ if (tree->berry == 0)
+ continue;
+ if (tree->stage == 0)
+ continue;
+ if (tree->growthSparkle)
+ continue;
+
+ if (time >= GetStageDurationByBerryType(tree->berry) * 71)
+ {
+ *tree = gUnknown_083CD780;
+ continue;
+ }
+
+ time2 = time;
+ if (!time2)
+ continue;
+
+ if (tree->secondsUntilNextStage > time2)
+ {
+ tree->secondsUntilNextStage -= time2;
+ time2 = tree->secondsUntilNextStage;
+ continue;
+ }
+
+ while (1)
+ {
+ time2 -= tree->secondsUntilNextStage;
+ tree->secondsUntilNextStage = GetStageDurationByBerryType(tree->berry);
+ if (BerryTreeGrow(tree))
+ {
+ if (tree->stage == 5)
+ {
+ tree->secondsUntilNextStage *= 4;
+ }
+ if (!time2)
+ {
+ break;
+ }
+ }
+ else
+ {
+ break;
+ }
+ if (tree->secondsUntilNextStage > time2)
+ {
+ tree->secondsUntilNextStage -= time2;
+ time2 = tree->secondsUntilNextStage;
+ break;
+ }
+ }
+ }
+}
+
+void PlantBerryTree(u8 id, u8 berry, u8 stage, u8 sparkle)
+{
+ struct BerryTree *tree;
+ tree = GetBerryTreeInfo(id);
+ *tree = gUnknown_083CD780;
+ tree->berry = berry;
+ tree->secondsUntilNextStage = GetStageDurationByBerryType(berry);
+ tree->stage = stage;
+ if (stage == 5)
+ {
+ tree->berryYield = CalcBerryYield(tree);
+ tree->secondsUntilNextStage *= 4;
+ }
+ if (sparkle == 0)
+ {
+ tree->growthSparkle = 1;
+ }
+}
+
+void RemoveBerryTree(u8 id)
+{
+ gSaveBlock1.berryTrees[id] = gUnknown_083CD780;
+}
+
+u8 GetBerryTypeByBerryTreeId(u8 id)
+{
+ return gSaveBlock1.berryTrees[id].berry;
+}
+
+u8 GetStageByBerryTreeId(u8 id)
+{
+ return gSaveBlock1.berryTrees[id].stage;
+}
+
+u8 ItemIdToBerryType(u16 item)
+{
+ u16 berry = item - FIRST_BERRY;
+ if (berry > LAST_BERRY - FIRST_BERRY)
+ return 1;
+ return item - FIRST_BERRY + 1;
+}
+
+u16 BerryTypeToItemId(u16 berry)
+{
+ u16 item = berry;
+ item -= 1;
+ if (item > LAST_BERRY - FIRST_BERRY)
+ return FIRST_BERRY;
+ item = berry;
+ return item + FIRST_BERRY - 1;
+}
+
+void GetBerryNameByBerryType(u8 berry, u8 *string)
+{
+ struct Berry *info;
+ info = GetBerryInfo(berry);
+ memcpy(string, info->name, 6);
+ string[6] = 0xff;
+}
+
+void ResetBerryTreeSparkleFlag(u8 id)
+{
+ struct BerryTree *tree;
+ tree = GetBerryTreeInfo(id);
+ tree->growthSparkle = 0;
+}
+
+u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree)
+{
+ u8 count = 0;
+ if (tree->watered1)
+ count++;
+ if (tree->watered2)
+ count++;
+ if (tree->watered3)
+ count++;
+ if (tree->watered4)
+ count++;
+ return count;
+}
+
+u8 GetNumStagesWateredByBerryTreeId(u8 id)
+{
+ return BerryTreeGetNumStagesWatered(GetBerryTreeInfo(id));
+}
+
+u8 CalcBerryYieldInternal(u16 a1, u16 a2, u8 a3)
+{
+ u32 v6;
+ u32 v1;
+ u32 v5;
+ u32 v4;
+ u16 random;
+ u32 ret;
+ v6 = a2;
+ if (a3 == 0)
+ return v6;
+ v1 = a1 - v6;
+ v5 = v1 * (a3 - 1);
+ v4 = v1 * a3;
+ random = Random();
+ v4 -= v5;
+ v4 += 1;
+ v5 += random % v4;
+ if ((v5 & 3) <= 1)
+ {
+ ret = v5 / 4;
+ return ret + v6;
+ }
+ else
+ {
+ ret = v5 / 4 + 1;
+ return ret + v6;
+ }
+}
+
+u8 CalcBerryYield(struct BerryTree *tree)
+{
+ struct Berry *berry = GetBerryInfo(tree->berry);
+ u8 min = berry->minYield;
+ u8 max = berry->maxYield;
+ return CalcBerryYieldInternal(max, min, BerryTreeGetNumStagesWatered(tree));
+}
+
+u8 GetBerryCountByBerryTreeId(u8 id)
+{
+ return gSaveBlock1.berryTrees[id].berryYield;
+}
+
+u16 GetStageDurationByBerryType(u8 berry)
+{
+ return GetBerryInfo(berry)->stageDuration * 60;
+}
+
+void FieldObjectInteractionGetBerryTreeData(void)
+{
+ u8 id;
+ u8 berry;
+ u8 unk;
+ u8 group;
+ u8 num;
+ id = FieldObjectGetBerryTreeId(gSelectedMapObject);
+ berry = GetBerryTypeByBerryTreeId(id);
+ ResetBerryTreeSparkleFlag(id);
+ unk = gUnknown_0202E8DE;
+ num = gSaveBlock1.location.mapNum;
+ group = gSaveBlock1.location.mapGroup;
+
+ if (sub_8060234(unk, num, group))
+ gUnknown_0202E8CC = 0xff;
+ else
+ gUnknown_0202E8CC = (u8)GetStageByBerryTreeId(id);
+
+ gUnknown_0202E8CE = (u8)GetNumStagesWateredByBerryTreeId(id);
+ gUnknown_0202E8D0 = (u8)GetBerryCountByBerryTreeId(id);
+ GetBerryNameByBerryType(berry, gStringVar1);
+}
+
+void sub_80B4EE4(void)
+{
+ SetMainCallback2(sub_80A68CC);
+}
+
+void FieldObjectInteractionPlantBerryTree(void)
+{
+ extern u16 word_203855E;
+ u8 berry = ItemIdToBerryType(word_203855E);
+ PlantBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject), berry, 1, 1);
+ FieldObjectInteractionGetBerryTreeData();
+}
+
+void FieldObjectInteractionPickBerryTree(void)
+{
+ u8 id;
+ u8 berry;
+ id = FieldObjectGetBerryTreeId(gSelectedMapObject);
+ berry = GetBerryTypeByBerryTreeId(id);
+ gUnknown_0202E8CC = AddBagItem(BerryTypeToItemId(berry), GetBerryCountByBerryTreeId(id));
+}
+
+void FieldObjectInteractionRemoveBerryTree(void)
+{
+ u8 id;
+ u8 unk;
+ u8 group, num;
+ id = FieldObjectGetBerryTreeId(gSelectedMapObject);
+ RemoveBerryTree(id);
+ unk = gUnknown_0202E8DE;
+ num = gSaveBlock1.location.mapNum;
+ group = gSaveBlock1.location.mapGroup;
+ sub_8060288(unk, num, group);
+}
+
+u8 PlayerHasBerries(void)
+{
+ return IsBagPocketNonEmpty(4);
+}
+
+void ResetBerryTreeSparkleFlags(void)
+{
+ s16 cam_left;
+ s16 cam_top;
+ s16 left;
+ s16 top;
+ s16 right;
+ s16 bottom;
+ int i;
+
+ GetCameraCoords(&cam_left, &cam_top);
+ left = cam_left;
+ top = cam_top + 3;
+ right = cam_left + 14;
+ bottom = top + 8;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (gMapObjects[i].active && gMapObjects[i].animPattern == 12)
+ {
+ cam_left = gMapObjects[i].coords2.x;
+ cam_top = gMapObjects[i].coords2.y;
+ if (left <= cam_left && cam_left <= right && top <= cam_top && cam_top <= bottom)
+ ResetBerryTreeSparkleFlag(gMapObjects[i].trainerRange_berryTreeId);
+ }
+ }
+}