Full notes
Full Horror Movie Bingo update
Read the full published notes in a cleaner layout. The original post stays linked below.
What changed
- Server
- Performance
- Gameplay
- Balance
- Fixes
Horror Movie Bingo changes
Great news! I've finally squashed the last elusive bug in the game, and it was terrrrrrible. For those of you that like to understand more about game development, here's the story:
Have you ever played a game where your phone was the controller and then suddenly you got disconnected and you couldn't get back into the game?
Well most games use a thing called websockets to make the connection happen, and they are fantastic (and cheap and insanely fast) when everything goes right. But when something goes wrong, it takes a ton of work to recover someone to the right place. Which means there's always something you don't account for that can mess you up.
My games run on APIs instead - so you tell the server you want something and it says "here's where you're at" and you can always stay up-to-date, even if something goes wrong. Just reload the page, or pull up your browser history, and you're right back in.
These APIs have been extremely reliable, and they fire every second, but there was a bug that would silently crash the game after 2 or 3 hours. No debug messages, no error log, just a hard crash that reported nothing.
When you deal with a situation with this, you have to rule things out. I knew it was happening during the main game loop, but to really isolate things, I had to start ripping out large blocks of code, and rerunning the game for 2 hours or more until it crashed, sometimes overnight. I even had OBS videotaping the screen and Task Manager to see if that provided any information.
It took days to find this thing, but I eventually found the issue:
In Gamemaker Studio, an Asynchronous HTTP call has a very specific way of getting information back. It looks something like...
if (ds_map_find_value(async_load, "id") == get) { if (ds_map_find_value(async_load, "status") == 0) { returnString = async_load[? "result"]; var resultMap = json_decode(returnString); full_list = resultMap[? "default"]; // Stuff happens // Cleanup ds_map_destroy(resultMap); ds_list_destroy(full_list);
full_list contains all the information from the API call, but on very, very rare occasions (we're talking a 1 in 10,000 chance here), the service I'm using to host the API will say it's successful, but return nothing. This gets picked up by Gamemaker as "undefined," and since undefined is not a valid thing to stick into ds_list_destroy(), it completely breaks.
By checking in the middle if is_undefined(full_list), I can now ignore any API call that comes back as undefined, saving the game from crashing after it's been up for a few hours. There would seriously be nothing worse than you playing this game with friends, having a bunch of people close to a bingo, and then suddenly the game just disappears.
So it's fixed now hooray!
I hope you like it, and if you see anything weird, let me know and I'll get on it.
Thanks! -Jaime
Source
Changelog.gg summarizes and formats this update. How we read updates.
