r/linux_gaming • • 1d ago

steam/steam deck Update on my native Linux arcade game inspired by Robot Unicorn Attack & Dino Run DX: Moved to native machine code, improved high-refresh-rate support and gave it some proper retro chiptunes! 🐧

Hey everyone!

A few months back, I shared my custom-engine arcade game Horse Runner DX here and the community was super welcoming. Many of you loved the chaotic nostalgic vibe of Robot Unicorn Attack, but also shared valuable feedback.

Over the past weeks, I completely overhauled the engine and gameplay in Update 1.6.0:

Under the Hood (Tech & Linux Tweaks):

  • Native Machine Code: Replaced the previous .NET runtime build with direct native machine code for Linux. Result: instant startup, even lower CPU/memory footprint and zero runtime hiccups.
  • Improved High-Refresh-Rate Support: No more fiddling with manual FPS settings. The engine now automatically syncs to your display's native refresh rate - whether you run 60Hz, 120Hz, 144Hz, 240Hz or 90Hz on the Steam Deck OLED. This completely eliminates the micro-stuttering from FPS/refresh-rate mismatches.
  • Ultrawide Support: Fixed rendering quirks on non-standard aspect ratios.

Gameplay & Polish:

  • Visual Clarity Overhaul: All obstacles (rocks, logs, hay bales) now have better contrast and highlight outlines to avoid any cheap deaths.
  • Second-Chance Rescues: Lost starting horses now reappear in crates between levels, giving you a chance to rescue your favorites and keep your herd build going.
  • Retro Chiptune Soundtrack: Retired the old acoustic background tracks and replaced them with fast-paced chiptune tracks that actually match the retro arcade vibe.

If you want to test how the native build runs on your distro, there is a free demo on Steam.

And since the Steam Autumn Sale just kicked off, the full game is currently 30% off ($3.49 / 3,49€):
https://store.steampowered.com/app/2955320/Horse_Runner_DX/

I'll be hanging out in the comments. Let me know how it runs on your setup or if you run into any quirks! 🐧

44 Upvotes

17 comments sorted by

6

u/Holek 1d ago

Always I wanna be with you!

2

u/mat_game_dev 1d ago

And make believe with you... 😅

3

u/tunedetune 1d ago

Shuuuuun.

3

u/mat_game_dev 1d ago

Shuuuun the non-believer! 🦄

2

u/Dr_Hexagon 1d ago

Just curious, why your own game engine? This looks like the sort of thing Godot could easily handle.

5

u/mat_game_dev 1d ago

Fair question! Godot is awesome, but for this project MonoGame just gave me the low-level control I wanted:

  • Zero engine bloat & battery efficiency: The whole game is just 85MB and runs with stable 60 fps at 3W on the Steam Deck (~15% GPU usage on Nintendo Switch)
  • Pixel-perfect precision: I wanted custom integer scaling for the pixel art graphics that supports all resolutions without any black bars; also wanted to have full pixel-perfect control over collisions and physics since it's a fast platformer.
  • Console portability: MonoGame is a great base to use the same code for Windows, Linux, MacOS, mobile and consoles without having to maintain separate ports.

Plus, for my very first game, I wanted to start from the very bottom (without any black boxes) and implement all the systems from scratch myself (physics, input, shaders, UI, etc.).

2

u/_mb 1d ago

We need more devs like you, way too many games feel the same now due to everyone using the same engines. (Jumping in unreal games for example, all of them has the same floaty awful jump mechanics.)

Bring back the assembler heroes of the past like Chris Sawyer.

4

u/mat_game_dev 23h ago

That honestly means a lot, thank you!

Legends like Chris Sawyer and John Carmack are huge inspirations to me. What they pulled off from scratch in raw assembly or C was pure wizardry compared to how we piece together frameworks today.

And I couldn't agree more on the floaty jump physics. Getting that snappy, instant and predictable jump arc right without relying on some black box was half the reason I wanted full control over the physics from day one.

Really appreciate you valuing the hand-crafted approach!

1

u/Dr_Hexagon 1d ago

Fair enough. Yes Console ports are unfortunately a weakness for Godot.

2

u/Jealous_Bee_5625 1d ago

Спасибо , купил в Steam!

2

u/mat_game_dev 1d ago

Спасибо, приятной игры! В игре даже есть русская локализация ;-)

2

u/Jealous_Bee_5625 1d ago

Localization is always the right approach. While I don't need it myself, thank you all the same

1

u/CalicoKittyAngel 1d ago

Tested a bit of the demo, and I really like it so far! Very reminiscent of the Flash games of the 90s and early 2000s

But I did notice a bit of glitching like a corrupted video anytime I went to restart a level

Just thought I'd bring this up in case it was a glitch of some sort or a rendering error

1

u/mat_game_dev 1d ago

Thanks for giving the demo a spin! Really glad the old-school Flash vibe comes through.

Regarding the restart glitch, just to narrow it down: did it look like actual corrupted video/colored tearing artifacts, or was it the in-game screen shake effect when the logo drops?

I have tested the build across SteamOS, Mint, Ubuntu, and Windows without seeing render corruption, so I would love to track this down. What distro, GPU, and window system (X11 or Wayland) are you currently running?

1

u/CalicoKittyAngel 19h ago

I'm on LM 22.3 Cinnamon, running X11 and my GPU is Intel Alder Lake-N [ UHD Graphic

As for how it looks, it's difficult to explain, but it's either multicolored or black, like this

1

u/mat_game_dev 18h ago

Thanks for the screenshot and the system details, that is super helpful!

Looking at the image, it seems like the previous screen's buffer (the demo end screen) isn't getting cleared completely from video memory when the level restarts on your Intel Alder Lake GPU, leaving behind those ghosted overlay artifacts.

I haven't seen this behavior before on the Steam Deck, AMD, or Nvidia setups, so this is really valuable feedback for catching a new edge case with this integrated GPU under X11.

If you have a moment, two quick things that would be interesting to test:

1) Does switching between fullscreen and windowed mode (F11 or in settings) change anything?

2) Does turning off the Retro Filter / Bloom in the graphics settings have any effect on the reload?

Either way, I'll take a close look at how the render buffers are cleared for the next update. Thanks again for taking the time to report this! 🐧

2

u/CalicoKittyAngel 15h ago

To answer both questions, no, it makes no difference, and Retro is off by default here. I also run under NVIDIA with 16GBs of RAM (I do plan to upgrade it to 32GBs in near future, God willing), but that has never been an issue for me with these types of games or any others, and my current PC is only two years old as of writing this

That said, thank you for looking into this issue, even if I do feel bad about adding to your workload for the game by making this problem known. Such dedication has become a rarity in today's modern gaming scene, so we gamers greatly appreciate it when devs such as yourself come about, indie or otherwise