diff --git a/src/p_mobj.c b/src/p_mobj.c
index 48d5474e9f053ac3d9df042a55f2d23d5184bf80..1df7d5b971d2770c315c2cb6fef9bc86f3da343c 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -12090,14 +12090,14 @@ ML_EFFECT5 : Don't stop thinking when too far away
 		break;
 	case MT_BIGFERN:
 	{
-		angle_t angle = FixedAngle((mthing->angle % 45) << FRACBITS);
+		angle_t angle = FixedAngle(mthing->angle << FRACBITS);
 		UINT8 i;
 		for (i = 0; i < 8; i++)
 		{
-			UINT8 j = (i + 2) % 8;
-			fixed_t xoffs = (j % 4) ? FRACUNIT : 0;
-			fixed_t yoffs = (i % 4) ? FRACUNIT : 0;
-			mobj_t *leaf = P_SpawnMobjFromMobj(mobj, (j > 3) ? -xoffs : xoffs, (i > 3) ? -yoffs : yoffs, 0, MT_BIGFERNLEAF);
+			angle_t fa = (angle >> ANGLETOFINESHIFT) & FINEMASK;
+			fixed_t xoffs = FINECOSINE(fa);
+			fixed_t yoffs = FINESINE(fa);
+			mobj_t *leaf = P_SpawnMobjFromMobj(mobj, xoffs, yoffs, 0, MT_BIGFERNLEAF);
 			leaf->angle = angle;
 			angle += ANGLE_45;
 		}