add random movement to spirit. allow gatekeeper to move and unlock door after solution dialog, and have final dialog available

no real need for GameEvent interface, just use Runnable

level2.tmx: add gatekeeper_dest maplink, where she will move to after solution dialog
remove switch property from exit door, instead default to locked.
gatekeeper should be standing in front of exit door and facing left
level2.gatekeeper3: Final dialog

refactor: remove unused imports

Entity: refactor miscapitalized "flickertotalTimeRemaining", unsused assignment
Entity.setDesiredDir() from PrimaryDirection
@Override

Level2Spirit: clean up constructor. fix spacing. use RandomWalkFSM. remove unnecessary init()

PredicateSwitchFSM.activated()

refactor: RandomWalk logic from RandomWalkNPC

GatekeeperMove event

GameObjectSystem: use enum map for layers
getObjectByName(), cast object to desired type

create generic DialogElement in the dialog system
move code for rendering DialogFrame to separate method, check DialogElement type
refactor variable names in Game dialog code

Gatekeeper: set move event after talking to her while predicate has been activated
Gatekeeper.move(): apply the move event
Gatekeeper.Moving and Gatekeeper.Final: two FSM states to apply the movement.
Level2Spirit: set can damage false. pause FSM while frozen. set frozen animation to correct animation and desired velocity to zero
call thaw()
Entity: use facing property instead of dir
AI_FSM: add support for pausing
GameObject: use double brace initializer to statically initialize gameObjectTypes, clean up imports
remove unused GameObject.canPlayerInteract()

GameObjectSystem: refactor renderLayers-> spriteRenderLayers
use HashSet instead of ArrayList for render layers

Player: use double brace static initialization for interactMap and targetClasses, clean up comments