← BACK_TO_DEVLOG

Porting to Godot found three bugs I'd never have seen

I expected a rewrite. I got a code review I didn't know I needed.

// THE PORT

Shadow Raid started life in GameMaker Studio 2. It now runs on Godot 4, and act one is playable end to end on Android.

I went in expecting pure cost. Same game, different engine, weeks of typing for nothing a player would ever notice. That's not how it turned out.

Working code reads differently from code you're transcribing. When it runs, your eye slides over it. When you have to move every number by hand and decide what it's for, you look at each one alone. Three bugs fell out that had been in the GameMaker build for months. None of them crashed anything. They just quietly made the game worse.

// BUG ONE: UPGRADES MADE IT WORSE

The original weapon code split damage across your guns. Two guns did 1.0 damage each, four did 0.6, six did 0.5. On a DPS chart that reads fine — more guns still means more damage per second.

But the most common enemy in act one has 1 HP.

2 guns, 1.00 dmg  →  dies in one shot
4 guns, 0.60 dmg  →  needs two
6 guns, 0.50 dmg  →  needs two

Every upgrade raised damage on paper and simultaneously doubled the shots needed to kill the enemy you meet most often. Buying an upgrade made the game feel worse, and no chart would ever have shown it.

Spread now only adds guns. Damage only scales per bullet. Per-bullet damage never drops below 1.0.

// BUG TWO: THE HITBOX WAS ON THE FLAME

One wrong sign in one line. The ship sprite sat 29 pixels too high, which put the collision capsule on the engine exhaust instead of the hull.

Bullets passed through the nose and wings without touching me, then registered a hit somewhere under the ship. It played as "I got hit after it already went past" — which I'd noticed, and blamed on lag.

I only caught it by rendering the sprite with the collision shape drawn on top, instead of reading the numbers. When you're checking geometry, draw a picture.

// BUG THREE: A SAFE CORRIDOR THROUGH THE BOSS

Everything the boss fires drops straight down from fixed offsets. Bullets at ±70 pixels, plasma at ±120, rockets at ±150.

Which leaves a gap at exactly zero.

-150  -120   -70    0   +70  +120  +150
  R     P     K     .    K     P     R

Sit directly under him, match his pacing, and nothing but the laser can reach you. He'd been beatable that way since the day he was written.

His bullet volley now aims at where you actually are. Plasma and rockets still fall straight, so the two threats stay readable at a glance.


// WHAT ELSE MOVED

Progression got rebuilt. You don't buy ship tiers any more — you earn them by beating an act's boss. Coins go on permanent upgrades that stack on top of whatever tier you're flying.

There's a streak now, too. Flying straight into the next level grows your coin multiplier, but you fly on whatever fuel and hull you have left. Stopping at the hangar refills you and resets it to zero.

That one exists because I built the hangar first and then realised low fuel was pushing players toward it. The "penalty" was a free refuel.

Still no ads. Still no in-app purchases. That part isn't moving.

// WAS IT WORTH IT?

Honestly, half the gains here have nothing to do with Godot. They came from the act of rewriting.

Godot earned its place — levels are JSON files now instead of five near-identical objects, and the audio system took an afternoon instead of a week. But the three bugs above would have surfaced in any engine, as long as I was forced to move every number by hand and ask what it was for.

If you have a project that's been running a year and you've stopped really seeing it, that's the argument for a rewrite. Not the engine. The reading.