Anyone have any experience implementing a way to upload, download, and browse user generated content (UGC) in their game?

I’ve gotten multiple requests for my puzzle game to have the ability to share user-created puzzles in-game. I don’t even know where to start. I have no networking know-how. I’m assuming I would have to buy server space using some provider, then configure the server to allow user puzzles to be uploaded to it, and then connect to the server in-game. It alls seems way above my capabilities.

My game is on Steam, so I could use Steam Workshop, but I don’t know how to use that either, and that would exclude the few people who have bought my game on Itch .io, as well as excluding any future platforms I could add the game to.

If you want to support multiple platforms and not just steam, then not using Steam Workshop is the way to go.

You pretty much summed up what you would need to do for the most part. If you want to make user-created puzzles available as an in-game download list, then you would need somewhere (a server) to store them.

Assuming for the sake of conversation that your the data for your puzzles are saved as a certain type of file (json/xml/tmx/etc). Your community will need a way to make these puzzles. So first you would need to provide some tool or release your development tool that the community can use to make the puzzles. Either as a separate tool or added as part of the game itself.

Once you have a method for users to make valid community created puzzles, then it becomes the problem of how to share them. If you’re wanting it to be an option in game (like Mario Maker or Gemoetry dash), then you’ll need a server that can host the user created puzzle files. This starts to get into web development territory, but what you’ll want to look into is making REST APIs.

Basically when a user clicks to “view community created puzzles”, the game will do a web request to the server using the API, then the server returns back a list of available community created puzzles that have been uploaded. Your game presents this to the user, they pick what they want from the list, which then would call another API on the server that will download the actual puzzle/level file.

But this doesn’t even touch the larger issue you’ll have to solve, which is Allowing users to upload files. There are many ways of doing this, but you have to consider things like "Will they need to make a user account?, “How will I handle authentication”? “How will I handle security with authentication?”

Using something like Steam Workshop handles all the hard parts for you. It has the APIs that can be called and just uses the users steam account as the authentication/user handle part.

If you want to not use Steam Workshop and handle this yourself, you’re going to need to get into web development some, at minimum learning about REST APIs and how to use them in conjunction with your game

Probably the easiest thing would be to store them as json blobs in a cloud-based document database like FireStore or MongoDB Atlas… Both platforms have relatively easy to use API libraries.

As mentioned above though, yeah the biggest PITA is going to be user management… Are you going to force players to have a user account to upload data, where/when/how do they create an account, etc.

It’s worth pointing out that you don’t have to deliver the entire feature fully completed all at once. A good starting point might just be to get a way for players to copy/paste puzzles to each other. I’m not sure how much data a puzzle definition takes, but if you could boil them down to a string that could be shared via discord, or posted to a discussion board (ie, 1000 characters in length), that would give users the opportunity to at least use it.

You can always increment further :slight_smile:

2 Likes

Funny you should say that; I’ve actually already done that! I implemented a method of converting binary data to and from a copy/paste-able string of characters and then used that to allow users to share puzzles amongst themselves. They end up looking something like this (of course, the length of text depended on the size of the puzzle):

22"-*##C;##!XJ##!0[##;!(##!Pj##!F!@##Bc##^!(##"5!'##;!(##!0[##!XJ##C;##"-*##

I added this method of puzzle sharing about a month after release. I have no way of knowing how much private use it got, but only a few users posted any puzzles on the Steam forum. One user took it upon him or herself to port all of the puzzles from a different game to mine and post all the text strings. All 312 puzzles! Now that’s dedication.

Fortunately, I have a puzzle editor already built into the game to allow users to create and share puzzles using the clipboard method mentioned above. Puzzles are generally represented as minimal binary data, but it wouldn’t be hard to convert them to other formats if I needed to.

Yeah, something in-game like Mario Maker would be ideal, though it probably wouldn’t need to be as complex. Web development is a problem, though, since I simply don’t know how to do it. How long would it take to learn the web development skills necessary for something like this?

Authentication? Yikes… Does that mean I would have to implement some kind of security BS to keep bad actors from hacking the server and ruining everything or deleting everyone’s puzzles? Maybe my game isn’t big enough to have to worry about being a target of that.

And user accounts for the non-Steam versions is something I hadn’t really considered. Unless I made all puzzle uploading anonymous or something…

Well darn, it sounds like Steam Workshop would be the best option for me, were it not for the platform limitation factor. Very few users bought my game on Itch .io, so I guess it wouldn’t be terrible if the fancy in-game user puzzle sharing were Steam only if I offered every Itch .io owner a Steam key of the game, but if they bought the game on Itch instead of Steam they might not want to use Steam.

Augh, databases… I don’t know those either. SELECT whatever WHERE condition and all that… Sounds like I’ll have a ton of learning to do if I really want to do this.

And if I implemented my own user account system, wouldn’t I then have to distribute some kind of Privacy Policy or something? I don’t have and can’t afford a lawyer. I think I’d prefer no user accounts in that case. Levels could just be signed by a username, but there wouldn’t be any sort of logging in or anything like that.

Thanks for the replies!

1 Like

afaik itch.io has a feature to automatically issue steam keys to itch.io buyers if you want that.

that said, steam workshop may be the easiest option (it’s basically just some api calls and copying directories) as it provides not only distribution but also UI for browsing, managing additional content, cloud space, security, authentication etc

If you wanna make a standalone version, you’d need to provide browsing etc on your own - or just allow for users to copy files somewhere and let them decide on their own how they share content and they just share files however they like.

It basically depends how much effort you wanna put into it. But I would most likely just give users the option to use custom files and let them share them manually via discord, forum or whereever the community connects to each other.

I actually went the workshop route with integrated activation system and put a lot of effort in preparing everything for a standalone system just to find out that noone seems to be interested anyway … so maybe go for the easy way first and expand when demand justifies it

Not sure if mentioned but instead of a database on the server, run a script to compact all uploaded puzzles say once a day, or hour, into a zip file, say a collection of text files - naming them will be fun - and download and unpack those into a game directory.

Just a thought.

You’re right about the automatic Steam key distribution, that makes things convenient. And yeah, I worry that I would experience something similar: put a lot of effort into an integrated puzzle sharing solution, and then find it hardly gets used anyway. The community around my game is pretty small, which is partly why I just stuck with copy/paste puzzle sharing at first anyway. However, having an integrated puzzle sharing option could potentially increase the attractiveness of the game. But it’s sort of a chicken and egg scenario, since it only increases the appeal if people are actually using it.

That would make things simpler, but that would also mean people would have to download all of the puzzles instead of just the ones they’re interested in. Not a bad idea, though.

Can do series of zipped collections and check for missing collections?

The easiest (and most obvious) way would be to utilize the steam workshop. For that you need to integrate the SteamAPI.

I created a github repo, which includes all what you need. I even created a workshop tool to show how to use the workshop api.

Here it is:


Another way would be using Mod.io.

You can communicate with their servers via REST api or use the Modio.NET wrapper.

Mod.io has the advantage that it supports multiple platforms. However, most of the time steam users wish a steam workshop integration more often, because it’s more comfortable for them (directly browsing UGC via steam client, favourites etc.).


Creating your own web solution would only be recommended if you want to gather experience in that topic or simply because it is fun for you.

In all other ways you should stick with what already exists on the market, because it just works and safes you alot of time.


Another solution in your case (binary level data) could be simply creating a forum space on discord and let users share their creations there. Maybe you could even integrate the DiscordAPI in your game to parse shared levels. You should check out the Discord Developer Portal.

Hope that helps.

Have a nice day! :slight_smile:

Cheers

1 Like

Maybe, but I think I’d just rather avoid users needing to have every user puzzle saved onto their system even if they’re not interested in all of them. I’ll keep the idea in mind, though.

Thanks for all the good info! A user who had requested in-game puzzle sharing had actually suggested mod .io as well, so it’s definitely an option I’ll be considering. And I’m currently using Steamworks .NET for achievement functionality, so if I did do a Workshop implementation I’d be using that. I know you have a Steamworks .NET repo as well, so that could be useful for me to peruse if I decide to go that route.

2 Likes

Out of curiosity, what platform has the lion’s share of your user base? I think it’s good to think about the future, but to be honest, whatever that platform is you could probably just solve the problem there.

This sounds like a feature that will only serve to give your game more exposure, which in turn leads to more sales, which is revenue you’ll have to invest in supporting other platforms.

The game is only on Itch .io and Steam at the moment, with by far many more having bought the game on Steam. However, I had hoped to release the game on the Windows Store as well but encountered difficulties, so that hasn’t happened yet but hasn’t been ruled out. Also, it would be cool to maybe eventually release the game on consoles, too. Maybe even Android if I could rework the interface to be touch-friendly.

I’m looking into mod .io at the moment. I was intimidated at first by its expansive documentation, but I think it’ll be so much easier than trying to roll my own solution while still providing support for multiple platforms.

Edit: Unfortunately, using mod .io seems to have implications involving data collection and privacy that rule it out for me. I don’t have a lawyer to draft a privacy policy for me. Not sure if I would run into the same issue with Steam Workshop, but if I will, then I guess that eliminates the idea of in-game puzzle sharing and browsing.

1 Like

There are several services that can auto-generate a boilerplate privacy policy, ToS, etc. and even host them for you for free/cheap.

I’m surprised Steam doesn’t already require them, the Google Play & App Store both do :person_shrugging:

Good to know, maybe I could still consider mod. io, but I’m still kind of leaning towards Workshop.

There’s no mention of requiring users to agree to a privacy policy in the documentation for Workshop. The only legal-related thing I could find in the docs is here, where you need to have users agree to the Workshop Terms of Service (which appears to be part of the Steam Subscriber Agreement users will already have agreed to anyway), or else their submissions will be private by default.

I’m guessing that this is because Steam users are already under the Steam Subscriber Agreement and Steam’s privacy policy, and user account authentication is done through Steam—and Workshop is Steam’s thing. So the legal bases are covered already.

Yes, that is right.

If you want to be as safe as possible you could place a message with a link to the legal agreement in the near of your “upload to the workshop button”.

Like this: “By submitting this item, you agree to the workshop terms of service. Click here to learn more.

I did it like this in the workshop tool:

1 Like

Yeah, I was planning on adding a pop-up dialog with something to that effect when the user tries to access Workshop in-game.

1 Like

Late last year I implemented Steam Workshop, which took months of work. A grand total of one (1!) puzzle was uploaded by someone who was not me. So, moral of the story is, unless you have a large userbase, probably don’t bother.

1 Like

Awwww, though storry of our lives, right? The upside is that your take away is a butt ton of learning and growth, so good job! :slight_smile: :heart:

2 Likes