Use Steam's data folders?

Use Steam's data folders?


My game deploys in Steam just fine, but I notice it writes all files to AppData\Local\psf2018. That’s kind of confusing to most users, and besides, it may make it difficult to back up their Steam data. Just curious if anyone does anything differently on Steam games.



That’s how I do it for my game too. If I were to change it, I’d change cocos2d’s GetWritablePath, but I don’t see the value. You could add a page to the PCGamingWiki for your game to make it easier, it’s a pretty good resource.


what does getWritablePath() actually return on Steam?


It’s the same as regular win32 dev, the folder in AppData. Since my project in VS2013 is called roguebreaker_proj, cocos2d saves to AppData/Local/roguebreaker_proj. The only configuration that I needed to do related to that was cloud saving:

telling Steam which exe to run:

and that’s about it. I also had Steam install the vs2013, 2012, and 2010 redists.


TankorSmash, you are awesome, man! Thanks for the great suggestions!

So … you haven’t by chance implemented Workshop, Steam Cloud, or Multiplayer, have you? :slight_smile:

BTW, if you have any questions for me, send them my way! I’ve moved from the simple audio to AudioEngine, but occasionally get a crash in iOS that I’m investigating. I hope I can keep using this library (or find another), because I like varying the crowd volume and music volume. But I’ll help out any way I can.

Again, thanks so much! I’m very impressed! Keep up the good work!!


I use CricketAudio for audio and it seems to work well. It might be causing a crash on Android but I can’t tell for sure. It’s real easy to use.

I use the Auto cloud stuff on Steam, haven’t tested it out much but I just pointed it to the AppData folder and I assume it works.

I got workshop support going, the docs are great but it was a little tricky. Sometimes the website doesn’t show the workshop item immediately, even if the API registers it as created, leading to a bit of confusion. Tldr of it though is you create a workshop item, then begin an update call and attach all the data, like title, desc, tags, metadata and preview image along with the Item’s folder location, and then ‘commit’ the update call.

Again, it seemed a lot more complex than it ended up being, just that there’s a lot of edge cases to handle.

Besides leaderboards, I haven’t come close to multiplayer though :frowning:

I’m only looking for pre-launch stats and how they compared to your releases. Like I’ve got 90 wishlists and I’m wondering how that might look come launch day (which happens to be tomorrow lol). If I get 100 sales tomorrow I’ll be happy haha.


Grats! And good luck!! I took an injury on June 4th, had surgery on June 15th, and so my time is cut way back. I’ve focused on small things like fixing screens for iPhoneX, and I’ve completed that, so I’d like to shift over to Steam this week. I’d really like to add Cloud (I’ll do as you suggest) and Workshop. If I can get multiplayer going this year, I’ll share any lessons learned.

Good luck!!


Sorry to hear about the injury, that’s the worst!

Yeah please let me know how it goes!


Thanks! I tore my left pectoral muscle, completely ripping two tendons 100% and another 95%. Can you believe that, LOL?!?


Sounds like you were going for a max bench!


Close!! I was doing dumbbell flys on the bench, and I guess I was the dumbbell.

  1. my spotter wasn’t there,
  2. our max weight had been 40#, and I had just gone up to 50# (again, no spotter!), and could tell I was unstable,

BUT for some reason I simply cannot understand myself, I decided to try 60#. I did 2 reps, and the third was horrific. I’ve never experienced anything like that. It was very stupid of me.

I guess live and learn!


Hey, thanks again for the tips! I was wondering, are you planning on releasing your game on the Mac as well? My game runs great on the Mac, but I need to decide whether to try to release it to the Apple store or Steam. I’d prefer Steam for eventual multiplayer, but I haven’t quite worked out the kinks yet for creating a Mac version on Steam.

Also, I need to research and see where most Mac users buy their games.

Good luck!


I’ve never built any of my games for OSX but the setup docs for Steam list some Mac specific cases so it’s probably fairly straight forward. I’ll need to hit you up when I do so I can figure out what you learned, haha!

I know on Steam you can filter by OS so maybe they just do that. I’ve heard that Windows is by far the larger platform though.


Yeah, my plan is:

  • finish the iphoneX work (just finished that)
  • submit to Apple for testing, but not for release yet
  • create a new Steam product, set up depot, etc (just for Windows at this time)
  • get it where I can build and deploy the new game to Steam
  • I need to create new game icons

I want to get the game fully releasable on both Steam and iOS, and tag the code. Then I’ll create a branch I can work on to continue adding features, since my release goal is mid or late August.

Only after I get everything else done will I work on the Mac version. I hope it goes smoothly, and either way, I’ll sure be glad to share my experience and any lessons learned!


If you ever need a tester, let me know!


absolutely! I’ll touch base with you once I have it on Steam. Thanks!


Tank, I’m looking into CricketAudio, and I notice it says to refresh / call CkUpdate() every frame. How did you implement that?



Right before I load in my main scene from AppDelegate, I schedule an update callback that I use for my game loop, which updates steam and the audio stuff. Doesn’t seem like you actually need to call CkUpdate but I do anyway.

MainLoop::MainLoop() {
    this->seconds_played = 0.0f;

void MainLoop::schedule() {
            CC_CALLBACK_1(MainLoop::update, this), this, 1.0f / 60, false, "key");

void MainLoop::unschedule() {
    cocos2d::Director::getInstance()->getScheduler()->unschedule("key", this);

void MainLoop::update(float dt)
    this->seconds_played += dt;



    CkUpdate(); //doesn't seem to be needed, but w/e


so like I’ve got a static instance of MainLoop, and I call MainLoop::getInstance()->schedule() and it hooks into the Director’s scheduler.


Thanks so much!!


Hey, thanks so much for this tip! BTW, what values did you enter for Byte quota and Number of files? I’m thinking of just using the maximum values.

I like your idea of using Auto-Cloud, I think I’ll try that first. I was going to go the route of writing all this code, but I’m really short on time, and this looks much better. Thanks again!