Pokémon Soul.Link has been deprecated! Hurray! It was fun, but I'm tired of supporting it.
I highly recommend you use PokéLink instead. It is much, much easier to set up. I would only use Pokèmon Soul.Link if you want very fine-grained styling and have skills with CSS.
This might seem like a daunting task. Don't worry. You're not crazy. It is.
config.json
fileThe config.json
file sitting in /node/
contains all the information the server needs to know what kind of run you're doing and how to display the webpage for your streaming software.
There are four main sections you are likely going to edit:
layout
death
soulLink
style
Additionally there are some miscellaneous, somewhat one-off settings. Oddly, these are the ones we'll tackle first. Open up config.json
in a text editor, preferably one that knows how to highlight JSON with comments, say, I don't know... something like VS Code.
JSON is a pretty intuitive markup language, but if you're unfamiliar with it, click the button below for a quick overview.
{
// Commented lines -- those starting with "//" -- have no effect. If you want to disable a setting,
// commenting it out is a common practice*.
// *all* setting names have double quotes around them
"textSetting": "some text", // text values have double quotes around them
"numberSetting": 42, // numbers do not have quotes around them (unless they also contain text)
"trueFalseSetting": false, // true/false, also known as boolean values, do not have quotes around them
"emptySetting": null, // null means the setting exists but doesn't have a value; it has no quotes
"listSetting": [ // lists are denoted by [ and ], and their items are separated by commas
"textItem",
123,
true,
null,
[ "another", "list" ]
],
"objectSetting": { // "objects" are denoted by { and }, and for the purposes of config,
// are basically a way to organize settings
"objectTextVal": "some more text"
}
}
// * The JSON specification doesn't handle comments. I've used a special loader that ignores them for convenience sake.
// Commenting out lines of code, in general however, is common practice for langauges that support it. (Which is
// basically all of them.)
For more information, w3schools explains the syntax well.
If something isn't working after you have changed a config file, the first thing you do is check that you didn't miss a comma or double-quote somewhere. If you are editing in VS Code, you can go to View -> Problems (ctrl + shift + m by default). If not, from node/
run validateConfigFormat.cmd
.
The config.json
document, itself, is pretty well commented, and I'd rather not repeat myself a whole lot, so I'm going to assume you've got the document open.
The miscellaneous settings I'm referring to are:
{
"configOverride": [
// ...
],
"randomizer": {
"enabled": false,
"normalizedExp": false,
},
"emptySlotImagePath": "..."
}
The configOverride
setting is the reason I'm starting with the miscellaneous settings. This is a list of filenames whose settings will overwrite the ones in config.json
(as well as config.advanced.json
, but you probably will never need to touch that). Files at the top of the list have the highest priority.
The biggest strength to this option, in my opinion, is that if you store all your custom settings in a separate file, you're less likely to screw something up. It also makes your config resilient to updates, since updates I make won't overwrite your own changes. If I were you, I'd copy one of the config files (config.json
, config.fail.json
, or config.iipk.json
) and name it something like config.stormageddon-dark-lord-of-all.json
. If you're not doing a SoulLink run, copy config.json
. Otherwise, choose one of the other two.
If you're running a randomizer, set randomizer.enabled
to true
. This setting is used to help determine whether a pokémon you've caught was a wild or static encounter. If you're using a randomizer, obviously it should not be comparing the species with the vanilla species.
Static encounter detection is experimental. It is currently only supported in HeartGold/SoulSilver. (And poorly at that.)
Set normalizedExp
to true
if you checked the Standardize EXP Curves box in the Universal Pokemon Randomizer. This tells the server to calculate levels based on the same curve the randomized ROM does.
The last miscellaneous setting indicates the path to the pokéball image that is displayed in empty slots when you don't have a full party. If you want to change the image, set this path. If you want to remove it entirely, set the value to null
.
This is the easiest one and has the largest immediate effect. This section determines which information elements are placed in which areas of the Party Display slots. Every element is optional. If you don't add any elements (and remove the ones there by default), the Party Display will only show images.
The topElements
, bottomElements
, leftElements
, and rightElements
refer to their position relative to the image. The leftElements
and rightElements
are rotated by default. To un-rotate them, you must set a style, which we'll get to a little later. (That said, the config.json
file that already exists does apply this un-rotation to level
, which was placed in the rightElements
. Failstream didn't like the rotated number. )
The imageOverlayElements
are placed atop the image itself. This is primarily useful for SoulLink runs where space is limited.
The death
section allows for various effects to occur in the Party Display when a pokémon faints.
The Nuzlocke challenge has a rule that if a pokémon faints, it stays dead. If you enable nuzlocke in the config, your fainted pokémon images won't return to life when you heal your pokémon (though you can manually revive the images in the Dashboard). To enable Nuzlocke, simply set death.nuzlocke
to true
.
Nuzlocke is enabled by default.
As of version 0.2.1, all death effects can be applied even when Nuzlocke is disabled.
There are really three places to go from here.