package Ġcom . st ew sters . fork knife . world Ċ Ċ import Ġcom . st ew sters . fork knife . components . Entity Ċ import Ġcom . st ew sters . fork knife . half Play Area Size Ċ import Ġcom . st ew sters . fork knife . left Column Ċ import Ġcom . st ew sters . fork knife . math . B res en ham 2 d Ċ import Ġcom . st ew sters . fork knife . math . Los Evaluator Ċ import Ġcom . st ew sters . fork knife . world Center Ċ import Ġk ai ju . math .* Ċ Ċ import Ġorg . hex works . z ir con . api . data . Position Ċ import Ġkotlin . streams . toList Ċ Ċ class ĠWorld ( Ċ // ĠĠĠ Ġval Ġsize : ĠVec 3 , ĊĠĠĠ Ġval Ġmap : ĠMatrix 2 d < Cell >, ĊĠĠĠ Ġvar Ġcamera Center : Ġ( world : ĠWorld ) Ġ-> ĠVec 2 Ċ ) Ġ{ ĊĠĠĠ Ġval Ġlos Entity Ġ= ĠLos Evaluator ( this ) ĊĊĠĠĠ Ġval Ġcharacters Ġ= Ġmutable ListOf < Entity >() ĊĠĠĠ Ġvar Ġselected Char Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġget Selected Character (): ĠEntity Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcharacters [ selected Char ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġring Center Ġ= ĠVec 2 [ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Int InRange ( map . x Size Ġ/ Ġ 4 , Ġ 3 Ġ* Ġmap . x Size Ġ/ Ġ 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Int InRange ( map . y Size Ġ/ Ġ 4 , Ġ 3 Ġ* Ġmap . y Size Ġ/ Ġ 4 ) ĊĠĠĠ Ġ] ĊĊĠĠĠ Ġvar Ġradius Ġ= Ġmax ( world Center . x , Ġworld Center . y ) Ġ* Ġ 2 ĊĊĠĠĠ Ġfun Ġis Outside Ring ( pos : ĠVec 2 ): ĠBoolean Ġ= Ġget E uclidean Distance ( ring Center , Ġpos ) Ġ> Ġradius Ċ Ċ // ĠĠĠ Ġval Ġentities Ġ= Ġmutable ListOf < Entity >() ĊĠĠĠ Ġval Ġactors Ġ= Ġmutable ListOf < Entity >() Ġ// Ġwith Ġai ĊĊĠĠĠ Ġfun Ġadd ( character : ĠEntity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġcharacter . pos Ċ // ĠĠĠĠĠĠĠ Ġentities . add ( character ) ĊĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ pos ]. entities . add ( character ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( character . ai Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactors . add ( character ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove ( character : ĠEntity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġcharacter . pos Ċ // ĠĠĠĠĠĠĠ Ġentities . remove ( character ) ĊĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ pos ]. entities . remove ( character ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( character . ai Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactors . add ( character ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmove ( character : ĠEntity , Ġdest : ĠVec 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġcharacter . pos ĊĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ pos ]. entities . remove ( character ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacter . pos Ġ= Ġdest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ dest ]. entities . add ( character ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : Ġthis ĊĠĠĠ Ġ// Ġgets Ġposition Ġrelative Ġto Ġplayer ĊĠĠĠ Ġfun Ġscreen To Player ( position : ĠPosition ): ĠVec 2 Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgets Ġthe Ġworld Ġcoordinates Ġfrom Ġa Ġclick ĊĠĠĠĠĠĠĠ Ġval Ġcenter Ġ= Ġcamera Center ( this ) ĊĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġposition . x Ġ- Ġcenter . x ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġposition . y Ġ- Ġcenter . y ĊĊĠĠĠĠĠĠĠ Ġreturn ĠVec 2 [ x , Ġy ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscreen ToMap ( position : ĠPosition ): ĠVec 2 Ġ= Ġscreen ToMap ( position . x , Ġposition . y ) ĊĊĠĠĠ Ġfun Ġscreen ToMap ( x : ĠInt , Ġy : ĠInt ): ĠVec 2 Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgets Ġthe Ġworld Ġcoordinates Ġfrom Ġa Ġclick ĊĠĠĠĠĠĠĠ Ġval Ġcenter Ġ= Ġcamera Center ( this ) ĊĊĠĠĠĠĠĠĠ Ġval Ġx W Ġ= Ġx Ġ+ Ġcenter . x Ġ- Ġhalf Play Area Size . x Ġ- Ġleft Column . x ĊĠĠĠĠĠĠĠ Ġval Ġy W Ġ= Ġy Ġ+ Ġcenter . y Ġ- Ġhalf Play Area Size . y ĊĊĠĠĠĠĠĠĠ Ġreturn ĠVec 2 [ x W , Ġy W ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġturn Ġ= Ġ 0 ĊĠĠĠ Ġfun Ġpass Time ( world : ĠWorld ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġeach Ġperson Ġdoes Ġwhat Ġthey Ġdo . Ġ ĠThen ĠAI Ġdo Ġwhat Ġthey Ġdo ĊĠĠĠĠĠĠĠ Ġprintln ( turn ++) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(( turn Ġ/ Ġ 2 0 ) Ġ% Ġ 3 Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradius Ġ-= Ġ 1 Ġ// Ġtodo , Ġclose , Ġthen Ġhold ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġplayers Ġare Ġdead , Ġstop ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġall Ġnot Ġplayers Ġare Ġdead , Ġstop ĊĊĠĠĠĠĠĠĠ Ġworld . actors . forEach Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . creature ?. hp ?. current Ġ?: Ġ 0 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġai Ġ= Ġit . ai Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġai . getNext Action ( it , Ġworld ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . on Perform ( world , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Outside Ring ( it . pos !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . creature ?. take Damage ( it , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġpc Id Ġ= Ġ 0 ĊĠĠĠ Ġval Ġpc Glyph s Ġ= Ġ(' 1 ' .. ' 9 '). toList () ĊĊĠĠĠ Ġfun Ġget Pc Glyph (): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchar Ġ= Ġpc Glyph s [ pc Id ++] ĊĠĠĠĠĠĠĠ Ġif Ġ( pc Id Ġ>= Ġpc Glyph s . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpc Id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġchar ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġvar Ġnpc Id Ġ= Ġ 0 ĊĠĠĠ Ġval Ġnpc Glyph s Ġ= Ġ( (' a ' .. ' z '). toList () Ġ+ Ġ(' A ' .. ' Z '). toList ()). sh uffled () ĊĊĠĠĠ Ġfun Ġget Npc Glyph (): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchar Ġ= Ġnpc Glyph s [ npc Id ++] ĊĠĠĠĠĠĠĠ Ġif Ġ( npc Id Ġ>= Ġnpc Glyph s . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnpc Id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġchar ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisible Things ( entity : ĠEntity , Ġrange : ĠInt ): ĠList < Entity > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġactors . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġget E uclidean Distance ( entity . pos !! , Ġit . pos !! ) Ġ<= Ġrange Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠB res en ham 2 d . los ( entity . pos !! , Ġit . pos !! , Ġlos Entity ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclosest Visible Enemy InRange ( entity : ĠEntity , Ġrange : ĠInt ): ĠEntity ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġactors . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . s quad Ġ!= Ġentity . s quad Ġ&& Ġit . creature ?. hp ?. current Ġ?: Ġ 0 Ġ> Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġget E uclidean Distance ( entity . pos !! , Ġit . pos !! ) Ġ<= Ġrange Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠB res en ham 2 d . los ( entity . pos !! , Ġit . pos !! , Ġlos Entity ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. min By Ġ{ Ġget E uclidean Distance ( entity . pos !! , Ġit . pos !! ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdistance To Ring ( entity : ĠEntity ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġradius Ġ- Ġget Che by she v Distance ( entity . pos !! , Ġring Center ) ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġfun ĠgetRandom Package Location (): ĠVec 2 Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġentities . filter Ġ{ Ġit . is Lo ot able () Ġ}. random (). pos Ġ?: Ġring Center Ċ // ĠĠĠ Ġ} Ċ Ċ } ĊĊ