open hexagon - leaderboards devlog #0

Published April 01, 2021
Advertisement

Rendered on my website:
https://vittorioromeo.info/index/blog/oh_leaderboard_devlog_0.html

Hello everyone!

This is going to be a DevLog about the implementation of one particular feature for my game [Open Hexagon](https://store.steampowered.com/app/1358090/Open_Hexagon/): **online leaderboards**.

### open hexagon

First of all, what is Open Hexagon?

It's a fast-paced arcade and rhythm game heavily inspired by Super Hexagon, created with its author's permission (Terry Cavanagh). You control a small triangle spinning around the center of the screen, and your goal is to avoid various obstacles that hone in towards the center.

https://www.youtube.com/embed/TlSJZlQrVJ4

Open Hexagon started as a clone of Super Hexagon, but it evolved into much more: it features new mechanics such as a *180° swap* and *curving walls*, and -- most importantly -- it was completely designed with *modding* and *customization* in mind.

Users can create *custom levels* using Lua scripts and publish them to the [Steam Workshop](https://steamcommunity.com/app/1358090/workshop/). Fans have created mind-blowing levels that push the engine to its boundaries.

Here's a short compilation of some very creative user-made levels:

https://www.youtube.com/embed/h4Jfj3lzWD4

I've also had players thank me for getting them into the world of programming, which feels amazing.

Despite being published on Steam, the game is also fully open-source [(on GitHub)](https://github.com/SuperV1234/SSVOpenHexagon/), and anyone can contribute to it or build it themselves for free. My intention is to have the source always freely available so that people can learn from it and/or improve the game.

### goals

Now, onto the online leaderboards. The main goals for this feature are:

- After playing a level, the user's final score is automatically submitted to a server.

- While selecting levels, the user can see his ranking in a global leaderboard.

Stretch goals:

- Download replays of top scores directly in-game from the server, and view them in-game.

### issues

Sounds simple enough... but it isn't. Fortunately, I've worked hard to make the game logic fully deterministic and have implemented an input-based replay system already, but there absolutely are zero online capabilities in the game.

Also, I want to make cheating as hard as possible. It sucks when players work hard for high scores, just to have the leaderboard ruined by a hacker.

Therefore, I came up with the following list of things to consider:

- Need a database, somewhere, maybe my VPS or have to rent cloud servers.

- Not a big deal, but costs and logistics are something to consider.

- Need to completely separate game logic and rendering logic.

- Definitely a big deal. I started working on this game almost a decade ago, and the codebase is not in a great state, despite my continuous efforts to improve it and clean it up.

- Need headless version of Open Hexagon which only runs game logic without rendering.

- Again, big deal. The code for the game logic is intertwined with some rendering code.

- Need to somehow encrypt/decrypt replay files to avoid tampering.

- I have no prior experience in this, but [`libsodium`'s Key Exchange](https://libsodium.gitbook.io/doc/key_exchange) and [Steamworks Authentication](https://partner.steamgames.com/doc/features/auth) should help.

- Need Open Hexagon client to produce and send replay clients to the server.

- What happens if the replay fails to be sent? When to retry?

- What happens if a client spams the server with replays? How to prevent DDOS attacks?

- Need Open Hexagon server to listen for replay files, and run them to verify validity.

- What happens on version mismatch between client and server?

- What about malicious replays? Someone could create a basic custom level without obstacles, run for 10 hours, then send a 10 hour replay that will stop the server from processing legit replays.

- Need to visually notify the client that (1) replay was received and (2) is being processed.

- Need to improve menu rendering to show leaderboards.

- Must avoid frequent calls to the server caused by browsing through menu entries.

- What happens if a custom level author updates a level?

- If it's just a "refactoring" change that doesn't affect the behavior of the level, the leaderboard should remain valid

- Otherwise, existing replays will fail to work. How to detect it? Periodically re-run replays? Or do not detect it at all?

- How to attach player identity to a leaderboard?

- Custom login system backed up by custom database? Would be a lot of work.

- Use Steamworks API? Probably easier, but completely ties the game to the Steam platform.

Happy to hear your thoughts on any of the points above.

### first milestone

My first milestone will be to implement a flag in the game in order to run it in headless mode, accepting a replay file as input, running it, and printing out information about the replayed playthrough.

Ideally, I should be able to invoke Open Hexagon from the command line like this:

./SSVOpenHexagon.exe -headless <path_to_replay>

And get some sort of output like this:

Replay <path_to_replay> completed.

Level: <level>

Player: <name>

Final time: <time>

I will keep this DevLog updated as a way of motivating myself, documenting my progress, and getting feedback. Hope you enjoy!

0 likes 0 comments

Comments

Nobody has left a comment. You can be the first!
You must log in to join the conversation.
Don't have a GameDev.net account? Sign up!
Advertisement
Advertisement