package Ġcom . github . dw ur ste is en . min ig dx . ecs . states Ċ Ċ import Ġcom . github . dw ur ste is en . min ig dx . Seconds Ċ import Ġcom . github . dw ur ste is en . min ig dx . ecs . entities . Entity Ċ import Ġcom . github . dw ur ste is en . min ig dx . ecs . events . Event Ċ import Ġcom . github . dw ur ste is en . min ig dx . ecs . events . Event With Query Ċ import Ġcom . github . dw ur ste is en . min ig dx . ecs . events . On Create Ċ import Ġcom . github . dw ur ste is en . min ig dx . ecs . systems . Entity Query Ċ import Ġcom . github . dw ur ste is en . min ig dx . ecs . systems . StateMachine System Ċ import Ġkotlin . reflect . K Class Ċ Ċ type alias ĠTransition Ġ= Ġ( event : ĠEvent ) Ġ-> ĠState ? Ċ Ċ abstract Ġclass ĠState Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġevent Listeners Ġ= Ġmutable Map Of < K Class < out ĠEvent >, ĠTransition >() ĊĊĠĠĠ Ġinternal Ġval Ġevents Ġ= Ġmutable ListOf < Event With Query >() ĊĊĠĠĠ Ġopen Ġfun Ġconfigure () Ġ= ĠUnit ĊĊĠĠĠ Ġopen Ġfun Ġon Enter ( entity : ĠEntity ) Ġ= ĠUnit ĊĊĠĠĠ Ġopen Ġfun Ġupdate ( delta : ĠSecond s , Ġentity : ĠEntity ): ĠState ? Ġ= Ġnull ĊĊĠĠĠ Ġopen Ġfun Ġon Exit ( entity : ĠEntity ) Ġ= ĠUnit ĊĊĠĠĠ Ġfun Ġconfigure ( system : ĠState Machine System ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconfigure () ĊĠĠĠĠĠĠĠ Ġsystem . events ToList en . addAll ( event Listeners . keys ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonCreate ( transition : ĠTransition ) Ġ= Ġon Event ( ĊĠĠĠĠĠĠĠ ĠOn Create :: class , ĊĠĠĠĠĠĠĠ Ġtransition ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġon Event ( event Clazz : ĠK Class < out ĠEvent >, Ġtransition : ĠTransition ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Listeners [ event Clazz ] Ġ= Ġtransition ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Event ( event : ĠEvent ): ĠState ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġevent Listeners [ event :: class ]?. invoke ( event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġemit Events ( event : ĠEvent , Ġtarget : ĠEntity Query ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevents . add ( Event With Query . of ( event , Ġtarget )) ĊĠĠĠ Ġ} Ċ } Ċ