package Ġcom . b sel zer . gw 2 . v 2 . tile . model . response Ċ Ċ import Ġcom . b sel zer . gw 2 . v 2 . tile . model . request . Tile Grid Request Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġkotlin . math . pow Ċ Ċ /** Ċ Ġ* ĠThe Ġtiles Ġwithin Ġthe Ġgrid . Ċ Ġ*/ Ċ @ Serializable Ċ data Ġclass ĠTile Grid ( ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġwidth Ġof Ġeach Ġindividual Ġtile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtile Width : ĠInt Ġ= Ġ 0 , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġheight Ġof Ġeach Ġindividual Ġtile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtile Height : ĠInt Ġ= Ġ 0 , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġwidth Ġof Ġthe Ġtexture . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtexture Width : ĠInt Ġ= Ġ 0 , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġheight Ġof Ġthe Ġtexture . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtexture Height : ĠInt Ġ= Ġ 0 , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġstarting Ġhorizontal Ġtile Ġposition . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġstart X : ĠInt Ġ= Ġ 0 , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġending Ġhorizontal Ġtile Ġposition . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġend X : ĠInt Ġ= Ġ 0 , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġstarting Ġvertical Ġtile Ġposition . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġstart Y : ĠInt Ġ= Ġ 0 , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġending Ġvertical Ġtile Ġposition . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġend Y : ĠInt Ġ= Ġ 0 , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġzoom Ġlevel . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġzoom : ĠInt Ġ= Ġ 0 , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġsubset Ġof Ġtiles Ġwith Ġcontent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtiles : ĠList < Tile > Ġ= Ġempty List (), Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAll Ġof Ġthe Ġtiles Ġwithin Ġthe Ġboundary Ġby Ġrows . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġrows : ĠList < List < Tile >> Ġ= Ġcreate Rows () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġnumber Ġof Ġcolumns Ġwithin Ġthe Ġgrid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcolumn Count : ĠInt Ġ= Ġend X Ġ- Ġstart X Ġ+ Ġ 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġnumber Ġof Ġrows Ġwithin Ġthe Ġgrid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġrow Count : ĠInt Ġ= Ġend Y Ġ- Ġstart Y Ġ+ Ġ 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġwidth Ġof Ġthe Ġentire Ġgrid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġwidth : ĠInt Ġ= Ġcolumn Count Ġ* Ġtile Width ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġheight Ġof Ġthe Ġentire Ġgrid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġheight : ĠInt Ġ= Ġrow Count Ġ* Ġtile Height ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġinstance Ġusing Ġthe Ġdata Ġfrom Ġthe Ġ[ request ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( request : ĠTile Grid Request , Ġtiles : ĠList < Tile > Ġ= Ġempty List ()) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġtile Width Ġ= Ġrequest . tile Width , ĊĠĠĠĠĠĠĠ Ġtile Height Ġ= Ġrequest . tile Height , ĊĠĠĠĠĠĠĠ Ġtexture Width Ġ= Ġrequest . texture Width , ĊĠĠĠĠĠĠĠ Ġtexture Height Ġ= Ġrequest . texture Height , ĊĠĠĠĠĠĠĠ Ġstart X Ġ= Ġrequest . start X , ĊĠĠĠĠĠĠĠ Ġend X Ġ= Ġrequest . end X , ĊĠĠĠĠĠĠĠ Ġstart Y Ġ= Ġrequest . start Y , ĊĠĠĠĠĠĠĠ Ġend Y Ġ= Ġrequest . end Y , ĊĠĠĠĠĠĠĠ Ġzoom Ġ= Ġrequest . zoom , ĊĠĠĠĠĠĠĠ Ġtiles Ġ= Ġtiles ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġposition Ġscaled Ġto Ġthe Ġbounds Ġof Ġthe Ġgrid Ġwithin Ġthe Ġ[ zoom ] Ġlevel ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġscale ( x : ĠInt , Ġy : ĠInt ): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġzoom Ġ= Ġtexture Scale ( x , Ġy ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġthe Ġexcluded Ġstarting Ġtiles . ĊĠĠĠĠĠĠĠ Ġval Ġscaled X Ġ= Ġzoom . first Ġ- Ġ( start X Ġ* Ġtile Width ) ĊĠĠĠĠĠĠĠ Ġval Ġscaled Y Ġ= Ġzoom . second Ġ- Ġ( start Y Ġ* Ġtile Height ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( scaled X , Ġscaled Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġposition Ġscaled Ġto Ġthe Ġabsolute Ġcoordinates Ġwithin Ġthe Ġ[ zoom ] Ġlevel ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtexture Scale ( x : ĠInt , Ġy : ĠInt ): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠScale Ġthe Ġcoordinates Ġto Ġthe Ġcurrent Ġzoom Ġlevel . ĊĠĠĠĠĠĠĠ Ġval Ġzoom Width Ġ= Ġ 2 . 0 . pow ( zoom ) Ġ* Ġtile Width ĊĠĠĠĠĠĠĠ Ġval Ġzoom Height Ġ= Ġ 2 . 0 . pow ( zoom ) Ġ* Ġtile Height ĊĠĠĠĠĠĠĠ Ġval Ġzoom X Ġ= Ġ( zoom Width Ġ* Ġx Ġ/ Ġtexture Width ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġzoom Y Ġ= Ġ( zoom Height Ġ* Ġy Ġ/ Ġtexture Height ). toInt () ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( zoom X , Ġzoom Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġgrid Ġfrom Ġthe Ġ[ tiles ] Ġwith Ġmissing Ġtiles Ġcreated Ġwith Ġempty Ġcontent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Rows (): ĠList < List < Tile >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgrouped Ġ= Ġtiles . groupBy Ġ{ Ġit . grid Y Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġgrid Ġ= Ġmutable ListOf < List < Tile >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġstart Y .. end Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġgrouped [ y ] Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( start X .. end X ). map Ġ{ Ġx Ġ-> Ġgroup . first OrNull Ġ{ Ġtile Ġ-> Ġtile . grid X Ġ== Ġx Ġ} Ġ?: ĠTile ( grid X Ġ= Ġx , Ġgrid Y Ġ= Ġy , Ġwidth Ġ= Ġtile Width , Ġheight Ġ= Ġtile Height , Ġzoom Ġ= Ġzoom ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrid . add ( row ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġgrid ĊĠĠĠ Ġ} Ċ }