/* Ċ Ġ* ĠFX GL Ġ- ĠJava FX ĠGame ĠLibrary . ĠThe ĠMIT ĠLicense Ġ( MIT ). Ċ Ġ* ĠCopyright Ġ( c ) ĠAl mas B Ġ( al mas lvl @ gmail . com ). Ċ Ġ* ĠSee ĠLICENSE Ġfor Ġdetails . Ċ Ġ*/ Ċ Ċ package Ġcom . al mas b . fx gl . cut scene . dialog ue Ċ Ċ import Ġcom . al mas b . fx gl . core . collection . Property Map Ċ import Ġcom . al mas b . fx gl . logging . Logger Ċ import Ġjava . lang . reflect . Method Ċ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ author ĠAl mas ĠB aim ag amb et ov Ġ( al mas lvl @ gmail . com ) Ċ Ġ*/ Ċ internal Ġclass ĠDialog ue Script Runner ( ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠVariables Ġglobal Ġto Ġthe Ġgame . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġgame Vars : ĠProperty Map , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠVariables Ġlocal Ġto Ġthe Ġdialogue Ġcontext . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠlocalVar s : ĠProperty Map , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfunction Handler : ĠFunction Call Handler Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLogger . get < Dialog ue Script Runner >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġ[ line ], Ġthis Ġfunction Ġreplaces Ġall Ġvariables Ġwith Ġtheir Ġvalues . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreplace Variables In Text ( line : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvar Names Ġ= Ġline . split (" Ġ+ ". to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . startsWith ("\ $ ") Ġ&& Ġit . length Ġ> Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . last (). is Letter Or Digit ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . substring ( 1 , Ġit . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . substring ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġreplace Variables ( line , Ġvar Names ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreplace Variables ( line : ĠString , Ġvar Names : ĠSet < String >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġline ĊĊĠĠĠĠĠĠĠ Ġvar Names . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Vars . exists ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠlocalVar s . getValue < Any >( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult . replace ("\ $$ it ", Ġvalue . toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( game Vars . exists ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġgame Vars . getValue < Any >( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult . replace ("\ $$ it ", Ġvalue . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġfrom Ġa Ġbranch Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcall Boolean Function ( line : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġif Ġ( line . is Equality Check Function ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Equality Check Function ( replace Variables In Text ( line )) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Function ( line ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ! is ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warning (" A Ġboolean Ġfunction Ġcall Ġdid Ġnot Ġreturn Ġa Ġboolean : Ġ${ line }. ĠAss uming Ġresult Ġ< false >. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall Equality Check Function ( line : ĠString ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoperators Ġ= Ġlinked Map Of < String , Ġ( Any , ĠAny ) Ġ-> ĠBoolean >() ĊĠĠĠĠĠĠĠ Ġoperators [" ==" ] Ġ= Ġ{ Ġlhs , Ġrhs Ġ-> Ġlhs Ġ== Ġrhs Ġ} ĊĠĠĠĠĠĠĠ Ġoperators [ "> =" ] Ġ= Ġ{ Ġlhs , Ġrhs Ġ-> Ġlhs Ġ>= Ġrhs Ġ} ĊĠĠĠĠĠĠĠ Ġoperators [" < =" ] Ġ= Ġ{ Ġlhs , Ġrhs Ġ-> Ġlhs Ġ<= Ġrhs Ġ} ĊĠĠĠĠĠĠĠ Ġoperators [ "> "] Ġ= Ġ{ Ġlhs , Ġrhs Ġ-> Ġlhs Ġ> Ġrhs Ġ} ĊĠĠĠĠĠĠĠ Ġoperators [" < "] Ġ= Ġ{ Ġlhs , Ġrhs Ġ-> Ġlhs Ġ< Ġrhs Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġoperators . entries . find Ġ{ Ġline . contains ( it . key ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( entry Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( op , Ġfunc ) Ġ= Ġentry ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlhs Ġ= Ġline . substring Before ( op ). trim (). to Typed Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrhs Ġ= Ġline . substring After ( op ). trim (). to Typed Value () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfunc . invoke ( lhs , Ġrhs ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠNull Object ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġfrom Ġa Ġfunction Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcall Function ( line : ĠString ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( line . is Assignment Function ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Assignment Function ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNull Object ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= Ġline . trim (). split (" Ġ+ ". to Regex ()) ĊĊĠĠĠĠĠĠĠ Ġrequire ( tokens . isNotEmpty ()) Ġ{ Ġ" Empty Ġfunction Ġcall : Ġ$ line " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfunc Name Ġ= Ġtokens [ 0 ]. trim () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tokens . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġthis Ġis Ġa Ġboolean Ġvariable Ġ-- Ġthe Ġonly Ġvalid Ġvariable Ġto Ġuse Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Vars . exists ( func Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlocalVar s . getValue ( func Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( game Vars . exists ( func Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgame Vars . getValue ( func Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfunction Handler . call ( func Name , Ġtokens . drop ( 1 ). map Ġ{ Ġreplace Variables In Text ( it . trim ()) Ġ}. to Typed Array ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall Assignment Function ( line : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" call Assignment Function ( Ġ$ line Ġ) ") ĊĊĠĠĠĠĠĠĠ Ġval Ġvar Name Ġ= Ġline . substring Before (' =' ). trim () ĊĠĠĠĠĠĠĠ Ġval Ġvar Value Ġ= Ġline . substring After (' =' ). trim (). to Typed Value () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( local Vars . exists ( varName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlocalVar s . setValue ( varName , Ġvar Value ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( game Vars . exists ( varName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame Vars . setValue ( varName , Ġvar Value ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdoes Ġnot Ġexist Ġanywhere , Ġcreate Ġlocally ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlocalVar s . setValue ( varName , Ġvar Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠString . is Assignment Function (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġthis . contains (' =') Ċ } Ċ Ċ private Ġfun ĠString . is Equality Check Function (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġthis . contains (" ==" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġthis . contains ("> =") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġthis . contains ("< =") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġthis . contains ("> ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġthis . contains ("< ") Ċ } Ċ Ċ private Ġfun ĠString . to Typed Value (): ĠAny Ġ{ ĊĠĠĠ Ġval Ġs Ġ= Ġthis ĊĊĠĠĠ Ġif Ġ( s Ġ== Ġ" true ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠ Ġif Ġ( s Ġ== Ġ" false ") ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠ Ġreturn Ġs . toInt OrNull () Ġ?: Ġs . toDouble OrNull () Ġ?: Ġs Ċ } Ċ Ċ private Ġoperator Ġfun ĠAny . compareTo ( other : ĠAny ): ĠInt Ġ{ ĊĠĠĠ Ġif Ġ( this Ġis ĠString Ġ&& Ġother Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . compareTo ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( this Ġis ĠBoolean Ġ&& Ġother Ġis ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . compareTo ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( this Ġis ĠInt Ġ&& Ġother Ġis ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . compareTo ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( this Ġis ĠInt Ġ&& Ġother Ġis ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . compareTo ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( this Ġis ĠDouble Ġ&& Ġother Ġis ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . compareTo ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( this Ġis ĠDouble Ġ&& Ġother Ġis ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . compareTo ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġthrow ĠRuntimeException (" Cannot Ġcompare : Ġ$ this Ġand Ġ$ other ") Ċ } Ċ Ċ private Ġobject ĠNull Object Ċ Ċ /** Ċ Ġ* ĠMark s Ġa Ġclass Ġas Ġone Ġthat Ġcontains Ġfunctions Ġthat Ġcan Ġbe Ġcalled Ċ Ġ* Ġby Ġ[ Function Call Handler ]. Ċ Ġ* Ċ Ġ* Ġ@ author ĠAl mas ĠB aim ag amb et ov Ġ( al mas lvl @ gmail . com ) Ċ Ġ*/ Ċ interface ĠFunction Call Delegate Ċ Ċ abstract Ġclass ĠFunction Call Handler Ġ: ĠFunction Call Delegate Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLogger . get ( java Class ) ĊĊĠĠĠ Ġprivate Ġval Ġmethods Ġ= Ġhash Map Of < Method Signature , ĠInv ok able Method >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġconversions Ġfrom Ġ[ String ] Ġto Ġother Ġtypes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġstring ToObject Ġ= Ġhash Map Of < Class <* >, Ġ( String ) Ġ-> ĠAny >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġregister Ġcommon Ġtypes ĊĠĠĠĠĠĠĠ Ġstring ToObject [ String :: class . java ] Ġ= Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġstring ToObject [ Int :: class . java ] Ġ= Ġ{ Ġit . toInt () Ġ} ĊĠĠĠĠĠĠĠ Ġstring ToObject [ Double :: class . java ] Ġ= Ġ{ Ġit . toDouble () Ġ} ĊĠĠĠĠĠĠĠ Ġstring ToObject [ Boolean :: class . java ] Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" true " Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" false " Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġjava . lang . RuntimeException (" Cannot Ġconvert Ġ$ it Ġto ĠBoolean ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġself Ġas Ġa Ġdelegate ĊĠĠĠĠĠĠĠ Ġadd Function Call Delegate ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Function Call Delegate ( obj : ĠFunction Call Delegate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobj . java Class . declared Methods . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= ĠMethod Signature ( it . name , Ġit . parameter Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= ĠInv ok able Method ( obj , Ġit ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethods [ signature ] Ġ= Ġmethod ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Added Ġcmd : Ġ$ method Ġ($ signature )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Function Call Delegate ( obj : ĠFunction Call Delegate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmethods . filter Values Ġ{ Ġit . delegate Ġ=== Ġobj Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġmethods . remove ( it . key ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcall ( function Name : ĠString , Ġargs : ĠArray < String >): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġmethods [ Method Signature ( function Name , Ġargs . size )] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs As Objects Ġ= Ġmethod . function . parameter Types . map Indexed Ġ{ Ġindex , Ġtype Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconverter Ġ= Ġstring ToObject [ type ] Ġ?: Ġthrow Ġjava . lang . RuntimeException (" No Ġconverter Ġfound Ġfrom ĠString Ġto Ġ$ type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconverter . invoke ( args [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvoid Ġreturns Ġnull , Ġbut ĠAny Ġis Ġexpected , Ġso Ġwe Ġreturn Ġ 0 Ġin Ġsuch Ġcases ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmethod . function . invoke ( method . delegate , Ġ* args As Objects . to Typed Array ()) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . warning (" Unrecognized Ġfunction : Ġ$ function Name Ġwith Ġ${ args . size } Ġarguments . ĠCalling Ġdefault Ġimplementation ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhandle ( function Name , Ġargs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġdefault Ġhandle Ġfunction , Ġwhich Ġis Ġcalled Ġwhen Ġno Ġfunction Ġdelegate Ġwith Ġmatching Ġmethod Ġsignature Ġwas Ġfound . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġhandle ( function Name : ĠString , Ġargs : ĠArray < String >): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . warning (" Function Ġcall Ġfrom Ġdialogue Ġgraph Ġvia Ġdefault Ġimplementation Ġof ĠFunction Call Handler :") ĊĠĠĠĠĠĠĠ Ġlog . warning ("$ function Name Ġ${ args . toList () }") ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠMethod Signature ( val Ġname : ĠString , Ġval Ġparam Count : ĠInt ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStores Ġthe Ġobject Ġ[ delegate ] Ġand Ġthe Ġfunction Ġ[ function ] Ġthat Ġcan Ġbe Ġinvoked Ġon Ġthe Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġdata Ġclass ĠInv ok able Method ( val Ġdelegate : ĠFunction Call Delegate , Ġval Ġfunction : ĠMethod ) Ċ }