diff options
-rw-r--r-- | asm/field_effect_helpers.s | 128 | ||||
-rw-r--r-- | src/field_effect_helpers.c | 94 |
2 files changed, 69 insertions, 153 deletions
diff --git a/asm/field_effect_helpers.s b/asm/field_effect_helpers.s index c5a2a0308..adb0e2ec2 100644 --- a/asm/field_effect_helpers.s +++ b/asm/field_effect_helpers.s @@ -6,134 +6,6 @@ .text - thumb_func_start FldEff_TreeDisguise -FldEff_TreeDisguise: @ 81284C4 - push {lr} - movs r0, 0x1C - movs r1, 0x18 - movs r2, 0x4 - bl ShowDisguiseFieldEffect - pop {r1} - bx r1 - thumb_func_end FldEff_TreeDisguise - - thumb_func_start FldEff_MountainDisguise -FldEff_MountainDisguise: @ 81284D4 - push {lr} - movs r0, 0x1D - movs r1, 0x19 - movs r2, 0x3 - bl ShowDisguiseFieldEffect - pop {r1} - bx r1 - thumb_func_end FldEff_MountainDisguise - - thumb_func_start FldEff_SandDisguise -FldEff_SandDisguise: @ 81284E4 - push {lr} - movs r0, 0x24 - movs r1, 0x1C - movs r2, 0x2 - bl ShowDisguiseFieldEffect - pop {r1} - bx r1 - thumb_func_end FldEff_SandDisguise - - thumb_func_start ShowDisguiseFieldEffect -ShowDisguiseFieldEffect: @ 81284F4 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - lsls r0, 24 - lsrs r4, r0, 24 - mov r8, r4 - lsls r1, 24 - lsrs r6, r1, 24 - lsls r2, 24 - lsrs r7, r2, 24 - ldr r5, _08128528 @ =gFieldEffectSpawnParams - ldrb r0, [r5] - ldrb r1, [r5, 0x4] - ldrb r2, [r5, 0x8] - mov r3, sp - bl TryGetFieldObjectIdByLocalIdAndMap - lsls r0, 24 - cmp r0, 0 - beq _0812852C - adds r0, r4, 0 - bl FieldEffectActiveListRemove - movs r0, 0x40 - b _08128598 - .align 2, 0 -_08128528: .4byte gFieldEffectSpawnParams -_0812852C: - ldr r1, _081285A4 @ =gFieldEffectObjectTemplatePointers - lsls r0, r6, 2 - adds r0, r1 - ldr r0, [r0] - movs r1, 0 - movs r2, 0 - movs r3, 0 - bl CreateSpriteAtEnd - mov r1, sp - strb r0, [r1] - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x40 - beq _08128594 - mov r0, sp - ldrb r0, [r0] - lsls r2, r0, 4 - adds r2, r0 - lsls r2, 2 - ldr r0, _081285A8 @ =gSprites - adds r2, r0 - movs r0, 0x3E - adds r0, r2 - mov r12, r0 - ldrb r3, [r0] - lsls r1, r3, 30 - lsrs r1, 31 - adds r1, 0x1 - movs r0, 0x1 - ands r1, r0 - lsls r1, 1 - movs r0, 0x3 - negs r0, r0 - ands r0, r3 - orrs r0, r1 - mov r1, r12 - strb r0, [r1] - lsls r3, r7, 4 - ldrb r1, [r2, 0x5] - movs r0, 0xF - ands r0, r1 - orrs r0, r3 - strb r0, [r2, 0x5] - mov r0, r8 - strh r0, [r2, 0x30] - ldr r0, [r5] - strh r0, [r2, 0x32] - ldr r0, [r5, 0x4] - strh r0, [r2, 0x34] - ldr r0, [r5, 0x8] - strh r0, [r2, 0x36] -_08128594: - mov r0, sp - ldrb r0, [r0] -_08128598: - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081285A4: .4byte gFieldEffectObjectTemplatePointers -_081285A8: .4byte gSprites - thumb_func_end ShowDisguiseFieldEffect - thumb_func_start sub_81285AC sub_81285AC: @ 81285AC push {r4,r5,lr} diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 347eb18a5..da406daeb 100644 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -38,6 +38,7 @@ static void sub_8127FD4(struct MapObject *, struct Sprite *); static void sub_812800C(struct MapObject *, struct Sprite *); static void sub_81280A0(struct MapObject *, struct Sprite *, struct Sprite *); static void sub_8128174(struct Sprite *); +static u32 ShowDisguiseFieldEffect(u8, u8, u8); // .rodata @@ -251,7 +252,7 @@ void sub_8126BC4(u8 spriteId, u8 animNum, s16 x, s16 y) } } -u8 FldEff_Shadow(void) +u32 FldEff_Shadow(void) { u8 mapObjectId; const struct MapObjectGraphicsInfo *graphicsInfo; @@ -295,7 +296,7 @@ void oamc_shadow(struct Sprite *sprite) } } -u8 FldEff_TallGrass(void) +u32 FldEff_TallGrass(void) { s16 x; s16 y; @@ -367,7 +368,7 @@ void unc_grass_normal(struct Sprite *sprite) } } -u8 FldEff_JumpTallGrass(void) +u32 FldEff_JumpTallGrass(void) { u8 spriteId; struct Sprite *sprite; @@ -404,7 +405,7 @@ u8 sub_8126FF0(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) return MAX_SPRITES; } -u8 FldEff_LongGrass(void) +u32 FldEff_LongGrass(void) { s16 x; s16 y; @@ -471,7 +472,7 @@ void unc_grass_tall(struct Sprite *sprite) } } -u8 FldEff_JumpLongGrass(void) +u32 FldEff_JumpLongGrass(void) { u8 spriteId; struct Sprite *sprite; @@ -489,7 +490,7 @@ u8 FldEff_JumpLongGrass(void) return 0; } -u8 FldEff_ShortGrass(void) +u32 FldEff_ShortGrass(void) { u8 mapObjectId; struct MapObject *mapObject; @@ -549,7 +550,7 @@ void sub_8127334(struct Sprite *sprite) } } -u8 FldEff_SandFootprints(void) +u32 FldEff_SandFootprints(void) { u8 spriteId; struct Sprite *sprite; @@ -567,7 +568,7 @@ u8 FldEff_SandFootprints(void) return 0; } -u8 FldEff_DeepSandFootprints(void) +u32 FldEff_DeepSandFootprints(void) { u8 spriteId; struct Sprite *sprite; @@ -585,7 +586,7 @@ u8 FldEff_DeepSandFootprints(void) return spriteId; } -u8 FldEff_BikeTireTracks(void) +u32 FldEff_BikeTireTracks(void) { u8 spriteId; struct Sprite *sprite; @@ -628,7 +629,7 @@ static void sub_81275C4(struct Sprite *sprite) } } -u8 FldEff_Splash(void) +u32 FldEff_Splash(void) { u8 mapObjectId; struct MapObject *mapObject; @@ -672,7 +673,7 @@ void sub_81276B4(struct Sprite *sprite) } } -u8 FldEff_JumpSmallSplash(void) +u32 FldEff_JumpSmallSplash(void) { u8 spriteId; struct Sprite *sprite; @@ -690,7 +691,7 @@ u8 FldEff_JumpSmallSplash(void) return 0; } -u8 FldEff_JumpBigSplash(void) +u32 FldEff_JumpBigSplash(void) { u8 spriteId; struct Sprite *sprite; @@ -708,7 +709,7 @@ u8 FldEff_JumpBigSplash(void) return 0; } -u8 FldEff_FeetInFlowingWater(void) +u32 FldEff_FeetInFlowingWater(void) { u8 mapObjectId; struct MapObject *mapObject; @@ -767,7 +768,7 @@ static void sub_81278D8(struct Sprite *sprite) } } -u8 FldEff_Ripple(void) +u32 FldEff_Ripple(void) { u8 spriteId; struct Sprite *sprite; @@ -783,7 +784,7 @@ u8 FldEff_Ripple(void) return 0; } -u8 FldEff_HotSpringsWater(void) +u32 FldEff_HotSpringsWater(void) { u8 mapObjectId; struct MapObject *mapObject; @@ -828,7 +829,7 @@ void sub_8127A7C(struct Sprite *sprite) } } -u8 FldEff_Unknown19(void) +u32 FldEff_Unknown19(void) { u8 spriteId; struct Sprite *sprite; @@ -845,7 +846,7 @@ u8 FldEff_Unknown19(void) return 0; } -u8 FldEff_Unknown20(void) +u32 FldEff_Unknown20(void) { u8 spriteId; struct Sprite *sprite; @@ -862,7 +863,7 @@ u8 FldEff_Unknown20(void) return 0; } -u8 FldEff_Unknown21(void) +u32 FldEff_Unknown21(void) { u8 spriteId; struct Sprite *sprite; @@ -879,7 +880,7 @@ u8 FldEff_Unknown21(void) return 0; } -u8 FldEff_Unknown22(void) +u32 FldEff_Unknown22(void) { u8 spriteId; struct Sprite *sprite; @@ -907,7 +908,7 @@ void ash(s16 x, s16 y, u16 c, s16 d) FieldEffectStart(FLDEFF_ASH); } -u8 FldEff_Ash(void) +u32 FldEff_Ash(void) { s16 x; s16 y; @@ -965,7 +966,7 @@ static void sub_8127E30(struct Sprite *sprite) } } -u8 FldEff_SurfBlob(void) +u32 FldEff_SurfBlob(void) { u8 spriteId; struct Sprite *sprite; @@ -1208,7 +1209,7 @@ static void sub_8128174(struct Sprite *sprite) } } -u8 FldEff_Dust(void) +u32 FldEff_Dust(void) { u8 spriteId; struct Sprite *sprite; @@ -1226,7 +1227,7 @@ u8 FldEff_Dust(void) return 0; } -u8 FldEff_SandPile(void) +u32 FldEff_SandPile(void) { u8 mapObjectId; struct MapObject *mapObject; @@ -1284,7 +1285,7 @@ void sub_81282E0(struct Sprite *sprite) } } -u8 FldEff_Bubbles(void) +u32 FldEff_Bubbles(void) { u8 spriteId; struct Sprite *sprite; @@ -1312,7 +1313,7 @@ void sub_8128410(struct Sprite *sprite) } } -u8 FldEff_BerryTreeGrowthSparkle(void) +u32 FldEff_BerryTreeGrowthSparkle(void) { u8 spriteId; struct Sprite *sprite; @@ -1329,3 +1330,46 @@ u8 FldEff_BerryTreeGrowthSparkle(void) } return 0; } + +u32 FldEff_TreeDisguise(void) +{ + return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, 0x18, 0x04); +} + + +u32 FldEff_MountainDisguise(void) +{ + return ShowDisguiseFieldEffect(FLDEFF_MOUNTAIN_DISGUISE, 0x19, 0x03); +} + + +u32 FldEff_SandDisguise(void) +{ + return ShowDisguiseFieldEffect(FLDEFF_SAND_DISGUISE, 0x1C, 0x02); +} + +static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 templateIdx, u8 paletteNum) +{ + u8 spriteId; + struct Sprite *sprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(gFieldEffectSpawnParams[0], gFieldEffectSpawnParams[1], gFieldEffectSpawnParams[2], &spriteId)) + { + FieldEffectActiveListRemove(fldEff); + return MAX_SPRITES; + } + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[templateIdx], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled ++; + sprite->oam.paletteNum = paletteNum; + sprite->data1 = fldEff; + sprite->data2 = gFieldEffectSpawnParams[0]; + sprite->data3 = gFieldEffectSpawnParams[1]; + sprite->data4 = gFieldEffectSpawnParams[2]; + } + return spriteId; +} + + |