From d814f8d017c15059c8b4feab42b2a3b82d99fd7b Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 6 Sep 2026 17:16:55 -0700 Subject: [PATCH] Decomp ApplyItemEffect; replace its stale extern with the new header ApplyItemEffect (0x0231B68C, 1310 instructions in US, 1312 in EU) is the thrown/eaten item dispatcher: an item-catcher preamble, the sticky-item block, and then one switch (item->id) over a 183-entry jump table with 85 distinct case bodies, a shared tail that walks APPLES_AND_BERRIES_ITEM_IDS, and EnemyEvolution. It is the last of ten functions in asm/overlay_29_0231B33C.s and the next object in main.lsf is src/overlay_29_0231CBC8.o, so extract_function.py merges rather than splits and main.lsf is unchanged. src/dungeon_projectile_throw.c declared ApplyItemEffect itself, with a live call site. That extern is removed and the file now includes the new header instead. It is a landed, already-matching object and parameters 1-3 are exactly where a wrong spelling would surface, so its rebuild in all three regions is a check on the signature rather than tidying. case ITEM_NOTHING is written explicitly above default even though the jump table sends id 0 there. The dispatch is cmp r0,#0 / addge pc,pc,r0,lsl #2 with no rebase, and a survey of all 786 such dispatches in asm/ shows MWCC's table spans the minimum to maximum LABELLED case: 104 of the 105 rebased tables have a real case at index 0, rebases occur for offsets as small as 3, yet 40 tables have 3-7 leading default entries un-rebased and 82 have trailing default entries, which padding cannot explain. Leading and trailing default entries are therefore explicit case labels sharing default's body. The category-5/10 test that skips the switch is an if/else whose else arm is the entire switch; both arms fall into the shared tail. Case emission order is source order and is not ascending (8 before 7, 77 before 74, 136 before 113, 182 before 104, default last). The 41 callees that are still asm are declared extern in the .c with prototypes read off their own asm, as the sibling files do, and so are the 28 rodata data symbols - const, with ov10_022C4864 as s32 where the other 25 scalars are s16, which is what makes its load a 32-bit ldr. Two prototypes deliberately differ from pmdsky-debug: ApplyKeyEffect takes one parameter, not two, and CalcDamageFixedNoCategory's fifth parameter points at a one-byte object, not a struct damage_data. Region handling: seven message ids are file-scope defines at US - 0x2C1 under JAPAN, and one EU-only call to ov29_022FB920 sits inside an ifdef EUROPE with its prototype. The JP fork of the exclusive_item_effect_flags offset needs nothing - the header already models the 4-byte JP struct monster shrink. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/overlay_29_0231B33C.inc | 100 +- asm/overlay_29_0231B33C.s | 1511 --------------------------- include/overlay_29_0231CBC8.h | 2 + src/dungeon_projectile_throw.c | 2 +- src/overlay_29_0231CBC8.c | 607 +++++++++++ 5 files changed, 614 insertions(+), 1608 deletions(-) diff --git a/asm/include/overlay_29_0231B33C.inc b/asm/include/overlay_29_0231B33C.inc index a1fadad6..cd8f2944 100644 --- a/asm/include/overlay_29_0231B33C.inc +++ b/asm/include/overlay_29_0231B33C.inc @@ -1,117 +1,25 @@ #pragma once .public AbilityIsActiveVeneer -.public AddHeldItemToBag .public AnimationDelayOrSomething -.public APPLES_AND_BERRIES_ITEM_IDS -.public ApplyBlastSeedEffect -.public ApplyCalciumEffect -.public ApplyCheriBerryEffect -.public ApplyDoughSeedEffect -.public ApplyGinsengEffect -.public ApplyGonePebbleEffect -.public ApplyGracideaEffect -.public ApplyGravelyrockEffect -.public ApplyGrimyFoodEffect -.public ApplyGummiBoostsDungeonMode -.public ApplyHungerSeedEffect -.public ApplyIronEffect -.public ApplyKeyEffect -.public ApplyMixElixirEffect -.public ApplyPechaBerryEffect -.public ApplyProteinEffect -.public ApplyRawstBerryEffect -.public ApplyViaSeedEffect -.public ApplyVileSeedEffect -.public ApplyViolentSeedEffect -.public ApplyZincEffect -.public BoostIQ .public BoostSpeedOneStage -.public CACNEA_SPIKE_POWER -.public CalcDamageFixedNoCategory -.public CALCIUM_STAT_BOOST -.public CalcStatusDuration -.public CheckVariousConditions__0230156C -.public CORSOLA_TWIG_POWER -.public DealDamageProjectile -.public DetermineMonsterShadow .public DUNGEON_PTR +.public DetermineMonsterShadow .public DungeonGetSpriteIndex -.public EndNegativeStatusConditionWrapper -.public EnemyEvolution -.public EntityIsValid__0231CBC8 -.public ExclusiveItemEffectFlagTest .public FemaleToMaleForm .public FreezeAnim -.public GEO_PEBBLE_DAMAGE .public GetActiveTeamMember .public GetIdleAnimationId -.public GetItemCategoryVeneer -.public GOLD_FANG_POWER -.public GOLD_THORN_POWER -.public GRAVELEROCK_DAMAGE -.public GUMMI_STAT_BOOST -.public InitMove -.public IqSkillIsEnabled -.public IRON_STAT_BOOST -.public IRON_THORN_POWER -.public IsBagFull .public IsShaymin .public IsSkyExclusiveDungeon -.public LevelUpItemEffect -.public LIFE_SEED_HP_BOOST -.public LogMessageByIdWithPopupCheckUserTarget -.public ORAN_BERRY_FULL_HP_BOOST -.public ORAN_BERRY_HP_RESTORATION -.public OREN_BERRY_DAMAGE -.public ov10_022C44EC -.public ov10_022C4558 -.public ov10_022C4574 +.public SetMonsterTypeAndAbility +.public SwapMonsterWanFileIndex +.public UnfreezeAnim .public ov10_022C457C -.public ov10_022C4864 .public ov29_022E3590 -.public ov29_022E5A00 -.public ov29_022E5AE4 .public ov29_022E60E4 .public ov29_022E81F8 .public ov29_022E9FD0 .public ov29_022EA370 -.public ov29_022F9EA0 -.public ov29_022FB920 -.public ov29_022FB9BC .public ov29_02304830 -.public ov29_0230F9A4 -.public PlaySeByIdIfNotSilence -.public PrepareItemForPrinting__02345728 -.public PROTEIN_STAT_BOOST -.public RARE_FOSSIL_DAMAGE -.public RestoreAllMovePP -.public SetMonsterTypeAndAbility -.public SILVER_SPIKE_POWER -.public SITRUS_BERRY_FULL_HP_BOOST -.public SITRUS_BERRY_HP_RESTORATION -.public SLEEP_TURN_RANGE -.public SpawnDroppedItemWrapper -.public STICK_POWER .public sub_020017EC .public sub_0201CF80 -.public SubstitutePlaceholderStringTags -.public SwapMonsterWanFileIndex -.public TryDecreaseLevel -.public TryIncreaseBelly -.public TryIncreaseHp -.public TryInflictBlinkerStatus -.public TryInflictConfusedStatus -.public TryInflictCrossEyedStatus -.public TryInflictDropeyeStatus -.public TryInflictEyedropStatus -.public TryInflictInvisibleStatus -.public TryInflictPetrifiedStatus -.public TryInflictSleeplessStatus -.public TryInflictSleepStatus -.public TryInflictSlipStatus -.public TryWarp -.public UnfreezeAnim -.public UpdateShopkeeperModeAfterAttack -.public WaitUntilAlertBoxPauseIsOver -.public WONDER_GUMMI_STAT_BOOST -.public ZINC_STAT_BOOST diff --git a/asm/overlay_29_0231B33C.s b/asm/overlay_29_0231B33C.s index 8596e6a1..dc22e1b7 100644 --- a/asm/overlay_29_0231B33C.s +++ b/asm/overlay_29_0231B33C.s @@ -285,1514 +285,3 @@ _0231B680: .word 0x00000216 _0231B684: .word 0x00000217 _0231B688: .word DUNGEON_PTR arm_func_end ChangeShayminForme - - arm_func_start ApplyItemEffect -ApplyItemEffect: ; 0x0231B68C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #0x5c - movs sb, r0 - mov sl, r2 - mov r8, r3 - ldr r7, [sp, #0x80] - ldr r6, [sp, #0x84] - beq _0231B840 - cmp r1, #0 - bne _0231B840 - mov r0, r7 - ldr r5, [r7, #0xb4] - mov r4, #0 - bl ov29_022FB9BC - cmp r0, #0 - beq _0231B6E4 - mov r0, r8 - mov r2, r6 - add r1, r7, #4 - mov r3, r4 - bl SpawnDroppedItemWrapper - b _0231CBA4 -_0231B6E4: - ldrb r0, [r5, #6] - cmp r0, #0 - ldrsh r0, [r6, #4] - beq _0231B74C - bl GetItemCategoryVeneer - cmp r0, #0 - beq _0231B720 - ldrsh r0, [r6, #4] - bl GetItemCategoryVeneer - cmp r0, #2 - beq _0231B720 - ldrsh r0, [r6, #4] - bl GetItemCategoryVeneer - cmp r0, #1 - movne r4, #1 -_0231B720: - ldrsh r0, [r6, #4] - bl GetItemCategoryVeneer - cmp r0, #4 - bne _0231B768 - ldrsh r1, [r6, #4] - cmp r1, #0x190 - blt _0231B768 - ldr r0, _0231C6C0 ; =0x000001AB - cmp r1, r0 - movle r4, #0 - b _0231B768 -_0231B74C: - bl GetItemCategoryVeneer - cmp r0, #2 - beq _0231B768 - mov r0, r7 - mov r1, #2 - bl IqSkillIsEnabled - mov r4, r0 -_0231B768: - mov r0, r7 - bl CheckVariousConditions__0230156C - cmp r0, #0 - movne r4, #0 - cmp r4, #0 - beq _0231B840 - ldrb r0, [r5, #0x62] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - bne _0231B840 - ldrb r0, [r5, #6] - cmp r0, #0 - bne _0231B7B0 - bl IsBagFull - cmp r0, #0 - bne _0231B840 -_0231B7B0: - ldrb r0, [r5, #9] - cmp r0, #1 - bne _0231B7D4 - mov r0, r8 - mov r2, r6 - add r1, r7, #4 - mov r3, #0 - bl SpawnDroppedItemWrapper - b _0231CBA4 -_0231B7D4: - ldr r0, _0231C6C4 ; =0x00001317 - bl PlaySeByIdIfNotSilence - mov r1, r6 - mov r0, #0 - bl PrepareItemForPrinting__02345728 - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231C6C8 ; =0x00000BE6 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - ldrh r0, [r6] - strh r0, [r5, #0x62] - ldrh r0, [r6, #2] - strh r0, [r5, #0x64] - ldrh r0, [r6, #4] - strh r0, [r5, #0x66] - ldrb r0, [r5, #6] - cmp r0, #0 - bne _0231B834 - mov r0, r5 - bl AddHeldItemToBag -_0231B834: - mov r0, r7 - bl ov29_022F9EA0 - b _0231CBA4 -_0231B840: - cmp sb, #0 - beq _0231B860 - mov r0, r7 - mov r1, r6 - bl ov29_022E5A00 - mov r0, r8 - mov r1, r7 - bl UpdateShopkeeperModeAfterAttack -_0231B860: - ldrb r0, [r6] - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _0231B8E4 - mov r1, r6 - mov r0, #0 - bl PrepareItemForPrinting__02345728 - ldr r2, _0231C6CC ; =0x00000BE7 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - cmp sb, #0 - beq _0231B8E4 - add r1, sp, #0x21 - ldr r0, _0231C6D0 ; =ov10_022C4574 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - mov r0, r8 - bl EnemyEvolution - b _0231CBA4 -_0231B8E4: - cmp sb, #0 - bne _0231B8F8 - mov r0, r7 - mov r1, r6 - bl ov29_022E5AE4 -_0231B8F8: - mov r0, r8 - mov r1, r6 - bl ov29_0230F9A4 - ldrsh r0, [r6, #4] - bl GetItemCategoryVeneer - cmp r0, #2 - bne _0231B92C - mov r3, #0 - mov r0, r8 - mov r1, r7 - mov r2, #5 - str r3, [sp] - bl TryIncreaseBelly -_0231B92C: - ldrsh r0, [r6, #4] - bl GetItemCategoryVeneer - cmp r0, #5 - beq _0231B94C - ldrsh r0, [r6, #4] - bl GetItemCategoryVeneer - cmp r0, #0xa - bne _0231B9A8 -_0231B94C: - cmp sb, #0 - beq _0231B994 - add r1, sp, #0x20 - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231B994: - ldr r2, _0231C6DC ; =0x00000BE8 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231B9A8: - ldrsh r0, [r6, #4] - cmp r0, #0x19c - bgt _0231BD6C - bge _0231CA60 - cmp r0, #0x194 - bgt _0231BD00 - bge _0231CA60 - cmp r0, #0x190 - bgt _0231BCD0 - bge _0231CA60 - cmp r0, #0xb6 - bgt _0231BCC0 - cmp r0, #0 - addge pc, pc, r0, lsl #2 - b _0231CABC -_0231B9E4: ; jump table - b _0231CABC ; case 0 - b _0231BE50 ; case 1 - b _0231BE88 ; case 2 - b _0231BEC0 ; case 3 - b _0231BEF8 ; case 4 - b _0231BF30 ; case 5 - b _0231BF68 ; case 6 - b _0231BFDC ; case 7 - b _0231BFA0 ; case 8 - b _0231C018 ; case 9 - b _0231C050 ; case 10 - b _0231CABC ; case 11 - b _0231CABC ; case 12 - b _0231CABC ; case 13 - b _0231CABC ; case 14 - b _0231CABC ; case 15 - b _0231CABC ; case 16 - b _0231CABC ; case 17 - b _0231CABC ; case 18 - b _0231CABC ; case 19 - b _0231CABC ; case 20 - b _0231CABC ; case 21 - b _0231CABC ; case 22 - b _0231CABC ; case 23 - b _0231CABC ; case 24 - b _0231CABC ; case 25 - b _0231CABC ; case 26 - b _0231CABC ; case 27 - b _0231CABC ; case 28 - b _0231CABC ; case 29 - b _0231CABC ; case 30 - b _0231CABC ; case 31 - b _0231CABC ; case 32 - b _0231CABC ; case 33 - b _0231CABC ; case 34 - b _0231CABC ; case 35 - b _0231CABC ; case 36 - b _0231CABC ; case 37 - b _0231CABC ; case 38 - b _0231CABC ; case 39 - b _0231CABC ; case 40 - b _0231CABC ; case 41 - b _0231CABC ; case 42 - b _0231CABC ; case 43 - b _0231CABC ; case 44 - b _0231CABC ; case 45 - b _0231CABC ; case 46 - b _0231CABC ; case 47 - b _0231CABC ; case 48 - b _0231CABC ; case 49 - b _0231CABC ; case 50 - b _0231CABC ; case 51 - b _0231CABC ; case 52 - b _0231CABC ; case 53 - b _0231CABC ; case 54 - b _0231CABC ; case 55 - b _0231CABC ; case 56 - b _0231CABC ; case 57 - b _0231CABC ; case 58 - b _0231CABC ; case 59 - b _0231CABC ; case 60 - b _0231CABC ; case 61 - b _0231CABC ; case 62 - b _0231CABC ; case 63 - b _0231CABC ; case 64 - b _0231CABC ; case 65 - b _0231CABC ; case 66 - b _0231CABC ; case 67 - b _0231CABC ; case 68 - b _0231C08C ; case 69 - b _0231C0A4 ; case 70 - b _0231C0CC ; case 71 - b _0231C15C ; case 72 - b _0231CABC ; case 73 - b _0231C118 ; case 74 - b _0231C210 ; case 75 - b _0231C130 ; case 76 - b _0231C0F4 ; case 77 - b _0231C248 ; case 78 - b _0231C258 ; case 79 - b _0231C144 ; case 80 - b _0231C194 ; case 81 - b _0231C184 ; case 82 - b _0231C16C ; case 83 - b _0231C1BC ; case 84 - b _0231C234 ; case 85 - b _0231C1A4 ; case 86 - b _0231C278 ; case 87 - b _0231C268 ; case 88 - b _0231C1F4 ; case 89 - b _0231C1E4 ; case 90 - b _0231C224 ; case 91 - b _0231C304 ; case 92 - b _0231C31C ; case 93 - b _0231C338 ; case 94 - b _0231C348 ; case 95 - b _0231C360 ; case 96 - b _0231C370 ; case 97 - b _0231CABC ; case 98 - b _0231C28C ; case 99 - b _0231C2A4 ; case 100 - b _0231C2BC ; case 101 - b _0231C2D4 ; case 102 - b _0231C380 ; case 103 - b _0231C6B0 ; case 104 - b _0231CABC ; case 105 - b _0231C768 ; case 106 - b _0231C7A0 ; case 107 - b _0231C2EC ; case 108 - b _0231C394 ; case 109 - b _0231C3B4 ; case 110 - b _0231C3F4 ; case 111 - b _0231C3D4 ; case 112 - b _0231C5FC ; case 113 - b _0231C61C ; case 114 - b _0231C63C ; case 115 - b _0231C7B0 ; case 116 - b _0231C7C0 ; case 117 - b _0231C7FC ; case 118 - b _0231C404 ; case 119 - b _0231C420 ; case 120 - b _0231C43C ; case 121 - b _0231C458 ; case 122 - b _0231C474 ; case 123 - b _0231C490 ; case 124 - b _0231C4AC ; case 125 - b _0231C4C8 ; case 126 - b _0231C4E4 ; case 127 - b _0231C500 ; case 128 - b _0231C51C ; case 129 - b _0231C538 ; case 130 - b _0231C554 ; case 131 - b _0231C570 ; case 132 - b _0231C58C ; case 133 - b _0231C5A8 ; case 134 - b _0231C5C4 ; case 135 - b _0231C5E0 ; case 136 - b _0231C80C ; case 137 - b _0231CABC ; case 138 - b _0231CABC ; case 139 - b _0231CABC ; case 140 - b _0231CABC ; case 141 - b _0231CABC ; case 142 - b _0231CABC ; case 143 - b _0231CABC ; case 144 - b _0231CABC ; case 145 - b _0231CABC ; case 146 - b _0231CABC ; case 147 - b _0231CABC ; case 148 - b _0231CABC ; case 149 - b _0231CABC ; case 150 - b _0231CABC ; case 151 - b _0231CABC ; case 152 - b _0231CABC ; case 153 - b _0231CABC ; case 154 - b _0231CABC ; case 155 - b _0231CABC ; case 156 - b _0231CABC ; case 157 - b _0231CABC ; case 158 - b _0231CABC ; case 159 - b _0231CABC ; case 160 - b _0231CABC ; case 161 - b _0231CABC ; case 162 - b _0231CABC ; case 163 - b _0231CABC ; case 164 - b _0231CABC ; case 165 - b _0231CABC ; case 166 - b _0231C81C ; case 167 - b _0231C82C ; case 168 - b _0231C844 ; case 169 - b _0231C8B0 ; case 170 - b _0231C91C ; case 171 - b _0231C988 ; case 172 - b _0231CABC ; case 173 - b _0231CABC ; case 174 - b _0231CABC ; case 175 - b _0231CABC ; case 176 - b _0231CABC ; case 177 - b _0231CABC ; case 178 - b _0231CA50 ; case 179 - b _0231C9F4 ; case 180 - b _0231CABC ; case 181 - b _0231C65C ; case 182 -_0231BCC0: - ldr r1, _0231C6E0 ; =0x0000016B - cmp r0, r1 - beq _0231CB14 - b _0231CABC -_0231BCD0: - ldr r1, _0231C6E4 ; =0x00000192 - cmp r0, r1 - bgt _0231BCF0 - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BCF0: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BD00: - cmp r0, #0x198 - bgt _0231BD3C - bge _0231CA60 - ldr r1, _0231C6E8 ; =0x00000196 - cmp r0, r1 - bgt _0231BD2C - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BD2C: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BD3C: - ldr r1, _0231C6EC ; =0x0000019A - cmp r0, r1 - bgt _0231BD5C - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BD5C: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BD6C: - cmp r0, #0x1a4 - bgt _0231BDE4 - bge _0231CA60 - cmp r0, #0x1a0 - bgt _0231BDB4 - bge _0231CA60 - ldr r1, _0231C6F0 ; =0x0000019E - cmp r0, r1 - bgt _0231BDA4 - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BDA4: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BDB4: - ldr r1, _0231C6F4 ; =0x000001A2 - cmp r0, r1 - bgt _0231BDD4 - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BDD4: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BDE4: - cmp r0, #0x1a8 - bgt _0231BE20 - bge _0231CA60 - ldr r1, _0231C6F8 ; =0x000001A6 - cmp r0, r1 - bgt _0231BE10 - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BE10: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BE20: - ldr r1, _0231C6FC ; =0x000001AA - cmp r0, r1 - bgt _0231BE40 - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BE40: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BE50: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x52 - bl InitMove - ldr r0, _0231C704 ; =STICK_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #1 - add r2, sp, #0x52 - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231BE88: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x4a - bl InitMove - ldr r0, _0231C708 ; =IRON_THORN_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #2 - add r2, sp, #0x4a - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231BEC0: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x42 - bl InitMove - ldr r0, _0231C70C ; =SILVER_SPIKE_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #3 - add r2, sp, #0x42 - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231BEF8: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x3a - bl InitMove - ldr r0, _0231C710 ; =GOLD_FANG_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #4 - add r2, sp, #0x3a - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231BF30: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x32 - bl InitMove - ldr r0, _0231C714 ; =CACNEA_SPIKE_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #5 - add r2, sp, #0x32 - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231BF68: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x2a - bl InitMove - ldr r0, _0231C718 ; =CORSOLA_TWIG_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #6 - add r2, sp, #0x2a - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231BFA0: - mov r4, #0 - str r4, [sp] - ldr r0, _0231C71C ; =GEO_PEBBLE_DAMAGE - ldr r1, _0231C720 ; =0x0000024F - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - ldrsh r2, [r0] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231BFDC: - mov r4, #0 - str r4, [sp] - ldr r0, _0231C724 ; =GRAVELEROCK_DAMAGE - ldr r1, _0231C720 ; =0x0000024F - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - ldrsh r2, [r0] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C018: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x22 - bl InitMove - ldr r0, _0231C728 ; =GOLD_THORN_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #9 - add r2, sp, #0x22 - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231C050: - mov r4, #0 - str r4, [sp] - ldr r0, _0231C72C ; =RARE_FOSSIL_DAMAGE - ldr r1, _0231C720 ; =0x0000024F - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - ldrsh r2, [r0] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C08C: - mov r0, r8 - mov r1, r7 - mov r3, sl - mov r2, #1 - bl EndNegativeStatusConditionWrapper - b _0231CB14 -_0231C0A4: - ldr r1, _0231C730 ; =ORAN_BERRY_HP_RESTORATION - ldr r0, _0231C734 ; =ORAN_BERRY_FULL_HP_BOOST - ldrsh r2, [r1] - ldrsh r3, [r0] - mov r4, #1 - mov r0, r8 - mov r1, r7 - str r4, [sp] - bl TryIncreaseHp - b _0231CB14 -_0231C0CC: - ldr r1, _0231C738 ; =SITRUS_BERRY_HP_RESTORATION - ldr r0, _0231C73C ; =SITRUS_BERRY_FULL_HP_BOOST - ldrsh r2, [r1] - ldrsh r3, [r0] - mov r4, #1 - mov r0, r8 - mov r1, r7 - str r4, [sp] - bl TryIncreaseHp - b _0231CB14 -_0231C0F4: - ldr r0, _0231C740 ; =LIFE_SEED_HP_BOOST - mov r4, #1 - ldrsh r3, [r0] - mov r0, r8 - mov r1, r7 - mov r2, #0 - str r4, [sp] - bl TryIncreaseHp - b _0231CB14 -_0231C118: - mov r2, #0 - mov r0, r8 - mov r1, r7 - mov r3, r2 - bl TryInflictBlinkerStatus - b _0231CB14 -_0231C130: - mov r0, r8 - mov r1, r7 - mov r2, #0 - bl TryInflictCrossEyedStatus - b _0231CB14 -_0231C144: - mov r0, r8 - mov r1, r7 - mov r2, #0 - mov r3, #1 - bl BoostSpeedOneStage - b _0231CB14 -_0231C15C: - mov r0, r8 - mov r1, r7 - bl TryInflictEyedropStatus - b _0231CB14 -_0231C16C: - mov r0, r8 - mov r1, r7 - mov r2, #1 - mov r3, #0 - bl TryInflictConfusedStatus - b _0231CB14 -_0231C184: - mov r0, r8 - mov r1, r7 - bl ApplyCheriBerryEffect - b _0231CB14 -_0231C194: - mov r0, r8 - mov r1, r7 - bl ApplyPechaBerryEffect - b _0231CB14 -_0231C1A4: - mov r2, #0 - mov r0, r8 - mov r1, r7 - mov r3, r2 - bl TryWarp - b _0231CB14 -_0231C1BC: - ldr r1, _0231C744 ; =SLEEP_TURN_RANGE - mov r0, r7 - mov r2, #1 - bl CalcStatusDuration - mov r2, r0 - mov r0, r8 - mov r1, r7 - mov r3, #1 - bl TryInflictSleepStatus - b _0231CB14 -_0231C1E4: - mov r0, r8 - mov r1, r7 - bl TryInflictSleeplessStatus - b _0231CB14 -_0231C1F4: - mov r2, #1 - mov r0, r8 - mov r1, r7 - mov r3, r2 - str r2, [sp] - bl LevelUpItemEffect - b _0231CB14 -_0231C210: - mov r0, r8 - mov r1, r7 - mov r2, #1 - bl TryDecreaseLevel - b _0231CB14 -_0231C224: - mov r0, r8 - mov r1, r7 - bl TryInflictPetrifiedStatus - b _0231CB14 -_0231C234: - ldr r2, _0231C748 ; =0x00000BE9 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231C248: - mov r0, r8 - mov r1, r7 - bl ApplyRawstBerryEffect - b _0231CB14 -_0231C258: - mov r0, r8 - mov r1, r7 - bl ApplyHungerSeedEffect - b _0231CB14 -_0231C268: - mov r0, r8 - mov r1, r7 - bl ApplyGinsengEffect - b _0231CB14 -_0231C278: - mov r0, r8 - mov r1, r7 - mov r2, sb - bl ApplyBlastSeedEffect - b _0231CB14 -_0231C28C: - ldr r2, _0231C74C ; =0x000003E7 - mov r0, r8 - mov r1, r7 - mov r3, #0 - bl RestoreAllMovePP - b _0231CB14 -_0231C2A4: - ldr r1, _0231C750 ; =PROTEIN_STAT_BOOST - mov r0, r8 - ldrsh r2, [r1] - mov r1, r7 - bl ApplyProteinEffect - b _0231CB14 -_0231C2BC: - ldr r1, _0231C754 ; =CALCIUM_STAT_BOOST - mov r0, r8 - ldrsh r2, [r1] - mov r1, r7 - bl ApplyCalciumEffect - b _0231CB14 -_0231C2D4: - ldr r1, _0231C758 ; =IRON_STAT_BOOST - mov r0, r8 - ldrsh r2, [r1] - mov r1, r7 - bl ApplyIronEffect - b _0231CB14 -_0231C2EC: - ldr r1, _0231C75C ; =ZINC_STAT_BOOST - mov r0, r8 - ldrsh r2, [r1] - mov r1, r7 - bl ApplyZincEffect - b _0231CB14 -_0231C304: - mov r0, r8 - mov r1, r7 - mov r2, #1 - mov r3, #0 - bl EndNegativeStatusConditionWrapper - b _0231CB14 -_0231C31C: - mov r3, #1 - mov r0, r8 - mov r1, r7 - mov r2, #5 - str r3, [sp] - bl LevelUpItemEffect - b _0231CB14 -_0231C338: - mov r0, r8 - mov r1, r7 - bl ApplyVileSeedEffect - b _0231CB14 -_0231C348: - mov r0, r8 - mov r1, r7 - mov r2, #4 - mov r3, #0 - bl TryWarp - b _0231CB14 -_0231C360: - mov r0, r8 - mov r1, r7 - bl ApplyViolentSeedEffect - b _0231CB14 -_0231C370: - mov r0, r8 - mov r1, r7 - bl TryInflictInvisibleStatus - b _0231CB14 -_0231C380: - mov r0, r7 - mov r1, #0xa - mov r2, #0 - bl BoostIQ - b _0231CB14 -_0231C394: - mov r4, #1 - mov r0, r8 - mov r1, r7 - mov r2, #0x32 - mov r3, #5 - str r4, [sp] - bl TryIncreaseBelly - b _0231CB14 -_0231C3B4: - mov r4, #1 - mov r0, r8 - mov r1, r7 - mov r2, #0x64 - mov r3, #0xa - str r4, [sp] - bl TryIncreaseBelly - b _0231CB14 -_0231C3D4: - mov r4, #1 - mov r0, r8 - mov r1, r7 - rsb r2, r4, #0x3e8 - mov r3, #0xa - str r4, [sp] - bl TryIncreaseBelly - b _0231CB14 -_0231C3F4: - mov r0, r8 - mov r1, r7 - bl ApplyGrimyFoodEffect - b _0231CB14 -_0231C404: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #1 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C420: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #2 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C43C: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #3 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C458: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #4 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C474: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #5 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C490: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #6 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C4AC: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #7 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C4C8: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #8 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C4E4: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #9 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C500: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xa - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C51C: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xb - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C538: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xc - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C554: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xd - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C570: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xe - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C58C: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xf - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C5A8: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0x10 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C5C4: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0x11 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C5E0: - ldr r1, _0231C764 ; =WONDER_GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xff - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C5FC: - mov r4, #1 - mov r0, r8 - mov r1, r7 - mov r2, #0x32 - mov r3, #5 - str r4, [sp] - bl TryIncreaseBelly - b _0231CB14 -_0231C61C: - mov r4, #1 - mov r0, r8 - mov r1, r7 - mov r2, #0xa - mov r3, #0 - str r4, [sp] - bl TryIncreaseBelly - b _0231CB14 -_0231C63C: - mov r4, #1 - mov r0, r8 - mov r1, r7 - rsb r2, r4, #0x3e8 - mov r3, #0x32 - str r4, [sp] - bl TryIncreaseBelly - b _0231CB14 -_0231C65C: - cmp sb, #0 - beq _0231C6A4 - add r1, sp, #0x1f - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C6A4: - mov r0, r8 - bl ApplyKeyEffect - b _0231CB14 -_0231C6B0: - mov r0, r8 - mov r1, r7 - bl TryInflictDropeyeStatus - b _0231CB14 - .align 2, 0 -#ifdef JAPAN -#define APPLY_ITEM_EFFECT_OFFSET -0x2C1 -#else -#define APPLY_ITEM_EFFECT_OFFSET 0 -#endif -_0231C6C0: .word 0x000001AB -_0231C6C4: .word 0x00001317 -_0231C6C8: .word 0x00000BE6 + APPLY_ITEM_EFFECT_OFFSET -_0231C6CC: .word 0x00000BE7 + APPLY_ITEM_EFFECT_OFFSET -_0231C6D0: .word ov10_022C4574 -_0231C6D4: .word 0x00000256 -_0231C6D8: .word ov10_022C4558 -_0231C6DC: .word 0x00000BE8 + APPLY_ITEM_EFFECT_OFFSET -_0231C6E0: .word 0x0000016B -_0231C6E4: .word 0x00000192 -_0231C6E8: .word 0x00000196 -_0231C6EC: .word 0x0000019A -_0231C6F0: .word 0x0000019E -_0231C6F4: .word 0x000001A2 -_0231C6F8: .word 0x000001A6 -_0231C6FC: .word 0x000001AA -_0231C700: .word 0x00000195 -_0231C704: .word STICK_POWER -_0231C708: .word IRON_THORN_POWER -_0231C70C: .word SILVER_SPIKE_POWER -_0231C710: .word GOLD_FANG_POWER -_0231C714: .word CACNEA_SPIKE_POWER -_0231C718: .word CORSOLA_TWIG_POWER -_0231C71C: .word GEO_PEBBLE_DAMAGE -_0231C720: .word 0x0000024F -_0231C724: .word GRAVELEROCK_DAMAGE -_0231C728: .word GOLD_THORN_POWER -_0231C72C: .word RARE_FOSSIL_DAMAGE -_0231C730: .word ORAN_BERRY_HP_RESTORATION -_0231C734: .word ORAN_BERRY_FULL_HP_BOOST -_0231C738: .word SITRUS_BERRY_HP_RESTORATION -_0231C73C: .word SITRUS_BERRY_FULL_HP_BOOST -_0231C740: .word LIFE_SEED_HP_BOOST -_0231C744: .word SLEEP_TURN_RANGE -_0231C748: .word 0x00000BE9 + APPLY_ITEM_EFFECT_OFFSET -_0231C74C: .word 0x000003E7 -_0231C750: .word PROTEIN_STAT_BOOST -_0231C754: .word CALCIUM_STAT_BOOST -_0231C758: .word IRON_STAT_BOOST -_0231C75C: .word ZINC_STAT_BOOST -_0231C760: .word GUMMI_STAT_BOOST -_0231C764: .word WONDER_GUMMI_STAT_BOOST -_0231C768: - mov r0, r8 - mov r1, r7 - bl TryInflictSlipStatus - cmp r0, #0 - bne _0231CB14 - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231CBAC ; =0x00000C75 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231C7A0: - mov r0, r8 - mov r1, r7 - bl ApplyViaSeedEffect - b _0231CB14 -_0231C7B0: - mov r0, r8 - mov r1, r7 - bl ApplyMixElixirEffect - b _0231CB14 -_0231C7C0: - mov r4, #0 - str r4, [sp] - ldr r0, _0231CBB0 ; =OREN_BERRY_DAMAGE - str r4, [sp, #4] - mov r1, #0x270 - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - ldrsh r2, [r0] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C7FC: - mov r0, r8 - mov r1, r7 - bl ApplyDoughSeedEffect - b _0231CB14 -_0231C80C: - mov r0, r8 - mov r1, r7 - bl ApplyGravelyrockEffect - b _0231CB14 -_0231C81C: - mov r0, r8 - mov r1, r7 - bl ApplyGonePebbleEffect - b _0231CB14 -_0231C82C: - mov r2, #0 - mov r0, r8 - mov r1, r7 - mov r3, r2 - bl TryInflictBlinkerStatus - b _0231CB14 -_0231C844: - cmp sb, #0 - beq _0231C88C - add r1, sp, #0x1e - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C88C: - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231CBB4 ; =0x00000C67 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231C8B0: - cmp sb, #0 - beq _0231C8F8 - add r1, sp, #0x1d - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C8F8: - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231CBB4 ; =0x00000C67 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231C91C: - cmp sb, #0 - beq _0231C964 - add r1, sp, #0x1c - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C964: - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231CBB4 ; =0x00000C67 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231C988: - cmp sb, #0 - beq _0231C9D0 - add r1, sp, #0x1b - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C9D0: - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231CBB4 ; =0x00000C67 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231C9F4: - cmp sb, #0 - beq _0231CA3C - add r1, sp, #0x1a - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231CA3C: - ldr r2, _0231CBB8 ; =0x00000C76 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231CA50: - mov r0, r8 - mov r1, r7 - bl ApplyGracideaEffect - b _0231CB14 -_0231CA60: - cmp sb, #0 - beq _0231CAA8 - add r1, sp, #0x19 - ldr r0, _0231CBBC ; =ov10_022C44EC - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231CAA8: - ldr r2, _0231C6DC ; =0x00000BE8 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231CABC: - cmp sb, #0 - beq _0231CB04 - add r1, sp, #0x18 - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231CB04: - ldr r2, _0231C6DC ; =0x00000BE8 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_0231CB14: - mov r0, r7 - bl EntityIsValid__0231CBC8 - cmp r0, #0 - beq _0231CB9C - ldr r1, [r7, #0xb4] - ldrsh r4, [r6, #4] - ldrb r0, [r1, #6] - cmp r0, #0 - movne r0, #0 - bne _0231CB48 -#ifdef JAPAN - add r0, r1, #0x224 -#else - add r0, r1, #0x228 -#endif - mov r1, #0x5d - bl ExclusiveItemEffectFlagTest -_0231CB48: - cmp r0, #0 - beq _0231CB9C - ldr r0, _0231CBC0 ; =APPLES_AND_BERRIES_ITEM_IDS - b _0231CB90 -_0231CB58: - cmp r4, r1 - bne _0231CB8C - mov r0, #0xa - bl WaitUntilAlertBoxPauseIsOver - ldr r0, _0231CBC4 ; =ov10_022C4864 - mov r4, #1 - ldr r2, [r0] - mov r0, r8 - mov r1, r7 - mov r3, #0 - str r4, [sp] - bl TryIncreaseHp - b _0231CB9C -_0231CB8C: - add r0, r0, #2 -_0231CB90: - ldrsh r1, [r0] - cmp r1, #0 - bne _0231CB58 -_0231CB9C: -#ifdef EUROPE - mov r0, #1 - bl ov29_022FB920 -#endif - mov r0, r8 - bl EnemyEvolution -_0231CBA4: - add sp, sp, #0x5c - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_0231CBAC: .word 0x00000C75 + APPLY_ITEM_EFFECT_OFFSET -_0231CBB0: .word OREN_BERRY_DAMAGE -_0231CBB4: .word 0x00000C67 + APPLY_ITEM_EFFECT_OFFSET -_0231CBB8: .word 0x00000C76 + APPLY_ITEM_EFFECT_OFFSET -_0231CBBC: .word ov10_022C44EC -_0231CBC0: .word APPLES_AND_BERRIES_ITEM_IDS -_0231CBC4: .word ov10_022C4864 - arm_func_end ApplyItemEffect diff --git a/include/overlay_29_0231CBC8.h b/include/overlay_29_0231CBC8.h index ea4e4a67..2823f729 100644 --- a/include/overlay_29_0231CBC8.h +++ b/include/overlay_29_0231CBC8.h @@ -6,4 +6,6 @@ // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__0231CBC8(struct entity *entity); +void ApplyItemEffect(char param_1, u8 param_2, u8 param_3, struct entity *attacker, struct entity *defender, struct item *item); + #endif //PMDSKY_OVERLAY_29_0231CBC8_H diff --git a/src/dungeon_projectile_throw.c b/src/dungeon_projectile_throw.c index 79db778a..dd89c843 100644 --- a/src/dungeon_projectile_throw.c +++ b/src/dungeon_projectile_throw.c @@ -1,4 +1,5 @@ #include "dungeon_projectile_throw.h" +#include "overlay_29_0231CBC8.h" #include "dg_object.h" #include "dungeon.h" #include "dungeon_items.h" @@ -35,7 +36,6 @@ extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity extern void ChangeMonsterAnimationToHurt(struct entity *monster, u32 direction); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); -extern void ApplyItemEffect(char param_1, u8 param_2, u8 param_3, struct entity *attacker, struct entity *defender, struct item *thrown_item); extern void SpawnDroppedItem(struct entity *entity, struct entity *item_entity, struct item *item, bool8 param_4, struct position *dir_xy, u32 param_6); bool8 ItemIsActive__02347B50(struct entity *entity, enum item_id item_id) diff --git a/src/overlay_29_0231CBC8.c b/src/overlay_29_0231CBC8.c index a3ffb4f6..a961a270 100644 --- a/src/overlay_29_0231CBC8.c +++ b/src/overlay_29_0231CBC8.c @@ -1,5 +1,612 @@ #include "overlay_29_0231CBC8.h" #include "dungeon_util_static.h" +#include "dungeon_capabilities_1.h" +#include "dungeon_pokemon_attributes_1.h" +#include "exclusive_item.h" +#include "item_util.h" +#include "main_0200EDC0.h" +#include "move_orb_effects.h" +#include "moves_1.h" +#include "overlay_29_022EAC7C.h" +#include "overlay_29_02344AF8.h" +#include "overlay_29_0234BA54.h" + +#ifdef JAPAN +#define MESSAGE_BE6 0x925 +#define MESSAGE_BE7 0x926 +#define MESSAGE_BE8 0x927 +#define MESSAGE_BE9 0x928 +#define MESSAGE_C67 0x9A6 +#define MESSAGE_C75 0x9B4 +#define MESSAGE_C76 0x9B5 +#else +#define MESSAGE_BE6 0xBE6 +#define MESSAGE_BE7 0xBE7 +#define MESSAGE_BE8 0xBE8 +#define MESSAGE_BE9 0xBE9 +#define MESSAGE_C67 0xC67 +#define MESSAGE_C75 0xC75 +#define MESSAGE_C76 0xC76 +#endif + + +#ifdef EUROPE +extern void ov29_022FB920(bool8 a); +#endif + +extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); +extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity, u32 param_3); +extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); +extern void EndNegativeStatusConditionWrapper(struct entity *user, struct entity *target, bool8 displayMessage, bool8 fromMove); +extern bool8 SpawnDroppedItemWrapper(struct entity *entity, struct position *pos, struct item *item, u32 a); +extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); +extern void BoostIQ(struct entity *entity, s16 iq, bool8 a); +extern void UpdateShopkeeperModeAfterAttack(struct entity *attacker, struct entity *defender); +extern void TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 a, bool8 b); +extern void TryInflictInvisibleStatus(struct entity *user, struct entity *target); +extern void TryInflictPetrifiedStatus(struct entity *user, struct entity *target); +extern void TryInflictSleeplessStatus(struct entity *user, struct entity *target); +extern s32 CalcStatusDuration(struct entity *entity, const s16 *turn_range, bool8 iq_skill_effects); + +extern void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s16 fixed_damage, s32 a, bool8 *flag, s32 b, s32 damage_source, s32 c, s32 d, s32 e); +extern void DealDamageProjectile(struct entity *attacker, struct entity *defender, struct move *move, s16 power, s32 a, s32 b); +extern void ApplyGummiBoostsDungeonMode(struct entity *user, struct entity *target, s32 type, s16 boost); +extern void TryIncreaseBelly(struct entity *user, struct entity *target, s32 a, s32 b, s32 c); +extern void LevelUpItemEffect(struct entity *user, struct entity *target, s32 a, s32 b, s32 c); +extern void RestoreAllMovePP(struct entity *user, struct entity *target, s32 a, s32 b); +extern void TryInflictSleepStatus(struct entity *user, struct entity *target, s32 turns, bool8 a); +extern void TryInflictBlinkerStatus(struct entity *user, struct entity *target, bool8 a, bool8 b); +extern void TryInflictCrossEyedStatus(struct entity *user, struct entity *target, bool8 a); +extern void TryDecreaseLevel(struct entity *user, struct entity *target, s32 a); +extern void ApplyProteinEffect(struct entity *user, struct entity *target, s16 boost); +extern void ApplyCalciumEffect(struct entity *user, struct entity *target, s16 boost); +extern void ApplyIronEffect(struct entity *user, struct entity *target, s16 boost); +extern void ApplyZincEffect(struct entity *user, struct entity *target, s16 boost); +extern void ApplyBlastSeedEffect(struct entity *user, struct entity *target, char a); +extern void ApplyCheriBerryEffect(struct entity *user, struct entity *target); +extern void ApplyPechaBerryEffect(struct entity *user, struct entity *target); +extern void ApplyRawstBerryEffect(struct entity *user, struct entity *target); +extern void ApplyHungerSeedEffect(struct entity *user, struct entity *target); +extern void ApplyGinsengEffect(struct entity *user, struct entity *target); +extern void ApplyVileSeedEffect(struct entity *user, struct entity *target); +extern void ApplyViolentSeedEffect(struct entity *user, struct entity *target); +extern void ApplyGrimyFoodEffect(struct entity *user, struct entity *target); +extern void ApplyMixElixirEffect(struct entity *user, struct entity *target); +extern void ApplyDoughSeedEffect(struct entity *user, struct entity *target); +extern void ApplyViaSeedEffect(struct entity *user, struct entity *target); +extern void ApplyGravelyrockEffect(struct entity *user, struct entity *target); +extern void ApplyGonePebbleEffect(struct entity *user, struct entity *target); +extern void ApplyGracideaEffect(struct entity *user, struct entity *target); +extern void TryInflictDropeyeStatus(struct entity *user, struct entity *target); +extern void TryInflictEyedropStatus(struct entity *user, struct entity *target); +extern bool8 TryInflictSlipStatus(struct entity *user, struct entity *target); +extern void ov29_022E5A00(struct entity *entity, struct item *item); +extern void ov29_022E5AE4(struct entity *entity, struct item *item); +extern void ov29_0230F9A4(struct entity *entity, struct item *item); +extern bool8 ov29_022FB9BC(struct entity *entity); +extern void ov29_022F9EA0(struct entity *entity); +extern void EnemyEvolution(struct entity *entity); +extern bool8 AddHeldItemToBag(struct monster *monster); +extern void ApplyKeyEffect(struct entity *entity); + +extern const s16 STICK_POWER; +extern const s16 IRON_THORN_POWER; +extern const s16 SILVER_SPIKE_POWER; +extern const s16 GOLD_FANG_POWER; +extern const s16 CACNEA_SPIKE_POWER; +extern const s16 CORSOLA_TWIG_POWER; +extern const s16 GOLD_THORN_POWER; +extern const s16 GEO_PEBBLE_DAMAGE; +extern const s16 GRAVELEROCK_DAMAGE; +extern const s16 RARE_FOSSIL_DAMAGE; +extern const s16 OREN_BERRY_DAMAGE; +extern const s16 ORAN_BERRY_HP_RESTORATION; +extern const s16 ORAN_BERRY_FULL_HP_BOOST; +extern const s16 SITRUS_BERRY_HP_RESTORATION; +extern const s16 SITRUS_BERRY_FULL_HP_BOOST; +extern const s16 LIFE_SEED_HP_BOOST; +extern const s16 PROTEIN_STAT_BOOST; +extern const s16 CALCIUM_STAT_BOOST; +extern const s16 IRON_STAT_BOOST; +extern const s16 ZINC_STAT_BOOST; +extern const s16 GUMMI_STAT_BOOST; +extern const s16 WONDER_GUMMI_STAT_BOOST; +extern const s16 ov10_022C44EC; +extern const s16 ov10_022C4558; +extern const s16 ov10_022C4574; +extern const s32 ov10_022C4864; +extern const s16 SLEEP_TURN_RANGE[]; +extern const s16 APPLES_AND_BERRIES_ITEM_IDS[]; + +void ApplyItemEffect(char param_1, u8 param_2, u8 param_3, + struct entity *attacker, struct entity *defender, + struct item *item) +{ + if (param_1 != 0 && param_2 == 0) { + struct monster *monster = GetEntInfo(defender); + bool8 flag = FALSE; + + if (ov29_022FB9BC(defender)) { + SpawnDroppedItemWrapper(attacker, &defender->pos, item, 0); + return; + } + if (monster->is_not_team_member) { + if (GetItemCategoryVeneer(item->id) != CATEGORY_THROWN_LINE && + GetItemCategoryVeneer(item->id) != CATEGORY_BERRIES_SEEDS_VITAMINS && + GetItemCategoryVeneer(item->id) != CATEGORY_THROWN_ARC) { + flag = TRUE; + } + if (GetItemCategoryVeneer(item->id) == CATEGORY_HELD_ITEMS && + item->id >= ITEM_A_STONE && item->id <= ITEM_QUESTION_STONE) { + flag = FALSE; + } + } else if (GetItemCategoryVeneer(item->id) != CATEGORY_BERRIES_SEEDS_VITAMINS) { + flag = IqSkillIsEnabled(defender, IQ_ITEM_CATCHER); + } + if (CheckVariousConditions__0230156C(defender)) { + flag = FALSE; + } + if (flag) { + if (!ItemExists(monster->held_item.flags)) { + if (monster->is_not_team_member || !IsBagFull()) { + if (monster->shopkeeper == SHOPKEEPER_MODE_SHOPKEEPER) { + SpawnDroppedItemWrapper(attacker, &defender->pos, item, 0); + return; + } + PlaySeByIdIfNotSilence(0x1317); + PrepareItemForPrinting__02345728(0, item); + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE6); + monster->held_item = *item; + if (!monster->is_not_team_member) { + AddHeldItemToBag(monster); + } + ov29_022F9EA0(defender); + return; + } + } + } + } + if (param_1) { + ov29_022E5A00(defender, item); + UpdateShopkeeperModeAfterAttack(attacker, defender); + } + if (ItemSticky(item->flags)) { + PrepareItemForPrinting__02345728(0, item); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE7); + if (param_1) { + bool8 b; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4574, 1, &b, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + EnemyEvolution(attacker); + return; + } + } + if (!param_1) { + ov29_022E5AE4(defender, item); + } + ov29_0230F9A4(attacker, item); + if (GetItemCategoryVeneer(item->id) == CATEGORY_BERRIES_SEEDS_VITAMINS) { + TryIncreaseBelly(attacker, defender, 5, 0, 0); + } + if (GetItemCategoryVeneer(item->id) == CATEGORY_TMS_HMS || + GetItemCategoryVeneer(item->id) == CATEGORY_LINK_BOX) { + if (param_1) { + bool8 b; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &b, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE8); + } + } else { + switch (item->id) { + case ITEM_STICK: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, STICK_POWER, 0x100, ITEM_STICK); + break; + } + case ITEM_IRON_THORN: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, IRON_THORN_POWER, 0x100, ITEM_IRON_THORN); + break; + } + case ITEM_SILVER_SPIKE: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, SILVER_SPIKE_POWER, 0x100, ITEM_SILVER_SPIKE); + break; + } + case ITEM_GOLD_FANG: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, GOLD_FANG_POWER, 0x100, ITEM_GOLD_FANG); + break; + } + case ITEM_CACNEA_SPIKE: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, CACNEA_SPIKE_POWER, 0x100, ITEM_CACNEA_SPIKE); + break; + } + case ITEM_CORSOLA_TWIG: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, CORSOLA_TWIG_POWER, 0x100, ITEM_CORSOLA_TWIG); + break; + } + case ITEM_GEO_PEBBLE: + CalcDamageFixedNoCategory(attacker, defender, GEO_PEBBLE_DAMAGE, 1, NULL, 0, DAMAGE_SOURCE_THROWN_ROCK, 0, 0, 0); + break; + case ITEM_GRAVELEROCK: + CalcDamageFixedNoCategory(attacker, defender, GRAVELEROCK_DAMAGE, 1, NULL, 0, DAMAGE_SOURCE_THROWN_ROCK, 0, 0, 0); + break; + case ITEM_GOLD_THORN: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, GOLD_THORN_POWER, 0x100, ITEM_GOLD_THORN); + break; + } + case ITEM_RARE_FOSSIL: + CalcDamageFixedNoCategory(attacker, defender, RARE_FOSSIL_DAMAGE, 1, NULL, 0, DAMAGE_SOURCE_THROWN_ROCK, 0, 0, 0); + break; + case ITEM_HEAL_SEED: + EndNegativeStatusConditionWrapper(attacker, defender, TRUE, param_3); + break; + case ITEM_ORAN_BERRY: + TryIncreaseHp(attacker, defender, ORAN_BERRY_HP_RESTORATION, ORAN_BERRY_FULL_HP_BOOST, TRUE); + break; + case ITEM_SITRUS_BERRY: + TryIncreaseHp(attacker, defender, SITRUS_BERRY_HP_RESTORATION, SITRUS_BERRY_FULL_HP_BOOST, TRUE); + break; + case ITEM_LIFE_SEED: + TryIncreaseHp(attacker, defender, 0, LIFE_SEED_HP_BOOST, TRUE); + break; + case ITEM_BLINKER_SEED: + TryInflictBlinkerStatus(attacker, defender, FALSE, FALSE); + break; + case ITEM_X_EYE_SEED: + TryInflictCrossEyedStatus(attacker, defender, FALSE); + break; + case ITEM_QUICK_SEED: + BoostSpeedOneStage(attacker, defender, 0, TRUE); + break; + case ITEM_EYEDROP_SEED: + TryInflictEyedropStatus(attacker, defender); + break; + case ITEM_TOTTER_SEED: + TryInflictConfusedStatus(attacker, defender, TRUE, FALSE); + break; + case ITEM_CHERI_BERRY: + ApplyCheriBerryEffect(attacker, defender); + break; + case ITEM_PECHA_BERRY: + ApplyPechaBerryEffect(attacker, defender); + break; + case ITEM_WARP_SEED: + TryWarp(attacker, defender, 0, 0); + break; + case ITEM_SLEEP_SEED: + TryInflictSleepStatus(attacker, defender, CalcStatusDuration(defender, SLEEP_TURN_RANGE, TRUE), TRUE); + break; + case ITEM_CHESTO_BERRY: + TryInflictSleeplessStatus(attacker, defender); + break; + case ITEM_JOY_SEED: + LevelUpItemEffect(attacker, defender, 1, 1, 1); + break; + case ITEM_DOOM_SEED: + TryDecreaseLevel(attacker, defender, 1); + break; + case ITEM_STUN_SEED: + TryInflictPetrifiedStatus(attacker, defender); + break; + case ITEM_PLAIN_SEED: + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE9); + break; + case ITEM_RAWST_BERRY: + ApplyRawstBerryEffect(attacker, defender); + break; + case ITEM_HUNGER_SEED: + ApplyHungerSeedEffect(attacker, defender); + break; + case ITEM_GINSENG: + ApplyGinsengEffect(attacker, defender); + break; + case ITEM_BLAST_SEED: + ApplyBlastSeedEffect(attacker, defender, param_1); + break; + case ITEM_MAX_ELIXIR: + RestoreAllMovePP(attacker, defender, 999, 0); + break; + case ITEM_PROTEIN: + ApplyProteinEffect(attacker, defender, PROTEIN_STAT_BOOST); + break; + case ITEM_CALCIUM: + ApplyCalciumEffect(attacker, defender, CALCIUM_STAT_BOOST); + break; + case ITEM_IRON: + ApplyIronEffect(attacker, defender, IRON_STAT_BOOST); + break; + case ITEM_ZINC: + ApplyZincEffect(attacker, defender, ZINC_STAT_BOOST); + break; + case ITEM_GABITE_SCALE: + EndNegativeStatusConditionWrapper(attacker, defender, TRUE, FALSE); + break; + case ITEM_GOLDEN_SEED: + LevelUpItemEffect(attacker, defender, 5, 1, 1); + break; + case ITEM_VILE_SEED: + ApplyVileSeedEffect(attacker, defender); + break; + case ITEM_PURE_SEED: + TryWarp(attacker, defender, 4, 0); + break; + case ITEM_VIOLENT_SEED: + ApplyViolentSeedEffect(attacker, defender); + break; + case ITEM_VANISH_SEED: + TryInflictInvisibleStatus(attacker, defender); + break; + case ITEM_NECTAR: + BoostIQ(defender, 10, FALSE); + break; + case ITEM_APPLE: + TryIncreaseBelly(attacker, defender, 50, 5, 1); + break; + case ITEM_BIG_APPLE: + TryIncreaseBelly(attacker, defender, 100, 10, 1); + break; + case ITEM_HUGE_APPLE: + TryIncreaseBelly(attacker, defender, 999, 10, 1); + break; + case ITEM_GRIMY_FOOD: + ApplyGrimyFoodEffect(attacker, defender); + break; + case ITEM_WHITE_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_NORMAL, GUMMI_STAT_BOOST); + break; + case ITEM_RED_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_FIRE, GUMMI_STAT_BOOST); + break; + case ITEM_BLUE_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_WATER, GUMMI_STAT_BOOST); + break; + case ITEM_GRASS_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_GRASS, GUMMI_STAT_BOOST); + break; + case ITEM_YELLOW_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_ELECTRIC, GUMMI_STAT_BOOST); + break; + case ITEM_CLEAR_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_ICE, GUMMI_STAT_BOOST); + break; + case ITEM_ORANGE_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_FIGHTING, GUMMI_STAT_BOOST); + break; + case ITEM_PINK_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_POISON, GUMMI_STAT_BOOST); + break; + case ITEM_BROWN_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_GROUND, GUMMI_STAT_BOOST); + break; + case ITEM_SKY_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_FLYING, GUMMI_STAT_BOOST); + break; + case ITEM_GOLD_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_PSYCHIC, GUMMI_STAT_BOOST); + break; + case ITEM_GREEN_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_BUG, GUMMI_STAT_BOOST); + break; + case ITEM_GRAY_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_ROCK, GUMMI_STAT_BOOST); + break; + case ITEM_PURPLE_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_GHOST, GUMMI_STAT_BOOST); + break; + case ITEM_ROYAL_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_DRAGON, GUMMI_STAT_BOOST); + break; + case ITEM_BLACK_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_DARK, GUMMI_STAT_BOOST); + break; + case ITEM_SILVER_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_STEEL, GUMMI_STAT_BOOST); + break; + case ITEM_WONDER_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, 0xFF, WONDER_GUMMI_STAT_BOOST); + break; + case ITEM_UNNAMED_0x71: + TryIncreaseBelly(attacker, defender, 50, 5, 1); + break; + case ITEM_UNNAMED_0x72: + TryIncreaseBelly(attacker, defender, 10, 0, 1); + break; + case ITEM_GOLDEN_APPLE: + TryIncreaseBelly(attacker, defender, 999, 50, 1); + break; + case ITEM_KEY: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } + else { + ApplyKeyEffect(attacker); + } + break; + case ITEM_DROPEYE_SEED: + TryInflictDropeyeStatus(attacker, defender); + break; +case ITEM_SLIP_SEED: + if (!TryInflictSlipStatus(attacker, defender)) { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C75); + } + break; +case ITEM_VIA_SEED: + ApplyViaSeedEffect(attacker, defender); + break; +case ITEM_MIX_ELIXIR: + ApplyMixElixirEffect(attacker, defender); + break; +case ITEM_OREN_BERRY: + CalcDamageFixedNoCategory(attacker, defender, OREN_BERRY_DAMAGE, 1, NULL, 0, + DAMAGE_SOURCE_OREN_BERRY, 0, 0, 0); + break; +case ITEM_DOUGH_SEED: + ApplyDoughSeedEffect(attacker, defender); + break; +case ITEM_GRAVELYROCK: + ApplyGravelyrockEffect(attacker, defender); + break; +case ITEM_GONE_PEBBLE: + ApplyGonePebbleEffect(attacker, defender); + break; +case ITEM_WANDER_GUMMI: + TryInflictBlinkerStatus(attacker, defender, 0, 0); + break; +case ITEM_PRIZE_TICKET: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); + } + break; +case ITEM_SILVER_TICKET: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); + } + break; +case ITEM_GOLD_TICKET: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); + } + break; +case ITEM_PRISM_TICKET: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); + } + break; +case ITEM_SKY_GIFT: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C76); + } + break; +case ITEM_GRACIDEA: + ApplyGracideaEffect(attacker, defender); + break; + case ITEM_UNNAMED_0x16B: + break; + case ITEM_A_STONE: + case ITEM_B_STONE: + case ITEM_C_STONE: + case ITEM_D_STONE: + case ITEM_E_STONE: + case ITEM_F_STONE: + case ITEM_G_STONE: + case ITEM_H_STONE: + case ITEM_I_STONE: + case ITEM_J_STONE: + case ITEM_K_STONE: + case ITEM_L_STONE: + case ITEM_M_STONE: + case ITEM_N_STONE: + case ITEM_O_STONE: + case ITEM_P_STONE: + case ITEM_Q_STONE: + case ITEM_R_STONE: + case ITEM_S_STONE: + case ITEM_T_STONE: + case ITEM_U_STONE: + case ITEM_V_STONE: + case ITEM_W_STONE: + case ITEM_X_STONE: + case ITEM_Y_STONE: + case ITEM_Z_STONE: + case ITEM_EXCLAMATION_STONE: + case ITEM_QUESTION_STONE: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C44EC, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE8); + } + break; + case ITEM_NOTHING: + default: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } + else { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE8); + } + break; + } + } + + if (EntityIsValid__0231CBC8(defender)) { + struct monster *info = GetEntInfo(defender); + s16 id = item->id; + bool8 active; + + if (!info->is_not_team_member) + active = ExclusiveItemEffectFlagTest(info->exclusive_item_effect_flags, EXCLUSIVE_EFF_RECOVER_HP_FROM_APPLES_AND_BERRIES); + else + active = FALSE; + + if (active) { + const s16 *p; + + for (p = APPLES_AND_BERRIES_ITEM_IDS; *p != 0; p++) { + if (id == *p) { + WaitUntilAlertBoxPauseIsOver(10); + TryIncreaseHp(attacker, defender, ov10_022C4864, 0, TRUE); + break; + } + } + } + } + +#ifdef EUROPE + ov29_022FB920(TRUE); +#endif + EnemyEvolution(attacker); +} bool8 EntityIsValid__0231CBC8(struct entity *entity) {