The user-facing display name of the sim. This needs to be writable, as users can change the display name of sims.
The internalized settings of the object.
A short name for the sim, used for internal naming. Should be usable as a CSS class name or other HTML-ish applications, i.e. start with a letter, then keep to alphanumeric and hyphen.
A good choice is to simply use the spec's stub name.
The original sim spec.
The settings, flatted into a form that is fully JSON-ifiable.
Notify the sim that settings have changed
Run a simulation. As mentioned in the class-level docs, all mutable state should be scoped to this method.
Like simulate, but only needs to return a single number. This is used for meld solving and such, as the brute force sim does not need to display any additional data to the user. If the extra processing time and memory use from the normal simulation path is trivial for a particular sim implementation, then this can be implemented as simply "return (await this.simulate(set)).mainDpsResult".
Represents a configured simulation. Note that an instance of this object is re-used across multiple runs of the same simulation (e.g. multiple sets, or multiple runs of one set). Thus, no mutable state should be kept at this level. Rather, all mutable state should be scoped within the simulate method.