From c64997bfe5186da521f735c3186f8f0bbac386ec Mon Sep 17 00:00:00 2001
From: lachwright <lachlanwright17@gmail.com>
Date: Mon, 7 Oct 2019 20:55:58 +0800
Subject: [PATCH] Add Ambush and Flip flag behaviors

---
 src/p_enemy.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/p_enemy.c b/src/p_enemy.c
index cf074d176..6fdb68ac4 100644
--- a/src/p_enemy.c
+++ b/src/p_enemy.c
@@ -13935,6 +13935,8 @@ void A_RolloutSpawn(mobj_t *actor)
 		|| P_AproxDistance(actor->x - actor->target->x, actor->y - actor->target->y) > locvar1)
 	{
 		actor->target = P_SpawnMobj(actor->x, actor->y, actor->z, locvar2);
+		actor->target->flags2 |= (actor->flags2 & (MF2_AMBUSH | MF2_OBJECTFLIP));
+		actor->target->eflags |= (actor->eflags & MFE_VERTICALFLIP);
 	}
 }
 
@@ -13958,12 +13960,12 @@ void A_RolloutRock(mobj_t *actor)
 	UINT8 maxframes = actor->info->reactiontime;
 	fixed_t pi = (22*FRACUNIT/7);
 	fixed_t circumference = FixedMul(2 * pi, actor->radius);
-	fixed_t speed = P_AproxDistance(actor->momx, actor->momy), topspeed = actor->info->speed;
+	fixed_t speed = P_AproxDistance(actor->momx, actor->momy), topspeed = FixedMul(actor->info->speed, actor->scale);
 	boolean inwater = actor->eflags & (MFE_TOUCHWATER|MFE_UNDERWATER);
 
 	actor->friction = FRACUNIT;
 
-	if (inwater)
+	if (inwater && !(actor->flags2 & MF2_AMBUSH))
 	{
 		actor->momz = FixedMul(actor->momz, locvar2);
 		actor->momz += P_MobjFlip(actor) * FixedMul(locvar2, actor->scale);
@@ -13971,8 +13973,8 @@ void A_RolloutRock(mobj_t *actor)
 
 	if (speed > topspeed)
 	{
-		actor->momx = FixedMul(FixedDiv(actor->momx, oldspeed), topspeed);
-		actor->momy = FixedMul(FixedDiv(actor->momy, oldspeed), topspeed);
+		actor->momx = FixedMul(FixedDiv(actor->momx, speed), topspeed);
+		actor->momy = FixedMul(FixedDiv(actor->momy, speed), topspeed);
 	}
 
 	actor->momx = FixedMul(actor->momx, locvar1);
@@ -13988,7 +13990,7 @@ void A_RolloutRock(mobj_t *actor)
 	else if (speed > actor->scale)
 	{
 		actor->angle = R_PointToAngle2(0, 0, actor->momx, actor->momy);
-		actor->movefactor += newspeed;
+		actor->movefactor += speed;
 		if (actor->movefactor > circumference / maxframes)
 		{
 			actor->reactiontime++;