package Ġio . github . to mpl um . a oc . air craft . energy Ċ Ċ import Ġio . github . to mpl um . libs . logging . Ad vent Logger Ċ import Ġio . github . to mpl um . libs . math . map . Ad vent Map 3 D Ċ import Ġio . github . to mpl um . libs . math . point . Point Ċ import Ġio . github . to mpl um . libs . math . point . Point 3 D Ċ Ċ /** Ċ Ġ* ĠA Ġ 3 - Dimension al Ġimplementation Ġof Ġa Ġ[ P ocket Dimension ]. Ċ Ġ*/ Ċ class ĠP ocket Dimension 3 D ( initialState : ĠList < String >) Ġ: ĠAd vent Map 3 D < Con way Cube >(), ĠP ocket Dimension Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ ĠinitialState . forEach Ġ{ Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . forEach Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Tile ( Point 3 D ( x , Ġy , Ġ 0 ), ĠCon way Cube ( state )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( initialState . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAd vent Logger . info (" Initial ĠState :\ n {}", Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermines Ġwhich Ġc ubes Ġwill Ġbecome Ġactive Ġin Ġthe Ġnext Ġtime - cycle . ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġlist Ġof Ġall Ġthe Ġpositions Ġof Ġthe Ġto - be - active Ġc ubes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠgetNext Active C ubes (): ĠList < Point 3 D > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrently Inactive Ġ= Ġfilter Tiles Ġ{ Ġcube Ġ-> Ġcube . isIn Active () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrently Inactive . keys . filter Ġ{ Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadjacent Ġ= Ġfilter Points ( pos . adjacent (). toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadjacent . count Ġ{ Ġ(_, Ġcube ) Ġ-> Ġcube . isActive () Ġ} Ġ== Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermines Ġwhich Ġc ubes Ġwill Ġbecome Ġin - active Ġin Ġthe Ġnext Ġtime - cycle . ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġlist Ġof Ġall Ġthe Ġpositions Ġof Ġthe Ġto - be - active Ġc ubes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠgetNext In Active C ubes (): ĠList < Point 3 D > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrently Active Ġ= Ġfilter Tiles Ġ{ Ġcube Ġ-> Ġcube . isActive () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrently Active . keys . filter Ġ{ Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadjacent Ġ= Ġfilter Points ( pos . adjacent (). toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactive Neighbors Ġ= Ġadjacent . count Ġ{ Ġ(_, Ġcube ) Ġ-> Ġcube . isActive () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactive Neighbors Ġ!= Ġ 2 Ġ&& Ġactive Neighbors Ġ!= Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠActiv ates Ġall Ġthe Ġc ubes Ġat Ġthe Ġgiven Ġ[ positions ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġpositions ĠA Ġlist Ġof Ġin - active Ġpositions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġactivate ( positions : ĠList < Point >) Ġ{ ĊĠĠĠĠĠĠĠ Ġpositions . forEach Ġ{ Ġpos Ġ-> Ġadd Tile ( pos Ġas ĠPoint 3 D , ĠCon way Cube . active ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDe - activ ates Ġall Ġthe Ġc ubes Ġat Ġthe Ġgiven Ġ[ positions ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġpositions ĠA Ġlist Ġof Ġactive Ġpositions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġdeactivate ( positions : ĠList < Point >) Ġ{ ĊĠĠĠĠĠĠĠ Ġpositions . forEach Ġ{ Ġpos Ġ-> Ġadd Tile ( pos Ġas ĠPoint 3 D , ĠCon way Cube . inactive ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġsnapshot Ġof Ġthe Ġcurrent Ġstate Ġof Ġthe Ġdimension . ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġcopy Ġof Ġthe Ġcurrent Ġdimensional Ġstate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Snapshot (): ĠP ocket Dimension 3 D Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsnapshot Ġ= ĠP ocket Dimension 3 D ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġsnapshot . overwrite Data ( getData Map (). to Mutable Map ()) ĊĠĠĠĠĠĠĠ Ġsnapshot . add New Sur rounding Cells () ĊĠĠĠĠĠĠĠ Ġreturn Ġsnapshot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġall Ġthe Ġc ubes Ġthat Ġare Ġcurrently Ġin Ġan Ġactive Ġstate . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġsum Ġof Ġall Ġactive Ġc ubes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Active Cube Quantity (): ĠInt Ġ= Ġfilter Tiles Ġ{ Ġcube Ġ-> Ġcube . isActive () Ġ}. count () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġa Ġnew Ġlayer Ġof Ġin - active Ġcells Ġaround Ġthe Ġcurrent Ġper imeter . ĊĠĠĠĠ Ġ* ĠThis Ġcauses Ġthe Ġdimension Ġto Ġexpand Ġevery Ġtime Ġcycle . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd New Sur rounding Cells () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Max Ġ= Ġx Max () !! ĊĠĠĠĠĠĠĠ Ġval Ġx Min Ġ= Ġx Min () !! ĊĠĠĠĠĠĠĠ Ġval Ġy Max Ġ= Ġy Max () !! ĊĠĠĠĠĠĠĠ Ġval Ġy Min Ġ= Ġy Min () !! ĊĠĠĠĠĠĠĠ Ġval Ġz Min Ġ= Ġz Min () !! ĊĠĠĠĠĠĠĠ Ġval Ġz Max Ġ= Ġz Max () !! ĊĊĠĠĠĠĠĠĠ Ġval Ġinactive Cube Ġ= ĠCon way Cube . inactive () ĊĊĠĠĠĠĠĠĠ Ġ( y Min Ġ- Ġ 1 .. y Max Ġ+ Ġ 1 ). forEach Ġ{ Ġy Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( z Min .. z Max ). forEach Ġ{ Ġz Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Add Ġleft Ġand Ġright Ġcolumn Ġfor Ġall Ġexisting Ġz - planes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Tile ( Point 3 D ( x Min Ġ- Ġ 1 , Ġy , Ġz ), Ġinactive Cube ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Tile ( Point 3 D ( x Max Ġ+ Ġ 1 , Ġy , Ġz ), Ġinactive Cube ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Add Ġentire Ġnew Ġz - layer Ġthat Ġis Ġ 1 Ġcell Ġw ider Ġin Ġeach Ġdirection Ġabove Ġand Ġbelow Ġthe Ġtop Ġand Ġbottom Ġlayers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( x Min Ġ- Ġ 1 .. x Max Ġ+ Ġ 1 ). forEach Ġ{ Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Tile ( Point 3 D ( x , Ġy , Ġz Min Ġ- Ġ 1 ), Ġinactive Cube ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Tile ( Point 3 D ( x , Ġy , Ġz Max Ġ+ Ġ 1 ), Ġinactive Cube ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ( x Min .. x Max ). forEach Ġ{ Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( z Min .. z Max ). forEach Ġ{ Ġz Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Tile ( Point 3 D ( x , Ġy Min Ġ- Ġ 1 , Ġz ), Ġinactive Cube ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Tile ( Point 3 D ( x , Ġy Max Ġ+ Ġ 1 , Ġz ), Ġinactive Cube ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }