NPC refactoring:
make NPC class concrete. specify body type
dialog logic to be handled by FSM

Predicate interface for functions that test a condition (returns boolean)
Level2Cleared predicate

created NPC_FSM and NPC_State, subtype AI_FSM and AI_State with canTalk() and getDialog()
Gatekeeper: use kinematic body, PredicateSwitchFSM

move state machine logic to Entity from Enemy
specify body type for Entity

Talk interaction: check NPC canTalk()