The error in this line is:
private val converters = HashMap<String, ValueConverter<Event>>()
The values ββof this map are limited by ValueConverter<Event> . Therefore, if you have a class
class FooEvent : Event
and value converter:
ValueConverter<FooEvent> ,
You could not save the value converter on your map. What you really want is the type of projection of the star * .
private val converters = HashMap<String, ValueConverter<*>>()
Now you can put any value converter on the map.
However, this opens up another problem: how
fun <E : Event> convert(event: E): Float
to know what is the general type of return converter on the card? In the end, a map can contain several converters for different types of events!
IntelliJ quickly complains:

But you already know the generic type, because your card key is the name of a parameter of the type type!
So just translate the return value using the map:
@Suppress("UNCHECKED_CAST") fun <E : Event> convert(event: E): Float { val converter = converters[event.javaClass.name] ?: return 0.0f return (converter as ValueConverter<E>).convert(event) }
If you are wondering why the compiler has not complained about your converter function before: remember how your map could contain only ValueConverter<Event> and only this class? This means that the compiler knew that you could pass any subclass of Event to this converter. After you change the type of star, the compiler does not know if it could be ValueConverter<FooEvent> or ValueConverter<BazEvent> , etc. - make an effective function signature of this converter on your card convert(event: Nothing) : <w> 
because nothing is a valid entry.