package Ġmath Ċ Ċ import Ġbeat wall s . log Error Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . random . Random Ċ Ċ data Ġclass ĠC ub oid Constr ains ( val Ġp 0 : ĠVec 3 , Ġval Ġp 1 : ĠVec 3 , Ġvar Ġr : ĠRandom ) Ġ{ ĊĠĠĠ Ġ// ĠThe Ġplayer Ġspace ĊĠĠĠ Ġprivate Ġval Ġred P 0 Ġ= ĠVec 3 (- 2 , 0 , 0 ) ĊĠĠĠ Ġprivate Ġval Ġred P 1 Ġ= ĠVec 3 ( 2 , 3 , 0 ) ĊĊĠĠĠ Ġval Ġx Min Blue Ġ= Ġmin Of ( p 0 . x , Ġp 1 . x ) ĊĠĠĠ Ġval Ġx Min Red Ġ= Ġmin Of ( red P 0 . x , Ġred P 1 . x ) ĊĠĠĠ Ġval Ġx Max Blue Ġ= Ġmax Of ( p 0 . x , Ġp 1 . x ) ĊĠĠĠ Ġval Ġx Max Red Ġ= Ġmax Of ( red P 0 . x , Ġred P 1 . x ) ĊĊĠĠĠ Ġval Ġy Min Blue Ġ= Ġmin Of ( p 0 . y , Ġp 1 . y ) ĊĠĠĠ Ġval Ġy Min Red Ġ= Ġmin Of ( red P 0 . y , Ġred P 0 . y ) ĊĠĠĠ Ġval Ġy Max Blue Ġ= Ġmax Of ( p 0 . y , Ġp 1 . y ) ĊĠĠĠ Ġval Ġy Max Red Ġ= Ġmax Of ( red P 0 . y , Ġred P 1 . y ) ĊĊĠĠĠ Ġfun Ġrandom Vec 3 ( avoid Center : ĠBoolean , Ġz : ĠDouble ): ĠVec 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvec 2 Ġ= Ġrandom ( avoid Center ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvec 2 . to Vec 3 ( z ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Could Ġnot Ġretrieve Ġa Ġrandom ĠVec 3 , Ġcontinuing Ġwith ĠVec 3 ( 0 , 0 , 0 )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Please Ġcheck Ġif Ġyour ĠC ub oid Ġis Ġt all Ġenough Ġand Ġconsider Ġturning Ġoff Ġavoid Center ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( e . message . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVec 3 () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrandom ( avoid Center : ĠBoolean ): ĠVec 2 Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmin Add Ġ= Ġ 0 . 0 0 0 0 1 ĊĠĠĠĠĠĠĠ Ġif Ġ(! avoid Center Ġ|| Ġx Min Blue Ġ>= Ġx Max Red Ġ|| Ġy Min Blue Ġ>= Ġy Max Red Ġ|| Ġx Max Blue Ġ<= Ġx Min Red Ġ|| Ġy Max Blue Ġ<= Ġy Min Red ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVec 2 ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr . next Double ( x Min Blue , Ġx Max Blue Ġ+ Ġmin Add ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr . next Double ( y Min Blue , Ġy Max Blue Ġ+ Ġmin Add ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġif ( r . next Double ( 1 . 0 ) Ġ< Ġget Ratio ( x Min Blue - x Min Red , Ġx Max Red - x Max Blue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr . next Double ( x Min Blue , Ġx Min Red Ġ+ Ġmin Add ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr . next Double ( x Max Red , Ġx Max Blue Ġ+ Ġmin Add ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġif ( r . next Double ( 1 . 0 ) Ġ< Ġget Ratio ( y Min Blue - y Min Red , Ġy Max Red - y Max Blue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr . next Double ( y Min Blue , Ġy Min Red Ġ+ Ġmin Add ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr . next Double ( y Max Red , Ġy Max Blue Ġ+ Ġmin Add ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVec 2 ( x , y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġget Ratio ( d 1 : ĠDouble , Ġd 2 : ĠDouble ) Ġ= ĊĠĠĠĠĠĠĠ Ġabs ( d 1 /( d 1 + d 2 )) Ġ// Ġabs Ġrequired Ġfor Ġ- Ġinfinity Ċ }