package Ġcom . ac orn ui . ecs Ċ Ċ import Ġcom . ac orn ui ._ assert Ċ import Ġcom . ac orn ui . assertions Enabled Ċ import Ġcom . ac orn ui . core . Uid Util Ċ import Ġcom . ac orn ui . logging . Log Ċ import Ġcom . ac orn ui . serialization .* ĊĊ Ċ /** Ċ Ġ* ĠAn Ġentity Ġis Ġa Ġbucket Ġof Ġcomponents . Ċ Ġ* Ġ@ author Ġnb ily k Ċ Ġ*/ Ċ class ĠEntity ( Ċĉ ĉ val Ġid : ĠString Ġ= ĠU id Util . create Uid () Ċ ) Ġ{ ĊĊ ĉ private Ġval Ġ_ components Ġ= ĠHashMap < ComponentType <* >, ĠComponent >( 1 6 ) ĊĊ ĉ val Ġcomponents : ĠMap < ComponentType <* >, ĠComponent > Ċĉ ĉ get () Ġ= Ġ_ components ĊĊ ĉ fun Ġassert Valid (): ĠBoolean Ġ{ Ċĉ ĉ if Ġ(! assertions Enabled ) Ġreturn Ġtrue Ċĉ ĉ _ assert ( components . isNotEmpty ()) Ġ{ Ġ" Entity Ġis Ġempty ." Ġ} Ċĉ ĉ for Ġ( entry Ġin Ġcomponents ) Ġ{ Ċĉĉ ĉ entry . value . assert Valid () Ċĉ ĉ } Ċĉ ĉ return Ġtrue Ċ ĉ } ĊĊ ĉ fun Ġadd Components ( var arg Ġcomponents : ĠComponent ): ĠEntity Ġ{ Ċĉ ĉ for Ġ( i Ġin Ġ 0 .. components . last Index ) Ġ{ Ċĉĉ ĉ addComponent ( components [ i ]) Ċĉ ĉ } Ċĉ ĉ return Ġthis Ċ ĉ } ĊĊ ĉ fun Ġadd Components ( components : ĠList < Component >): ĠEntity Ġ{ Ċĉ ĉ for Ġ( i Ġin Ġ 0 .. components . last Index ) Ġ{ Ċĉĉ ĉ addComponent ( components [ i ]) Ċĉ ĉ } Ċĉ ĉ return Ġthis Ċ ĉ } ĊĊ ĉ fun Ġadd Component ( component : ĠComponent ): ĠEntity Ġ{ Ċĉ ĉ _ assert ( component . parent Entity Ġ== Ġnull , Ġ" Component Ġmust Ġbe Ġremoved Ġfirst .") Ċĉ ĉ component . parent Entity Ġ= Ġthis Ċĉ ĉ _ components [ component . type ] Ġ= Ġcomponent Ċĉ ĉ return Ġthis Ċ ĉ } ĊĊ ĉ fun Ġremove Component ( component : ĠComponent ) Ġ{ Ċĉ ĉ if Ġ( component . parent Entity Ġ== Ġthis ) Ġ{ Ċĉĉ ĉ component . parent Entity Ġ= Ġnull Ċĉĉ ĉ _ components . remove ( component . type ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠReturns Ġa Ġcomponent Ġfor Ġthe Ġgiven Ġsub Type . Ċĉ Ġ* Ġ@ param Ġtype ĠThe Ġsub Type Ġof Ġcomponent Ġto Ġretrieve . Ċĉ Ġ* Ċĉ Ġ* Ġ@ return ĠReturns Ġthe Ġcomponent Ġfor Ġthe Ġgiven Ġsub Type , Ġor Ġnull Ġif Ġno Ġsuch Ġcomponent Ġhas Ġbeen Ġadded . Ċĉ Ġ*/ Ċ ĉ fun Ġ< T Ġ: ĠComponent > Ġget Component ( type : ĠComponent Type < T >): ĠT Ġ{ Ċĉ ĉ return Ġget Optional Component ( type ) Ġ?: Ġthrow ĠException (" Does Ġnot Ġcontain Ġcomponent Ġof Ġtype Ġ$ type ") Ċ ĉ } ĊĊ ĉ fun Ġ< T Ġ: ĠComponent > Ġget Optional Component ( type : ĠComponent Type < T >): ĠT ? Ġ{ Ċĉ ĉ @ Suppress (" UN CHECK ED _ CAST ") Ċĉ ĉ return Ġ_ components [ type ] Ġas ĠT ? Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* Ġ@ param Ġcomponent ĠThe Ġcomponent Ġto Ġsearch Ġfor . Ċĉ Ġ* Ċĉ Ġ* Ġ@ return ĠReturns Ġtrue Ġif Ġthe ĠEntity Ġcontains Key Ġthe Ġgiven Ġcomponent . Ċĉ Ġ*/ Ċ ĉ fun Ġcontains Component ( component : ĠComponent ): ĠBoolean Ġ{ Ċĉ ĉ return Ġcomponent . parent Entity Ġ=== Ġthis Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* Ġ@ param Ġtype ĠThe Ġcomponent Ġclass Ġto Ġsearch Ġfor . Ċĉ Ġ* Ġ@ return ĠReturns Ġtrue Ġif Ġthe ĠEntity Ġcontains Key Ġa Ġcomponent Ġfor Ġthe Ġclass . Ċĉ Ġ*/ Ċ ĉ fun Ġcontains Component ( type : ĠComponent Type < *> ): ĠBoolean Ġ{ Ċĉ ĉ return Ġ_ components . containsKey ( type ) Ċ ĉ } ĊĊ ĉ operator Ġfun Ġ< T Ġ: ĠComponent > ĠT . unary Plus (): ĠT Ġ{ Ċĉ ĉ addComponent ( this ) Ċĉ ĉ return Ġthis Ċ ĉ } ĊĊ ĉ operator Ġfun ĠList < Component >. unary Plus () Ġ{ Ċĉ ĉ add Components ( this ) Ċ ĉ } ĊĊ ĉ operator Ġfun ĠComponent . unary Minus () Ġ{ Ċĉ ĉ remove Component ( this ) Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠRemoves Ġand Ġdis poses Ġthe Ġentity . Ċĉ Ġ* ĠThis Ġalso Ġdis poses Ġall Ġcomponents Ġon Ġthe Ġentity . Ċĉ Ġ*/ Ċ ĉ fun Ġdispose () Ġ{ Ċĉ ĉ for Ġ( entry Ġin Ġcomponents ) Ġ{ Ċĉĉ ĉ entry . value . parent Entity Ġ= Ġnull Ċĉĉ ĉ entry . value . dispose () Ċĉ ĉ } Ċĉ ĉ _ components . clear () Ċ ĉ } ĊĊ ĉ comp anion Ġobject Ġ{ ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠCreates Ġan Ġentity Ġwith Ġa Ġlist Ġof Ġcomponents . Ċĉĉ Ġ*/ Ċĉ ĉ fun Ġfrom Components ( var arg Ġcomponents : ĠComponent ): ĠEntity Ġ{ Ċĉĉ ĉ val Ġentity Ġ= ĠEntity () Ċĉĉ ĉ entity . add Components (* components ) Ċĉĉ ĉ return Ġentity Ċĉ ĉ } Ċ ĉ } Ċ Ċ } ĊĊ Ċ class ĠEntity Serializer ( component Types : ĠArray < Serializable ComponentType <* >>) Ġ: ĠTo < Entity >, ĠFrom < Entity > Ġ{ ĊĊ ĉ private Ġval Ġcomponent Serializer Ġ= ĠComponent Serializer ( component Types ) ĊĊ ĉ override Ġfun ĠEntity . write ( writer : ĠWriter ) Ġ{ Ċĉ ĉ writer . string (" id ", Ġid ) Ċĉ ĉ val Ġw Ġ= Ġwriter . property (" components ") Ċĉ ĉ w . array ( true ) Ġ{ Ċĉĉ ĉ // ĠOnly Ġserialize Ġserial izable Ġcomponents . Ċĉĉ ĉ for Ġ( v Ġin Ġcomponents . values ) Ġ{ Ċĉĉĉ ĉ if Ġ( v . type Ġis ĠSerializable ComponentType ) Ġ{ Ċĉĉĉĉ ĉ it . element (). obj ( true ) Ġ{ Ċĉĉĉĉĉ ĉ component Serializer . write 2 ( v , Ġit ) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġread ( reader : ĠReader ): ĠEntity Ġ{ Ċĉ ĉ val Ġe Ġ= ĠEntity ( reader . string (" id ") !! ) Ċĉ ĉ val Ġc Ġ= Ġreader . array 2 (" components ", Ġcomponent Serializer ) Ċĉ ĉ if Ġ( c Ġ!= Ġnull ) Ġ{ Ċĉĉ ĉ e . add Components (* c ) Ċĉĉ ĉ for Ġ( entry Ġin Ġe . components ) Ġ{ Ċĉĉĉ ĉ if Ġ( entry . value . type Ġ== ĠUnknown Component ) Ġ{ Ċĉĉĉĉ ĉ // ĠAttempt Ġto Ġrecover Ġfrom Ġunknown Ġcomponents . Ċĉĉĉĉ ĉ Log . warn (" Unknown Ġor Ġold Ġcomponent Ġtype : Ġ${ ( entry . value Ġas ĠUnknown Component ). original Type }") Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġe Ċ ĉ } Ċ } Ċ Ċ fun Ġentity ( init : ĠEntity . () Ġ-> ĠUnit Ġ= Ġ{} ): ĠEntity Ġ{ Ċ ĉ val Ġe Ġ= ĠEntity () Ċ ĉ e . init () Ċ ĉ return Ġe Ċ }