We just ship out first Godot console Port - Hazard Pay across PS5 and Switch

Hi all,

We’re Pocket Sized Hands, a porting and co-dev studio based in Dundee, Scotland. Last week, Hazard Pay launched on PlayStation 5, Nintendo Switch and Steam. It’s a block-pushing puzzler set in a Cold War research facility in 1982, developed by Smitner Studio and published by Numskull Games. We handled all the console ports for them.

We’ve been porting titles in Unity and Unreal for years, but this was our first Godot title shipped on console. It passed platform certification first time, which we were really pleased about.

I can’t go into any console-specific implementation in public, anything to do with the SDKs are all under NDA, which is the same wall every console dev hits and the reason the Foundation can’t ship console exports itself. What I can say is that now we’ve done one, we know the shape of the work, and future Godot ports should run a lot more like our Unreal and Unity ones do.

Earlier in the year at GodotCon Amsterdam, our Director of Engineering, Rory gave an intro talk on how to set your godot game up to be ready for porting: https://www.youtube.com/watch?v=wH0fZxWh_ow

The short version: Godot on console is very doable, we see it as a growth area as a company, and we’re putting continued investment into it. If you’re building in Godot and thinking about console, feel free to reach out to me.

Also please check out Hazard Pay. It’s an amazing game made by a great developer and publisher!
Steam: Save 20% on Hazard Pay on Steam
Switch: Hazard Pay | Nintendo Switch download software | Games | Nintendo UK
PS5: https://store.playstation.com/en-gb/concept/10019225

8 Likes

That’s dope, thanks for sharing a bit of your experience!

1 Like

Well done.

I have a question : Do you port to Xbox?

We didn’t for this project but are looking to expand out tools for Xbox soon.

We launch many Xbox games with Unity and Unreal in the past.

2 Likes

Great job !

Great talk! I would like to hammer on the save data serialization point, really try to get all of your save data into one file.

Be prepared for save migrations too, if you update your game please do not break old save file compatibility! A simple trick is to write a version number for each save format just in case, then any breaking updates to your save file can be detected and fixed while loading the old file. All of my saves start with a .store_16 for a version number, so the first bit of my loading function may look like this:

var version: int = file.get_16()
if version == current_save_version:
    load_function_30(file)
elif version == 20:
    load_function_20(file)
elif version == 10:
    load_function_10(file)
else:
    push_error("Unknown save version! ", version)

It can help to be able to buffer your save data, if you are using a lot FileAccess’ get/put in sequence I would recommend writing to a StreamPeerBuffer first, then writing it’s .data_array contents to the file. Keeping an in-memory copy of a save file can help if writing fails and allows for easier asynchronous writes.

2 Likes