Has anyone had any experience with Steamworks?
Steamworks and Blitz
Miscellaneous Forums/General Discussion/Steamworks and Blitz They said they were only interested in serious developers and since I'm not yet ready to show anything of my game, I couldn't be viewed as a serious developer. So I haven't approached them yet. I have taken a look at the API overview though, and it's a C++ API so you would definitely need some kind of intermediate DLL wrapping it in order to use it. In BlitzMax it could be possibly done without an intermediate DLL, but only if they have a MinGW build and that's unlikely.
I was mainly interested in the DRM and the auto-updating mechanisms but they don't give anything away about the auto-updating and the DRM is just mentioned in passing. Have you contacted them? You have a finished game so I'm sure they'd get back to you.
I was mainly interested in the DRM and the auto-updating mechanisms but they don't give anything away about the auto-updating and the DRM is just mentioned in passing. Have you contacted them? You have a finished game so I'm sure they'd get back to you.
Last I checked Bullet Candy was on Steam and that game was developed in BlitzMax.
Gabriel
I'm working with Meridian4 and they've been in contact with Valve. I have a copy of the Steamworks API but need to get my head around it -which may not be possible given I have no experience with C++.
May need to grab someone to help out with a DLL.
I'm working with Meridian4 and they've been in contact with Valve. I have a copy of the Steamworks API but need to get my head around it -which may not be possible given I have no experience with C++.
May need to grab someone to help out with a DLL.
Yes, but Steamworks is completely unconnected to being sold on Steam. You don't have to use Steamworks to be on Steam ( and it wasn't available when Bullet Candy was released on Steam, so I highly doubt it does ) nor do you have to release on Steam in order to use Steamworks.
EDIT: Sorry, that was a reply to ClownHunter.
EDIT: Sorry, that was a reply to ClownHunter.
Well the API looks pretty clean from what little I've seen of it, so it might be ok to follow, although interfacing with these things can be tricky even if you understand the API.
My C++ skills aren't great, but I've managed to wrap a 2D engine and a 3D engine, so if run into problems and think I might be able to help, shoot me an email.
My C++ skills aren't great, but I've managed to wrap a 2D engine and a 3D engine, so if run into problems and think I might be able to help, shoot me an email.
Yes, but Steamworks is completely unconnected to being sold on Steam
Yes - but from the publisher's point of view, if your game already fits Steamworks and makes use of features such as achievements, then there's a better chance of the game being picked up by Valve for inclusion on Steam proper.
Trouble is, my game's been written with Blitz3d which does not link natively with 'stuff'. As mentioned, a purpose built DLL might be required?
Yep, I can certainly see that taking advantage of Steam's best features ( DRM, updates and the community ) would be appealing to a publisher.
I'm almost certain that you would need a purpose built DLL in order to do it, yeah. Blitz3D can only call a plain C API, not a C++ API
Essentially a C API would be something like this in the headers :
void DoSomethingCoolNowPlease(int NumberOfTimesToDoIt)
And a C++ API would be something like this :
class SomeClass
{
public:
void DoSomethingCoolNowPlease(int NumberOfTimesToDoIt)
}
When you have things in classes like that, Blitz3D can't link to it, and you'd have to use a DLL. If you're lucky and the API is simple, all you need to do is wrap each function within a class with a plain function.
I'm almost certain that you would need a purpose built DLL in order to do it, yeah. Blitz3D can only call a plain C API, not a C++ API
Essentially a C API would be something like this in the headers :
void DoSomethingCoolNowPlease(int NumberOfTimesToDoIt)
And a C++ API would be something like this :
class SomeClass
{
public:
void DoSomethingCoolNowPlease(int NumberOfTimesToDoIt)
}
When you have things in classes like that, Blitz3D can't link to it, and you'd have to use a DLL. If you're lucky and the API is simple, all you need to do is wrap each function within a class with a plain function.
all you need to do is wrap each function within a class with a plain function
Sounds like fun. However you're talking to a dullard here ;-)
So how would I 'wrap each function within a class with a plain function'? ;-) What would I need (software wise), to be able to even begin to approach doing this?
Depends what the library comes with. If it comes with lib<something>.a file ( possibly in a folder called MinGW or GCC ) you could do it in Dev C++ and then you won't have to worry about creating any new dependencies. If you only get a <something>.lib then you would have to use Visual C++ and you have to build it in a particular way to ensure that it doesn't require the .Net platform.
In terms of wrapping it, essentially each function belongs to a class in the same way that a field belongs to a type. Since Blitz3D can't use classes or functions within them, what you're basically going to do is give yourself a handle to the class ( an integer handle, like B3D objects ) and then call a function passing that handle plus whatever other parameters the function needed. Then that function takes your handle, treats it like a class/object ( because it is ) and then calls the underlying function.
So, using the example above, you might end up with some C++ wrapper code which looks like this :
extern "C" __cdecl is just a directive telling the compiler how to export the function, in this case, in a manner which B3D can call.
That's the basic method you would use to wrap straighforward functions using basic data types like integers. It can get more complicated depending on what the API is like, but maybe you won't need anything more.
In terms of wrapping it, essentially each function belongs to a class in the same way that a field belongs to a type. Since Blitz3D can't use classes or functions within them, what you're basically going to do is give yourself a handle to the class ( an integer handle, like B3D objects ) and then call a function passing that handle plus whatever other parameters the function needed. Then that function takes your handle, treats it like a class/object ( because it is ) and then calls the underlying function.
So, using the example above, you might end up with some C++ wrapper code which looks like this :
extern "C" __cdecl void SomeClass_DoSomethingCoolNowPlease(SomeClass* Handle, int NumberOfTimesToDoIt) { Handle->DoSomethingCoolNowPlease(NumberOfTimeToDoIt); }
extern "C" __cdecl is just a directive telling the compiler how to export the function, in this case, in a manner which B3D can call.
That's the basic method you would use to wrap straighforward functions using basic data types like integers. It can get more complicated depending on what the API is like, but maybe you won't need anything more.
Gabriel
I appreciate the information - I'll make a note of your explanation above and do a bit more research tonight.
Thanks!
I appreciate the information - I'll make a note of your explanation above and do a bit more research tonight.
Thanks!