package Ġtriple k lay . entity Ċ Ċ import Ġe uk lid . f . Dimension Ċ import Ġe uk lid . f . Point Ċ import Ġe uk lid . f . Vector Ċ import Ġe uk lid . platform . array Copy Ċ Ċ /** Ċ Ġ* ĠA Ġcomponent Ġcontains Ġthe Ġdata Ġfor Ġa Ġsingle Ġaspect Ġof Ġan Ġentity . ĠThis Ġmight Ġbe Ġits Ġposition Ġin Ġa Ċ Ġ* Ġ 2 D Ġspace , Ġor Ġits Ġanimation Ġstate , Ġor Ġany Ġother Ġpiece Ġof Ġdata Ġthat Ġe vol ves Ġas Ġthe Ġentity Ġexists Ċ Ġ* Ġin Ġthe Ġworld . Ċ Ġ* Ċ Ġ* ĠA Ġ` Component ` Ġinstance Ġcontains Ġthe Ġdata Ġfor Ġ* all * Ġentities Ġthat Ġpos sess Ġthe Ċ Ġ* Ġcomponent Ġin Ġquestion Ġ( in Ġa Ġsparse Ġarray ). ĠThis Ġenables Ġa Ġdata - driven Ġapproach Ġto Ġentity Ċ Ġ* Ġprocessing Ġwhere Ġa Ġsystem Ġcan Ġprocess Ġone Ġor Ġmore Ġcomponents Ġfor Ġits Ġactive Ġentities Ġwith Ġa Ċ Ġ* Ġcache - friendly Ġmemory Ġaccess Ġpattern . Ċ Ġ*/ Ċ abstract Ġclass ĠComponent Ġprotected Ġconstructor ( ĊĠĠĠ Ġ/** ĠThe Ġworld Ġin Ġwhich Ġthis Ġcomponent Ġexists . Ġ Ġ*/ ĊĠĠĠ Ġval Ġworld : ĠWorld Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĠA Ġcomponent Ġimplementation Ġfor Ġarbitrary Ġobjects . Ġ Ġ*/ ĊĠĠĠ Ġopen Ġclass ĠGeneric < T >( world : ĠWorld ) Ġ: ĠComponent ( world ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠReturns Ġthe Ġvalue Ġof Ġthis Ġcomponent Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġget ( entityId : ĠInt ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġblock [ entityId Ġ% ĠBLOCK ] Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUpdates Ġthe Ġvalue Ġof Ġthis Ġcomponent Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġset ( entityId : ĠInt , Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ entityId Ġ% ĠBLOCK ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit ( entityId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Idx Ġ= Ġentity Id Ġ/ ĠBLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Idx Ġ>= Ġ_ blocks . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks Ġ= Ġ_ blocks . copyOf (_ blocks . size Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ blocks [ block Idx ] Ġ== Ġnull ) Ġ_ blocks [ block Idx ] Ġ= ĠarrayOf Null s < Any >( BLOCK ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclear ( entityId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġentity Id Ġ% ĠBLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Ġ= Ġblock [ idx ] Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ idx ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease ( prev ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠRelease s Ġan Ġinstance Ġof Ġthis Ġcomponent Ġfor Ġan Ġentity Ġthat Ġis Ġno Ġlonger Ġusing Ġit . ĠThe ĊĠĠĠĠĠĠĠĠ Ġ* Ġdefault Ġdoes Ġnothing Ġ( ass uming Ġthe Ġobject Ġwill Ġbe Ġgarbage Ġcollected ), Ġbut Ġif Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġcomponent Ġwas Ġset Ġto Ġan Ġobject Ġfetched Ġfrom Ġa Ġpool , Ġthis Ġis Ġa Ġconvenient Ġplace Ġto Ġreturn ĊĠĠĠĠĠĠĠĠ Ġ* Ġit Ġto Ġthe Ġpool . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprotected Ġopen Ġfun Ġrelease ( value : ĠT ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġ_ blocks Ġ= ĠarrayOf Null s < Array < Any ?> >( INDEX _ BLOCKS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠA Ġcomponent Ġimplementation Ġfor Ġa Ġsingle Ġscalar Ġ` int `. Ġ Ġ*/ ĊĠĠĠ Ġclass ĠIS cal ar ( world : ĠWorld ) Ġ: ĠComponent ( world ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠReturns Ġthe Ġvalue Ġof Ġthis Ġcomponent Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġget ( entityId : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ entityId Ġ% ĠBLOCK ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUpdates Ġthe Ġvalue Ġof Ġthis Ġcomponent Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġset ( entityId : ĠInt , Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ entityId Ġ% ĠBLOCK ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠAdds Ġ` dv ` Ġto Ġthe Ġvalue Ġof Ġthis Ġcomponent Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġadd ( entityId : ĠInt , Ġdv : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ entityId Ġ% ĠBLOCK ] Ġ+= Ġdv ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit ( entityId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Idx Ġ= Ġentity Id Ġ/ ĠBLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Idx Ġ>= Ġ_ blocks . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblocks Ġ= ĠarrayOf Null s < IntArray >(_ blocks . size Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Copy (_ blocks , Ġ 0 , Ġblocks , Ġ 0 , Ġ_ blocks . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks Ġ= Ġblocks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ blocks [ block Idx ] Ġ== Ġnull ) Ġ_ blocks [ block Idx ] Ġ= ĠInt Array ( BLOCK ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġ_ blocks Ġ= ĠarrayOf Null s < IntArray >( INDEX _ BLOCKS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠA Ġcomponent Ġimplementation Ġfor Ġa Ġsingle Ġscalar Ġ` float `. Ġ Ġ*/ ĊĠĠĠ Ġclass ĠF Scalar ( world : ĠWorld ) Ġ: ĠComponent ( world ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠReturns Ġthe Ġvalue Ġof Ġthis Ġcomponent Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġget ( entityId : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ entityId Ġ% ĠBLOCK ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUpdates Ġthe Ġvalue Ġof Ġthis Ġcomponent Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġset ( entityId : ĠInt , Ġvalue : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ entityId Ġ% ĠBLOCK ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠAdds Ġ` dv ` Ġto Ġthe Ġvalue Ġof Ġthis Ġcomponent Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġadd ( entityId : ĠInt , Ġdv : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ entityId Ġ% ĠBLOCK ] Ġ+= Ġdv ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit ( entityId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Idx Ġ= Ġentity Id Ġ/ ĠBLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Idx Ġ>= Ġ_ blocks . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblocks Ġ= ĠarrayOf Null s < Float Array >(_ blocks . size Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Copy (_ blocks , Ġ 0 , Ġblocks , Ġ 0 , Ġ_ blocks . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks Ġ= Ġblocks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ blocks [ block Idx ] Ġ== Ġnull ) Ġ_ blocks [ block Idx ] Ġ= ĠFloat Array ( BLOCK ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġ_ blocks Ġ= ĠarrayOf Null s < Float Array >( INDEX _ BLOCKS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠA Ġcomponent Ġimplementation Ġfor Ġa Ġpair Ġof Ġ` int ` s . Ġ Ġ*/ ĊĠĠĠ Ġclass ĠI XY ( world : ĠWorld ) Ġ: ĠComponent ( world ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠReturns Ġthe Ġx Ġcomponent Ġof Ġthe Ġpoint Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget X ( entityId : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK )] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠReturns Ġthe Ġy Ġcomponent Ġof Ġthe Ġpoint Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget Y ( entityId : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWrites Ġthe Ġx / y Ġcomponents Ġof Ġthe Ġpoint Ġfor Ġ` entityId ` Ġinto Ġ` into `. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġinto Ġfor Ġeasy Ġmethod Ġchaining . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget ( entityId : ĠInt , Ġinto : Ġe uk lid . i . Point ): Ġe uk lid . i . Point Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinto . x Ġ= Ġblock [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinto . y Ġ= Ġblock [ idx Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinto ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWrites Ġthe Ġx / y Ġcomponents Ġof Ġthe Ġpoint Ġfor Ġ` entityId ` Ġinto Ġ` into `. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġinto Ġfor Ġeasy Ġmethod Ġchaining . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget ( entityId : ĠInt , Ġinto : Ġe uk lid . i . Dimension ): Ġe uk lid . i . Dimension Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinto . width Ġ= Ġblock [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinto . height Ġ= Ġblock [ idx Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinto ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUpdates Ġthe Ġx Ġcomponent Ġof Ġthe Ġpoint Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset X ( entityId : ĠInt , Ġx : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK )] Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUpdates Ġthe Ġy Ġcomponent Ġof Ġthe Ġpoint Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset Y ( entityId : ĠInt , Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) Ġ+ Ġ 1 ] Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUpdates Ġthe Ġx / y Ġcomponents Ġof Ġthe Ġpoint Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġset ( entityId : ĠInt , Ġvalue : Ġe uk lid . i . Point ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( entityId , Ġvalue . x , Ġvalue . y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUpdates Ġthe Ġx / y Ġcomponents Ġof Ġthe Ġpoint Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset ( entityId : ĠInt , Ġx : ĠInt , Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ idx ] Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ idx Ġ+ Ġ 1 ] Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠCop ies Ġthe Ġvalue Ġof Ġ` other ` Ġfor Ġ` entityId ` Ġto Ġthis Ġcomponent . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġset ( entityId : ĠInt , Ġother : ĠI XY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Idx Ġ= Ġentity Id Ġ/ ĠBLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo block Ġ= Ġother ._ blocks [ block Idx ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ_ blocks [ block Idx ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ idx ] Ġ= Ġo block [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ idx Ġ+ Ġ 1 ] Ġ= Ġo block [ idx Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠAdds Ġ` dx ` Ġand Ġ` dy ` Ġto Ġthe Ġx Ġand Ġy Ġcomponents Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġadd ( entityId : ĠInt , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ idx ] Ġ+= Ġdx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ idx Ġ+ Ġ 1 ] Ġ+= Ġdy ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit ( entityId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Idx Ġ= Ġentity Id Ġ/ ĠBLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Idx Ġ>= Ġ_ blocks . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblocks Ġ= ĠarrayOf Null s < IntArray >(_ blocks . size Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Copy (_ blocks , Ġ 0 , Ġblocks , Ġ 0 , Ġ_ blocks . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks Ġ= Ġblocks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ blocks [ block Idx ] Ġ== Ġnull ) Ġ_ blocks [ block Idx ] Ġ= ĠInt Array ( 2 Ġ* ĠBLOCK ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġ_ blocks : ĠArray < IntArray ?> Ġ= ĠarrayOf Null s ( INDEX _ BLOCKS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠA Ġcomponent Ġimplementation Ġfor Ġa Ġpair Ġof Ġ` float ` s . Ġ Ġ*/ ĊĠĠĠ Ġclass ĠF XY ( world : ĠWorld ) Ġ: ĠComponent ( world ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠReturns Ġthe Ġx Ġcomponent Ġof Ġthe Ġpoint Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget X ( entityId : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK )] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠReturns Ġthe Ġy Ġcomponent Ġof Ġthe Ġpoint Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget Y ( entityId : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWrites Ġthe Ġx / y Ġcomponents Ġof Ġthe Ġpoint Ġfor Ġ` entityId ` Ġinto Ġ` into `. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġinto Ġfor Ġeasy Ġmethod Ġchaining . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget ( entityId : ĠInt , Ġinto : ĠPoint ): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinto . x Ġ= Ġblock [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinto . y Ġ= Ġblock [ idx Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinto ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWrites Ġthe Ġx / y Ġcomponents Ġof Ġthe Ġpoint Ġfor Ġ` entityId ` Ġinto Ġ` into `. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġinto Ġfor Ġeasy Ġmethod Ġchaining . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget ( entityId : ĠInt , Ġinto : ĠVector ): ĠVector Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinto . x Ġ= Ġblock [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinto . y Ġ= Ġblock [ idx Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinto ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWrites Ġthe Ġx / y Ġcomponents Ġof Ġthe Ġpoint Ġfor Ġ` entityId ` Ġinto Ġ` into `. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġinto Ġfor Ġeasy Ġmethod Ġchaining . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget ( entityId : ĠInt , Ġinto : ĠDimension ): ĠDimension Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinto . width Ġ= Ġblock [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinto . height Ġ= Ġblock [ idx Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinto ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUpdates Ġthe Ġx Ġcomponent Ġof Ġthe Ġpoint Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset X ( entityId : ĠInt , Ġx : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK )] Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUpdates Ġthe Ġy Ġcomponent Ġof Ġthe Ġpoint Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset Y ( entityId : ĠInt , Ġy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) Ġ+ Ġ 1 ] Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUpdates Ġthe Ġx / y Ġcomponents Ġof Ġthe Ġpoint Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġset ( entityId : ĠInt , Ġvalue : Ġe uk lid . f . XY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( entityId , Ġvalue . x , Ġvalue . y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUpdates Ġthe Ġx / y Ġcomponents Ġof Ġthe Ġpoint Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset ( entityId : ĠInt , Ġx : ĠFloat , Ġy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ idx ] Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ idx Ġ+ Ġ 1 ] Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠCop ies Ġthe Ġvalue Ġof Ġ` other ` Ġfor Ġ` entityId ` Ġto Ġthis Ġcomponent . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġset ( entityId : ĠInt , Ġother : ĠComponent . F XY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Idx Ġ= Ġentity Id Ġ/ ĠBLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo block Ġ= Ġother ._ blocks [ block Idx ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ_ blocks [ block Idx ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ idx ] Ġ= Ġo block [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ idx Ġ+ Ġ 1 ] Ġ= Ġo block [ idx Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠAdds Ġ` dx ` Ġand Ġ` dy ` Ġto Ġthe Ġx Ġand Ġy Ġcomponents Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġadd ( entityId : ĠInt , Ġdx : ĠFloat , Ġdy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġ 2 Ġ* Ġ( entityId Ġ% ĠBLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ idx ] Ġ+= Ġdx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ idx Ġ+ Ġ 1 ] Ġ+= Ġdy ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit ( entityId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Idx Ġ= Ġentity Id Ġ/ ĠBLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Idx Ġ>= Ġ_ blocks . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblocks Ġ= ĠarrayOf Null s < Float Array >(_ blocks . size Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Copy (_ blocks , Ġ 0 , Ġblocks , Ġ 0 , Ġ_ blocks . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks Ġ= Ġblocks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ blocks [ block Idx ] Ġ== Ġnull ) Ġ_ blocks [ block Idx ] Ġ= ĠFloat Array ( 2 Ġ* ĠBLOCK ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġ_ blocks Ġ= ĠarrayOf Null s < Float Array >( INDEX _ BLOCKS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠA Ġcomponent Ġimplementation Ġfor Ġa Ġsingle Ġ` int ` Ġbit Ġmask . Ġ Ġ*/ ĊĠĠĠ Ġclass ĠI Mask ( world : ĠWorld ) Ġ: ĠComponent ( world ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠReturns Ġthe Ġvalue Ġof Ġthis Ġcomponent Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġget ( entityId : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ entityId Ġ% ĠBLOCK ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUpdates Ġthe Ġentire Ġmask Ġfor Ġ` entityId `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġset ( entityId : ĠInt , Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ entityId Ġ% ĠBLOCK ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠSets Ġthe Ġmask Ġfor Ġ` entityId ` Ġto Ġ` current Ġ& Ġmask `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset And ( entityId : ĠInt , Ġmask : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ entityId Ġ% ĠBLOCK ] Ġ= Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ entityId Ġ% ĠBLOCK ] Ġand Ġmask ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠSets Ġthe Ġmask Ġfor Ġ` entityId ` Ġto Ġ` current Ġ| Ġmask `. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset Or ( entityId : ĠInt , Ġmask : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ entityId Ġ% ĠBLOCK ] Ġ= Ġ_ blocks [ entityId Ġ/ ĠBLOCK ] ! ![ entityId Ġ% ĠBLOCK ] Ġor Ġmask ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠReturns Ġwhether Ġ` flag ` Ġis Ġset Ġin Ġthis Ġmask . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġflag Ġan Ġinteger Ġwith Ġthe Ġappropriate Ġflag Ġbit Ġset . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠisSet ( entityId : ĠInt , Ġflag : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget ( entityId ) Ġand Ġflag Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠSets Ġ` flag ` Ġin Ġthe Ġmask Ġfor Ġ` entityId `. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġflag Ġan Ġinteger Ġwith Ġthe Ġappropriate Ġflag Ġbit Ġset . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset Flag ( entityId : ĠInt , Ġflag : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Or ( entityId , Ġflag ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠClear s Ġ` flag ` Ġfrom Ġthe Ġmask Ġfor Ġ` entityId `. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġflag Ġan Ġinteger Ġwith Ġthe Ġappropriate Ġflag Ġbit Ġset . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġclear Flag ( entityId : ĠInt , Ġflag : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset And ( entityId , Ġflag . inv ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit ( entityId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Idx Ġ= Ġentity Id Ġ/ ĠBLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Idx Ġ>= Ġ_ blocks . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblocks Ġ= ĠarrayOf Null s < IntArray >(_ blocks . size Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Copy (_ blocks , Ġ 0 , Ġblocks , Ġ 0 , Ġ_ blocks . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ blocks Ġ= Ġblocks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ blocks [ block Idx ] Ġ== Ġnull ) Ġ_ blocks [ block Idx ] Ġ= ĠInt Array ( BLOCK ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġ_ blocks Ġ= ĠarrayOf Null s < IntArray >( INDEX _ BLOCKS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThis Ġcomponent 's Ġunique Ġid Ġ( used Ġin Ġbit Ġmasks ). Ġ Ġ*/ ĊĠĠĠ Ġinternal Ġval Ġid : ĠInt Ġ= Ġworld . register ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis :: class . simple Name Ġ+ Ġ"#" Ġ+ Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠEns ures Ġthat Ġspace Ġis Ġallocated Ġfor Ġthe Ġcomponent Ġfor Ġgiven Ġ[ entityId ], Ġwhich Ġis Ġjust Ġindex . Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġinit ( entityId : ĠInt ) ĊĊĠĠĠ Ġ/** ĠClear s Ġthe Ġvalue Ġof Ġthe Ġcomponent Ġfor Ġgiven Ġ[ entityId ]. Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġclear ( entityId : ĠInt ) Ġ{} Ġ// Ġnoop Ġby Ġdefault ĊĊĠĠĠ Ġinternal Ġfun Ġadd ( entity : ĠEntity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġentity . comp s . set ( id ) ĊĠĠĠĠĠĠĠ Ġinit ( entity . id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġremove ( entity : ĠEntity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġentity . comp s . clear ( id ) ĊĠĠĠĠĠĠĠ Ġclear ( entity . id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġnumber Ġof Ġcomponents Ġin Ġa Ġsingle Ġblock . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprotected Ġval ĠBLOCK Ġ= Ġ 2 5 6 ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġnumber Ġof Ġindex Ġblocks Ġto Ġallocate Ġby Ġdefault . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprotected Ġval ĠINDEX _ BLOCKS Ġ= Ġ 3 2 ĊĠĠĠ Ġ} Ċ } Ċ