package Ġcom . contracts And States . states Ċ Ċ import Ġcom . r 3 . cord a . lib . tokens . contracts . types . TokenType Ċ import Ġnet . cord a . core . contracts . Amount Ċ import Ġnet . cord a . core . serialization . Constructor For Deserialization Ċ import Ġnet . cord a . core . serialization . C ord a Serializable Ċ Ċ @ C ord a Serializable Ċ data Ġclass ĠPl aced Ports Ġ@ Constructor For Deserialization Ġconstructor ( val Ġvalue : ĠList < Port >) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( value . size Ġ== ĠPORT _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" value . size Ġcannot Ġbe Ġ${ value . size }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPORT _ COUNT Ġ= Ġ 9 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Port At ( hex Tile : ĠHex Tile Index , Ġtile Corner : ĠTile Corner Index ) Ġ= Ġvalue . single Ġ{ ĊĠĠĠĠĠĠĠ Ġit . access Points . any Ġ{ Ġaccess Point Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Point . hex Tile Index Ġ== Ġhex Tile Ġ&& Ġaccess Point . hex Tile Coordinate . contains ( tile Corner ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Builder () Ġ= ĠBuilder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . map Ġ{ Ġit . port Tile Ġ}. to Mutable List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . map Ġ{ Ġit . access Points . to Mutable List () Ġ}. to Mutable List ()) ĊĊĠĠĠ Ġclass ĠBuilder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġport Tiles : ĠMutable List < Port Tile > Ġ= Ġmutable ListOf (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccess Points List : ĠMutable List < Mutable List < Access Point >> Ġ= Ġmutable ListOf ()) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcreate All Ports () Ġ= ĠBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Port Tile ( listOf ( She ep ). map Of ( 2 ), Ġall Resources . minus ( She ep ). map Of ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Port Tile ( listOf ( W ood ). map Of ( 2 ), Ġall Resources . minus ( W ood ). map Of ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Port Tile ( listOf ( Brick ). map Of ( 2 ), Ġall Resources . minus ( Brick ). map Of ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Port Tile ( listOf ( O re ). map Of ( 2 ), Ġall Resources . minus ( O re ). map Of ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Port Tile ( listOf ( W heat ). map Of ( 2 ), Ġall Resources . minus ( W heat ). map Of ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Port Tile ( all Resources . map Of ( 3 ), Ġall Resources . map Of ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Port Tile ( all Resources . map Of ( 3 ), Ġall Resources . map Of ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Port Tile ( all Resources . map Of ( 3 ), Ġall Resources . map Of ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Port Tile ( all Resources . map Of ( 3 ), Ġall Resources . map Of ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( listOf ( Access Point ( 0 , ĠlistOf ( 5 , Ġ 1 )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( listOf ( Access Point ( 1 , ĠlistOf ( 0 , Ġ 2 )), ĠAccess Point ( 2 , ĠlistOf ( 5 )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( listOf ( Access Point ( 2 , ĠlistOf ( 2 )), ĠAccess Point ( 6 , ĠlistOf ( 0 , Ġ 1 )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( listOf ( Access Point ( 1 1 , ĠlistOf ( 1 , Ġ 2 )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( listOf ( Access Point ( 1 5 , ĠlistOf ( 2 , Ġ 3 )), ĠAccess Point ( 1 8 , ĠlistOf ( 1 )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( listOf ( Access Point ( 1 8 , ĠlistOf ( 4 )), ĠAccess Point ( 1 7 , ĠlistOf ( 2 , Ġ 3 )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( listOf ( Access Point ( 1 6 , ĠlistOf ( 3 , Ġ 4 )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( listOf ( Access Point ( 1 2 , ĠlistOf ( 4 , Ġ 5 )), ĠAccess Point ( 7 , ĠlistOf ( 3 )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( listOf ( Access Point ( 3 , ĠlistOf ( 4 , Ġ 5 )), ĠAccess Point ( 7 , ĠlistOf ( 0 )))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd ( port Tile : ĠPort Tile ) Ġ= Ġapply Ġ{ Ġport Tiles . add ( port Tile ) Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġadd ( access Points : ĠList < Access Point >) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( access Points . isNotEmpty ()) Ġ{ Ġ" access Points Ġmust Ġnot Ġbe Ġempty " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Points List . add ( access Points . to Mutable List ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠPl aced Ports Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( port Tiles . size Ġ== Ġaccess Points List . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ports Ġand Ġaccess Points List Ġmust Ġhave Ġthe Ġsame Ġsize " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPl aced Ports ( port Tiles . map Indexed Ġ{ Ġindex , Ġport Tile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPort ( port Tile , Ġaccess Points List [ index ]. to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ C ord a Serializable Ċ data Ġclass ĠPort Ġ@ Constructor For Deserialization Ġconstructor ( val Ġport Tile : ĠPort Tile , Ġval Ġaccess Points : ĠList < Access Point >) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( access Points . isNotEmpty ()) Ġ{ Ġ" access Points Ġmust Ġnot Ġbe Ġempty " Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠPort s Ġin ĠSet tl ers Ġof ĠC ordan Ġenable Ġusers Ġto Ġexchange Ġresources Ġat Ġmore Ġfavour able Ġrates Ġthan Ġthose Ġavailable Ġto Ċ Ġ* Ġplayers Ġgenerally . Ċ Ġ* ĠTo Ġaccess Ġa Ġport , Ġa Ġplayer Ġmust Ġhave Ġpreviously Ġbuilt Ġa Ġset tlement Ġon Ġa Ġhex Ġtile Ġwith Ġan Ġadjacent Ġport . Ċ Ġ* ĠThe Ġset tlement Ġmust Ġalso Ġbe Ġbuilt Ġon Ġone Ġof Ġthe Ġdesign ated Ġaccess Ġpoint Ġspecified Ġbelow . Ċ Ġ*/ Ċ @ C ord a Serializable Ċ data Ġclass ĠPort Tile ( val Ġinput Required : ĠList < Amount < TokenType >>, Ġval Ġoutput Required : ĠList < Amount < TokenType >>) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( input Required . isNotEmpty ()) Ġ{ Ġ" input Required Ġmust Ġnot Ġbe Ġempty " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( output Required . isNotEmpty ()) Ġ{ Ġ" output Required Ġmust Ġnot Ġbe Ġempty " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput Types Ġ= Ġinput Required . map Ġ{ Ġit . token Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( input Types . size Ġ== Ġinput Types . toSet (). size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġshould Ġbe Ġno Ġduplicates Ġin Ġthe Ġinput Required Ġlist " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( input Required . none Ġ{ Ġit . quantity Ġ== Ġ 0 L Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġinput Required Ġshould Ġhave Ġa Ġ 0 Ġquantity " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutput Types Ġ= Ġoutput Required . map Ġ{ Ġit . token Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( output Types . size Ġ== Ġoutput Types . toSet (). size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġshould Ġbe Ġno Ġduplicates Ġin Ġthe Ġoutput Required Ġlist " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( output Required . none Ġ{ Ġit . quantity Ġ== Ġ 0 L Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġoutput Required Ġshould Ġhave Ġa Ġ 0 Ġquantity " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Input Of ( token : ĠTokenType ) Ġ= Ġinput Required . single Ġ{ Ġit . token Ġ== Ġtoken Ġ} ĊĠĠĠ Ġfun Ġget Output Of ( token : ĠTokenType ) Ġ= Ġoutput Required . single Ġ{ Ġit . token Ġ== Ġtoken Ġ} Ċ } Ċ Ċ @ C ord a Serializable Ċ data Ġclass ĠAccess Point Ġ@ Constructor For Deserialization Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġhex Tile Index : ĠHex Tile Index , ĊĠĠĠĠĠĠĠ Ġval Ġhex Tile Coordinate : ĠList < Tile Corner Index >) Ġ{ ĊĊĠĠĠ Ġconstructor ( hex Tile Index : ĠInt , Ġhex Tile Coordinate : ĠList < Int >) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHex Tile Index ( hex Tile Index ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhex Tile Coordinate . map Ġ{ ĠTile Corner Index ( it ) Ġ}) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( hex Tile Coordinate . isNotEmpty ()) Ġ{ Ġ" hex Tile Coordinate Ġmust Ġnot Ġbe Ġempty " Ġ} ĊĠĠĠ Ġ} Ċ } Ċ