Written by GuillaumeTechProject Skyfall

Skyfall, part 1: from a Defold cube to a fresh start in LÖVE

Where my archery brawler comes from: a year of prototyping in Defold, then a new repository on January 11, 2026, with six build targets before the first jump.

Skyfall on February 5, 2026: two dwarf archers in the Towerfall training arena, with an arrow flying across the floor.

Skyfall is my pixel-art archery brawler in the spirit of TowerFall: two to four archers, one arrow kills, last one standing wins the round. This series tells its story one milestone at a time, from the changelog, the commit history and screenshots of the game as it was at each step.

Table of contents

Before LÖVE: a year in Defold

Skyfall didn’t start in LÖVE. Its first commit dates from February 15, 2025, in a Defold project, and the first goal had nothing to do with archery: I wanted to know if I could talk to a Nakama server at all. A week later, a cube moved on screen with data coming from a match on the server. That cube was the whole game.

Then nothing until September. When I came back, the work went into what a multiplayer game needs underneath: one match engine shared by local and online play, platformer physics, collisions read from the tilemap, a camera. In October came the first arrows, server-authoritative from the start, then the dash, a limited quiver and catching arrows.

December was the big month: wall slides, wall jumps and ledge grabs, the head stomp, stealing arrows with a dash, wrapping on the sides of the map, gamepad support, a waiting room, an aiming arc, blood and a zoom at the end of a round. A dwarf replaced the default character, and the first real map got its name: “The Choosen One”. By January 6, 2026, the Defold version also had replays, torch lighting, rematches and homing arrows.

Five days later, I created a new repository: love-skyfall.

Day one

January 11, 2026, 6:19 in the morning: first commit. Before the game had a single jump, it had build scripts. Linux, Windows, Android, the web, iOS and Switch homebrew were all there between 7:41 and 7:56. At 8:38, “The Choosen One” came back as the first map. Before noon there was a small physics engine with 2D collisions; the afternoon added an input manager with contexts, two local players and a mock of the online manager.

At the end of that first day, Skyfall was two coloured rectangles in a brick map.

Two rectangles, one blue and one red, in a pink brick tilemap. The text at the top reads “Controls: P1 (WASD+Space), P2 (Arrows+Num0)”.
January 11, 2026: two rectangles in “The Choosen One”.

Online in four days

On January 15, the LÖVE client got a Nakama client library, authentication, a first server and online movement, with server reconciliation and interpolation. On January 19, player updates became server-authoritative: the server decides where everyone is, and each client smooths it out.

The rest of January went into the foundations I still use today:

  • Two resolutions. The game world is drawn on a 320×180 canvas and scaled up with nearest-neighbour filtering, so the pixels stay sharp. Text and buttons are drawn on top at the screen’s real resolution, so they stay readable.
  • The web. The game ran in a browser, Nakama included.
  • Hot reload. Scenes and modules reload while the game runs, patching the live scene instead of restarting it.
  • A dwarf. The rectangles became an animated dwarf, an Aseprite sprite played with the peachy library.

On January 28, a second map arrived: Towerfall, a nod to the game that inspired all this. Between January 30 and February 1, the online lobby took shape: create a match, join it with a short code, sign in with the device, wait in a waiting room.

First arrows

February 1 was arrow day: a camera that follows the players, shoot and dash actions, then a projectile that flies, sticks into walls and snaps to them on impact. The next day, players could die and respawn. On February 5, arrows were synced online with delta serialization, so only what changed goes over the network.

The same day, a small script started copying the engine into the server’s modules. The physics, players and arrows are plain Lua, so the very same files run in the LÖVE client and in Nakama’s Lua runtime. That idea came straight from the Defold version, and it still holds the whole game together.

The February menu, titled “Love2D Platformer”: Training, Create Lobby, Join Lobby and Enter Code buttons, next to the dwarf.
February 5, 2026: the game was still called “Love2D Platformer”.

Starting over, a little

Then I stopped adding features. On February 7 and 8, I tried a few libraries, switched some of them to my own forks, and stripped the project back to its scene manager and hot reload. On February 15, the core structure was rebuilt, with native-resolution rendering and a custom love.run that fixes a crash when the window is resized. A new input manager came next, with gamepad navigation in the menus. On February 22, the arena was back with online play, and on February 23, input for several players.

Then March went by without a single commit.

By the numbers

  • About 180 commits between January 11 and February 23.
  • About 800 lines of Lua at the end of day one, 3,700 on February 5.

The Skyfall story

  1. From a Defold cube to a fresh start in LÖVE (this article)
  2. Wall jumps, a real bow and a quiet network
  3. Rounds, rain, torches and a VHS replay
  4. The War Room and the armory
  5. A map editor, a ghost and the Champion Forge