Update: GREENLIT! Steamworks networking, leaderboards coupled with replays and a rant on how steamworks does it's callbacks, plus an updated hub area
It's waaaaaay late, but NEO Impossible Bosses has been greenlit along with the pre-SteamDirect greenlight wave about a couple of months ago! Now that Steam has given me access to an Appid to work with, I've been working on integrating the many modules that steamworks(the library that lets you work with Steam) provides.
First up, I have to convert a lot of my old network api functions to Steam's variants. I could not get their GameServer samples working with my appid, so I had to use the Lobby variant as a means to connect players over the Internet. I suspect that I have to contact Valve to enable gameservers, but I'm content with this approach for now. So I'll have to let it pass.
Other things to integrate are cloud saves, achievements and leaderboards. Cloud saves are easy enough to code since all I need is 2 simple functions saving/loading from the cloud at appropriate times. Achievements are also simple enough to code. Leaderboards are a little more annoying to code up due to the way they force users to implement their callbacks, which I'll explain later. Whilst implementing the Leaderboards, I had an idea. Why not integrate downloadable replays into the leaderboard?
I already had replays implemented earlier so I could deal with desyncs when I encountered them in multiplayer. Theoretically, it should help that players can download replays of successful attempts on bosses if they're stuck, so there's that sense of community help. I'm sure I'll be looking forward to seeing the Impossible difficulty leaderboards filled with many DEFEAT results.
Rant on the way steamworks does it's callbacks
To sum up, there are about 2 different ways that steamworks does it's callback functions.
1) Use the STEAM_CALLBACK define, which makes an object that you have to construct (forces me to use a constructor for my parent class containing these guys)
2) Have a "CCallResult<Classname, SteamObjectType> mSteamCallAchComplete;" object and pair it with a class function with parameters SteamObjectType and a boolean. Then set the callback when after you've checked the steamworks function is successful.
To say the least, these are fairly cubersome techniques and c++ done wrong. I'm forced to make a class functions have another area of construction for technique 1), and set callbacks with 'this' pointers for 2). Then these techniques hide how the callback function's parameters and return value should look like.
I'll leave this with a suggestion: why not use simple typedef for a c-style function pointer, which, in addition to whatever steam structures it needs, supply a simple void* for user data? Then set the callback with a simple SetOnAchCompleteCallback call with the userdata. It's many, many times simpler, the function parameters are explicitly defined, and there's no need to do that template type checking thing.
Hub area Update
Now this area has been hard to make. I've reverted to a environment art placement style similar to one of the other boss's arenas, which is to put some bigger props(white flowers) surrounded by many smaller props(white/red flowers). Then there's additional vfx to work on as well.
I hope this update was sufficient to tide for the lack of updates. As NEO Impossible Bosses edges towards the proposed deadlines of early 2018, I hope to be able to cover more of what gameplay is within the game. Seeya around!
In the meantime, here's some more gifs that I've been posting over the previous months..
Our dragon's Roar ability scares our heroes away!
Ultimate for the Robot Boss!
Ji'loch the Imprisoned unleashes his diabolic seekers!
Cast multiple spells while selecting multiple heroes! Helps LOTS with multiple unit controls.