Before config was allowed to be swapped while `Feature` was enabled,
which has led to a lot of loading code being moved into the
`SwapConfig()` method, making `Feature` initialization code way more
complex than it needed to be.
This patch forces `Feature` to get disabled before config swap. This
adds some verhead for swapping configs for already running `Feature`s,
but that's a small cost for way simpler implementations.
Squashed commit of the following:
commit f7cbf54045
Author: Anton Tarasenko <dkanus@gmail.com>
Date: Thu Jun 23 02:45:20 2022 +0700
Done
commit 3cf67a3ca5
Author: Anton Tarasenko <dkanus@gmail.com>
Date: Wed Jun 22 20:49:28 2022 +0700
Almost done
commit 6dfb9dc204
Author: Anton Tarasenko <dkanus@gmail.com>
Date: Wed Jun 22 17:03:06 2022 +0700
Now it even works
commit 2be4656f51
Author: Anton Tarasenko <dkanus@gmail.com>
Date: Wed Jun 22 16:30:35 2022 +0700
Kind of compiles now
commit 73914e9b7e
Author: Anton Tarasenko <dkanus@gmail.com>
Date: Tue Jun 21 04:24:04 2022 +0700
Daily dirty commit
This method did not do any checks for validity of its parameters and its
behavior wasn't consistent in that it woldn't set specified config in
case `Feature` was already enabled. Now it will.
I shamefully ended up doing another mega-commit, because a lot of things
needed to be redone at once and it was easier that way on me. No one
really consistently tracks what I'm doing with these commits anyway.
This adds a whole bunch of code to deal with proper clean up for Acedia,
so it doesn't crash on map change and also replaces old event/listener
system with new signals/slots one.
We cannot rely on `Feature`'s static constructor to be called for every
feature class, so we move out relevant code into separate
`LoadConfigs()` method.
This patch changes how `Feature`s configs work - they are now required
to use a separate config object (each `Feature` their own class, derived
from `FeatureConfig`) that is to be used as a `perconfigobject` storage.
`Feature`s themselves are not supposed to interact with their config
objects directly, instead using JSON-serializable type, which should
allow us a universal way to change `Feature`'s config variables during
execution.