Written by GuillaumeTechProject Skyfall

Skyfall, part 6: pixel-art menus, six arenas and sound at last

November 2026: in four days, I redid almost everything you see on screen. Pixel-art menus under an animated sky, six themed arenas with traps, music, crouching, chests and a shop, compared screen by screen with the October build.

Skyfall's title screen split in two. On the left, the October version, a menu on a flat navy background. On the right, the November one, a floating island with a tower in front of a sunset.

Part 6 of the Skyfall story. Part 5 ended in late October on a game that was still silent. The plan’s next steps were chests, sound effects, a main theme and more arenas. All of them landed between November 6 and 9, in 27 commits.

The screenshots on the project page dated from October 12. I’m keeping them here, and each October screen is followed by its November version.

Table of contents

Pixel-art menus

On November 6, I rebuilt the menus. Before, every panel and button was a rectangle drawn in code. Now everything comes from a pixel-art UI kit: a single image, assets/ui/kit.png, cut into frames, buttons, selectors and icons. Everything lands on the game’s grid, where one game pixel is a whole number of screen pixels, and text only uses sizes in whole font pixels. The CRT scanlines and the fade between screens follow the same grid, so they no longer make moiré patterns on the art.

Behind every menu, an animated sky scrolls in parallax, and a shader lights the clouds. The next day, the title screen learned to fit any window. A tall window adds stars above and rows of clouds below. A very wide window mirrors the sky and the cliff. In portrait, the logo moves above the art and the menu sits on the sea of clouds. Translated text that runs long shrinks to fit.

The title screen in October: the Skyfall logo at the top left, the Play, Trials, Shop, Options and Quit menu on a navy background with faint mountains, and a small dwarf archer on the right.
October 12: a menu on a flat background.

The title screen in November: the Skyfall logo at the top left, the Play, Champion, Trials, Shop, Options and Quit menu, a floating island with a lit tower in front of a setting sun, and the player's champion standing on a cliff on the right.
November 9: a floating island, a tower and the sea of clouds.

The play screen keeps its three cards, but each one now has an icon: crossed arrows for Quick Match, a key for the private lobby and a gamepad for Local Couch.

The "Take the field" screen in October: three flat cards, Quick Match, Private Lobby and Local Couch, above a Bronze III ranked panel.
October 12.

The "Take the field" screen in November: the same three cards in pixel-art frames, with crossed arrows, a key and a gamepad, in front of the animated sky and the tower.
November 9.

The War Room and the stage select

The War Room kept its layout. Each slot now shows the player’s champion, and the match rules have three new options: Mirror, Shop and Traps. More on those below.

The War Room in October: two dwarf archers with their Ready up buttons, two open slots, and the Mode, First to, Chests and arrows in pool rules.
October 12: four rules.

The War Room in November: player 1 in a red headband and player 2 as the dwarf king, two open slots, and the Mode, First to, Chests, Mirror, Shop, Traps and arrows in pool rules.
November 9: Mirror, Shop and Traps join in.

The stage select shows the biggest change. In October, it had Towerfall, Towerfall 2 and four “coming soon” tiles. In November, six arenas replace the empty tiles, next to the two Towerfall maps and a Random tile.

The stage select in October: Towerfall and Towerfall 2, then four "coming soon" tiles, with a Towerfall preview on the right.
October 12: two arenas.

The stage select in November: Elderhollow, Stormkeep, Embergrove, Oubliette, Driftmoor, Cragspire, Towerfall, Towerfall 2 and Random, with an Elderhollow preview on the right.
November 9: eight arenas and Random.

Six themed arenas

The six arenas arrived on November 7. Elderhollow is a forest built around a huge tree. Stormkeep is a castle in a storm. Embergrove is a forge, with a hearth in the middle and lava falls. Oubliette is a dungeon. Driftmoor floats in the sky, on islands. Cragspire is an ice cave.

Each one has layered art and its own ambience, set in scenes/arena/ambience.lua: rain, thunder, clouds, drifting motes, an ambient tint and animated torch flames. The map list lives in one file, engine/map/maps.lua, which the server reads too. Online votes send an index into that list, so the client and the server must have the same order. The map design rules are written down in docs/map-design.md, and a test checks every map.

The six new arenas in a two-column grid: the Elderhollow forest, Stormkeep castle in the rain, the Embergrove forge with its fire jets, the Oubliette dungeon with its spike balls, the Driftmoor islands in the sky and the Cragspire ice cave with its frost jets.
Elderhollow, Stormkeep, Embergrove, Oubliette, Driftmoor and Cragspire.

The project’s main picture showed a replay in a ruin under the rain. The new one is set in Embergrove, right as an arrow hits the dwarf king.

A replay in October: an arrow flies toward the second archer in a torch-lit ruin, under the rain, with the playback bar at the top.
October 12: the ruin under the rain.

A match in Embergrove in November: in front of the big hearth, the dwarf king is knocked back at the top right in a spray of blood, while player 1 dashes along the mantel.
November 9: a hit in Embergrove.

Traps

On November 9, the arenas got traps: spike balls, vents that blow fire, frost or spikes, moving blocks, falling icicles, and the wall levers and bell that trigger them. Each map lists its traps in its own hazards.lua file.

Like the physics, the traps are pure Lua in engine/hazards/, and the same code runs in the client and on the Nakama server. Whoever simulates the match runs the trap clock and syncs it to the others. A trap kill counts for the player who pulled the lever, otherwise it’s a self-kill. The replay rebuilds the traps from the recorded snapshots, like everything else. And the Traps rule turns them off, leaving the moving blocks still, as part of the level.

In the Oubliette dungeon, a swinging spike ball hits player 1 at the top left in a spray of blood, while the dwarf king waits on a walkway in the middle.
Oubliette: the spike ball shows no mercy.

Sound at last

On November 7, Skyfall got music and sound effects. core/audio.lua streams the music and crossfades from one track to the next. The music drops during the replay and the pause. Sound effects get voice pools and stereo panning. Each screen picks its music, and the arena takes the one for its map’s theme. There are 9 tracks (the menu, the victory, and one battle track per theme: forest, castle, lava, dungeon, sky, ice, plus a default one) and 52 sound effects.

Sounds don’t go over the network. Every frame, scenes/arena/audio.lua compares the synced state of the players, arrows and round with the previous frame, and plays what changed. So every player hears everyone else’s actions without a single extra message. The menus also got cursor ticks and confirm and back sounds.

All the audio comes from code. A Python synth in tools/audio/ renders the music and effects to OGG with numpy and ffmpeg. Each sound reseeds the random generator from its name, so rendering one sound alone gives the same file as a full run.

Some arrows have sounds of their own. The drill arrow leaves with a bow twang that revs into a whir while it flies, then grinds when it burrows into a wall. The toy arrow pops on every bounce and goes “boing” when it hits an archer.

Crouching and squeezing through

On November 7 and 8, the archers learned to crouch. Hold down on the ground and the hitbox drops from 14 to 10 pixels, the feet stay planted, and you turn in place instead of walking. You stay down under a low ceiling. A crouched archer who stops moving fades to 6% opacity, name and quiver included.

The dash tucks in too: for 0.2 seconds, the archer is only 8 pixels tall. That’s enough to slide into a one-tile crack, and to slip past a corner that blocks by 3 pixels or less. Elderhollow and Stormkeep have one-way platforms: you land on them from above, pass through them from below and the sides, and drop through with down and jump.

The new poses take after TowerFall and Celeste. There’s a crouch pose, a back-to-the-wall slide and an arm gripping the ledge, dust puffs, squash and stretch, and during a dash, afterimages in the player’s color and wind streaks. The replay plays them back from the recorded state. Even the hats follow: they sink lower on the head during a crouch or a dash.

In the Elderhollow forest, player 1 dashes to the right between two spike balls, leaving a trail of afterimages, with a chest on a branch to the left and the dwarf king higher up.
A dash in Elderhollow, with its afterimages.

Chests and the Mirror rule

Chests arrived on November 8. With the Chests rule, chests drop into the arena on a timer. The Mirror rule drops them in pairs, at matching spots, and spawns the players on mirrored left and right markers. The buy phase between rounds became a rule you can turn off, and all the match rules sync online. Like the traps, the chest logic is shared between the client and the server, in engine/chest/.

On the floating islands of Driftmoor, a chest waits on the middle island, while the dwarf king dashes at the top right and player 1 jumps in the middle.
A chest in the middle of Driftmoor.

Arrows at the right speed

On November 8, I found that arrow speed depended on the frame rate. The physics started from the drawn position, which is interpolated between two physics steps, so every step lost part of its motion. Now the physics starts from its own position, and the interpolation runs from the last physics position to the new one.

To keep the game feeling the same, I lowered the speeds to what players actually had. Normal, drill, bramble and toy arrows go from 270 to 207 pixels per second, the bomb from 250 to 192, the feather from 400 to 366 and the bolt from 230 to 176. Gravity drops by the same factor, 0.767. A test checks arrow speed at 60 and 240 frames per second.

The same day, toy arrows stopped sticking. They bounce off walls, ceilings and floors, lose speed on each bounce, then lie down on the floor, where you can pick them up.

The buy phase in October, "Arm yourself": a grid of eight items, player 1 buying a drill arrow and player 2 a toy arrow.
October 12.

The buy phase in November: the same grid, the toy arrow that now bounces off walls, player 1 still shopping and the ghost already locked in.
November 9: part 5's ghost is already done shopping.

The shop

In October, the main menu’s Shop entry was greyed out. Since November 8, it’s the Sky Bazaar. It sells champions, gear and auras for coins or gems. Purchases are saved locally for now. A shop item stays locked in the Champion Forge until you buy it, and when you change looks, the old one is kept in one of four outfit slots.

On the 9th, the shop tabs and the forge grid got pages, which you flip with the « 1/3 » pager, LB and RB, Q and E, or the mouse wheel. The shop also gained 8 gear items, 2 auras and a Valkyrie.

The Sky Bazaar: the Champions, Gear and Auras tabs, the Frost Warden already owned and the Grove Druid at 220 gems, and on the right the Frost Warden's card with an Equip button.
The Sky Bazaar.

Part 5’s forge got the same look as the other menus.

The Champion Forge in November: the list of part slots on the left, the player's champion under a spotlight in the middle, and a grid of pre-built champions on the right, on page 1 of 2.
The forge, in the new style.

Scoring between rounds

On November 9, I reworked the scoring. Each death counts once, for the player who caused it. A self-kill at 0 points leaves the score at 0. The round winner is the last one standing through the 2 seconds after the last death.

The round break replays each score change in order. A point won pops in a gold pip, and a point lost pops out a red one, which stays red until the next round. Each row now has the champion’s portrait, and the round winner’s row has a gold border.

The round break in October: "Match, first to 10", two rows with a colored square for each player and a line of empty pips.
October 12.

The round break in November: "Round 1 complete, first to 7", player 1 with a portrait, 300 shards and a first gold pip in a gold-bordered row, then the ghost with 150 shards.
November 9: player 1's first point.

Where Skyfall stands

  • Still pre-alpha, at version 0.0.0.
  • About 500 commits since January 11, 27 of them from November 6 to 9.
  • About 27,800 lines of Lua in 153 files, up from 21,000 in 114 files at the end of October.
  • 9 music tracks and 52 sound effects, all generated by code.

What’s left in the plan: accounts, several currencies, champion parts to unlock and online stats, then Steam, achievements, a ranked mode and weekly quests.

The Skyfall story

  1. From a Defold cube to a fresh start in LÖVE
  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
  6. Pixel-art menus, six arenas and sound at last (this article)
  7. A track editor for the music
  8. A map editor that draws with the game
  9. A sprite editor for the blocks and props