From 6c1629868fe84414d4f7595d28c8030dffab35d7 Mon Sep 17 00:00:00 2001
From: Lighto97 <lighto97@outlook.com>
Date: Fri, 7 Mar 2025 01:11:17 -0300
Subject: [PATCH 1/9] fix bubble shield trap respawn softlock

---
 src/d_player.h      |  2 ++
 src/k_respawn.c     |  6 ++++++
 src/lua_playerlib.c | 13 +++++++++++++
 src/p_inter.c       |  2 ++
 src/p_mobj.c        |  1 +
 5 files changed, 24 insertions(+)

diff --git a/src/d_player.h b/src/d_player.h
index f1458f7fc..3c010fbfc 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -775,6 +775,8 @@ struct player_t
 	UINT8 curshield;	// see kartshields_t
 	UINT8 bubblecool;	// Bubble Shield use cooldown
 	UINT8 bubbleblowup;	// Bubble Shield usage blowup
+	mobj_t *bubbletrap; // Bubble player is trapped inside
+	boolean gotbubbletrapped; //to know if player was got trapped
 	UINT16 flamedash;	// Flame Shield dash power
 	UINT16 flamemeter;	// Flame Shield dash meter left
 	UINT8 flamelength;	// Flame Shield dash meter, number of segments
diff --git a/src/k_respawn.c b/src/k_respawn.c
index 6fe2f9897..e8ba03976 100644
--- a/src/k_respawn.c
+++ b/src/k_respawn.c
@@ -726,6 +726,12 @@ static void K_DropDashWait(player_t *player)
 	if (player->pflags & PF_FAULT)
 		return;
 
+	// if player got trapped inside a ubble but lost its bubble object in a unintended way, remove no gravity flag
+	if ((P_MobjWasRemoved(player->bubbletrap) && player->gotbubbletrapped == true) && (player->mo->flags & MF_NOGRAVITY)
+	{
+		player->mo->flags &= ~MF_NOGRAVITY;
+	}
+
 	if (leveltime % 8 == 0)
 	{
 		const UINT8 ns = 8;
diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c
index ee56da06f..daabaa701 100644
--- a/src/lua_playerlib.c
+++ b/src/lua_playerlib.c
@@ -430,6 +430,10 @@ static int player_get(lua_State *L)
 		lua_pushinteger(L, plr->bubblecool);
 	else if (fastcmp(field,"bubbleblowup"))
 		lua_pushinteger(L, plr->bubbleblowup);
+	else if (fastcmp(field,"bubbletrap"))
+		LUA_PushUserdata(L, plr->bubbletrap, META_MOBJ);
+	else if (fastcmp(field,"gotbubbletrapped"))
+		lua_pushboolean(L, plr->gotbubbletrapped);
 	else if (fastcmp(field,"flamedash"))
 		lua_pushinteger(L, plr->flamedash);
 	else if (fastcmp(field,"counterdash"))
@@ -994,6 +998,15 @@ static int player_set(lua_State *L)
 		plr->bubblecool = luaL_checkinteger(L, 3);
 	else if (fastcmp(field,"bubbleblowup"))
 		plr->bubbleblowup = luaL_checkinteger(L, 3);
+	else if (fastcmp(field,"bubbletrap"))
+	{
+		mobj_t *mo = NULL;
+		if (!lua_isnil(L, 3))
+			mo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
+		P_SetTarget(&plr->bubbletrap, mo);
+	}
+	else if (fastcmp(field,"gotbubbletrapped"))
+		plr->gotbubbletrapped = luaL_checkboolean(L, 3);
 	else if (fastcmp(field,"flamedash"))
 		plr->flamedash = luaL_checkinteger(L, 3);
 	else if (fastcmp(field,"counterdash"))
diff --git a/src/p_inter.c b/src/p_inter.c
index 49cae6cab..ed35a65b0 100644
--- a/src/p_inter.c
+++ b/src/p_inter.c
@@ -642,6 +642,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
 			P_SetTarget(&special->tracer, toucher);
 			toucher->flags |= MF_NOGRAVITY;
 			toucher->momz = (8*toucher->scale) * P_MobjFlip(toucher);
+			toucher->player->gotbubbletrapped = true;
+			P_SetTarget(&toucher->player->bubbletrap, special); //allow it to access later on and to know if player is trapped
 
 			// Snap to the unfortunate player and quit moving laterally, or we can end up quite far away
 			special->momx = 0;
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 896af74d6..3eebff507 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -9387,6 +9387,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
 			{
 				S_StartSound(mobj->tracer, sfx_s3k77);
 				mobj->tracer->flags &= ~MF_NOGRAVITY;
+				mobj->tracer->player->gotbubbletrapped = false;
 				P_KillMobj(mobj, mobj->tracer, mobj->tracer, DMG_NORMAL);
 				break;
 			}
-- 
GitLab


From c622ee9c90cdb1eee6962cac8bf1c5e8ffd164c1 Mon Sep 17 00:00:00 2001
From: Lighto97 <lighto97@outlook.com>
Date: Fri, 7 Mar 2025 16:41:59 -0300
Subject: [PATCH 2/9] fix missing )

---
 src/k_respawn.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/k_respawn.c b/src/k_respawn.c
index e8ba03976..785d67370 100644
--- a/src/k_respawn.c
+++ b/src/k_respawn.c
@@ -727,7 +727,7 @@ static void K_DropDashWait(player_t *player)
 		return;
 
 	// if player got trapped inside a ubble but lost its bubble object in a unintended way, remove no gravity flag
-	if ((P_MobjWasRemoved(player->bubbletrap) && player->gotbubbletrapped == true) && (player->mo->flags & MF_NOGRAVITY)
+	if ((P_MobjWasRemoved(player->bubbletrap) && player->gotbubbletrapped == true) && (player->mo->flags & MF_NOGRAVITY))
 	{
 		player->mo->flags &= ~MF_NOGRAVITY;
 	}
-- 
GitLab


From ed5adc5b78ff233058240ee31bb5d3809b3f02cf Mon Sep 17 00:00:00 2001
From: Lighto97 <lighto97@outlook.com>
Date: Tue, 11 Mar 2025 02:03:35 -0300
Subject: [PATCH 3/9] use player->carry and player->mobj->tracer

---
 src/d_player.h      |  3 +--
 src/deh_tables.c    |  1 +
 src/k_respawn.c     |  5 +++--
 src/lua_playerlib.c | 13 -------------
 src/p_inter.c       |  4 ++--
 src/p_mobj.c        |  2 +-
 6 files changed, 8 insertions(+), 20 deletions(-)

diff --git a/src/d_player.h b/src/d_player.h
index 3c010fbfc..80ebacc25 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -150,6 +150,7 @@ typedef enum
 	CR_SLIDING,
 	CR_ZOOMTUBE,
 	CR_DASHRING,
+	CR_TRAPBUBBLE,
 } carrytype_t; // carry
 
 /*
@@ -775,8 +776,6 @@ struct player_t
 	UINT8 curshield;	// see kartshields_t
 	UINT8 bubblecool;	// Bubble Shield use cooldown
 	UINT8 bubbleblowup;	// Bubble Shield usage blowup
-	mobj_t *bubbletrap; // Bubble player is trapped inside
-	boolean gotbubbletrapped; //to know if player was got trapped
 	UINT16 flamedash;	// Flame Shield dash power
 	UINT16 flamemeter;	// Flame Shield dash meter left
 	UINT8 flamelength;	// Flame Shield dash meter, number of segments
diff --git a/src/deh_tables.c b/src/deh_tables.c
index 6a5255e8e..1b7a8fcb7 100644
--- a/src/deh_tables.c
+++ b/src/deh_tables.c
@@ -4671,6 +4671,7 @@ struct int_const_s const INT_CONST[] = {
 	// Carrying
 	{"CR_NONE",CR_NONE},
 	{"CR_ZOOMTUBE",CR_ZOOMTUBE},
+	{"CR_TRAPBUBBLE",CR_TRAPBUBBLE},
 
 	// Character flags (skinflags_t)
 	{"SF_MACHINE",SF_MACHINE},
diff --git a/src/k_respawn.c b/src/k_respawn.c
index 785d67370..748b9aaae 100644
--- a/src/k_respawn.c
+++ b/src/k_respawn.c
@@ -726,10 +726,11 @@ static void K_DropDashWait(player_t *player)
 	if (player->pflags & PF_FAULT)
 		return;
 
-	// if player got trapped inside a ubble but lost its bubble object in a unintended way, remove no gravity flag
-	if ((P_MobjWasRemoved(player->bubbletrap) && player->gotbubbletrapped == true) && (player->mo->flags & MF_NOGRAVITY))
+	// if player got trapped inside a bubble but lost its bubble object in a unintended way, remove no gravity flag
+	if (((P_MobjWasRemoved(player->mo->tracer) || player->mo->tracer == NULL) && player->carry == CR_TRAPBUBBLE) && (player->mo->flags & MF_NOGRAVITY))
 	{
 		player->mo->flags &= ~MF_NOGRAVITY;
+		player->carry = CR_NONE;
 	}
 
 	if (leveltime % 8 == 0)
diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c
index daabaa701..ee56da06f 100644
--- a/src/lua_playerlib.c
+++ b/src/lua_playerlib.c
@@ -430,10 +430,6 @@ static int player_get(lua_State *L)
 		lua_pushinteger(L, plr->bubblecool);
 	else if (fastcmp(field,"bubbleblowup"))
 		lua_pushinteger(L, plr->bubbleblowup);
-	else if (fastcmp(field,"bubbletrap"))
-		LUA_PushUserdata(L, plr->bubbletrap, META_MOBJ);
-	else if (fastcmp(field,"gotbubbletrapped"))
-		lua_pushboolean(L, plr->gotbubbletrapped);
 	else if (fastcmp(field,"flamedash"))
 		lua_pushinteger(L, plr->flamedash);
 	else if (fastcmp(field,"counterdash"))
@@ -998,15 +994,6 @@ static int player_set(lua_State *L)
 		plr->bubblecool = luaL_checkinteger(L, 3);
 	else if (fastcmp(field,"bubbleblowup"))
 		plr->bubbleblowup = luaL_checkinteger(L, 3);
-	else if (fastcmp(field,"bubbletrap"))
-	{
-		mobj_t *mo = NULL;
-		if (!lua_isnil(L, 3))
-			mo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
-		P_SetTarget(&plr->bubbletrap, mo);
-	}
-	else if (fastcmp(field,"gotbubbletrapped"))
-		plr->gotbubbletrapped = luaL_checkboolean(L, 3);
 	else if (fastcmp(field,"flamedash"))
 		plr->flamedash = luaL_checkinteger(L, 3);
 	else if (fastcmp(field,"counterdash"))
diff --git a/src/p_inter.c b/src/p_inter.c
index ed35a65b0..1c696327a 100644
--- a/src/p_inter.c
+++ b/src/p_inter.c
@@ -642,8 +642,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
 			P_SetTarget(&special->tracer, toucher);
 			toucher->flags |= MF_NOGRAVITY;
 			toucher->momz = (8*toucher->scale) * P_MobjFlip(toucher);
-			toucher->player->gotbubbletrapped = true;
-			P_SetTarget(&toucher->player->bubbletrap, special); //allow it to access later on and to know if player is trapped
+			toucher->player->carry = CR_TRAPBUBBLE;
+			P_SetTarget(&toucher->tracer, special); //use tracer to acces the object 
 
 			// Snap to the unfortunate player and quit moving laterally, or we can end up quite far away
 			special->momx = 0;
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 3eebff507..ccb810bf9 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -9387,7 +9387,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
 			{
 				S_StartSound(mobj->tracer, sfx_s3k77);
 				mobj->tracer->flags &= ~MF_NOGRAVITY;
-				mobj->tracer->player->gotbubbletrapped = false;
+				mobj->tracer->player->carry = CR_NONE;
 				P_KillMobj(mobj, mobj->tracer, mobj->tracer, DMG_NORMAL);
 				break;
 			}
-- 
GitLab


From 4e4a3d3ba6663e8f92c86b0c7741cee70d724946 Mon Sep 17 00:00:00 2001
From: Lighto97 <lighto97@outlook.com>
Date: Wed, 12 Mar 2025 02:21:28 -0300
Subject: [PATCH 4/9] move missplaced code from DropDashWait to HandleDropDash

---
 src/k_respawn.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/src/k_respawn.c b/src/k_respawn.c
index 748b9aaae..127dc7a3c 100644
--- a/src/k_respawn.c
+++ b/src/k_respawn.c
@@ -724,14 +724,7 @@ static void K_DropDashWait(player_t *player)
 		player->respawn.timer--;
 
 	if (player->pflags & PF_FAULT)
-		return;
-
-	// if player got trapped inside a bubble but lost its bubble object in a unintended way, remove no gravity flag
-	if (((P_MobjWasRemoved(player->mo->tracer) || player->mo->tracer == NULL) && player->carry == CR_TRAPBUBBLE) && (player->mo->flags & MF_NOGRAVITY))
-	{
-		player->mo->flags &= ~MF_NOGRAVITY;
-		player->carry = CR_NONE;
-	}
+		return;	
 
 	if (leveltime % 8 == 0)
 	{
@@ -878,6 +871,12 @@ static void K_HandleDropDash(player_t *player)
 		{
 			player->mo->colorized = false;
 		}
+		// if player got trapped inside a bubble but lost its bubble object in a unintended way, remove no gravity flag
+		if (((P_MobjWasRemoved(player->mo->tracer) || player->mo->tracer == NULL || (!P_MobjWasRemoved(player->mo->tracer) && player->mo->tracer && player->mo->tracer->type != MT_BUBBLESHIELDTRAP)) && player->carry == CR_TRAPBUBBLE) && (player->mo->flags & MF_NOGRAVITY))
+		{
+			player->mo->flags &= ~MF_NOGRAVITY;
+			player->carry = CR_NONE;
+		}
 	}
 	else
 	{
-- 
GitLab


From b668678278c172af1da447d4b49cbd40f2016db9 Mon Sep 17 00:00:00 2001
From: Lighto97 <lighto97@outlook.com>
Date: Wed, 12 Mar 2025 02:24:07 -0300
Subject: [PATCH 5/9] add missing CR_ flags in deh_tables.c

---
 src/deh_tables.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/deh_tables.c b/src/deh_tables.c
index 1b7a8fcb7..58deb6cb8 100644
--- a/src/deh_tables.c
+++ b/src/deh_tables.c
@@ -4670,7 +4670,9 @@ struct int_const_s const INT_CONST[] = {
 
 	// Carrying
 	{"CR_NONE",CR_NONE},
+	{"CR_SLIDING",CR_SLIDING},
 	{"CR_ZOOMTUBE",CR_ZOOMTUBE},
+	{"CR_DASHRING",CR_DASHRING},
 	{"CR_TRAPBUBBLE",CR_TRAPBUBBLE},
 
 	// Character flags (skinflags_t)
-- 
GitLab


From 05923e935d259a37a210d47c6495aafd13cbffc2 Mon Sep 17 00:00:00 2001
From: Lighto97 <lighto97@outlook.com>
Date: Wed, 12 Mar 2025 02:27:05 -0300
Subject: [PATCH 6/9] check tracer and player carry flag on trapbubble thinker

---
 src/p_mobj.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/p_mobj.c b/src/p_mobj.c
index ccb810bf9..4fe37026e 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -9339,7 +9339,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
 		if (leveltime % 180 == 0)
 			S_StartSound(mobj, sfx_s3kbfl);
 
-		if (mobj->tracer && !P_MobjWasRemoved(mobj->tracer) && mobj->tracer->player)
+		if (mobj->tracer && !P_MobjWasRemoved(mobj->tracer) && mobj->tracer->tracer == mobj && mobj->tracer->player && mobj->tracer->player->carry == CR_TRAPBUBBLE)
 		{
 			player_t *player = mobj->tracer->player;
 			fixed_t destx, desty, curfz, destfz;
-- 
GitLab


From 25712a0cf3f75efea0bc755cd86336c3d0104590 Mon Sep 17 00:00:00 2001
From: Lighto97 <lighto97@outlook.com>
Date: Wed, 12 Mar 2025 02:31:01 -0300
Subject: [PATCH 7/9] make game keep CR_TRAPBUBBLE flag on player respawn/reset

---
 src/p_inter.c | 3 ++-
 src/p_user.c  | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/p_inter.c b/src/p_inter.c
index 1c696327a..2bad99e5d 100644
--- a/src/p_inter.c
+++ b/src/p_inter.c
@@ -2626,7 +2626,8 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source,
 	K_DropEmeraldsFromPlayer(player, player->emeralds);
 	//K_SetHitLagForObjects(player->mo, inflictor, source, MAXHITLAGTICS, true);
 
-	player->carry = CR_NONE;
+	if (player->carry != CR_TRAPBUBBLE)
+		player->carry = CR_NONE;
 
 	K_KartResetPlayerColor(player);
 
diff --git a/src/p_user.c b/src/p_user.c
index ecff343ee..0ba95a032 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -418,7 +418,8 @@ void P_ResetPlayer(player_t *player)
 {
 	//player->pflags &= ~(PF_);
 
-	player->carry = CR_NONE;
+	if (player->carry != CR_TRAPBUBBLE)
+		player->carry = CR_NONE;
 	player->onconveyor = 0;
 
 	//player->drift = player->driftcharge = 0;
-- 
GitLab


From da0d266a60415951ac28de0ae900882374046441 Mon Sep 17 00:00:00 2001
From: Lighto97 <lighto97@outlook.com>
Date: Wed, 12 Mar 2025 15:30:43 -0300
Subject: [PATCH 8/9] let player->carry be reseted on player true death

---
 src/p_inter.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/p_inter.c b/src/p_inter.c
index 2bad99e5d..1e22373be 100644
--- a/src/p_inter.c
+++ b/src/p_inter.c
@@ -2626,8 +2626,8 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source,
 	K_DropEmeraldsFromPlayer(player, player->emeralds);
 	//K_SetHitLagForObjects(player->mo, inflictor, source, MAXHITLAGTICS, true);
 
-	if (player->carry != CR_TRAPBUBBLE)
-		player->carry = CR_NONE;
+	//if (player->carry != CR_TRAPBUBBLE)
+	player->carry = CR_NONE;
 
 	K_KartResetPlayerColor(player);
 
-- 
GitLab


From 3ac03eb572dc46338fa59057fd4090a512261f78 Mon Sep 17 00:00:00 2001
From: Lighto97 <lighto97@outlook.com>
Date: Wed, 12 Mar 2025 15:31:36 -0300
Subject: [PATCH 9/9] remove code i comented to test it out, oops

---
 src/p_inter.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/p_inter.c b/src/p_inter.c
index 1e22373be..1c696327a 100644
--- a/src/p_inter.c
+++ b/src/p_inter.c
@@ -2626,7 +2626,6 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source,
 	K_DropEmeraldsFromPlayer(player, player->emeralds);
 	//K_SetHitLagForObjects(player->mo, inflictor, source, MAXHITLAGTICS, true);
 
-	//if (player->carry != CR_TRAPBUBBLE)
 	player->carry = CR_NONE;
 
 	K_KartResetPlayerColor(player);
-- 
GitLab