Tasks
The 'tasks' represent an array of actions that can be used to launch the game.
You can think of them like the Tasks you have in VSCode.
Where Tasks can be Defined
- Per Game
- These tasks are automatically created when you add a game to the launcher.
- These are persisted in the user's preferences.
- Per Package
ToolPackages can declare their own tasks to run.
- Community Repository
- Community Repository can define tasks for games.
Structure
The Tasks field when present is an array of Task objects, where each Task is defined as:
[[Tasks]]
Id = "" # No ID. Imported from GOG.
Type = "Executable"
VisualHint = "Game"
Name = "Launch Game"
GroupNames = ["GOG"]
Description = "Launches the game."
Path = {
win+x64-any = "Game.exe",
linux+x64-any = "Game.elf",
macos+x64-any = "Game.app"
}
IsPrimary = true
IsHidden = false
InjectLoader = true
Icon = "GameIcon.png"
RelativeWorkingDir = "Bin"
Arguments = ["-fullscreen", "-config", "{GameDir}/config.ini"]
| Type | Field | Description |
|---|---|---|
| Id | Id | Unique Identifier for Task. |
| TaskType | TaskType | The type of the task (e.g., "Executable", "Url"). |
| VisualHint | VisualHint | Visual hint for the UIs. |
| string | Name | A user-friendly name for the task. |
| string[] | GroupNames | A user-friendly name for 'group' containing this task. |
| string? | Description | A brief description of the task. Ideally limited to 2 short lines. |
| CrossPath | Path | The relative path to the executable file or the URL to open. See Path for details. |
| bool | IsPrimary | Indicates whether this task launches the game's main executable. Only one task should have IsPrimary set to true. |
| bool | InjectLoader | Indicates whether the loader should be injected. Usually only true for the IsPrimary task. |
| string[] | Arguments | An array of additional commandline arguments to pass to the executable. Can use placeholders like {GameDir}. |
| bool? | IsHidden | Indicates whether the task should be hidden from the user. Defaults to false. |
| string? | RelativeWorkingDir | The working directory for the task. Defaults to the folder containing Path, otherwise is a folder relative to it. |
| StoreType | Store | The store to restrict this operation to. |
Id
This is a unique identifier for the task.
This allows for tasks to be used in workflow scripts and other places where uniquely identifying a task is useful.
For tasks defined in packages, please always use an ID
Set the Task Id to packageId+TaskName to ensure uniqueness. For example, for a package named
sonicheroes.tool.heroesone.s56, give the main tool the ID of
sonicheroes.tool.heroesone.s56.main.
If you have multiple binaries, you would do, sonicheroes.tool.heroesone.s56.extractor,
sonicheroes.tool.heroesone.s56.archiver etc.
TaskType
The TaskType can be one of the following
- 0:
Executable: Represents a task that launches an executable file. - 1:
Url: Launches an URL. Path specifies the full URL to open.
VisualHint
This is a hint for the launcher and other UIs.
- 0:
Game: Shows a GamePad. Used for game binary. - 1:
Settings: Shows a Gear. Used for launchers. - 2:
Tool: Shows a Wrench. Used for modding tools. - 3:
Wiki: Shows a Book. Used for documentation. - 4:
Community: Shows a Globe. Used for community links.
Group Names
A user-friendly name for 'groups' containing this task.
This field is used to group tasks together in the UI if the user to chooses to view tasks by group.
Example group names include:
GOG: All items imported from GOG.Community: All items imported from the community repository.
Description
A brief description of the task. Ideally limited to 2 short lines.
The Description field provides a brief description of the task.
It should ideally be limited to 2 short lines for conciseness and clarity.
Example:
Description = "Launches the configuration program."
Path
The relative path to the executable file or the URL to open.
The Path field specifies the relative path to the executable file or the URL to open when the task is executed.
- If the task is declared in a Package, the
Pathis relative to the folder the package is located in. - If the task is declared for a game, the
Pathis relative to the folder that contains the main executable of the game.- The one marked IsPrimary.
// TODO:
- [Platform][platforms] only: win, linux. When package has all architecture binaries.
- [Platform][platforms]+[Arch][architecture]: win+x64-v3, linux+x64-v3. When package has only one specific architecture.
Examples:
-
Cross-platform executable:
Path = { any = "Tool.dll" } # .NET -
Platform-specific paths:
Path = { win+x64-any = "Tool.exe", linux+x64-any = "Tool.elf", macos+x64-any = "Tool.app" } -
Windows only
Path = { any = "", win+x64-any = "Tool.exe" }
At least one of these keys must be specified.
If a platform-specific key is not present, the Default path will be used if.
This can be used to ship cross-platform binaries.
If there's no Default and no platform-specific path for the current platform,
the task will not be available on that platform.
IsPrimary
Indicates whether this task launches the game's main executable.
Only one task should have IsPrimary set to true.
The IsPrimary field indicates whether the task launches the game's main
executable, which is usually the primary EXE file assigned by the game store or the user.
When importing external tasks, there may be more than one 'default' task.
In such cases, the local already defined task wins.
InjectLoader
Indicates whether the loader should be injected.
Usually only true for the IsPrimary task.
The InjectLoader field is a boolean value that indicates whether the mod loader should be injected
when the task is executed.
This field is only used when the method of injecting is set to 'Code Injection'
RelativeWorkingDir
The working directory for the task.
Defaults to the folder containing Path, otherwise is a folder relative to it.
The RelativeWorkingDir field specifies the working directory for the task.
If not specified, it defaults to the folder containing the file specified in the Path field.
Otherwise, it is treated as a folder relative to the Path.
Example:
RelativeWorkingDir = ""
Gives you C:/Games/MyGame/Bin if the Path is Bin/Game.exe and game is at C:/Games/MyGame.
If you want to go one folder up from the Path, use double dots:
RelativeWorkingDir = ".."
This will set the working directory to C:/Games/MyGame.
Commandline Placeholders
These placeholders will be replaced with their corresponding values when the task is executed.
When specifying the Path or commandline Arguments for a task, you can use placeholders to
dynamically insert certain values.
The available placeholders are:
{GameDir}: The absolute path to the directory containing the main executable file.
If the task is sourced from a package, the following variables are also available:
{PackageDir}: The absolute path to the base folder of the package.{PackageUserCacheDir}: The absolute path to the config folder for the package.{PackageMachineCacheDir}: The absolute path to the config folder for the package.
The intent is to allow for external tools to store their configuration files within loadouts. By doing this, the user can cloud save their settings for their favourite tools.
Arguments
An array of additional commandline arguments to pass to the executable.
Can use Commandline Placeholders.
The Arguments field is an array of additional commandline arguments to pass to the executable
when the task is executed. It supports the use of Commandline Placeholders
like {GameDir} to dynamically insert values.
Example:
Arguments = ["-fullscreen", "-config", "{GameDir}/config.ini"]
When you execute the task, the following will run:
Game.exe -fullscreen -config C:/Games/MyGame/config.ini
Store
Some tasks are only available for certain game stores.
The Store field is an optional field that specifies the store this task is associated with.
The available store values can be found here.
If the Store field is not specified or set to None, the task is
considered store-independent and can be used with any store.
This is useful for things like adding links via Steam Browser Protocol
Tasks in Code
Some additional fields exist only in memory/code, on the actual implementation side
| Type | Field | Description |
|---|---|---|
| TaskSource | Type | Where the current task originated from. |
| string | UnavailableReason | The reason a task cannot be executed. Task is unavailable if this is not null. |
TaskSource
- 0:
Game: Task was defined for the game. - 1:
Package: Task was defined in a package. - 2:
Community: Task was imported from the community repository. - 3:
Imported: Task was imported from an external source (e.g., GOG).
Importing from GOG
GOG Games have their 'tasks' defined inside the goggame-{gameid}.info file.
Example from file (truncated):
"playTasks": [
{
"category": "game",
"isPrimary": true,
"languages": [
"en-US"
],
"name": "The Legend of Heroes: Trails in the Sky SC",
"path": "ed6_win2_DX9.exe",
"type": "File"
},
{
"category": "launcher",
"languages": [
"en-US"
],
"name": "Configuration Tool",
"path": "Config2_DX9.exe",
"type": "File"
}
],
We should be able to import these tasks directly into the game configuration.
Edge Cases
Not All Tasks Always are Valid
Check the target file exists before showing the task.
A user who for example is dual booting their OS, might find that launching Steam on Linux, after using it on Windows has replaced their game with the Linux version.
A task that is not valid should set the UnavailableReason field to a string explaining why the task is not available. And be blanked out.