package Ġworld . greg s . void ps . engine . client . ui Ċ Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġkotlinx . coroutines . suspend C ancellable Coroutine Ċ import Ġworld . greg s . void ps . cache . definition . data . Interface Component Definition Ċ import Ġworld . greg s . void ps . engine . action . Action Ċ import Ġworld . greg s . void ps . engine . action . Sus pension Ċ import Ġworld . greg s . void ps . engine . client . ui . event . Interface Closed Ċ import Ġworld . greg s . void ps . engine . client . ui . event . Interface Opened Ċ import Ġworld . greg s . void ps . engine . client . ui . event . Interface Ref reshed Ċ import Ġworld . greg s . void ps . engine . entity . character . player . Player Ċ import Ġworld . greg s . void ps . engine . entity . character . player . Player Game Frame Ċ import Ġworld . greg s . void ps . engine . entity . definition . Interface Definitions Ċ import Ġworld . greg s . void ps . engine . entity . definition . getComponent OrNull Ċ import Ġworld . greg s . void ps . engine . event . Events Ċ import Ġworld . greg s . void ps . engine . utility . get Ċ import Ġworld . greg s . void ps . network . Client Ċ import Ġworld . greg s . void ps . network . encode .* Ċ import Ġkotlin . coroutines . resume Ċ Ċ /** Ċ Ġ* ĠAPI Ġfor Ġthe Ġinteracting Ġand Ġtracking Ġof Ġclient Ġinterfaces Ċ Ġ*/ Ċ class ĠInterfaces ( ĊĠĠĠ Ġprivate Ġval Ġevents : ĠEvents , ĊĠĠĠ Ġvar Ġclient : ĠClient ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġdefinitions : ĠInterface Definitions , ĊĠĠĠ Ġprivate Ġval Ġgame Frame : ĠPlayer Game Frame , ĊĠĠĠ Ġprivate Ġval Ġopen Interfaces : ĠMutable Set < String > Ġ= Ġmutable Set Of () Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġopen ( id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Open Or Root Parent ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsend If Opened ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose ( id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( remove ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Children Of ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose Children ( id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( contains ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Children Of ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove ( id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( open Interfaces . remove ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Close ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents . emit ( Interface Closed ( id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget ( type : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġopen Interfaces . first OrNull Ġ{ ĠgetType ( it ) Ġ== Ġtype Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcontains ( id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġopen Interfaces . contains ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrefresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġopen Interfaces . forEach Ġ{ Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Open ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Refresh ( id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Open Or Root Parent ( id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= ĠgetParent ( id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġparent Ġ== ĠROOT _ ID Ġ|| Ġcontains ( parent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend If Opened ( id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( open Interfaces . add ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Open ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents . emit ( Interface Opened ( id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Refresh ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnotify Refresh ( id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose Children Of ( parent : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġopen Interfaces . iterator () ĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ( it . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġit . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getParent ( id ) Ġ== Ġparent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Close ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents . emit ( Interface Closed ( id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . add ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġchildren ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Children Of ( child ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetParent ( id : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdefinitions . get ( id )[ if Ġ( game Frame . resizable ) Ġ" parent _ resize " Ġelse Ġ" parent _ fixed ", Ġ" "] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Index ( id : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdefinitions . get ( id )[ if Ġ( game Frame . resizable ) Ġ" index _ resize " Ġelse Ġ" index _ fixed ", Ġ- 1 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetType ( id : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdefinitions . get ( id )[" type ", Ġ" main _ screen "] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Open ( id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= ĠgetParent ( id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ== ĠROOT _ ID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. update Interface ( definitions . get ( id ). id , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠgetType ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermanent Ġ= Ġtype Ġ!= Ġ" main _ screen " Ġ&& Ġtype Ġ!= Ġ" under lay " Ġ&& Ġtype Ġ!= Ġ" dialog ue _ box " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. open Interface ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermanent Ġ= Ġpermanent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġdefinitions . get ( parent ). id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Ġ= Ġget Index ( id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġdefinitions . get ( id ). id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Close ( id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= ĠgetParent ( id ) ĊĠĠĠĠĠĠĠ Ġclient ?. close Interface ( definitions . get ( parent ). id , Ġget Index ( id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify Refresh ( id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevents . emit ( Interface Ref reshed ( id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠROOT _ ID Ġ= Ġ" root " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠROOT _ INDEX Ġ= Ġ 0 ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġget Component ( id : ĠString , Ġcomponent : ĠString ): ĠInterface Component Definition ? Ġ{ ĊĠĠĠ Ġval Ġdefinitions : ĠInterface Definitions Ġ= Ġget () ĊĠĠĠ Ġreturn Ġdefinitions . get ( id ). getComponent OrNull ( component ) Ċ } Ċ Ċ fun ĠInterfaces . send Animation ( id : ĠString , Ġcomponent : ĠString , Ġanimation : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcomp Ġ= Ġget Component ( id , Ġcomponent ) Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġclient ?. animate Interface ( comp [" parent ", Ġ- 1 ], Ġcomp . id , Ġanimation ) ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun ĠInterfaces . send Text ( id : ĠString , Ġcomponent : ĠString , Ġtext : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcomp Ġ= Ġget Component ( id , Ġcomponent ) Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġclient ?. interface Text ( comp [" parent ", Ġ- 1 ], Ġcomp . id , Ġtext ) ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun ĠInterfaces . send Visibility ( id : ĠString , Ġcomponent : ĠString , Ġvisible : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcomp Ġ= Ġget Component ( id , Ġcomponent ) Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġclient ?. interface Visibility ( comp [" parent ", Ġ- 1 ], Ġcomp . id , Ġ! visible ) ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun ĠInterfaces . send Sprite ( id : ĠString , Ġcomponent : ĠString , Ġsprite : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcomp Ġ= Ġget Component ( id , Ġcomponent ) Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġclient ?. interface Sprite ( comp [" parent ", Ġ- 1 ], Ġcomp . id , Ġsprite ) ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun ĠInterfaces . send Item ( id : ĠString , Ġcomponent : ĠString , Ġitem : ĠInt , Ġamount : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcomp Ġ= Ġget Component ( id , Ġcomponent ) Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġclient ?. interface Item ( comp [" parent ", Ġ- 1 ], Ġcomp . id , Ġitem , Ġamount ) ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun ĠPlayer . open ( interface Id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġdefs : ĠInterface Definitions Ġ= Ġget () ĊĠĠĠ Ġval Ġtype Ġ= Ġdefs . get ( interface Id )[" type ", Ġ" "] ĊĠĠĠ Ġif Ġ( type . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġinterfaces . get ( type )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterfaces . close ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġinterfaces . open ( interface Id ) Ċ } Ċ Ċ fun ĠPlayer . isOpen ( interface Id : ĠString ) Ġ= Ġinterfaces . contains ( interface Id ) Ċ Ċ fun ĠPlayer . has Open ( interface Type : ĠString ) Ġ= Ġinterfaces . get ( interface Type ) Ġ!= Ġnull Ċ Ċ fun ĠPlayer . has Screen Open () Ġ= Ġhas Open (" main _ screen ") Ġ|| Ġhas Open (" under lay ") Ċ Ċ fun ĠPlayer . close ( interface Id : ĠString ) Ġ= Ġinterfaces . close ( interface Id ) Ċ Ċ fun ĠPlayer . close Type ( interface Type : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġid Ġ= Ġinterfaces . get ( interface Type ) Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġreturn Ġinterfaces . close ( id ) Ċ } Ċ Ċ fun ĠPlayer . close Children ( interface Id : ĠString ) Ġ= Ġinterfaces . close Children ( interface Id ) Ċ Ċ suspend Ġfun ĠAction . await Interface ( id : ĠString ) Ġ= Ġawait < Unit >( Sus pension . Interface ( id )) Ċ Ċ suspend Ġfun Ġ< T Ġ: ĠAny > ĠAction . await ( job : ĠDeferred < T >): ĠT Ġ= Ġsuspend C ancellable Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠ Ġcontinuation Ġ= Ġcont ĊĠĠĠ Ġthis . sus pension Ġ= ĠS us pension . External ĊĠĠĠ Ġjob . invoke On Completion Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( job . get Completed ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ val ĠPlayer . dialog ue : ĠString ? ĊĠĠĠ Ġget () Ġ= Ġinterfaces . get (" dialog ue _ box ") Ġ?: Ġinterfaces . get (" dialog ue _ box _ small ") Ċ Ċ val ĠPlayer . menu : ĠString ? ĊĠĠĠ Ġget () Ġ= Ġinterfaces . get (" main _ screen ") Ġ?: Ġinterfaces . get (" under lay ") Ġ?: Ġdialogue Ċ Ċ fun ĠPlayer . close Dialog ue (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġclose ( dialog ue Ġ?: Ġreturn Ġfalse ) Ċ } Ċ Ċ fun ĠPlayer . close Interface (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġclose ( menu Ġ?: Ġreturn Ġfalse ) Ċ } Ċ Ċ suspend Ġfun ĠPlayer . await Dialog ues (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġid Ġ= Ġdialogue ĊĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaction . await < Unit >( Sus pension . Interface ( id )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ suspend Ġfun ĠPlayer . await Interfaces (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġid Ġ= Ġmenu ĊĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaction . await < Unit >( Sus pension . Interface ( id )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ }