`APlayer` and `ATrader` represented player and trader (`ShopVolume`)
with a single object instance. Such design, if used for all actors,
could have led to mutitute of problems rooted in need to find that
single object for any given native actor: we'd need to store
object-actor pairs separately and look through pairs lists, which is
hardly a sane design.
Now Acedia switches to a different design, where a single in-game entity
(i.e. actor) can have several interfaces referring to it. All equaly
valid. Refactoring `APlayer` and `ATrader` into `EPlayer` and `ETrader`
is a first step in that direction.
Several methods such as `Copy()`, `Remove()`, `ChangeFormatting()` and
several others have had similar errors related to how their input
parameters defined range when specified out-of-bounds.
This patch should fix them.
Previously one could only read formatted data directly from `string`s.
This patch adds another method `AppendFormatted()` for appending a
`Text`/`MutableText`, while parsing its data like a formatted string.
This method was creating an empty json pointer when user passed a `none`
value, but having to pass `none` made for a bad interface. This patch
allows to simply omit the argument.
Before this patch `ConsoleWriter` could only send messages to all
players or to none of them. Now it posseses methods to configure a
sprecise set of players to send messages to.
`Timer` could have been deallocated after it has emitted its signal, but
still try to execute code and change its internal state. This patch
prevents that.
This patch addresses issues with inability to define and create a new
database from scratch from configs, as well as invalid definition of
database links that required them to contain "/" character.