How Should Beta Beta Builds For Your Games

About

When making a game, it is generally a good idea to roll out a beta for your game, so that people can play it, and give early feedback. Games like Minecraft roll out snapshots for the game way before the version’s actual release. But, when we talk about Roblox, the story is different.

Making Betas

Making betas for your game is pretty easy, all you have to do is add a new place in your game, and add an option in your main game to TP to the beta place using Teleport Service.

The Problem: Data Management

If you are making a beta of your game, your game probably utilizes data stores. The problem here is how to manage the data of the players from the beta, and the players from the main game.

Solution 1: Don’t Care

You could actually publish your game to the beta place and not care about the data coming from the main game and the beta. This would mean that if you were to change the way data was stored in the beta, it will be replicated in the main game, hence, probably breaking the game. So, don’t do this for goodness sake, I have seen many games do this and it’s terrifying.

Solution 2: Separate Data Store

You could instead allow players to log in to a different data store, hence making them starting from scratch. This may be what you may want because you may want the people to experience the “newbie” -ness of the game, but, it would be a pain in the butt for the playtesters to work through the game to reach a point where they can actually experience the game. So, it really comes down to what you like. Here is how you may do it:

local DataStoreService = game:GetService("DataStoreService")
local dataStore

if game.PlaceId == 123456789 then
	-- main game, so load normal account
	dataStore = DataStoreService:GetDataStore("mainGameDataStore")
elseif game.PlaceId == 987654321 then
	dataStore = DataStoreService:GetDataStore("betaGameDataStore")
end

But, if you wanted to have a new data store every beta, here is how you do that:

local DataStoreService = game:GetService("DataStoreService")
local dataStore
local gameVersion = "v1.5.8-beta"

if game.PlaceId == 123456789 then
	-- main game, so load normal account
	dataStore = DataStoreService:GetDataStore("mainGameDataStore")
elseif game.PlaceId == 987654321 then
	dataStore = DataStoreService:GetDataStore("betaGameDataStore" .. gameVersion)
end

Solution 3: Load and Leave (The Best!)

This is the solution that everyone should have: load the data from the normal game and then never save the data hence allowing the player to resume playing as if it was a release. It’s that simple. Here’s how you might do it:

local DataStoreService = game:GetService("DataStoreService")
local dataStore

if game.PlaceId == 123456789 then
	-- main game, so load normal account
	dataStore = DataStoreService:GetDataStore("mainGameDataStore")
elseif game.PlaceId == 987654321 then
	-- load main account, and do not allow save
	dataStore = {
		GetAsync = function (...)
			return DataStoreService:GetDataStore("mainGameDataStore"):GetAsync(...)
		end,
		SetAsync = function ()
			return nil
		end,
		IncrementAsync = function ()
			return nil
		end,
		RemoveAsync = function ()
			return nil
		end,
		UpdateAsync = function ()
			return nil
		end
	}
end

Conclusion

In the end, it’s your choice. Do you want to drain players’ accounts each time they join? Do it. Do you want them to resume playing, do it! If you are making betas for your game, make it worth it to join.

- CoolAbhi1290

3 Likes

I personally don’t think this a great idea for QA. If you want to release an update, but not sure how it’s going to play out through errors, community feedback or performance, I’ve always found it useful to upload a separate universe with restricted access to those who want to participate.

This way, you completely remove the problem you’ve outlined in this post. Nothing affects the main universe, and you get your QA as requested :smiley:

2 Likes