Simplify a few things, and improve an algorithm

Use std::none_of rather than explicitly looping over demon_traits
in search of a match.

Use a range-based for loop for a few iterations over the player's spells.

Have is_memorised call you.has_spell, for which it is a synonym.  Make
the latter, and _get_spell_slot, use std::find.  Use is_memorised in
one location that essentially replicated the loop yet again.

Replace an ugly repeated array scan in _get_status_lights with a bitset.
It would be even nicer if we could statically initialise the bitset from
important_statuses rather than setting it each time we check status
lights.  Possibly an array<bool> or FixedVector<bool> would be faster
than bitset despite the increased size.