These weeks in Veloren 247

29 minute read02 May 2025Mar 16 -> Mar 31

Authored by horblegorble

Sunrise spectacular β€” by unii

You may experience some slight turbulence as a volley of new throwables, tunes, and banter fill the air. Here we go!

- horblegorble, TWiV Contributor

Announcement

Whether you're a casual snapper or full-on shutterbug, we want you to take a shot at this photo contest being organised by @walpo:

Veloren of yore

We are looking for a new cover image for the README file of Veloren.

If you think you have a cool picture to share with the community, feel free to post it in the Discord or Zulip submission threads!

Rules:

  1. Submissions are open from now until Thursday, June 12 at 21:00 UTC (about 1 month and a half). Any content submitted later will not be included.
  2. You are free to use our current (textual) Veloren logo on your submitted images, but it is not mandatory.
  3. Your submitted images must have a minimum height of 600 pixels and have a 16:9 aspect ratio.
  4. Each participant can submit up to three images. If a participant has submitted more than three images by the time the submission window is closed, we will ask them privately which images to include in the voting phase. If the participant does not reply in a timely manner, we reserve the right to choose the three most recent images by default.
  5. After the time window for submissions is closed, we will decide on a voting system for our community to pick their favorite. Emoji reactions on Discord do not count towards the vote.
  6. You must be the copyright owner of the submitted image. This implies you cannot use generative artificial intelligence (GenAI) to create part or the whole image (currently, a legal grey area).
  7. You agree to share your submissions under an open licence. For example, some licences in the Creative Commons suite.
  8. If your image wins the contest, our team will contact you to discuss what licence you want to share your work with and how to handle attribution.

Contributor work

Thanks to everyone who contributed to veloren these last weeks: @do-no-van, @Supa, @Gemu, @floppy, @Joe_Cool, @Crabo, @isse, @juliancoffee, @Synis, @srpapinha, @zesterer, @souffle, @unii, @imbris, @Tarhun, @UncomfySilence, @Nikophos, and @violetwillow.

Thanks to the weblate translators who contributed these last weeks:

LanguageTranslators
CzechJanez
EnglishJanez | EatherBone | ministergoose
FrenchLimina | sandraev
Germancoffee-compiler | CodeVlogs | Benny | Virtex | fnetX
PolishK0RR
RussianEatherBone | aleeo | lucius_pilgrim
SwedishIsseW
Ukrainianministergoose

Merged work

Sparkling action at a distance

Unable to wait for the bow rework, @do-no-van took projectiles into their own hands with a hefty refactoring. Best have your eye protection ready as sparks fly across town.

πŸ”Š All kinds of light shows. Music by @Crow

And hope that nothing ominous has been waiting for "the day that dummies fly".

Gitlab: !4593

Oud and a lute

What started out as a remodelled Lute in @Joe_Cool's first foray with MagicaVoxel, became a catalyst for the arrival of the new Oud instrument. @Supa was the supervising chemist for this reaction, mixing together voxels from @Gemu and audio from @floppy. You can hit up the crafting bench to enjoy the silver linings in these new notes.

The newcomer (left) and their restyled cousin (right)

πŸ”Š New strings attached

With his lab coat still on, @Supa continued with some instrumental tinkering:

  • The icy talharpa instrument now faces the correct way in the inventory
  • Sprite image sizes for instruments are changed to be consistent with each other
  • Small recipe tweaks for banjo and kora

Gitlab: !4778

Friend or foe

Whether you're looking to pick a fight, or keep the peace, @Crabo's changes to the player list take the guesswork out of battlemode negotiations and moderator status. Sword icons were supplied by a secretive arms dealer that looked an awful lot like @Supa.

Your duelling career is but a click away

Gitlab: !4790

Mise en place

With the prep-work done on tile-able sprites, @isse got to cooking up a system for piecing together furniture mosaics:

The way we place composable sprites in site2 is an extension trait for Painter, which is what we use to define how blocks are placed for site2, and as sprites are blocks it includes those.

On this I have created both helper methods for placing generic tiled sprites and functions that directly refer to some configuration of sprites creating a bigger thing, like a bed.

There are different kinds of generic helper methods. Right now I have a one dimensional and a two dimensional. The 1D one, which is called tileable1 takes a side sprite and a middle sprite, it also takes parameters for position, facing direction, and width. This assumes that the sprite with the maximum position has to be mirrored.

Some ASCII+ to demonstrate this:

width: 4 blocks    < β–‘ β–‘ >    center sprite: β–‘
       2 blocks      < >      side sprite: <
                                mirrored: >

The 2D one is called tileable2. This needed a bit more arguments so it takes a struct Tileable2 to define it. Which stores a rectangle and an altitude to define position. A center sprite, side sprite and a corner sprite. Both the side and corner sprites can vary by which side/corner they're placed on. It also has it's own direction to rotate the whole construct. For a table where all corners and sides are the same this looks like:

+y                   size: 5x3 blocks (x by y)
 β­‘                   center sprite: β–‘ 
 β•΅  β”Œ ∧ ∧ ┐          side sprite: <
 β•΅  < β–‘ β–‘ >            rotated/mirrored: >  ∧  ∨
 β•΅  β”” ∨ ∨ β”˜          corner sprite: β””
 β”” ─ ─ ─ ─ ─ β­’ +x      rotated/mirrored: β”˜  β”Œ  ┐ 

For a bed it looks like:

+y                 size: 3x2 blocks (x by y)
 ⭑                 side sprite: ∧ | ∨
 β•΅  β•” ∧ ┐          (-x) corner sprite: β•š | β•”
 β•΅  β•š ∨ β”˜          (+x) corner sprite: β”˜ | ┐
 β”” ─ ─ ─ β­’ +x    

Because there are different corner sprites used for the diagonals that face -x and +x.

There are also helper methods like chairs_around which places sprites around a specific bounds. And specific ones for sprites that don't fit any generic pattern we have, for example lanternpost_wood. When there are more sprites that need that specific pattern more generic methods will be created.

A tiling of tile-ables

Gitlab: !4799

Turn down the heat

@juliancoffee understands that, like a good vegemite sandwich, you only want a bit of spread. So now when you're campfire moshing with mates, the chance of lighting each other up scales with time and buff strength of the source. And when the heat does catch on, it'll only be the world to blame. A relief to town guards that've been busy dousing feuds between hot-headed neighbours.

Their new release is a real slow burner

Gitlab: !4832

More vertical progression

No, not that kind. The other one. Yeah, climbing.

Anyway, @Synis has heard the feedback on their recent changes, and put together the next shift-to-release-candidate version. This lets you overcome fear to drop straight out of climbing, and also features the return of uphill bounding. Other changes include a persistence of wielding state, as well as fixes to energy cost calculations and infinite wall jumping.

Sliding down and scooting up

Gitlab: !4811

War of the names

And on the seventh day, the user made a typo in naming their new world. Luckily, @juliancoffee let them rewrite history:

You can now change the world πŸ”οΈ name even after it is generated ✍️

Somebody once told me

Gitlab: !4830

Worldly estimates

Watching water boil, grass grow, paint dry, or waiting for the next tick in the erosion process for a new world. These are universal expressions for wearing down the soul. But there is now relief for the latter, with updates from @isse to put your mind at ease:

Added some additional info when generating worlds, it now shows more fine grained progress and a time estimate for how long erosion will take

Might be able to sync up with a New Year's countdown

Gitlab: !4834

Jungle jumble

@juliancoffee went around the colour wheel to spin up a remix of our tropical ambience:

Jungles look a bit more like jungles now. I in collaboration with @Gemu changed their colour scheme to make their bark darker and more recognisable.

Rainforest Red -> Botanical Brown

Gitlab: !4831

All spin and no swing make Jack a dizzy boy

After some coaching sessions with @srpapinha, your not-so-friendly dance partners have learned to get some step in their rhythm. A broad set of melee orientation modifiers have retired their aim-botting 'robot' routines.

πŸŒͺ️ 🀒 Round and round we go

Gitlab: !4803

Same sprite, different loot

No doubt we've all heard the expression "You shouldn't judge a sprite by its voxels." It's a sound bit of wisdom that @juliancoffee has put it into practice for wordgen:

Ok, it finally happened. We merged an MR that allows you to override the default loot for sprites when you place them.

Currently, the way containers/pickables work is via SpriteKind::default_loot_spec() method (previously known as SpriteKind::collectible_id), which is a big list of sprites and their corresponding loot tables. That's fine and even desirable for 70% of sprites. When you pick up an Apple, you don't want anything else. And chests in boss rooms in our new breathtaking dungeons greatly benefit from stylistic conformance with the environment.

But we have a lot of generic containers like crates and barrels in towns and caves and, most importantly, spots, which inevitably forced to have the same boring loot tables. Well, not anymore! Look at the spot config for the Saurok altar:

#![enable(implicit_some)]
#![enable(unwrap_newtypes)]
[
    (
        specifier: "world.structure.spots.saurok-altar",
        center: (10, 13, 3),
        custom_indices: {
+            11: SpriteWithCfg(DungeonChest0, (
+                loot_table: "common.loot_tables.spot.saurok_altar",
+            )),
            105: Filled(GlowingRock, (r: 161, g: 255, b: 133)),
            113: Filled(GlowingRock, (r: 139, g: 245, b: 104)),
        },
    ),
]

This line allows us to override the default chest with DungeonChest0 and its own loot table! For those who are new to the spot system, spots are usually small pre-made models that have specific blocks which we re-interpret using custom indices from MagicaVoxel palette. 0-16 are pre-defined, and 11 stands for the default chest, but you can override those.

And you can do that in virtually every situation if you can place a sprite along with SpriteConfig, which includes caves, towns, procedurally generated spots, dungeons, et cetera.

At the moment, the MR only enables such functionality and we need balance people and testers to make the world truly alive using this system πŸ™‚

Ground zero, one, and two for the new loot setup

Gitlab: !4354

Mark my words

They say locals always know the best place in town, but they've been tight-lipped on sharing tips. @zesterer has loosened their tongues enough to at least point out the local landmarks. If we keep playing our cards right, they may yet tell us where to get the best sunflower ice tea.

Can't always navigate the skyline at ground level

Gitlab: !4750

Busy with battles and barter

Rather than see everything in life through a trading window, @souffle has given merchants some clarity in expressing their preoccupations.

Trading hits vs trading bits

Gitlab: !4814

You know a good spot?

What do cleaning products and Veloren have in common?

Spot testing is good practice. And even easier now with some polish from @juliancoffee:

Oh, and I also extended /spot command to work with all spots (these mini-sites, like gnarling totem). /spot command was originally created by @isse , but worked only for spots defined in .ron files. Most older spots aren't defined in .ron files, so we needed to fix it. Bonus point: now it teleports you 100 blocks above the spot, so get your glider ready and fly!

Just dropping by

Gitlab: !4836 + !4839

Big cow evicts old milk

Cheese merchants have been setting up shop in Minotaur's colosseum, and that bull is no fan of dairy degenerates. But he felt trapped in the ring as a mere franchise manager, having butted heads with Myrmopolisβ„’ management before. This behooved the great Minotaur to enlist the representation of @unii, who was well received by corporate. @floppy was dispatched to patch things up, with their testing sidekick @Supa helping to iron out some of the repositioning kinks.

Cheese on a platter, not by the player

Gitlab: !4783

Throwing their weight around

From bovine negotiations to safety inspections, @unii swapped hats to remind us of the gravitational hazards involved in setting entity mass:

I've reduced the mass of Frost Gigas's summons (Boreal Warriors), so that they're less vulnerable to collision/fall damage as a result. This mostly impacts the encounters where elevation differences come into play.

Gonna need a lot more snow to break that fall

Gitlab: !4827

More changes:

  • addressed a TODO fix in hostile npc feeling speech - @souffle - !4813
  • damage tweaks to left mouse attacks for sword and axe - @unii - !4806
  • buff icons for skills swapped to the respective skill where possible - @Supa - !4821
  • window size saving logic was moved - @imbris - !4819
  • window saving was disabled if it is zero size in any direction - @isse - !4825
  • added detection for stuck airships along with remedial actions - @Tarhun - !4822
  • removed old mining tool check for directly lootable sprites - @juliancoffee - !4837
  • switched to fluent upstream - @juliancoffee - !4840
  • 'PlotKindMeta' used instead of just 'PotKind' for npc directions - @isse - !4848
  • small fixes, definitely nothing serious - @isse - !4828

Ongoing unmerged work

This Gigas on fire

Now might be the time to refamiliarise yourself with local wildfire response plans. What was dismissed as a drifting haze has become distant but visible flames. The molten menace is preparing to erupt.

Let's take a look through the geological record to see where it all began.

Plans of attack β€” by @Gemu

This is no spectator sport β€” by @Gemu

Roleplaying as a very hot potato β€” by @do-no-van

β™ͺ I fell into a burning ring of fire β™ͺ β€” by @do-no-van

Assembling the ashen arsenal β€” by @Gemu

Today's forecast: rolling heatwaves β€” by @do-no-van

The streaming hot playtest debut β€” by @Necti

Fiery fallout β€” by @And_i

Gitlab: !4638

Throw ALL the things!

Ballistic bottles and flying flasks were on the radar of @UncomfySilence's prototyping efforts to extend the range of the throwables refactor. But why stop at potions? These hands were made for hurling, so let's get things airborne!

Alas, the existing controls and item definitions aren't quite as dextrous for the task at hand. So conversation turned to juggling the dynamics at play: equipping, throwing, consuming, and whacking. From hotbar slots and special inventories, to utility belts and radial menus; there were a lot of ideas in flight. Eventually air traffic control was called in to setup a dedicated airspace within a Request for Comment (RFC). The lofty goals remain for just about every item to be something you can pickup, throw, and swing around.

Don't catch a cold

Gitlab: !4846

Discussions

Who's next?

Clowns to left of me, jokers to the right - who do I punch first? We know that NPCs aren't the ones to ask; they love to play trivial pursuit in a game of whack-a-mole. But if we took off the blinders and cleared their minds, could we teach these old dogs some new tricks? When @James put this question on the table, he was painting a bulls-eye for brain cannons on himself. It wasn't long before the discussion was firing off on a few trajectories:

  • A threat/aggro index for each target entity could be used to make prioritised decisions. Some fuzzy logic and coarse-grained updates might keep it from thrashing or getting too expensive.
  • Should the personality and saviness of an entity have an influence on how they choose their battles, get into position, or pick their loadout? Perhaps they've a logistical mind to notice and take out players that give buffs and support.
  • Sprinkling in some unpredictability may be helpful to feel like we're fighting beings of awareness, rather than walking algorithms. The experienced among them could even have the agency to mix together their own combat ingredients.
  • Can all this be pulled off in a system that allows for varying depths of complexity? From Gnarlings to Gigas, and solo fighters to team players.

Target acquired

Brewing up a storm

After the ideation concoctions of @Nikophos overflowed the cooking pot and town cauldron, he went for a short stay retreat at a (conveniently vacant) witch hut. Free to steep in the potent, unventilated ambience of basement broths and cauldron fumes, the real distillation could begin. What bubbled up to the surface was an 'essence' based system for crafting potions.

Cause and effect β€” by @Nikophos

The essential ingredients β€” by @Nikophos

A mixologist's cheat sheet β€” by @Nikophos

Alchemical alternatives β€” by @Nikophos + @violetwillow

@violetwillow, the partner in slime, arrived after these brainstorming batches to help infuse fresh thoughts into an octagonal blender concept. Various quantities of ingredients would take you around the segments to create different potions. A rarer cocktail might have a narrow target to hit, while the region for a more common potion might span across several segments.

Will it blend? β€” by @Nikophos

Community showcase

Out goes the tide

Knowing the Sahagin warrior isn't much for words, @unii devised a shell-breaker activity for them to open up to.

Beware the hidden fees on charges

Doom-loren

@horblegorble drilled down past the lava biomes of their screenshot folders to fire up just the right mood with @souffle's logo design.

Is this the future of an unstoppable Gigas?

Mastering the forge

With the right moves and a steady rhythm, who even needs armour? Certainly not @And_i.

Hot temper meets cool tempo

Picnic at goblet rock

The postcard that started it all β€” by @Supa

The story began like any other in Veloren. Your standard affair of airships, dungeons, and general gallivanting about. It was when our band of misfits got wind of a unique rock formation that things went off script into some voxelated production of the Motley Crew and the Holy Goblet. Rumours spiralled and reason was lost - it was said that drinking of its snowmelt would let you see the worldgen seed.

Whatever the soundness of their minds at this point, the mission was clear. How to climb the darn thing was a bit more clouded. Yet altitude sickness and buffeting winds were just extra spice for the ascent, and a mutual mix of encouragement and slander got the whole party to the top. Now at last atop Goblet Rock, they found fantastic views, outstanding acoustics, and joyous jubilation. But no matter how much snow they ate, the great wisdoms were not granted to them. Perhaps the real treasure was indeed the friends made along the way.

After recovering from their over-eager hydration, the gang decided to embark on vampire ventures at the nearby Zaluj Keep. What lay inside were trials of teamwork, much spilled blood, and quite a lot of nonsense. Many shenanigans and one viola later, a very unrelated discovery was made: their coconut cavalry could be converted into holy hand grenades. It was promptly agreed that Zaluj was no Camelot, and the town below of Ochreseaux was where they could get up to rather silly things. Most records of what happened next were turned to ash, and what survived was badly singed. Though much evidence was destroyed, it was no mystery who the chief troublemaker was.

Here is the adventure album from @horblegorble.

Do you like silly scribbles?

Visitors tolerated

Dropdown drama

Bloodmoon battle

Snail squadron

Nefarious Necti

Gigas gladiatoris

A colossal crab pot.

Becomes an ice rink.

Catching frosty prey.

Now playing: The Real Stadium Blues

πŸ”Š Front row seats at the gig

Screenshots

Vibrant sky, shimmering waters β€” by @Indragedall

Something special β€” @Retromaster

A mote of stardust β€” @horblegorble

Spores under Sporia β€” by @Supa

Some very buoyant crops β€” by @isse

Airflow arrangements β€” @horblegorble

Do these echoes make my voice sound cold? β€” by @Sam113

Don't forget to check the forecast β€” by @Supa

Torrential temples β€” by @juliancoffee

β™ͺ I'm flyyying in the rain, oh flyyying in the rain β™ͺ β€” by @Sam113

Under the weather β€” by @Sam113

Tolerating strangers vs riding with the squad β€” by @Crabo + @Supa

Diving for the deepest blacks β€” by @Muerto

Screaming into the void, staring into the abyss - where do ravines fit in? β€” by @And_i

Moving on from mushrooms β€” by @Sam113

Not so tall now, are we? β€” by @juliancoffee

Airshippin' around β€” @horblegorble

The beginnings of a smog problem? β€” by @Sam113

Melodies of dawn, ft. The Songbirds β€” @horblegorble

This developer blog is based on information collected in #blog-content, where game contributors are always invited to communicate their updates or simply post a link to a different channel.

@Supa and friends queueing up for their favourite ride. Don't miss the next flight :)