A courier mod in Godot: delivering parcels between four towns, on foot or by broom
Eight chained parcels between the post offices of Gotic's four towns. There's a tip if you arrive in time, but the deadline is set so that walking won't make it.

Next to every town's arch there's now a counter stacked with parcels, a yellow CORREO (post) sign and someone behind it: Tolo in Brumacosta, Nel in Caleta Salobre, Ruth in Altomira and Gael in Vega de Poniente. Tolo gives you the first job, a new fishing net for Sela. Once you accept it, the parcel is strapped to your back, the destination is marked on the map and the quest log keeps count: "PAQUETE · una red nueva para Sela → Caleta Salobre · 227 m · 4/45 s" (parcel, the item, where it goes, how far, and seconds used out of the limit).
The route chains eight parcels, and each one leaves from wherever you delivered the last: salted fish for the tower, a spyglass for Dalia, a barrel of cider for Lía, goat cheeses for Bruno… After the eighth it starts over. Your first parcel earns you a satchel, four deliveries earn a cape and eight earn the title of "correo mayor" (postmaster).
How it's built
The rule that shapes the whole mod is the tip. Arrive before the limit and you get one. The limit isn't arbitrary: it's the straight-line distance between the two post offices, covered at 5 m/s.
# Tip limit: the straight-line distance between the two post offices at TIP_SPEED.
func limit() -> float:
return desk_spot(current()["from"]).distance_to(desk_spot(current()["to"])) / TIP_SPEED
That was on purpose. The broom was the most popular thing in the game, and I wanted flying deliveries to pay off. A test walks the first parcel along the road with real physics, from Brumacosta to Caleta: 57.2 s against a 45 s limit. Running along the road you won't make it. Flying, you will (or with one of Lía's infusions and a shortcut across the fields).
Flying comes with one condition: you have to land to deliver. The game's shared interaction doesn't work in mid-air, and deliver() also refuses if the player is riding something. Before trusting it, I removed that guard and watched the test fail.
Another decision: the courier needs all four towns, all or nothing. Turn off a town and the courier turns off with it. Turn on the courier and any missing towns switch on. Adapting the route to whichever towns are enabled (cancelling a parcel whose destination disappears, say) meant many more edge cases, so I chose not to.
What went wrong
The "inconsistent save" test stores nonsense data and checks that the game doesn't break. One of the values was "carrying": "sí", a string where a yes/no should be. The code did data.get("carrying", false) == true, which looks harmless. But in GDScript, comparing a string to a boolean doesn't return false: it's an engine ERROR. I fixed it like this:
var flag = data.get("carrying", false)
carrying = flag is bool and flag
Shortly after, I fixed the same thing in the village and the three towns, which read their "visited" flag the same way, and added it to the project's lessons file.
The next day the inventory arrived, and the satchel and cape became items you only see when you wear them. The parcel, though, isn't an item: delivering doesn't depend on what you have on.
Still unverified
All 672 checks from that round pass, but nobody has played the route with real fingers, and I don't know whether the tip feels fair or impossible. There are no FPS figures from a phone either. And for now the courier is a fixed route with no failure states and no variety. The plan lists ideas (a daily job board, fragile or urgent parcels, postcards taken with the camera) that I haven't built yet. This screenshot cost 266 draw calls.