package Ġtry pp . support . pattern . component Ċ Ċ import Ġtry pp . support . collections . Array Map Ċ import Ġtry pp . support . extensions . k Class Ċ import Ġtry pp . support . memory . Heap Pool Ċ import Ġtry pp . support . time . Duration Ċ import Ġjava . util .* Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠA Ġclass Ġwhich Ġmanages Ġof Ġcollection Ġof Ġentities . Ċ Ġ*/ Ċ class ĠEntity Manager ( max Entity Count : ĠInt ) Ġ{ ĊĊĠĠĠ Ġinterface ĠEntity Initializer Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġinitialize ( entity : ĠEntity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġentity Pool Ġ= ĠHeap Pool ({ ĠEntity ( this ) Ġ}, Ġ{ Ġit . reset () Ġ}, Ġmax Entity Count ) ĊĠĠĠ Ġprivate Ġval Ġcomponent Pools Ġ= ĠArray Map < K Class <* >, ĠHeap Pool < *> >( 3 2 ) ĊĠĠĠ Ġprivate Ġval Ġinitial izers Ġ= ĠArray Map < Enum <* >, ĠEntity Initializer >() ĊĠĠĠ Ġprivate Ġval Ġsystems Ġ= ĠArrayList < Entity System >() ĊĠĠĠ Ġprivate Ġval Ġqueued For Removal Ġ= ĠStack < Entity >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġqueued For Removal . ensure Capacity ( max Entity Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġmethod Ġto Ġcall Ġ[ register Initializer ] Ġwith Ġa Ġlambda . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister Initializer ( id : ĠEnum <* >, Ġinitialize : Ġ( Entity ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġregister Initializer ( id , Ġobject Ġ: ĠEntity Initializer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinitialize ( entity : ĠEntity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġan Ġinitializer Ġso Ġfuture Ġcode Ġcan Ġcreate Ġa Ġnew Ġentity Ġgiven Ġan ĠID . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġnew Entity ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister Initializer ( id : ĠEnum <* >, Ġentity Initializer : ĠEntity Initializer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( getEntity Initializer ( id ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Attempt Ġto Ġregister Ġduplicate Ġentity Ġid Ġ$ id ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinitial izers . put ( id , Ġentity Initializer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġnew Ġentity Ġusing Ġan Ġid Ġpreviously Ġregistered Ġwith Ġ[ register Initializer ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġno Ġint ial izer Ġwas Ġregistered Ġwith Ġthe Ġtarget Ġid ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnew Entity ( id : ĠEnum < *> ): ĠEntity Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitializer Ġ= Ġget Entity Initializer ( id ) Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Attempt Ġto Ġcreate Ġentity Ġfrom Ġinvalid Ġid Ġ$ id ") ĊĊĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġnew Entity () ĊĠĠĠĠĠĠĠ Ġinitializer . initialize ( entity ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġentity ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġnew , Ġempty Ġentity Ġshell , Ġwhich Ġyou Ġcan Ġpopulate Ġwith Ġcomponents Ġusing ĊĠĠĠĠ Ġ* Ġ[ Entity . addComponent ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠConsider Ġusing Ġ[ register Initializer ] Ġthen Ġ[ new Entity ] Ġinstead , Ġas Ġthat Ġmakes Ġit Ġvery Ġeasy Ġto ĊĠĠĠĠ Ġ* Ġcreate Ġmany Ġentity Ġinstances Ġof Ġsimilar Ġtypes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnew Entity (): ĠEntity Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġentity Pool . grab New () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest Ġa Ġnew Ġcomponent Ġinstance Ġfrom Ġthe Ġmanager 's Ġpool . ĠDon 't Ġuse Ġdirectly ; Ġinstead , Ġuse ĊĠĠĠĠ Ġ* Ġ[ Entity . addComponent ] Ġwhich Ġdeleg ates Ġto Ġthis Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġinternal Ġfun Ġ< C Ġ: ĠComponent > Ġnew Component ( component Class : ĠK Class < C >): ĠC Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! component Pools . containsKey ( component Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent Pool Ġ= ĠHeap Pool . of ( component Class , Ġentity Pool . capacity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Pool . make Resizable ( entity Pool . max Capacity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Pools . put ( component Class , Ġcomponent Pool ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcomponent Pools [ component Class ]. grab New () Ġas ĠC ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġa Ġnew Ġentity Ġsystem Ġto Ġthis Ġmanager . ĠThe Ġorder Ġof Ġregistration Ġmatters , Ġas Ġthe Ġfirst ĊĠĠĠĠ Ġ* Ġsystem Ġregistered Ġwill Ġrun Ġfirst . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister System ( system : ĠEntity System ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsystems . add ( system ) ĊĠĠĠĠĠĠĠ Ġentity Pool . items InUse . forEach Ġ{ Ġif Ġ( it . initialized ) Ġsystem . entity Added ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġwhen Ġyou Ġare Ġdone Ġwith Ġthis Ġentity Ġand Ġwant Ġto Ġrelease Ġits Ġresources . ĠIf Ġan Ġupdate Ġcycle ĊĠĠĠĠ Ġ* Ġis Ġin Ġprogress , Ġit Ġwill Ġbe Ġfreed Ġafter Ġthe Ġcycle Ġhas Ġfinished . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfree Entity ( entity : ĠEntity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIt 's Ġpossible Ġthat Ġthis Ġmethod Ġcan Ġget Ġcalled Ġmore Ġthan Ġonce Ġbefore Ġwe Ġhave Ġa Ġchance Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġactually Ġremove Ġthe Ġentity , Ġso Ġwe Ġguard Ġagainst Ġthat Ġhere . ĊĠĠĠĠĠĠĠ Ġif Ġ(! queued For Removal . contains ( entity )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueued For Removal . push ( entity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġall Ġ[ Entity System ] s Ġmanaged Ġby Ġthis Ġmanager , Ġprocessing Ġall Ġentities . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate ( elapsed Time : ĠDuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentities Ġ= Ġentity Pool . items InUse ĊĠĠĠĠĠĠĠ Ġentities . forEach Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! e . initialized ) Ġsystems . forEach Ġ{ Ġs Ġ-> Ġs . entity Added ( e ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . initialized Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsystems . forEach Ġ{ Ġit . update ( elapsed Time ) Ġ} ĊĠĠĠĠĠĠĠ Ġentities . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . update Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Entity Ġregistered Ġbut Ġnot Ġprocessed Ġby Ġany Ġsystem : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . update Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠKill Ġany Ġdead Ġobjects Ġfrom Ġthe Ġlast Ġcycle ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! queued For Removal . empty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfree Entity Internal ( queued For Removal . pop ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġinternal Ġfun Ġfree Component ( component : ĠComponent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! component Pools . containsKey ( component . k Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can 't Ġfree Ġcomponent Ġtype Ġ${ component . k Class } Ġas Ġwe Ġdon 't Ġown Ġit .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ( component Pools [ component . k Class ] Ġas ĠHeap Pool < Component >). free ( component ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Entity Initializer ( id : ĠEnum < *> ): ĠEntity Initializer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinitial izers . get If ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfree Entity Internal ( entity : ĠEntity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsystems . forEach Ġ{ Ġit . entity Removed ( entity ) Ġ} ĊĠĠĠĠĠĠĠ Ġentity . free Components () ĊĠĠĠĠĠĠĠ Ġentity Pool . free ( entity ) ĊĠĠĠ Ġ} Ċ } Ċ