diff options
-rw-r--r-- | asm/berry.s | 311 | ||||
-rw-r--r-- | asm/berry_crush_3.s | 4 | ||||
-rw-r--r-- | data/data_835B488.s | 7 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/berry.c | 169 |
5 files changed, 174 insertions, 319 deletions
diff --git a/asm/berry.s b/asm/berry.s deleted file mode 100644 index 5537e3590..000000000 --- a/asm/berry.s +++ /dev/null @@ -1,311 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_809C718 -sub_809C718: @ 809C718 - push {r4,r5,lr} - ldr r2, _0809C778 @ =gSaveBlock1Ptr - ldr r1, [r2] - ldr r0, _0809C77C @ =gUnknown_83DF7E8 - ldr r3, _0809C780 @ =0x000030ec - adds r1, r3 - movs r4, 0x93 - lsls r4, 3 - adds r0, r4 - ldm r0!, {r3-r5} - stm r1!, {r3-r5} - ldm r0!, {r3-r5} - stm r1!, {r3-r5} - ldr r0, [r0] - str r0, [r1] - movs r1, 0 - adds r4, r2, 0 - adds r5, r4, 0 - ldr r3, _0809C784 @ =0x00003108 - movs r2, 0 -_0809C740: - ldr r0, [r5] - adds r0, r3 - adds r0, r1 - strb r2, [r0] - adds r1, 0x1 - cmp r1, 0x11 - ble _0809C740 - ldr r0, [r4] - ldr r5, _0809C788 @ =0x0000311a - adds r0, r5 - movs r1, 0 - strb r1, [r0] - ldr r0, [r4] - ldr r2, _0809C78C @ =0x0000311b - adds r0, r2 - strb r1, [r0] - ldr r0, [r4] - ldr r3, _0809C780 @ =0x000030ec - adds r0, r3 - bl GetEnigmaBerryChecksum - ldr r1, [r4] - ldr r4, _0809C790 @ =0x0000311c - adds r1, r4 - str r0, [r1] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0809C778: .4byte gSaveBlock1Ptr -_0809C77C: .4byte gUnknown_83DF7E8 -_0809C780: .4byte 0x000030ec -_0809C784: .4byte 0x00003108 -_0809C788: .4byte 0x0000311a -_0809C78C: .4byte 0x0000311b -_0809C790: .4byte 0x0000311c - thumb_func_end sub_809C718 - - thumb_func_start sub_809C794 -sub_809C794: @ 809C794 - push {lr} - sub sp, 0x4 - mov r1, sp - movs r0, 0 - strh r0, [r1] - ldr r0, _0809C7B8 @ =gSaveBlock1Ptr - ldr r1, [r0] - ldr r0, _0809C7BC @ =0x000030ec - adds r1, r0 - ldr r2, _0809C7C0 @ =0x0100001a - mov r0, sp - bl CpuSet - bl sub_809C718 - add sp, 0x4 - pop {r0} - bx r0 - .align 2, 0 -_0809C7B8: .4byte gSaveBlock1Ptr -_0809C7BC: .4byte 0x000030ec -_0809C7C0: .4byte 0x0100001a - thumb_func_end sub_809C794 - - thumb_func_start SetEnigmaBerry -SetEnigmaBerry: @ 809C7C4 - push {r4-r7,lr} - adds r4, r0, 0 - bl sub_809C794 - adds r5, r4, 0 - ldr r0, _0809C824 @ =gSaveBlock1Ptr - ldr r2, [r0] - ldr r0, _0809C828 @ =0x000030ec - adds r4, r2, r0 - adds r1, r4, 0 - adds r0, r5, 0 - ldm r0!, {r3,r6,r7} - stm r1!, {r3,r6,r7} - ldm r0!, {r3,r6,r7} - stm r1!, {r3,r6,r7} - ldr r0, [r0] - str r0, [r1] - movs r3, 0 - ldr r0, _0809C82C @ =0x00003108 - adds r6, r2, r0 - ldr r1, _0809C830 @ =0x00000516 - adds r2, r5, r1 -_0809C7F0: - adds r0, r6, r3 - adds r1, r2, r3 - ldrb r1, [r1] - strb r1, [r0] - adds r3, 0x1 - cmp r3, 0x11 - ble _0809C7F0 - movs r3, 0xA5 - lsls r3, 3 - adds r0, r5, r3 - ldrb r0, [r0] - adds r1, r4, 0 - adds r1, 0x2E - strb r0, [r1] - ldr r6, _0809C834 @ =0x00000529 - adds r0, r5, r6 - ldrb r0, [r0] - adds r1, 0x1 - strb r0, [r1] - adds r0, r4, 0 - bl GetEnigmaBerryChecksum - str r0, [r4, 0x30] - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0809C824: .4byte gSaveBlock1Ptr -_0809C828: .4byte 0x000030ec -_0809C82C: .4byte 0x00003108 -_0809C830: .4byte 0x00000516 -_0809C834: .4byte 0x00000529 - thumb_func_end SetEnigmaBerry - - thumb_func_start GetEnigmaBerryChecksum -GetEnigmaBerryChecksum: @ 809C838 - push {lr} - adds r3, r0, 0 - movs r2, 0 - movs r1, 0 -_0809C840: - adds r0, r3, r1 - ldrb r0, [r0] - adds r2, r0 - adds r1, 0x1 - cmp r1, 0x2F - bls _0809C840 - adds r0, r2, 0 - pop {r1} - bx r1 - thumb_func_end GetEnigmaBerryChecksum - - thumb_func_start IsEnigmaBerryValid -IsEnigmaBerryValid: @ 809C854 - push {r4,lr} - ldr r4, _0809C888 @ =gSaveBlock1Ptr - ldr r1, [r4] - movs r2, 0xC4 - lsls r2, 6 - adds r0, r1, r2 - ldrb r0, [r0] - cmp r0, 0 - beq _0809C898 - ldr r2, _0809C88C @ =0x000030f6 - adds r0, r1, r2 - ldrb r0, [r0] - cmp r0, 0 - beq _0809C898 - ldr r2, _0809C890 @ =0x000030ec - adds r0, r1, r2 - bl GetEnigmaBerryChecksum - ldr r1, [r4] - ldr r2, _0809C894 @ =0x0000311c - adds r1, r2 - ldr r1, [r1] - cmp r0, r1 - bne _0809C898 - movs r0, 0x1 - b _0809C89A - .align 2, 0 -_0809C888: .4byte gSaveBlock1Ptr -_0809C88C: .4byte 0x000030f6 -_0809C890: .4byte 0x000030ec -_0809C894: .4byte 0x0000311c -_0809C898: - movs r0, 0 -_0809C89A: - pop {r4} - pop {r1} - bx r1 - thumb_func_end IsEnigmaBerryValid - - thumb_func_start sub_809C8A0 -sub_809C8A0: @ 809C8A0 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x2B - bne _0809C8C4 - bl IsEnigmaBerryValid - cmp r0, 0 - beq _0809C8C4 - ldr r0, _0809C8BC @ =gSaveBlock1Ptr - ldr r0, [r0] - ldr r1, _0809C8C0 @ =0x000030ec - b _0809C8D8 - .align 2, 0 -_0809C8BC: .4byte gSaveBlock1Ptr -_0809C8C0: .4byte 0x000030ec -_0809C8C4: - subs r0, r4, 0x1 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x2A - bls _0809C8D0 - movs r4, 0x1 -_0809C8D0: - lsls r0, r4, 3 - subs r0, r4 - lsls r0, 2 - ldr r1, _0809C8E0 @ =gUnknown_83DF7CC -_0809C8D8: - adds r0, r1 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809C8E0: .4byte gUnknown_83DF7CC - thumb_func_end sub_809C8A0 - - thumb_func_start ItemIdToBerryType -ItemIdToBerryType: @ 809C8E4 - push {lr} - lsls r0, 16 - lsrs r1, r0, 16 - ldr r2, _0809C900 @ =0xff7b0000 - adds r0, r2 - lsrs r0, 16 - cmp r0, 0x2A - bhi _0809C904 - adds r0, r1, 0 - adds r0, 0x7C - lsls r0, 24 - lsrs r0, 24 - b _0809C906 - .align 2, 0 -_0809C900: .4byte 0xff7b0000 -_0809C904: - movs r0, 0x1 -_0809C906: - pop {r1} - bx r1 - thumb_func_end ItemIdToBerryType - - thumb_func_start BerryTypeToItemId -BerryTypeToItemId: @ 809C90C - push {lr} - lsls r0, 16 - lsrs r1, r0, 16 - ldr r2, _0809C928 @ =0xffff0000 - adds r0, r2 - lsrs r0, 16 - cmp r0, 0x2A - bhi _0809C92C - adds r0, r1, 0 - adds r0, 0x84 - lsls r0, 16 - lsrs r0, 16 - b _0809C92E - .align 2, 0 -_0809C928: .4byte 0xffff0000 -_0809C92C: - movs r0, 0x85 -_0809C92E: - pop {r1} - bx r1 - thumb_func_end BerryTypeToItemId - - thumb_func_start GetBerryNameByBerryType -GetBerryNameByBerryType: @ 809C934 - push {r4,lr} - adds r4, r1, 0 - lsls r0, 24 - lsrs r0, 24 - bl sub_809C8A0 - 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 - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/berry_crush_3.s b/asm/berry_crush_3.s index 23968f655..f837c4929 100644 --- a/asm/berry_crush_3.s +++ b/asm/berry_crush_3.s @@ -1537,7 +1537,7 @@ _0814E21A: lsls r1, r2, 3 subs r1, r2 lsls r1, 2 - ldr r0, _0814E294 @ =gUnknown_83DF7E8 + ldr r0, _0814E294 @ =sBerries adds r1, r0 ldr r0, _0814E298 @ =gStringVar1 bl StringCopy @@ -1591,7 +1591,7 @@ _0814E27E: bl StringCopy b _0814E2B8 .align 2, 0 -_0814E294: .4byte gUnknown_83DF7E8 +_0814E294: .4byte sBerries _0814E298: .4byte gStringVar1 _0814E29C: .4byte gUnknown_846F4B8 _0814E2A0: .4byte gStringVar4 diff --git a/data/data_835B488.s b/data/data_835B488.s index 00f0caecf..7970f26c4 100644 --- a/data/data_835B488.s +++ b/data/data_835B488.s @@ -605,12 +605,9 @@ gUnknown_83DF0F2:: @ 83DF0F2 .incbin "baserom.gba", 0x3DF0F2, 0x6 gUnknown_83DF0F8:: @ 83DF0F8 - .incbin "baserom.gba", 0x3DF0F8, 0x6D4 + .incbin "baserom.gba", 0x3DF0F8, 0x6F0 -gUnknown_83DF7CC:: @ 83DF7CC - .incbin "baserom.gba", 0x3DF7CC, 0x1C - -gUnknown_83DF7E8:: @ 83DF7E8 +sBerries:: @ 83DF7E8 .incbin "baserom.gba", 0x3DF7E8, 0x4B4 gUnknown_83DFC9C:: @ 83DFC9C diff --git a/ld_script.txt b/ld_script.txt index eeb9f6564..1a6f260bc 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -141,7 +141,7 @@ SECTIONS { asm/battle_anim_80989F8.o(.text); asm/item.o(.text); asm/shop.o(.text); - asm/berry.o(.text); + src/berry.o(.text); asm/script_menu.o(.text); asm/naming_screen.o(.text); src/money.o(.text); diff --git a/src/berry.c b/src/berry.c new file mode 100644 index 000000000..5cbcd4e90 --- /dev/null +++ b/src/berry.c @@ -0,0 +1,169 @@ +#include "global.h" +#include "berry.h" +#include "text.h" +#include "constants/items.h" + +extern const struct Berry sBerries[]; + +#define ENIGMA_BERRY_STRUCT ({const struct Berry2 *berries = (const struct Berry2 *)sBerries;berries[ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY];}) + +void sub_809C718(void) +{ + s32 i; + + gSaveBlock1Ptr->enigmaBerry.berry = ENIGMA_BERRY_STRUCT; + for (i = 0; i < 18; i++) + gSaveBlock1Ptr->enigmaBerry.itemEffect[i] = 0; + gSaveBlock1Ptr->enigmaBerry.holdEffect = 0; + gSaveBlock1Ptr->enigmaBerry.holdEffectParam = 0; + gSaveBlock1Ptr->enigmaBerry.checksum = GetEnigmaBerryChecksum(&gSaveBlock1Ptr->enigmaBerry); +} + +void sub_809C794(void) +{ + CpuFill16(0, &gSaveBlock1Ptr->enigmaBerry, sizeof(gSaveBlock1Ptr->enigmaBerry)); + sub_809C718(); +} + +#ifdef NONMATCHING +void SetEnigmaBerry(u8 * berry) +{ + struct EnigmaBerry * enigmaBerry; + + sub_809C794(); + + { + const struct Berry2 * src = (const struct Berry2 *)berry; + struct Berry2 * dest = &gSaveBlock1Ptr->enigmaBerry.berry; + *dest = *src; + } + + enigmaBerry = &gSaveBlock1Ptr->enigmaBerry; + { + s32 i = 0; + u8 * dest = gSaveBlock1Ptr->enigmaBerry.itemEffect; + const u8 * src = berry + 0x516; + + for (i = 0; i < 18; i++) dest[i] = src[i]; + } + enigmaBerry->holdEffect = berry[0x528]; + enigmaBerry->holdEffectParam = berry[0x529]; + enigmaBerry->checksum = GetEnigmaBerryChecksum(enigmaBerry); +} +#else +NAKED +void SetEnigmaBerry(u8 * berry) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tadds r4, r0, 0\n" + "\tbl sub_809C794\n" + "\tadds r5, r4, 0\n" + "\tldr r0, _0809C824 @ =gSaveBlock1Ptr\n" + "\tldr r2, [r0]\n" + "\tldr r0, _0809C828 @ =0x000030ec\n" + "\tadds r4, r2, r0\n" + "\tadds r1, r4, 0\n" + "\tadds r0, r5, 0\n" + "\tldm r0!, {r3,r6,r7}\n" + "\tstm r1!, {r3,r6,r7}\n" + "\tldm r0!, {r3,r6,r7}\n" + "\tstm r1!, {r3,r6,r7}\n" + "\tldr r0, [r0]\n" + "\tstr r0, [r1]\n" + "\tmovs r3, 0\n" + "\tldr r0, _0809C82C @ =0x00003108\n" + "\tadds r6, r2, r0\n" + "\tldr r1, _0809C830 @ =0x00000516\n" + "\tadds r2, r5, r1\n" + "_0809C7F0:\n" + "\tadds r0, r6, r3\n" + "\tadds r1, r2, r3\n" + "\tldrb r1, [r1]\n" + "\tstrb r1, [r0]\n" + "\tadds r3, 0x1\n" + "\tcmp r3, 0x11\n" + "\tble _0809C7F0\n" + "\tmovs r3, 0xA5\n" + "\tlsls r3, 3\n" + "\tadds r0, r5, r3\n" + "\tldrb r0, [r0]\n" + "\tadds r1, r4, 0\n" + "\tadds r1, 0x2E\n" + "\tstrb r0, [r1]\n" + "\tldr r6, _0809C834 @ =0x00000529\n" + "\tadds r0, r5, r6\n" + "\tldrb r0, [r0]\n" + "\tadds r1, 0x1\n" + "\tstrb r0, [r1]\n" + "\tadds r0, r4, 0\n" + "\tbl GetEnigmaBerryChecksum\n" + "\tstr r0, [r4, 0x30]\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0809C824: .4byte gSaveBlock1Ptr\n" + "_0809C828: .4byte 0x000030ec\n" + "_0809C82C: .4byte 0x00003108\n" + "_0809C830: .4byte 0x00000516\n" + "_0809C834: .4byte 0x00000529"); +} +#endif + +u32 GetEnigmaBerryChecksum(struct EnigmaBerry * enigmaBerry) +{ + const u8 * src = (const u8 *)enigmaBerry; + u32 result = 0; + u32 i; + + for (i = 0; i < offsetof(struct EnigmaBerry, checksum); i++) + result += src[i]; + + return result; +} + +bool32 IsEnigmaBerryValid(void) +{ + if (gSaveBlock1Ptr->enigmaBerry.berry.stageDuration == 0) + return FALSE; + if (gSaveBlock1Ptr->enigmaBerry.berry.maxYield == 0) + return FALSE; + if (GetEnigmaBerryChecksum(&gSaveBlock1Ptr->enigmaBerry) != gSaveBlock1Ptr->enigmaBerry.checksum) + return FALSE; + + return TRUE; +} + +const struct Berry * sub_809C8A0(u8 berryIdx) +{ + if (berryIdx == ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY + 1 && IsEnigmaBerryValid()) + return (struct Berry *)&gSaveBlock1Ptr->enigmaBerry.berry; + + if (berryIdx == 0 || berryIdx > ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY + 1) + berryIdx = 1; + + return &sBerries[berryIdx - 1]; +} + +u8 ItemIdToBerryType(u16 itemId) +{ + if (itemId - ITEM_CHERI_BERRY < 0 || itemId - ITEM_CHERI_BERRY > ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY) + return 1; + + return itemId - ITEM_CHERI_BERRY + 1; +} + +u16 BerryTypeToItemId(u16 berryType) +{ + if (berryType - 1 < 0 || berryType - 1 > ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY) + return ITEM_CHERI_BERRY; + + return berryType + ITEM_CHERI_BERRY - 1; +} + +void GetBerryNameByBerryType(u8 berryType, u8 * dest) +{ + const struct Berry * berry = sub_809C8A0(berryType); + memcpy(dest, berry->name, 6); + dest[6] = EOS; +} |