Making Gartic Phone like game, issue with showcasing builds and prompts that are not lining up

I’m currently trying to make a game thats based and inspired by Gartic Phone, execpt in 3d.
what im trying to do here is that when someone is done doing a promt or a build the server gets this promt or build, then takes the table and alter it by one index and resend to the clients in other again, until every player has their promt read, made and repeated untill into a form thats incomprehesible, just like a telephone game, but heres the issue.

the code that “shuffles” the tables seems to be working,
but the code that shows the results doesnt seem to line up, from what i saw when play testing with a few people, i could technicly try to fix this myself, but i thought of giving this to the people who know more then me and mabye see things that i couldnt see and a little feedback.
after all this is the most importent code of the game, the game is public and you can test it out yourself if you deem helpful: Onion Telegraf - Roblox be warned, extreme indie dev feel, 1/4 baked and buggyness.

strangest thing is that i made a code that simlulates the code that showcases the builds and it seems to be working so idk whats wrong with it.

here is the code, along with the test code i made, sorry if its long, you dont need to look at everything but only the part that creates a table to show the results.

local listOfWords = {
	"Dog", "Cat","Burger","House","Epic","Balling","InterlockingSystem","Butterfly","Rocket","Bomb","Nuclear","Beutiful","Stratagema","PSCP","Lore","Soul","Of","Cinder","Love","Car","Team","Person","Existence","Why","Who","Bro","When","PlinPlinPlon"
}
local function giveStartPromt()
	local tablo = {}
	for i=1, math.random(3,6) do
		table.insert(tablo,listOfWords[math.random(1,#listOfWords)])
	end
	return table.concat(tablo,"_")
end

local nextfinishedpromt = false
local rounds = {}
local startOfPlayers
local numOfPlayers

local normalmode_desctext = "write what you think you see,<br />once sended no going back"
local normalmode_impacentText  = "you really take alot to process isnt it?"
RS.Remotes.startGame.OnServerEvent:Connect(function()
	if onGoingGame then print("game goin silly") return end
	onGoingGame = true
	table.clear(rounds)
	for roundnum = 1, #game.Players:GetChildren() do
		--1 = promts
		--2 = places
		rounds[roundnum] = {
			{},
			{}
		}
		--get promts
		local howManyVoted = 0
		if roundnum == 1 then
			numOfPlayers = #game.Players:GetChildren()
			for _, player:Player in game.Players:GetChildren() do
				task.spawn(function()
					local success, promtthing = pcall(function()
						return RS.Remotes.getPromtsForServer:InvokeClient(player,nil,"write a promt for someone idk",normalmode_impacentText)
					end)
					--local promtthing = RS.Remotes.getPromtsForServer:InvokeClient(player)
					--rounds[roundnum][player] = promtthing --why dodesnt it # the values AHHHHHH
					if success then
						if promtthing == "" then
							promtthing = giveStartPromt()
						end
						table.insert(rounds[roundnum][1],{player.UserId,promtthing,true})
					else numOfPlayers -= 1 warn("got error prop left idk: "..promtthing) end --client prob left the server
					RS.Remotes.sendPlayersReadyOfPromt:FireAllClients(#rounds[roundnum][1],numOfPlayers)
				end)
			end
			startOfPlayers = numOfPlayers
		else
			local firstTolast
			local lastguy
			for i, tableplayer in rounds[roundnum-1][2] do
				if not lastguy then lastguy = tableplayer firstTolast = tableplayer continue end --i should ve drank water this boggy bugy me out
				task.spawn(function()
					local isAlive = tableplayer[3] --idk if i should make a system if they can come back if they disconnected.. eh why not
					local success, promtthing = pcall(function()
						return RS.Remotes.getPromtsForServer:InvokeClient(game.Players:GetPlayerByUserId(tableplayer[1]),lastguy[2],normalmode_desctext,normalmode_impacentText)
					end)
					
					if success and not isAlive then --this guy resurected
						numOfPlayers += 1 warn("no way he came back")
					elseif not success and isAlive then --this guy died you barnical how could you
						numOfPlayers -= 1 warn("got error prob left or has left idk: "..promtthing)
						promtthing = rounds[roundnum-1][1][i]
					end --client prob left the server	
					table.insert(rounds[roundnum][1],{tableplayer[1],promtthing,success})
					RS.Remotes.sendPlayersReadyOfPromt:FireAllClients(#rounds[roundnum][1]-(startOfPlayers-numOfPlayers),numOfPlayers) --#rounds[roundnum-1][2]) --numOfPlayers?
				end)
				lastguy = tableplayer
			end
			task.spawn(function()
				local isAlive = firstTolast[3] --idk if i should make a system if they can come back if they disconnected.. eh why not
				local success, promtthing = pcall(function()
					return RS.Remotes.getPromtsForServer:InvokeClient(game.Players:GetPlayerByUserId(firstTolast[1]),lastguy[2],normalmode_desctext,normalmode_impacentText)
				end)
				--rounds[roundnum][player] = promtthing --why dodesnt it # the values AHHHHHH
				if success and not isAlive then --this guy resurected
					numOfPlayers += 1 warn("no way he came back")
				elseif not success and isAlive then --this guy died you barnical how could you
					numOfPlayers -= 1 warn("got error prob left or has left idk: "..promtthing)
					promtthing = rounds[roundnum-1][1][1]
				end --client prob left the server	
				table.insert(rounds[roundnum][1],{firstTolast[1],promtthing,success})
			end)			
		end
		
		repeat task.wait() until #rounds[roundnum][1] == startOfPlayers
		print(rounds)
		print("finished writing promts")
		
		--give promts
		local firstTolast
		local lastguy
		for i, tableplayer in rounds[roundnum][1] do --should i store it in a table or run the same for loop? this is future me at bed time i have no idea what this guy talkin about
			if not lastguy then lastguy = tableplayer firstTolast = tableplayer continue end
			local playerstuff = game.Players:GetPlayerByUserId(tableplayer[1])
			if playerstuff then
				RS.Remotes.sendPromt:FireClient(playerstuff,lastguy[2])
			end
			lastguy = tableplayer
		end
		local playerstuff = game.Players:GetPlayerByUserId(firstTolast[1])
		if playerstuff then
			RS.Remotes.sendPromt:FireClient(playerstuff,lastguy[2])
		end
		
		print("building started")
		waitTimer(globalGamemodeSettings.timeForBuildingInSeconds)
		print("building ended")
		
		local firstTolast
		local lastguy
		for i, tableplayer in rounds[roundnum][1] do
			if not lastguy then lastguy = tableplayer firstTolast = tableplayer continue end
			if not tableplayer[1] then numOfPlayers -= 1 continue end
			task.spawn(function()
				local isAlive = tableplayer[3]
				local success, palcething = pcall(function()
					return RS.Remotes.getPlacesForServer:InvokeClient(game.Players:GetPlayerByUserId(tableplayer[1]))
				end)
				
				if success and not isAlive then --this guy resurected
					numOfPlayers += 1 warn("no way he came back")
				elseif not success and isAlive then --this guy died you barnical how could you
					numOfPlayers -= 1 warn("got error prob left or has left idk: "..palcething)
					palcething = rounds[roundnum-1][1][i]
				end --client prob left the server	
				table.insert(rounds[roundnum][2],{tableplayer[1],palcething,success})
			end)
			lastguy = tableplayer
		end
		task.spawn(function()
			local isAlive = firstTolast[3]
			local success, palcething = pcall(function()
				return RS.Remotes.getPlacesForServer:InvokeClient(game.Players:GetPlayerByUserId(firstTolast[1]))
			end)
			if success and not isAlive then --this guy resurected
				numOfPlayers += 1 warn("no way he came back")
			elseif not success and isAlive then --this guy died you barnical how could you
				numOfPlayers -= 1 warn("got error prob left or has left idk: "..palcething)
				palcething = rounds[roundnum-1][1][1]
			end --client prob left the server	
			table.insert(rounds[roundnum][2],{firstTolast[1],palcething})
		end)
		repeat task.wait() until #rounds[roundnum][2] == startOfPlayers
		print(rounds)
		print("one round finished")
	end
	print("makin fnished now time to show em")
	
	local finishedRounds = {}
	for i, round in rounds do
		if i == 1 then
			for i, playerpromt in round[1] do
				finishedRounds[i] = {}
			end
		end
		local thing = {}
		for i, promthing in round[1] do
			thing[i] = {}
			table.insert(thing[i],{promthing[1],promthing[2]})
		end
		for i, promthing in round[2] do
			table.insert(thing[i],{promthing[1],promthing[2]})
		end
		for i, thingytning in thing do
			table.insert(finishedRounds[i],thingytning)
		end
	end
	print(finishedRounds)
	--for i, round in rounds do
	--	if i == 1 then
	--		for i, playerpromt in round[1] do
	--			finishedRounds[i] = {}
	--		end
	--	end
	--	for i, promthing in round[1] do
	--		table.insert(finishedRounds[i],{1,promthing[1],promthing[2]})
	--	end
	--	for i, promthing in round[2] do
	--		table.insert(finishedRounds[i],{2,promthing[1],promthing[2]})
	--	end
	--end
	for iron, roundabout in finishedRounds do
		for i, thing in roundabout do
			local a if iron == 1 and i == 1 then a = 1 end
			repeat task.wait() until nextfinishedpromt or a
			if i == 1 and a ~= 1 then a = 2 end
			if iron == #finishedRounds and i == #roundabout then a = 3 end
			RS.Remotes.sendFinishedPromtToPlayers:FireAllClients(thing, a,nextfinishedpromt)
			nextfinishedpromt = false
		end
	end
	
	print("game finished!111")
	onGoingGame = false
end)

local rounds = {}
local playersTest = {}
local function addTestPlayer(name)
	local a = Instance.new("StringValue")
	a.Name = name
	table.insert(playersTest,a)
end
addTestPlayer("Player1")
addTestPlayer("Player2")
addTestPlayer("Player3")
local function givePromt(strin)
	return strin..1
end
local function testRoundSytem()
	table.clear(rounds)
	for roundnum = 1, #playersTest do
		--1 = promts
		--2 = places
		rounds[roundnum] = {
			{},
			{}
		}
		--get promts
		if roundnum == 1 then
			for _, player in playersTest do
				task.spawn(function()
					local promtthing = giveStartPromt() --RS.Remotes.getPromtsForServer:InvokeClient(player)
					--rounds[roundnum][player] = promtthing --why dodesnt it # the values AHHHHHH
					table.insert(rounds[roundnum][1],{player,promtthing})
					--RS.Remotes.sendPlayersReadyOfPromt:FireAllClients(#rounds[roundnum][1],#game.Players:GetChildren())
				end)
			end		
		else
			local firstTolast
			local lastguy
			for i, tableplayer in rounds[roundnum-1][2] do
				if not lastguy then lastguy = tableplayer firstTolast = tableplayer continue end --i should ve drank water this boggy bugy me out
				task.spawn(function()
					local promtthing = givePromt(lastguy[2]) --RS.Remotes.getPromtsForServer:InvokeClient(tableplayer[1],lastguy[2])
					--rounds[roundnum][player] = promtthing --why dodesnt it # the values AHHHHHH
					table.insert(rounds[roundnum][1],{tableplayer[1],promtthing})
					--RS.Remotes.sendPlayersReadyOfPromt:FireAllClients(#rounds[roundnum][1],rounds[roundnum-1][2])
				end)
				lastguy = tableplayer
			end
			task.spawn(function()
				local promtthing = givePromt(lastguy[2]) --RS.Remotes.getPromtsForServer:InvokeClient(firstTolast[1],lastguy[2])
				--rounds[roundnum][player] = promtthing --why dodesnt it # the values AHHHHHH
				table.insert(rounds[roundnum][1],{firstTolast[1],promtthing})
			end)
		end

		repeat task.wait() until #rounds[roundnum][1] == #playersTest
		print(rounds)
		print("finished writing promts")

		--give promts
		local firstTolast
		local lastguy
		for i, tableplayer in rounds[roundnum][1] do --should i store it in a table or run the same for loop?
			if not lastguy then lastguy = tableplayer firstTolast = tableplayer continue end
			print("sended promt "..lastguy[2].."by "..lastguy[1].Name.."to"..tableplayer[1].Name)--RS.Remotes.sendPromt:FireClient(tableplayer[1],lastguy[2])
			lastguy = tableplayer
		end
		print("sended promt "..lastguy[2].."by "..lastguy[1].."to"..firstTolast[1])--RS.Remotes.sendPromt:FireClient(firstTolast[1],lastguy[2])

		print("building started")
		waitTimer(globalGamemodeSettings.timeForBuildingInSeconds)
		print("building ended")

		local firstTolast
		local lastguy
		for i, tableplayer in rounds[roundnum][1] do
			if not lastguy then lastguy = tableplayer firstTolast = tableplayer continue end
			task.spawn(function()
				local palcething = "building of "..tableplayer[1].Name --RS.Remotes.getPlacesForServer:InvokeClient(tableplayer[1])
				table.insert(rounds[roundnum][2],{tableplayer[1],palcething})
			end)
			lastguy = tableplayer
		end
		task.spawn(function()
			local palcething = "building of "..firstTolast[1].Name --RS.Remotes.getPlacesForServer:InvokeClient(firstTolast[1])
			table.insert(rounds[roundnum][2],{firstTolast[1],palcething})
		end)
		repeat task.wait() until #rounds[roundnum][2] == #playersTest
		print(rounds)
		print("one round finished")
	end
	print("makin fnished now time to show em")

	local finishedRounds = {}
	for i, round in rounds do
		if i == 1 then
			for i, playerpromt in round[1] do
				finishedRounds[i] = {}
			end
		end
		local thing = {}
		for i, promthing in round[1] do
			thing[i] = {}
			table.insert(thing[i],{promthing[1],promthing[2]})
		end
		for i, promthing in round[2] do
			table.insert(thing[i],{promthing[1],promthing[2]})
		end
		for i, thingytning in thing do
			table.insert(finishedRounds[i],thingytning)
		end
	end
	print(finishedRounds)
	--for i, round in rounds do
	--	if i == 1 then
	--		for i, playerpromt in round[1] do
	--			finishedRounds[i] = {}
	--		end
	--	end
	--	for i, promthing in round[1] do
	--		table.insert(finishedRounds[i],{1,promthing[1],promthing[2]})
	--	end
	--	for i, promthing in round[2] do
	--		table.insert(finishedRounds[i],{2,promthing[1],promthing[2]})
	--	end
	--end
	for iron, roundabout in finishedRounds do
		for i, thing in roundabout do
			local a if iron == 1 and i == 1 then a = 1 end
			task.wait(1)--repeat task.wait() until nextfinishedpromt or a
			if i == 1 and a ~= 1 then a = 2 end
			nextfinishedpromt = false
			if iron == #finishedRounds and i == #roundabout then a = 3 end
			if a == 1 then
				print("time up, Lets take a look *rubs hands*")
				print(" Album i think, use /next to next")
			elseif a == 2 then
				print(thing[1][1].Name.." Album i think, use /next to next")
			elseif a == 3 then
				print("i think thats it")
			else
				print("nexted")
			end
			print(thing[1][1]..": "..thing[1][2])
			task.wait(2)
			print(thing[2][1]..": "..thing[1][2])
			--RS.Remotes.sendFinishedPromtToPlayers:FireAllClients(thing, a)	
		end
	end
	
	print("game finished!111")
end

Sorry if this post is bad, its my first post and im abusing the excuse that english is not my first language (dispite using it more then my native one)
Most importent: please ignore my comments