These weeks in Veloren 247

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:
- 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.
- You are free to use our current (textual) Veloren logo on your submitted images, but it is not mandatory.
- Your submitted images must have a minimum height of 600 pixels and have a 16:9 aspect ratio.
- 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.
- 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.
- 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).
- You agree to share your submissions under an open licence. For example, some licences in the Creative Commons suite.
- 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:
Language | Translators |
---|---|
Czech | Janez |
English | Janez | EatherBone | ministergoose |
French | Limina | sandraev |
German | coffee-compiler | CodeVlogs | Benny | Virtex | fnetX |
Polish | K0RR |
Russian | EatherBone | aleeo | lucius_pilgrim |
Swedish | IsseW |
Ukrainian | ministergoose |
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 A tiling of tile-ableschairs_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.
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 Just dropping by/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!
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. 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 :)
