package Ġcom . l ro z ans ki . generator . d ungeon . map . data Ċ Ċ import Ġcom . l ro z ans ki . generator . d ungeon . Cell Type Ċ import Ġcom . l ro z ans ki . generator . d ungeon . map . cor rid or . Direction Ċ Ċ data Ġclass ĠConnector ( val Ġposition : ĠPosition , Ġval Ġdirection : ĠDirection ) Ġ{ ĊĠĠĠ Ġvar Ġunused : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġforward ( amount : ĠInt ) Ġ= Ġposition Ġ+ Ġdirection . position Ġ* Ġamount Ċ } Ċ Ċ class ĠRoom ( val Ġrect : ĠGrid Rect < Cell >, Ġprivate Ġval Ġmax Connectors : ĠInt Ġ= Ġ 5 ) Ġ{ ĊĊĠĠĠ Ġvar Ġconnector s : ĠMutable List < Connector > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġfun Ġremaining Connectors () Ġ= Ġmax Connectors Ġ- Ġconnector s . size ĊĊĠĠĠ Ġfun Ġadd Connector ( connector : ĠConnector ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconnector s . add ( connector ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclean Up Connectors () Ġ= Ġconnector s . removeAll Ġ{ Ġit . unused Ġ} ĊĊĠĠĠ Ġfun Ġplace Floor () Ġ= ĠforEach Cell Ġ{ ĊĠĠĠĠĠĠĠ Ġrect . grid [ it . x , Ġit . y ] Ġ= ĠCell ( it . x , Ġit . y , ĠCell Type . FLO OR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplace W alls () Ġ= ĠforEach Cell Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġit . x ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġit . y ĊĊĠĠĠĠĠĠĠ Ġif Ġ(( x Ġ== Ġrect . x Min Ġ|| Ġx Ġ== Ġrect . x Max ) Ġ|| Ġ( y Ġ== Ġrect . y Min Ġ|| Ġy Ġ== Ġrect . y Max )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . grid [ it . x , Ġit . y ] Ġ= ĠCell ( it . x , Ġit . y , ĠCell Type . WALL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplace Connectors () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpositions Ġ= Ġmutable ListOf < Position >() ĊĠĠĠĠĠĠĠ Ġvar Ġtries Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġremaining Connectors () Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġposition : ĠPosition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġrandom Point On Edge () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( positions . any Ġ{ Ġit . is Adjacent ( position ) Ġ} Ġ&& Ġtries ++ < 1 0 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositions Ġ+= Ġposition ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconnector s . addAll ( positions . map Ġ{ ĠConnector ( it , Ġfind Direction ( it )) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Direction ( position : ĠPosition ): ĠDirection Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition . y Ġ== Ġrect . y Min Ġ-> ĠDirection . UP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition . x Ġ== Ġrect . x Max Ġ-> ĠDirection . RIGHT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition . y Ġ== Ġrect . y Max Ġ-> ĠDirection . DOWN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition . x Ġ== Ġrect . x Min Ġ-> ĠDirection . LEFT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠDirection . UP ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplace Do ors () Ġ= Ġconnector s . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġrect . grid [ it . position ] Ġ= ĠCell ( it . position , ĠCell Type . DO OR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠforEach Cell ( action : Ġ( cell : ĠCell ) Ġ-> ĠUnit ) Ġ= Ġrect . grid . forEach Cell ( rect ) Ġ{ Ġaction ( it ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrandom Point On Edge (): ĠPosition Ġ= Ġedge ( Direction . values (). random ()). random () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġall Ġpositions Ġon Ġan Ġedge , Ġwithout Ġcorners . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġedge ( direction : ĠDirection ): ĠList < Position > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . UP Ġ-> Ġ( rect . x Min Ġ+ Ġ 1 Ġuntil Ġrect . x Max Ġ- Ġ 1 ). map Ġ{ ĠPosition ( it , Ġrect . y Min ) Ġ}. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . RIGHT Ġ-> Ġ( rect . y Min Ġ+ Ġ 1 Ġuntil Ġrect . y Max Ġ- Ġ 1 ). map Ġ{ ĠPosition ( rect . x Max , Ġit ) Ġ}. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . DOWN Ġ-> Ġ( rect . x Min Ġ+ Ġ 1 Ġuntil Ġrect . x Max Ġ- Ġ 1 ). map Ġ{ ĠPosition ( it , Ġrect . y Max ) Ġ}. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . LEFT Ġ-> Ġ( rect . y Min Ġ+ Ġ 1 Ġuntil Ġrect . y Max Ġ- Ġ 1 ). map Ġ{ ĠPosition ( rect . x Min , Ġit ) Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ