Dev Log — Weather, Living World and Infrastructure Behind the Scenes

It has been a while since I last wrote a dev log here. The past months were intense on two fronts that go hand in hand: the game world became more alive and the infrastructure behind it turned into a decent machine. This post is a quick tour through both sides.


The world gained weather — and real seasons

The first thing you notice when you open the game now is that the sky is no longer a static backdrop. Tel-Annat has a smooth day and night cycle; the trees sway when the wind blows; and when it rains, it truly rains.

Tel-Annat at dusk — the sky now follows sunrise and sunset calculated by latitude and season.
Tel-Annat at dusk — the sky now follows sunrise and sunset calculated by latitude and season.

The technical turning point was simple to describe, but long to execute: each map carries geographic coordinates (latitude/longitude) coming directly from the CMS. With that, the engine calculates which hemisphere the player is in and what season of the year is currently in effect. The climate of each biome is just a default — you can force a storm in a desert via console if you want to test a specific scene.

Rain falling over the map, with particles and trees swaying in the wind.
Rain falling over the map, with particles and trees swaying in the wind.

The trees had their own chapter. There were many shader iterations until the wind became visible without the leaves “bursting” out of the sprite frame. About 8 commits in a row just to adjust amplitude, frequency and the point where the base of the trunk remains still.

The trees' *sway* in motion — the wind deforms the top of the canopy without clipping the sprite.
The trees’ sway in motion — the wind deforms the top of the canopy without clipping the sprite.

A console to debug the world

Together with the weather system came an in-game console. Now I open it and send things like “what is the current weather?”, “change the season to winter”, “show the upcoming weather events”. For me, as a solo dev, it saves a good amount of time — testing a specific blizzard before required a back-and-forth of save/load; now it is a single command line.

The in-game console answering the `weather` command: clouds, precipitation, wind, season and the map's geolocation.
The in-game console answering the weather command: clouds, precipitation, wind, season and the map’s geolocation.

I also fixed a silly but annoying bug: opening the console would pause the game, and closing the console would unpause it — even if the game was already paused before for another reason. Now the previous state is preserved.


Behind the Scenes: The Infrastructure Overhaul

This part is less visual, but it was one of the most important changes of the past months. The server running the game’s backend (API, CMS, auth) went from a somewhat improvised setup to a structure I trust to leave running on its own.

Real backups, every day

Before, I had that feeling of “oh, if the hard drive dies right now…”. Today there is a backup pipeline that runs automatically every day at 1 AM. It:

  • Freezes uploads for a few seconds to ensure consistency
  • Takes a snapshot of the database and CMS files
  • Deduplicates and encrypts everything (using a tool called restic)
  • Sends copies to Google Drive and Amazon S3 simultaneously
  • Applies grandfather-father-son retention (daily, weekly, monthly)

And most importantly: there is a quarterly drill scheduled — meaning every three months I effectively restore the backup in a test environment to confirm it works. A backup that nobody tests is not a backup, it is faith.

The backups panel in the CMS: date, status and history of the last snapshot sent to Drive and S3.
The backups panel in the CMS: date, status and history of the last snapshot sent to Drive and S3.

Monitoring in three layers

Now the server warns when something stops working — and the warning arrives before I notice through a frozen game. The scheme works in three layers:

  1. Internal heartbeat — each critical job (backup, brainstorm worker, etc.) hits an endpoint saying “I am alive” at each execution. If it goes silent for too long, an alert fires.
  2. Continuous health checks — the public site polls the API health every 30 seconds. That discreet “Server: online/offline” indicator in the corner of the page comes from this.
  3. Public alert banner — if the last backup failed or is overdue by more than 26 hours, a warning appears automatically in the admin panel, and an email is also sent to the infrastructure admins.

Unified login

Another thing that seemed small but helped a lot: game, website and backend now share the same login system (running on top of a dedicated identity server). If you enter the site’s admin panel, the game already knows who you are. If the session expires, an overlay appears asking you to log back in — without losing work in progress.

Unified login: game, website and admin panel share the same access.
Unified login: game, website and admin panel share the same access.

Content in the right place

A principle that became a rule: all game content is born in the CMS. Item, monster, NPC, map, biome, quest, dialogue — everything. The game reads this at runtime and assembles the resources on its own. This means that I (or anyone collaborating) can edit a skill or adjust a loot table directly through the web panel, without touching the game’s code.

The CMS panel listing the game content — all editable from the browser, without touching the code.
The CMS panel listing the game content — all editable from the browser, without touching the code.

Along with that came a plans system in the CMS itself — where I break each major undertaking into phases and activities, track progress and can “resume” work from where I left off (including with AI assistance). It is somewhat meta: I am using the CMS to manage the development of the very game that the CMS feeds.


What is coming next

The next front is the public wiki — a space within the site where players can read about the world, the lore, the characters, without having to discover everything inside the game. Its backend is already live; now the visual layer is missing.

In parallel, I continue to polish the day/night cycle (I want the light from campfires to have more presence at night), and I want to experiment with weather affecting gameplay — rain extinguishing torches, cold reducing stamina, that sort of thing.

Night in Tel-Annat: the character's torch and a campfire light the ground, while the rest of the world stays dark.
Night in Tel-Annat: the character’s torch and a campfire light the ground, while the rest of the world stays dark.

If you read this far, thank you. Mensageiros do Vento is a solo project built in the corners of late nights, and every comment, follower or share makes a difference.

Until the next log.

𒀀𒀀