package Ġrs . d us k . engine . map . chunk Ċ Ċ import Ġorg . k oin . dsl . module Ċ import Ġrs . d us k . engine . entity . Registered Ċ import Ġrs . d us k . engine . entity . Un registered Ċ import Ġrs . d us k . engine . entity . obj . Objects Ċ import Ġrs . d us k . engine . event . EventBus Ċ import Ġrs . d us k . engine . map . area . area Ċ import Ġrs . d us k . engine . map . region . Region Plane Ċ import Ġrs . d us k . engine . map . region . Region Reader Ċ Ċ class ĠDynamic Chunks ( private Ġval Ġbus : ĠEvent Bus , Ġprivate Ġval Ġobjects : ĠObjects , Ġprivate Ġval Ġreader : ĠRegion Reader ) Ġ{ ĊĠĠĠ Ġval Ġchunks : ĠMutable Map < Int , ĠInt > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġsource ĠThe Ġchunk Ġto Ġbe Ġcopied ĊĠĠĠĠ Ġ* Ġ@ param Ġtarget ĠThe Ġchunk Ġthings Ġwill Ġbe Ġcopied Ġto ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset ( source : ĠChunk , Ġtarget : ĠChunk , Ġrotation : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchunks [ source . id ] Ġ= Ġtarget . rot ated Id ( rotation ) ĊĠĠĠĠĠĠĠ Ġval Ġsource Objs Ġ= Ġobjects . get Static ( source )// ĠJust Ġin - case Ġsource Ġis Ġtarget ĊĠĠĠĠĠĠĠ Ġ// ĠClear Ġtarget ĊĠĠĠĠĠĠĠ Ġclear Objects ( target ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSpawn Ġobjs Ġfrom Ġsource Ġin Ġtarget ĊĠĠĠĠĠĠĠ Ġsource Objs ?. forEach Ġ{ ĠgameObject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Ġ= ĠgameObject . tile . minus ( gameObject . tile . chunk . tile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠgameObject . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotated X Ġ= ĠrotateX ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgameObject . rotation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotated Y Ġ= ĠrotateY ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgameObject . rotation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtile Ġ= Ġtarget . tile . add ( rot ated X , Ġrotated Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotated Object Ġ= ĠgameObject . copy ( tile Ġ= Ġtile , Ġrotation Ġ= ĠgameObject . rotation Ġ+ Ġrotation Ġand Ġ 0 x 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjects . add ( rot ated Object ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbus . emit ( Registered ( rot ated Object )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbus . emit ( Reload Chunk ( source )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove ( chunk : ĠChunk ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchunks . remove ( chunk . id ) ĊĠĠĠĠĠĠĠ Ġval Ġregion Ġ= Ġchunk . region ĊĠĠĠĠĠĠĠ Ġif ( is Region Cle ared ( chunk . region Plane )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . loading . remove ( region ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclear Objects ( chunk ) ĊĠĠĠĠĠĠĠ Ġbus . emit ( Reload Chunk ( chunk )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Region Cle ared ( region : ĠRegion Plane ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor ( region Chunk Ġin Ġregion . chunk . area ( width Ġ= Ġ 8 , Ġheight Ġ= Ġ 8 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chunks . containsKey ( region Chunk . id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Objects ( chunk Plane : ĠChunk ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobjects . get Static ( chunk Plane )?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbus . emit ( Un registered ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġobjects . clear ( chunk Plane ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun ĠChunk . dynamic Id () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Chunk Position ( x , Ġy , Ġplane ) ĊĊĠĠĠĠĠĠĠ Ġfun ĠChunk . rot ated Id ( rotation : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Rot ated Chunk Position ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplane , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġto Chunk Position ( chunk X : ĠInt , Ġchunk Y : ĠInt , Ġplane : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchunk Y Ġ+ Ġ( chunk X Ġshl Ġ 1 4 ) Ġ+ Ġ( plane Ġshl Ġ 2 8 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġto Rot ated Chunk Position ( chunk X : ĠInt , Ġchunk Y : ĠInt , Ġplane : ĠInt , Ġrotation : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrotation Ġshl Ġ 1 Ġor Ġ( plane Ġshl Ġ 2 4 ) Ġor Ġ( chunk X Ġshl Ġ 1 4 ) Ġor Ġ( chunk Y Ġshl Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠrotateX ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj X : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj Y : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize X : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Y : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj Rotation : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Rotation : ĠInt ĊĠĠĠĠĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġsize X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġsize Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= Ġchunk Rotation Ġand Ġ 0 x 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( obj Rotation Ġand Ġ 0 x 1 Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġtemp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rotation Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobj X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rotation Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobj Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( rotation Ġ== Ġ 2 ) Ġ 7 Ġ- Ġobj X Ġ- Ġx Ġ+ Ġ 1 Ġelse Ġ 7 Ġ- Ġobj Y Ġ- Ġy Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠrotateY ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj X : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj Y : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize X : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Y : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj Rotation : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Rotation : ĠInt ĊĠĠĠĠĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= Ġchunk Rotation Ġand Ġ 0 x 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġsize Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġsize X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( obj Rotation Ġand Ġ 0 x 1 Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġtemp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rotation Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobj Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rotation Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 7 Ġ- Ġobj X Ġ- Ġy Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( rotation Ġ== Ġ 2 ) Ġ 7 Ġ- Ġobj Y Ġ- Ġx Ġ+ Ġ 1 Ġelse Ġobj X ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ val Ġinstance Module Ġ= Ġmodule Ġ{ ĊĠĠĠ Ġsingle Ġ{ ĠDynamic Chunks ( get (), Ġget (), Ġget ()) Ġ} Ċ }