package Ġorg . mon sim . impl . play Ċ Ċ import Ġorg . mon sim . api . play . House Builder Ċ import Ġorg . mon sim . impl . util . Game Util Impl Ċ import Ġorg . mon sim . impl . util . Mon op oly Util Impl Ċ import Ġorg . mon sim . impl . util . Pr icer Impl Ċ Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . mon sim . bean . Bill Ċ import Ġorg . mon sim . bean . domain . Game Ċ import Ġorg . mon sim . bean . domain . Player Ċ import Ġorg . mon sim . bean . domain . Property Ċ import Ġorg . mon sim . bean . type . Group Type Ċ import Ġorg . mon sim . impl . accounting . Cash Ac counter Impl Ċ import Ġorg . mon sim . impl . accounting . House Ac counter Impl Ċ import Ġjava . lang . RuntimeException Ċ Ċ class ĠHouse Builder Impl Ġ: ĠHouse Builder Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġhouse Transfer er Ġ= ĠHouse Ac counter Impl () ĊĠĠĠ Ġprivate Ġval Ġmon op oly Util Ġ= ĠMon op oly Util Impl () ĊĠĠĠ Ġprivate Ġval Ġgame Util Ġ= ĠGame Util Impl () ĊĠĠĠ Ġprivate Ġval Ġpr icer Ġ= ĠP ric er Impl () ĊĠĠĠ Ġprivate Ġval Ġcash Transfer er Ġ= ĠCash Ac counter Impl () ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} ĊĠĠĠ Ġprivate Ġval ĠB ANK : ĠPlayer ? Ġ= Ġnull ĊĊĊĠĠĠ Ġdata Ġclass ĠTransaction ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty : ĠProperty , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Adding : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġowner : ĠPlayer ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuy er : ĠPlayer ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsell er : ĠPlayer ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprice : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġverb : ĠString ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġtransaction ( property : ĠProperty , Ġis Adding : ĠBoolean , Ġgame : ĠGame ): ĠTransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġgame Util . player For Id ( property . owner Id , Ġgame ) ĊĠĠĠĠĠĠĠ Ġval Ġis Develop able Ġ= Ġgame Util . group For Property ( property , Ġgame ). group Type Ġ== ĠGroup Type . DE VELO P ABLE ĊĠĠĠĠĠĠĠ Ġval Ġprice Ġ= Ġif Ġ(! is Develop able ) Ġ- 1 Ġelse Ġif Ġ( is Adding ) Ġpr icer . house Buy ( property , Ġgame ) Ġelse Ġpr icer . house Sell ( property , Ġgame ) ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= ĠTransaction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Adding Ġ= Ġis Adding , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Ġ= Ġproperty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverb Ġ= Ġif Ġ( is Adding ) Ġ" add " Ġelse Ġ" remove ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprice Ġ= Ġprice , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner Ġ= Ġowner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuy er Ġ= Ġif Ġ( is Adding ) Ġowner Ġelse ĠB ANK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsell er Ġ= Ġif Ġ( is Adding ) ĠB ANK Ġelse Ġowner ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtransaction ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġchange House ( property : ĠProperty , Ġis Adding : ĠBoolean , Ġgame : ĠGame ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġtransaction ( property , Ġis Adding , Ġgame ) ĊĠĠĠĠĠĠĠ Ġval Ġverb Ġ= Ġtransaction . verb ĊĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ"${ verb } Ġhouse Ġon Ġproperty Id # ${ property . id }" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġreason Why Illegal Ġ= Ġreason Why Change House Illegal ( transaction , Ġgame ) ĊĠĠĠĠĠĠĠ Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreason Why Illegal Ġ!= Ġnull Ġ-> Ġthrow ĠRuntimeException (" Can 't Ġ${ verb } Ġhouse Ġon Ġproperty # ${ property . id }: Ġ$ reason Why Illegal ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġde bt Ġ= ĠBill ( de bt or Ġ= Ġtransaction . buyer , Ġcred itor Ġ= Ġtransaction . seller , Ġtransaction . price ) ĊĠĠĠĠĠĠĠ Ġhouse Transfer er . transfer House ( property , Ġis Adding , Ġgame ) ĊĠĠĠĠĠĠĠ Ġcash Transfer er . apply Bill ( de bt , Ġgame ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Change House Legal ( property : ĠProperty , Ġis Adding : ĠBoolean , Ġgame : ĠGame ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġtransaction ( property , Ġis Adding , Ġgame ) ĊĠĠĠĠĠĠĠ Ġreturn Ġreason Why Change House Illegal ( transaction , Ġgame ) Ġ== Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreason Why Change House Illegal ( transaction : ĠTransaction , Ġgame : ĠGame ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġtransaction . property ĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġtransaction . owner ĊĠĠĠĠĠĠĠ Ġval Ġsub Error Ġ= Ġhouse Transfer er . transfer House Error ( transaction . property , Ġtransaction . is Adding , Ġgame ) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Error Ġ!= Ġnull Ġ-> Ġsub Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . is Adding Ġ&& Ġ( transaction . price Ġ> Ġowner !!. cash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ" Player # ${ owner !!. id } Ġdoesn 't Ġhave Ġenough Ġcash Ġto Ġadd Ġhouse Ġfor Ġproperty # ${ property . id }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġerror ĊĠĠĠ Ġ} Ċ }