14 KiB
title | date | draft | tags | toc | series | ||||
---|---|---|---|---|---|---|---|---|---|
Astra & Novus Status Update: May 2025 | 2025-05-06 | false |
|
true |
|
Sooo... it's been a while since I wrote one of these. We have a years worth of progress to catch up on, so we'd better begin!
If this is your first time hearing any of any of these projects, Astra is my unofficial FFXIV launcher that supports Linux1. It launches Dalamud, can run as a Steam Compatibility Tool, and supports alternative servers like Kawari:
Novus is my unofficial FFXIV tool suite which includes programs to view model files, edit gear and a lot more. I got frustrated years ago that (almost) none of the pre-existing FFXIV modding tooling ran on Linux, so I made my own:
Updates to my Kawari alternative server project are happening in another series of blog posts, because the scope of that project is large enough on it's own! These status updates also serves as a place to discuss my other, smaller FFXIV projects that aren't interesting enough to live in their own blog post.
Astra
Initial Setup
I have redone the initial setup again, and the entire process should be cleaner and easier now. There are three major "flows" you can take: Install the game, install the benchmark, or import from another launcher:
Astra now supports importing an existing game install from another launcher, such as from XivLauncher.Core:
There is a limited amount of launchers it supports, patches are welcome! This same logic can be re-used for other launchers too, and I should probably integrate it into Novus sometime.
Developer Settings
Advanced Dalamud settings are now hidden behind the "Developer Settings" toggle, because they should rarely (if ever) be touched. Here is how it looks when they're disabled:
A new button has been added to the Developer Settings to launch the game immediately, which has been more useful to me on more than one occasion!
If you develop Dalamud, there's now an easier way to use a local build in Astra. Plop it into ~/.local/share/astra/dalamud/local
(or the Flatpak equivalent) and select the "Local" option for "Dalamud Channel" in your profile settings. This also skips all update and version checks for Dalamud.
You can now specify custom servers under your account's developer settings, and Astra can now function without being connected to any of SqEx's servers. I made these per-account so I can have my test Kawari account and still play with my real Square Enix account.
You can now specify the platform, boot and game update channels inside of your profile's developer settings:
Misc UX
The password field is now writeable again, and you can also click a button to view your password:
Before Astra starts patching, it checks if you have enough disk space - not only to download the update but also to install it. This should prevent some nasty scenarios while patching:
On a related note, Astra will now warn you before it starts updating. This is to help prevent "gotchas" like your installation being considered invalid, profiles you weren't supposed to update or you're on a connection with limited data:
I have added back the "Tools" menu that was lost during the QML transition, so you can access the Official Launcher and other tools if needed:
When deleting a profile, there's now an option to delete the game files as well:
Bugfixes
Here's a rundown list of some of interesting bugfixes:
- It's now possible to update the game even if the worlds are closed for maintenance.
- Patches are no longer kept in memory, which was problematic for systems like the Steam Deck.
- When Dalamud reports that it's incompatible with your game version, it disables itself now instead of crashing on launch.
- In the rare case where Astra does fail to apply a patch - like if the download was corrupted - an error is shown to the user and the errant patch is deleted:
- The method Astra uses to track if the game is open (e.g. for keeping your computer from sleeping) is now more reliable on Linux when Dalamud is enabled.
- The Steam Compatibility Tool should be much more reliable now in general!
Feature Removals
I have done several feature removals to claw back the feature creep:
- Sapphire support is removed. I only used this feature once (if ever?) and I kept breaking it. There are several other launchers that support Sapphire's account system you can use instead.
- Feral Gamemode support is removed. I just didn't use it anymore.
- Gamescope support is removed. I originally added this to workaround bugs when the game was running under XWayland. But now that we have a native Wine on Wayland (and even the XWayland bugs are gone) I didn't see a reason to keep it.
- The news on the main login page is now always shown, and the option to hide it was removed.
Steam Service Accounts
One of the last remaining features to implement was Steam service account support. I had been putting this off for a while because:
- I don't use my own Steam service account.
- They use yet another Blowfish implementation for "encrypting" steam tickets and do a whole bunch of nonsense before sending it.
- Communicating with the Steamworks API from a GPLv3 application is a bit annoying.
I'm happy to report I solved all of those problems, and Astra can now login to Steam service accounts just fine. There is one caveat: it's only supported when running as a Steam compatibility tool for now.
Delving into the technical tidbits, Miscel has a Blowfish implementation you can use for problem #2 (the Steam Ticket is further "encrypted" with the process done here. Astra simply has a C++ version of that.) Problem #3 is done using Steamwrap. I'm unsure how OK it is to redistribute the Steam API headers freely, so I decided to compile a separate application that I build myself and pack into the Flatpak. Astra communicates with this daemon through HTTP, and it might be useful to someone else too.
Nightly Flatpaks
Are you interested in trying out Astra? If you have a GitHub account, you can grab a nightly Flatpak from GitHub Actions. I'm also preparing to release this properly on Flathub, so any testing of the Flatpak is appreciated. (I personally have switched over to only using the Flatpak version now.)
Novus
Gear Editor
Added various Penumbra actions to the Armour menubar, like redrawing the models and opening the window:
Redrawing is also called automatically when importing models!
Excel Editor
You can switch between any available language in an Excel sheet. I'm stupid and CJK characters are not shown correctly yet, but other languages work fine:
(Apart from SeString support, that's also something I need to work on.)
Data Explorer
As you may have seen in my Kawari progress reports, I have been delving into how the game's event system works. To aid in this effort, I added a Lua decompiler to the Data Explorer which makes exploring way easier:
I also have improved the import process from ResLogger2, it should import a lot faster now.
Auracite
Auracite is my character backup tool that runs in your web browser, and can optionally connect to a Dalamud plugin. If you're wondering how it's useful, check out my FFXIV Shrine.
The following data is now fetched from the Lodestone:
- Free company name
- Currently equipped item names
- Grand company name and rank
And the following data is now fetched when connected to the Dalamud plugin:
- Voice
The following data now has numerical values alongside English text, to ease the difficulty in building tools on top of Auracite data:
- City-state
- World
- Nameday
- Guardian
- Race
- Gender
- Tribe
Additionally, a character appearance save data file is included (if connected to the Dalamud plugin) that can be read by the retail client.
Physis
This is the library that powers my FFXIV-related projects. It has received some significant changes, most of them related to fixing problems introduced by changes in Dawntrail. Unfortunately due to the nature of it being a library, the update is text-only and extremely dry (hence why it's at the end!)
Dawntrail Support
I'm happy to report that everything mostly works now, with the biggest exception being model I/O still. You can read Dawntrail models, but writing them results in an invalid model that crashes the retail client. I will be redoing how model I/O works at some point, which will fix inherent design problems with how it's structured today, but I'm unsure about how soon that will happen.
Save Data
As seen in the Auracite section above, I needed write support for character creator save data and that's now added. I also added unit tests for all of the versions, and the API is functionally complete!
let char_dat = physis::chardat::CharacterData {
version: 7,
customize: physis::chardat::CustomizeData {
race: Race::Hyur,
tribe: Tribe::Midlander,
gender: Gender::Female,
... everything else ...
},
timestamp,
comment: "Generated by your tool!".to_string(),
};
Loius Brunner has kindly written support for the GEARSET.DAT
save data, and I hope we can expand into reading even more in the future! We can read the following save data now:
- Character creator presets
- Gearsets
- Chat logs
- Plain-text configs
Retail Testing Platform
I have a lot of tests in Physis (which I'm really proud of!) but one thing that's really lacking is being able to test against many game versions. I end up breaking support for Benchmark versions accidentally, for example. To solve this, I have begun writing a testing platform for running Physis against a bunch of different game versions. I need to write a web frontend for it, and it's still a simple script I have to manually run.
Miscel
In an effort to reduce the scope of Physis, I have moved a lot of functionality really only used by Astra to a new library called Miscel. This includes frontier URL lookup, installer helpers, and locating existing game installations. libphysis exposes both libraries to make things simple for now.
Excel Improvements
One of the first things I wrote was the Excel parser, and naturally it has a ton of mistakes. A good example is how I handled row IDs - or to be more specific how I didn't handle them and so looking up rows never really worked properly. To fix things, I have begun breaking a lot of the Excel API - not only to make it more functionally correct but also to prepare for writing support2.
Terrain and Layer Groups
Another focus of mine has been terrain (TERA) and layer group (LGB) files, the two formats that make up most of the zone data in-game: terrain, background objects, NPCs and even deciding where you teleport to are read from these two formats. I have tidied up the terrain parsing some, and begun implementing write support for both formats. Writing LGBs are going to be really tricky, don't expect that for a long while.
I have begun exposing LGB objects in the public Physis API, which is used in Kawari to get pop ranges:
for group in &self.planmap.as_ref().unwrap().chunks[0].layers {
for object in &group.objects {
if let LayerEntryData::PopRange(pop_range) = &object.data {
if object.instance_id == instance_id {
return Some((object, pop_range));
}
}
}
}
Everything Else
- The little-known format called SQDB (Square Enix Database?) is used to detail what is inside of data files. This isn't shipped in the retail game anymore, but is such a simple format it was easy to add support for it.
- Physis can now be compiled to WebAssembly, which was used in the web version of Auracite. I also hacked away a lot of dependencies in Physis that either wasn't needed or I could safely take out, and the result is a much lighter library to build!
- ZiPatch support has been improving, I not only fixed more patching bugs but also working towards write support. Physis-created patches can add new files, but that's about the extent of what I wrote so far.
Documentation
I begun the process of moving from docs.xiv.zone to wiki.xiv.zone. (You may have already seen links to it in some of my newer projects.) The wiki has proven to be a lower barrier for me to edit it, so I hope more interesting stuff pops up on there. Note that the wiki is not publicly editable, and I have no immediate plans to allow sign ups.
I will be adding redirects once the transition is complete.