Video Ad for Chase Bliss Audio

We are proud to announce that a video advertisement was made with (almost only) Solarus. It’s an ad that parodies Zelda, and promotes Dark World, the new guitar pedal by Chase Bliss Audio. The pedal was released on November 19th, 2018.

The video


The context

Joel Korte, Chase Bliss Audio creator was looking for someone who could create a Zelda theme trailer for their new guitar pedal, Dark World, named in honour to the second world map of our beloved game A Link to the Past, the best SNES game by a huge margin, and maybe the best video game ever made too (at least for us at Solarus, but if you follow us, you may have noticed we really like this game more than anything, right ?).

Gil Assayas, who made the beautiful trailer music, contacted us first. Since I was free at the moment, I agreed to work on the project. We began to talk about this at the end of September. I was busy at the time, so I told Joel and Gil that I would begin to work on the video at the end of October. This would have given me 2 to 3 weeks, which would have been rather comfortable. However, the other projects I work on took me more time than planned, and eventually I had only 6-7 days to make to entire video! Very short, indeed. We lowered our ambitions without diluting the initial concept, and in the end I had just enough time to finish before the trailer release date!

The execution

Since the time frame was very short, the quickest way to startup the project was duplicating our current project, A Link to the Dream, the incoming Solarus-made Link’s Awakening remake. The Solarus engine is well advanced and already allows you to create Action-RPG à la A Link to the Past, also called Zelda-like, almost out of the box. So, with a complete and functional engine entirely dedicated to making Zelda-like games, all I had to do was making assets for a game, and record me playing it in a video. I used the development version of Solarus, which was 1.6 at the time, and not publicly available yet.

Gil Assayas had already made a beautiful rendition of the famous Dark World music theme from A Link to the Past. His music was used as the breadcrumb trail to build the scenes of the video. I began with the beginning of the video, then the end, then filled up until no more time was left.

What I had to do:

  1. Fork the project in Git
  2. Drawing pixel art for logos, the pedal, custom entities (Aseprite)
  3. Drawing Joel’s character animated sprite (Aseprite)
  4. Scripting in Lua (code) the logo, title screen and other non-playable scenes (Solarus)
  5. Making maps (Solarus)
  6. Record everything into videos (OBS)
  7. Cut and edit (Adobe After Effects)

The Gitlab project

I simply forked our current Zelda project into my own repository. This is accessible on GitLab at the address, for those interested. The project already contains much code and assets. It was solid foundations to build upon. I only modified what was necessary. The game is playable. Just open it with Solarus.


Yes, the game is playable. Try it yourself if you want.


I began with Chase Bliss Audio, and coded an animation a bit like the old Game Boy startup screen. It was quite easy to make.

Chase Bliss logo in pixel art.

Next, I made the ending screen, with the Dark World logo, and a pixel art rendition of the guitar pedal. Drawing the pedal was rather hard and long: one day. Animating everything with Lua code is easier and quicker.

The pedal’s sprite in pixel art.

Dark World logo in pixel art.

Next is the recreation of A Link to the Past famous title screen. I looked for the original pictures of the background, and changed the colours to fit the Dark World colours. I was working at the time of a basic recreation of the ALTTP logo with Solarus to add it to our ALTTP resource pack, so it was the perfect time to finish the work. The animation of the water was made with a shader, a new feature in Solarus 1.6.

Title screen.


Joel wanted to avoid to use Link’s sprite because, of course, copyright issues. So he sent me pictures of himself as a basis to create a little character that looks like him. Sprites in ALTTP are 24*24 pixels. Making a few pixels look like him was hard but I am quite proud of the result, very Nintendo-esque and cartoony.

Link’s sprite has dozen of animation cycles (walking, swimming, fighting, etc.) so to save time, I only drew the necessary ones:

  • Walking (left, top, right, bottom directions)
  • Stopped (when the character is not moving)
  • Brandishing (when the character brandishes the item he gets at the end)

Joel’s walking animation.


Solarus Quest Editor makes this an easy task, though quite long. Placing tiles is very simple and intuitive with or map editor. However, getting a nice looking map is harder since it has to look ‘natural’: i.e. no symmetries, no horizontal or vertical lines of trees, etc. It must not feel artificial. I created some custom tiles for the dungeon entrance: statues with guitars, guitar heads, amp stacks. Initially, I planned to made a more detailed entrance but time was running out.

Dungeon entrance full map.

Forest map, without the fog effect (added with Solarus).

Recording screen

Simple: I just recorded myself playing the game. The game’s resolution is the HD resolution (1920*1080 pixels) divided by 4, so I recorded only the game window, in the highest quality available. I could have written a script to make the hero automatically move, but it would have been longer to directly record myself. I made a few attempts to get the perfect take though.


There is almost no editing since everything is done with Solarus: transitions, scenes, etc. I just used the video and enlarged it to HD and added Gil’s marvellous music on it. A simpler app than After Effects would have been equivalent in this process, since no VFX are added.


And that’s all! Actually it is a full week of word, from 9am to 12pm, non-stop, to be in time. It was nice to work with people who share love for The Legend of Zelda series.

Solarus on Snap Store and Ubuntu Software Center

Solarus is finally available on Snap Store and Ubuntu Software Center. Installing Solarus has never been easier! Thanks to Alex Gleason.

On Ubuntu

Search for Solarus in the Software Center and install it from here.

Click on Install.


On other Linux distros

Get it from the Snap Store

First, ensure you have snapd installed. If not, install it with your package manager. It should be something like:

sudo apt install snapd

Then, install Solarus.

sudo snap install solarus

Solarus 1.6 released

Merry Christmas everyone!

Today, we are proud to announce the release of Solarus 1.6! This release is even bigger than the previous one, seriously. This has been possible thanks to many talented and devoted people who have joined the team.

Here are the big features in Solarus 1.6:

  • OpenGL backend and support for GLSL shaders (by Stdgregwar and Vlag)
  • Support for external script editor of your choice. Zerobrane integration: autocompletion, debug breakpoints, stack inspection (by Stdgregwar)
  • Multiple improvements in map editor, including the much-requested contour generator, tile replacement and support for multiple tilesets
  • Multiple improvements in tileset editor, including multiple selection, custom frame count for animated tile patterns
  • Multiple improvements in sprite editor
  • Data import from other quests
  • Beautiful new free tilesets (Zoria by DragonDePlatino, Ocean’s Heart by Max Mraz)
  • Free pixel fonts (by Wekhter)
  • Custom hero states in Lua to allow advanced customization of the hero
  • Tons of new features in the Lua API

Last but not least: Solarus 1.6 is fully compatible with Solarus 1.5 quests. You have no work to do to upgrade your project to Solarus 1.6.

Let’s discover everything in action in this trailer!


You want to know the whole list of new features and bugfixes? I assume you have a lot of time. Ready?

Changes in Solarus 1.6

Engine changes

  • Solarus 1.5 quests are still supported by Solarus 1.6.
  • Add support of OpenGL shaders (#394) by stdgregwar, Vlag and Christopho.
  • Improve the performance of loading images.
  • Maps can now use multiple tilesets (#1174).
  • Animated tile patterns can now have any frame number and delay (#683).
  • Fix crash when using coroutines (#1269) by stdgregwar.
  • Treasure dialogs are now optional (#1076).
  • Allow entities to have a non-multiple of 8 size (#1294).
  • Don’t center the hero on non-blocking streams (#1063).
  • Allow pickables to follow streams (#1139).
  • Blocks can now be moved multiple times (#967).
  • Fix enemies unable to move on non-blocking streams.
  • Fix streams stopping when using the sword several times.
  • Fix non-blocking stream turns after going south (#648).
  • Fix stairs activating when the hero is not exactly aligned.
  • Fix sol.timer.start() not detecting invalid context parameter.
  • Fix timer:set_suspended_with_map() for entity timers (#1158, #1236).
  • Fix random movement giving the same path for all entities on Mac (#1083).
  • Fix circle_movement:get_direction4() not working (#1163).
  • Fix precision issue with circle_movement angular speed (#1116).
  • Fix path_movement:get_path() and pixel_movement:get_trajectory() (#1136).
  • Fix straight_movement:set_max_distance() incorrect on tables (#1075).
  • Fix straight_movement:set_speed() not handling errors correctly.
  • Fix possible crash when reloading very old savegame files (#1064).
  • Fix crash when loading a map with tiles whose pattern does not exist (#1299).
  • Fix crash when a sprite PNG file is missing.
  • Fix crash when calling entity:test_obstacles() on an unloaded map.
  • Fix crash when opening a chest with a missing treasure dialog (#1089).
  • Fix crash when scrolling to the same map (#924) by stdgregwar.
  • Fix crash when scrolling to an invalid layer (#1015).
  • Fix entity:get_ground_below() from map:on_started() after scrolling (#925).
  • Fix crash when calling map:get_hero() after the map is finished (#1228).
  • Fix hero:on_movement_changed() not called (#1095).
  • Fix hero shield sprite directions in animation sword (#1185).
  • Fix facing entity randomly chosen when the hero faces multiple ones (#1042).
  • Fix disabling teletransporters during their on_activated() event (#1266).
  • Fix blocks not falling into water or lava (#1214).
  • Fix enemy:on_restarted() called twice (#1179).
  • Fix removed entity still drawn during scrolling transition (#1193).
  • Fix item:on_ability_used() not called for sword knowledge ability (#1171).
  • Fix sprite parameters order in custom entity collision callback (#1162).
  • Fix sol.file.exists() returning false for directories.
  • Fix scripts failing to load if a directory exists with the same name (#1100).
  • Fix mouse API not working when the mouse is outside the window (#1018).
  • Fix joypad deadzone issue (#672) by strycore.
  • Fix compilation error with Clang 3.9 in SNES_SPC.
  • Fix possible compilation error when HAVE_UNISTD_H has no value (#1084).
  • Fix loading quests in non UTF-8 filesystems.
  • Add support of .otf fonts.
  • Improve Lua error messages.
  • CLI can accept an archive’s path as argument.
  • Replaced SDL renderer by a custom GL backend, by stdgregwar.

Lua API changes

This release adds new features and deprecates a few ones but does not introduce any incompatibility.

New features

  • Add a shader API.
  • Add a custom hero state API.
  • Add an event to draw to the scaled screen (#1216).
  • Add a function sol.main.get_quest_version() (#1058) by Nate-Devv.
  • Add a function sol.main.get_game() (#1212).
  • Add functions to get and set the resource elements (#959, #630).
  • Add methods game:simulate_key_pressed/released() by Vlag (#1034).
  • Add abilities push, grab and pull to game:get/set_ability() (#788).
  • Add a method item:is_being_used() by alexander-b (#879).
  • Add methods entity:set_size() to all entities (#121, #528).
  • Add methods entity:set_origin() to all entities.
  • Add methods entity:create/remove_sprite() to all entities (#852).
  • Add methods entity:is/set_drawn_in_y_order() to all entities (#1098, #1173).
  • Add methods entity:get/set_weight() to all entities to lift them (#1227).
  • Add methods entity:get_property() and entity:set_property() (#1094).
  • Add methods entity:get_properties() and entity:set_properties() (#1144).
  • Add methods entity:get_layer() and entity:set_layer().
  • Add a method entity:get_controlling_stream() (#1204).
  • Add optional sprite parameters to entity:overlaps() (#1159).
  • Add methods entity:get/set_draw_override() (#1260).
  • Add events entity:on_pre/post_draw(camera) to all entities (#1260).
  • Add parameter camera to event entity:on_pre/post_draw() (#1260).
  • Add events entity:on_enabled/disabled() to all entities (#898).
  • Add event entity:on_suspended() to all entities (#1261).
  • Add a method hero:get_carried_object().
  • Add a method hero:start_grabbing() (#1303).
  • Add a method hero:start_attack_loading() (#1291).
  • Add an event hero:on_state_changing() (#1247).
  • Add an event camera:on_state_changing().
  • Add a method camera:get_surface() (#1265).
  • Add an event camera:on_state_changing().
  • Add methods dynamic_tile:get/set_tileset() (#1175).
  • Add methods door:open(), door:close() and door:set_open() (#1007).
  • Add methods stairs:get_direction() and stairs:is_inner() (#1037).
  • destructible:on_lifting() now gives a carried object parameter.
  • Add method carried_object:get_carrier().
  • Add methods carried_object:get/set_damage_on_enemies().
  • Add methods carried_object:get/set_destruction_sound().
  • Add events carried_object:on_lifted/thrown/breaking() (#1233).
  • Add property max_moves in map:create_block() replacing maximum_moves (#967).
  • Add methods block:get/set_max_moves() replacing block:get/set_maximum_moves().
  • Add optional callback parameter to enemy:set_attack_consequence() (#1062).
  • Add method enemy:is_immobilized() (#1092).
  • Add methods enemy:get/set_attacking_collision_mode() (#1066).
  • Add methods enemy:get/set_dying_sprite_id() (#955).
  • Add methods custom_entity:is/set_tiled() (#1105).
  • Add methods custom_entity:get/set_follow_streams() (#1221).
  • Add methods drawable:get/set_rotation() and get/set_scaling() by stdgregwar.
  • Add methods get/set_opacity() to sprite and text_surface (#702) by stdgregwar.
  • Add methods sprite:is_animation_started() and sprite:stop_animation() (#1264).
  • Add a method sprite:get_frame_src_xy() (#1093).
  • Add a method sprite:get_ignore_suspend().
  • sprite:get_num_frames() can now optionally take an animation and direction.
  • sprite:get_frame_delay() can now optionally take an animation.
  • sprite:get_size() can now optionally take an animation and direction.
  • sprite:get_origin() can now optionally take an animation and direction.
  • Add a method surface:get_pixels() (#452).
  • Add a method surface:set_pixels() (#466) by stdgregwar.
  • Add methods surface:gl_bind_as_target/texture() by stdgregwar.
  • Add method movement:is_suspended().
  • Add methods movement:get/set_ignore_suspend() (#858).
  • Add method get_angle() to more movement types (#1122) by stdgregwar.
  • Add method circle_movement:get_center() (#1091).
  • Add methods circle_movement:get/set_angle_from_center() in radians (#1116).
  • Add methods circle_movement:get/set_angular_speed() in radians (#1116).
  • Add methods (#1107).
  • Repeated timers can now change their next delay by returning a number (#983).
  • Automatically set the language when there is only one in the quest (#1006).
  • Add functions sol.file.is_dir() and sol.file.list_dir() (#971).
  • Add finger functions to sol.input and finger events by Vlag.
  • Add methods get/set_color_modulation() by stdgregwar.
  • Add function sol.text_surface.get_predicted_size() by stdgregwar.

Deprecated functions

  • Built-in video mode functions: use shaders instead.
  • Property maximum_moves of map:create_block(): use max_moves instead.
  • block:get/set_maximum_moves(): use get/set_max_moves() instead.
  • Angles in degrees in circle movement: use functions with radians instead.

Data files format changes

  • Maps: add support of custom properties for entities (#1094).
  • Maps: add property enabled_at_start to all entities (#1101).
  • Maps: add property tileset to tiles and dynamic tiles (#1174).
  • Maps: add property max_moves to blocks to allow multiple limited moves (#967).
  • Maps: property maximum_moves of blocks is now deprecated and optional (#967).
  • Maps: add properties origin_x, origin_y to custom entities.
  • Maps: add property tiled to custom entities (#1105).
  • Tilesets: add support of border sets (autotiles) (#1069).
  • Tilesets: add support of custom frame number and delay (#683).
  • Make the tileset entities image optional (#884).

Changes in Solarus Quest Editor 1.6.0

Solarus Quest Editor Logo

  • Allow to import files from other quests (#4).
  • Quest tree: show all .png and .dat files (#260).
  • Quest tree: show all language files, map files and tileset files.
  • Quest tree: allow to set the author and license information of files.
  • Quest tree: automatically select the currently open file (#336).
  • Quest tree: allow to update sprites when renaming a .png file (#420).
  • Quest tree: allow to open folders with the system explorer (#316).
  • Quest tree: allow to select multiple files.
  • Quest tree: allow to delete multiple files and directories (#354).
  • Allow to view PNG files (#335).
  • Map/tileset editor: allow to generate borders automatically (autotiles).
  • Map editor: add support of custom properties for entities by Maxs (#327).
  • Map editor: allow to use multiple tilesets in the same map.
  • Map editor: allow to change the pattern of existing tiles (#280).
  • Map editor: allow to change the pattern of all similar tiles at once (#329).
  • Map editor: allow to change the origin of custom entities.
  • Map editor: allow to initially enable or disable any entity.
  • Map editor: allow to export the view as a PNG file (#81).
  • Map editor: allow to lock layers (#94).
  • Map editor: show the layer under the cursor in the status bar (#91).
  • Map editor: add shortcuts to show/hide negative layers too.
  • Map editor: keep the selection after adding entities with ctrl or shift.
  • Map editor: add a shortcut to open the tileset by Akadream (#241).
  • Map editor: don’t reload the tileset if it is already open elsewhere (#350).
  • Map editor: automatically reload the tileset when it has changed (#362, #375).
  • Tileset editor: allow to change the frame number and delay of patterns.
  • Tileset editor: allow to duplicate tile patterns (#188).
  • Tileset editor: allow to move several patterns at once (#171).
  • Sprite editor: allow to reorder directions by Maxs (#144).
  • Sprite editor: allow to change the frame number graphically by Maxs (#147).
  • Sprite editor: the default origin is now 8,13 as usual in Solarus (#307).
  • Sprite editor: fix precision issues when creating or moving directions.
  • Sprite editor: fix scrollbars reset when adding directions by Maxs (#277).
  • Dialog editor: show the line and column number.
  • Script editor: allow a replace option to the find dialog by Akadream (#3).
  • Allow to select map/tileset/sprite/etc. ids to copy-paste them (#170).
  • Lua console: provide variables game, map, entities and function tp (#268).
  • Clear the console when a quest is started (#230).
  • Fix resource declaration not updated when renaming a directory (#337).
  • Fix crash when opening quest in non-UTF8 filesystems (#373).
  • Fix error message when opening a read-only quest (#264).
  • Fix memory not released when closing an editor (#306).
  • Initial quest: add some shaders (#320).
  • Text editor: allow to set an external editor to be used instead of thebuilt-in one (#398)

Changes in Solarus Launcher

  • Show the path and the compatibility format of each quest (#1129).
  • Lua console: provide variables game, map, entities and tp function.
  • Clear the console when a quest is started.
  • FileDialog now expects a file, either quest.dat or an archive (.solarus, .zip)

Changes in Zelda Mystery of Solarus DX 1.12.0

  • Upgrade to Solarus 1.6.
  • Add the Solarus team logo.
  • Change the sound of the Solarus logo.
  • Fix typos in French dialogs (thanks Renkineko).

Changes in Zelda Mystery of Solarus XD 1.12.0

  • Upgrade to Solarus 1.6.
  • Add the Solarus team logo.
  • Change the sound of the Solarus logo.
  • Slightly improve English dialogs

Changes in Zelda Return of the Hylian SE 1.2.0

  • Upgrade to Solarus 1.6.
  • Add Solarus Team logo.
  • Change the sound of the Solarus logo.
  • Dungeon 6: make medusa puzzle easier (#97).
  • Fix using joypad hat in menus.
  • Fix accents displaying in Spanish (#100).
  • Fix fire traversing torches after they get lit (#104).
  • Fix minor torch alignment errors (#103).
  • Fix minor tile issues.

Changes in Zelda XD2 Mercuris Chess 1.1.0

  • Upgrade to Solarus 1.6.
  • Add Spanish translation by Minefran12 (#22).
  • Fix English language not set by default (#129).

We hope you’ll enjoy this release. Have fun playing our games or creating ones with Solarus! Merry Christmas!

Solarus has moved to Gitlab

With the recent purchase of Github by Microsoft, the Solarus Team has decided to leave Github. We choose its alternative Gitlab, which we already know because we used it to secretly develop our last mini-game Mercuris Chess, in April last year.

All the projects are still on Github for the moment, but in a read-only state. If you want to contribute, the code is now here on Gitlab :

Be sure nothing will change, since Gitlab is almost identical. Development will work exactly as before.

See you soon!

English release for Zelda XD2: Mercuris Chess

Who said it was too late? It’s never too late!

Exactly one year after the original release of the sequel to our first parodic game, we are proud to finally offer an to the English speakers the opportunity to play our game in an all-English version. The translation wasn’t easy : the original French release contains multiple references to French-speaking culture (Comic groups Les Nuls, Les Inconnus, cult movies like Cité de la peur and OSS 117 à Rio, and of course the beloved cult TV show Kaamelott).

As a direct sequel (the story begins only months after the first episode), the overworld is expanded, the story is extended and the funny tone is kept, if not bettered!

Click here to download the game

The game is longer than the first episode: it has 2 dungeons, and lots of side-quests and secrets everywhere, and also features silly PNJs all around the overworld. Be sure to speak to every one to not miss a joke! The estimated game duration is 7-12h of playing.

We hope that you will enjoy our little game. Have fun!

Children of Solarus (4th fortnightly screenshot)

Ahoy there again! Today we have our worst screenshot until now of the project Children of Solarus. But do not worry, because the next ones may have tasty surprises! 😀

Our screenshot shows Eldran jumping with the new custom jump, which is much better than the built-in jump used in MoS-DX. Some annoying pink flowers and a mysterious wooden house can be seen.

Challenge: Can you guess what is written in the signpost in morse code? 🙂

We are coming back in 2 weeks with more news. Stay tuned!

Children of Solarus (3rd fortnightly screenshot)

Ahoy there! Today, our new screenshot of the project Children of Solarus shows a delightful house, and a very suspicious clucko wandering around (who would not want to kill it???!!!). Stay tuned for a new screenshot in two weeks!