/* Ċ Ġ* Ġ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 . animation . Animation Ċ import Ġcom . al mas b . fx gl . animation . Animation Builder Ċ import Ġcom . al mas b . fx gl . audio . Audio Player Ċ import Ġcom . al mas b . fx gl . audio . Music Ċ import Ġcom . al mas b . fx gl . core . asset . Asset Loader Service Ċ import Ġcom . al mas b . fx gl . core . asset . Asset Type Ċ import Ġcom . al mas b . fx gl . core . collection . Property Map Ċ import Ġcom . al mas b . fx gl . core . util . Empty Runnable Ċ import Ġcom . al mas b . fx gl . cut scene . dialog ue . Dialog ue NodeType .* Ċ import Ġcom . al mas b . fx gl . input . Key Trigger Ċ import Ġcom . al mas b . fx gl . input . Trigger Ċ import Ġcom . al mas b . fx gl . input . Trigger Listener Ċ import Ġcom . al mas b . fx gl . input . User Action Ċ import Ġcom . al mas b . fx gl . input . view . Key View Ċ import Ġcom . al mas b . fx gl . logging . Logger Ċ import Ġcom . al mas b . fx gl . scene . Scene Service Ċ import Ġcom . al mas b . fx gl . scene . Sub Scene Ċ import Ġjavafx . beans . binding . Bindings Ċ import Ġjavafx . geometry . Point 2 D Ċ import Ġjavafx . scene . Group Ċ import Ġjavafx . scene . input . KeyCode Ċ import Ġjavafx . scene . layout . V Box Ċ import Ġjavafx . scene . paint . Color Ċ import Ġjavafx . scene . shape . Rectangle Ċ import Ġjavafx . scene . text . Font Ċ import Ġjavafx . scene . text . Text Ċ import Ġjavafx . util . Duration Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ author ĠAl mas ĠB aim ag amb et ov Ġ( al mas lvl @ gmail . com ) Ċ Ġ*/ Ċ class ĠDialog ue Scene ( private Ġval Ġscene Service : ĠScene Service ) Ġ: ĠSub Scene () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLogger . get < Dialog ue Scene >() ĊĊĠĠĠ Ġprivate Ġval Ġanimation 1 : ĠAnimation < *> ĊĠĠĠ Ġprivate Ġval Ġanimation 2 : ĠAnimation < *> ĊĊĠĠĠ Ġprivate Ġval Ġtop Text Ġ= ĠText () ĊĠĠĠ Ġprivate Ġval Ġbox Player Lines Ġ= ĠV Box ( 5 . 0 ) ĊĊĠĠĠ Ġprivate Ġvar Ġon Finished : ĠRunnable Ġ= ĠEmpty Runnable ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgraph : ĠDialog ue Graph ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfunction Handler : ĠFunction Call Handler ĊĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġgame Vars : ĠProperty Map ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġasset Loader : ĠAsset Loader Service ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġaudio Player : ĠAudio Player ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdialogue Script Runner : ĠDialog ue Script Runner ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtop Line Ġ= ĠRectangle ( 0 . 0 , Ġ 1 5 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġtop Line . width Property (). bind ( scene Service . pref Width Property ()) ĊĠĠĠĠĠĠĠ Ġtop Line . translate Y Ġ= Ġ- 1 5 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġbot Line Ġ= ĠRectangle ( 0 . 0 , Ġ 2 0 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġbot Line . width Property (). bind ( scene Service . pref Width Property ()) ĊĠĠĠĠĠĠĠ Ġbot Line . translate Y Property (). bind ( scene Service . pref Height Property ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġbot Line Group Ġ= ĠGroup ( bot Line ) ĊĊĠĠĠĠĠĠĠ Ġanimation 1 Ġ= ĠAnimation Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. duration ( Duration . seconds ( 0 . 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. translate ( top Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. from ( Point 2 D ( 0 . 0 , Ġ- 1 5 0 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to ( Point 2 D . ZERO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġanimation 2 Ġ= ĠAnimation Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. duration ( Duration . seconds ( 0 . 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. translate ( bot Line Group ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. from ( Point 2 D ( 0 . 0 , Ġ 0 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to ( Point 2 D ( 0 . 0 , Ġ- 2 0 0 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġtop Text . fill Ġ= ĠColor . WHITE ĊĠĠĠĠĠĠĠ Ġtop Text . font Ġ= ĠFont . font ( 1 8 . 0 ) ĊĠĠĠĠĠĠĠ Ġtop Text . wrapping Width Property (). bind ( scene Service . pref Width Property (). subtract ( 1 5 5 )) ĊĠĠĠĠĠĠĠ Ġtop Text . translate X Ġ= Ġ 5 0 . 0 ĊĠĠĠĠĠĠĠ Ġtop Text . translate Y Ġ= Ġ 4 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġbox Player Lines . translate X Ġ= Ġ 5 0 . 0 ĊĠĠĠĠĠĠĠ Ġbox Player Lines . translate Y Property (). bind ( scene Service . pref Height Property (). subtract ( 1 6 0 )) ĊĠĠĠĠĠĠĠ Ġbox Player Lines . opacity Ġ= Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġkey View Ġ= ĠKey View ( KeyCode . ENTER , ĠColor . GREEN YELLOW , Ġ 1 8 . 0 ) ĊĠĠĠĠĠĠĠ Ġkey View . translate X Property (). bind ( scene Service . pref Width Property (). subtract ( 8 0 )) ĊĠĠĠĠĠĠĠ Ġkey View . translate Y Property (). bind ( scene Service . pref Height Property (). subtract ( 4 0 )) ĊĊĠĠĠĠĠĠĠ Ġkey View . opacity Property (). bind ( box Player Lines . opacity Property ()) ĊĠĠĠĠĠĠĠ Ġtop Text . opacity Property (). bind ( box Player Lines . opacity Property ()) ĊĊĠĠĠĠĠĠĠ Ġinit User Actions () ĊĊĠĠĠĠĠĠĠ Ġcontent Root . children . addAll ( top Line , Ġbot Line Group , Ġtop Text , Ġbox Player Lines , Ġkey View ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit User Actions () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Action Ġ= Ġobject Ġ: ĠUser Action (" Next ĠR PG ĠLine ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Action Begin () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentNode . type Ġ== ĠC HO ICE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Line () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdigit Trigger Listener Ġ= Ġobject Ġ: ĠTrigger Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Action Begin ( trigger : ĠTrigger ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġany Ġp resses Ġif Ġtype Ġis Ġnot ĠC HO ICE Ġor Ġthe Ġtext Ġanimation Ġis Ġstill Ġgoing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentNode . type Ġ!= ĠC HO ICE Ġ|| Ġmessage . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( trigger Ġis ĠKey Trigger Ġ&& Ġtrigger . key . toString (). startsWith (" DIGIT ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid String Ġ= Ġtrigger . key . toString (). remove Prefix (" DIGIT ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcareful , Ġthese Ġare Ġunsafe Ġoperations Ġassuming Ġthat Ġproperties [] Ġare Ġpresent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal ID : ĠInt ? Ġ= Ġbox Player Lines . children ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . properties [" id String "] Ġ== Ġid String Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . properties ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get (" local ID ") Ġas ? ĠInt ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal ID ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Line ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinput . addAction ( user Action , ĠKeyCode . ENTER ) ĊĠĠĠĠĠĠĠ Ġinput . add Trigger Listener ( digit Trigger Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġanimation 2 . on Finished Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Open () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġanimation 1 . start () ĊĠĠĠĠĠĠĠ Ġanimation 2 . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonUpdate ( tp f : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġanimation 1 . on Update ( tp f ) ĊĠĠĠĠĠĠĠ Ġanimation 2 . on Update ( tp f ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( message . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Text . text Ġ+= Ġmessage . poll () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġend Cut scene () Ġ{ ĊĠĠĠĠĠĠĠ Ġbox Player Lines . opacity Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġanimation 2 . on Finished Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscene Service . pop Sub Scene () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġanimation 1 . start Reverse () ĊĠĠĠĠĠĠĠ Ġanimation 2 . start Reverse () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart ( dialog ue Graph : ĠDialog ue Graph , Ġcontext : ĠDialog ue Context , Ġfunction Handler : ĠFunction Call Handler , Ġon Finished : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgraph Ġ= Ġdialogue Graph . copy () ĊĠĠĠĠĠĠĠ Ġthis . function Handler Ġ= Ġfunction Handler ĊĠĠĠĠĠĠĠ Ġthis . on Finished Ġ= Ġon Finished ĊĠĠĠĠĠĠĠ Ġdialogue Script Runner Ġ= ĠDialog ue Script Runner ( game Vars , Ġcontext . properties (), Ġfunction Handler ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhile Ġgraph Ġhas Ġsub dialog ue Ġnodes , Ġexpand ĊĠĠĠĠĠĠĠ Ġwhile Ġ( graph . nodes . any Ġ{ Ġit . value . type Ġ== ĠSUB DIALOG UE Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Dialog ue Node Ġ= Ġgraph . nodes . values . find Ġ{ Ġit . type Ġ== ĠSUB DIALOG UE Ġ} !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Graph Ġ= Ġload Sub Dialog ue ( sub Dialog ue Node Ġas ĠSub Dialog ue Node ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġgraph . edges . find Ġ{ Ġit . target Ġ=== Ġsub Dialog ue Node Ġ} !!. source ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġgraph . next Node ( sub Dialog ue Node ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbreak Ġthe Ġchain Ġsource Ġ-> Ġsub dialog ue Ġ-> Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . remove Node ( sub Dialog ue Node ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconnect Ġthe Ġsource Ġand Ġtarget Ġwith Ġa Ġgraph ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . append Graph ( source , Ġtarget , Ġsub Graph ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠcurrentNode Ġ= Ġgraph . start Node ĊĊĠĠĠĠĠĠĠ Ġnext Line () ĊĊĠĠĠĠĠĠĠ Ġscene Service . push Sub Scene ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Sub Dialog ue ( sub Dialog ue Node : ĠSub Dialog ue Node ): ĠDialog ue Graph Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġasset Loader . load ( Asset Type . DIALOG UE , Ġsub Dialog ue Node . text ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Line Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠcurrentNode : ĠDialog ue Node ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġtext Ġthat Ġis Ġshown Ġto Ġthe Ġplayer Ġone Ġchar Ġat Ġa Ġtime . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmessage Ġ= ĠArray Deque < Char >() ĊĊĠĠĠ Ġprivate Ġvar Ġstring ID Ġ= Ġ 1 ĊĊĠĠĠ Ġprivate Ġfun Ġnext Line ( next Node : ĠDialog ue Node ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġnot Ġallow Ġto Ġmove Ġto Ġnext Ġline Ġwhile Ġthe Ġtext Ġanimation Ġis Ġgoing ĊĠĠĠĠĠĠĠ Ġif Ġ( message . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġjust Ġshow Ġthe Ġtext Ġfully ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( message . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Text . text Ġ+= Ġmessage . poll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Line Ġ== Ġ 0 Ġ&& ĠcurrentNode . type Ġ== ĠSTART ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialogue Script Runner . replace Variables In Text ( currentNode . text ). forEach Ġ{ Ġmessage . add Last ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Line ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġis Done Ġ= ĠcurrentNode . type Ġ== ĠEND ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Done ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode Ġ= Ġnext Node Ġ?: Ġnext Node () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay Audio Lines ( currentNode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentNode . type Ġ== ĠFUNCTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode . text . parse And Call Functions () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Line ( next Node ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( currentNode . type Ġ== ĠB RANCH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbranch Node Ġ= ĠcurrentNode Ġas ĠBranch Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchoice Local ID : ĠInt ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( branch Node . text . trim (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġdialogue Script Runner . call Boolean Function ( branch Node . text ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchoice Local ID Ġ= Ġif Ġ( result ) Ġ 0 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warning (" Branch Ġnode Ġhas Ġno Ġfunction Ġcall : Ġ${ branch Node . text }. ĠAss uming Ġ< false > Ġbranch .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchoice Local ID Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Line ( next Node From Choice ( choice Local ID )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialogue Script Runner . replace Variables In Text ( currentNode . text ). forEach Ġ{ Ġmessage . add Last ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentNode . type Ġ== ĠC HO ICE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchoice Node Ġ= ĠcurrentNode Ġas ĠChoice Node ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring ID Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchoice Node . conditions . forEach Ġ{ Ġid , Ġcondition Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( condition . value . trim (). isEmpty () Ġ|| Ġdialogue Script Runner . call Boolean Function ( condition . value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoption Ġ= Ġchoice Node . options [ id ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopulate Player Line ( id , Ġdialogue Script Runner . replace Variables In Text ( option . value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Text . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Text . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Cut scene () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay Audio Lines ( node : ĠDialog ue Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( node . audio FileName . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġstore Ġaudio Ġbeing Ġplayed , Ġso Ġwe Ġcan Ġstop Ġas Ġappropriate ĊĠĠĠĠĠĠĠ Ġval Ġaudio Ġ= Ġasset Loader . load < Music >( Asset Type . M US IC , Ġasset Loader . get URL ( node . audio FileName . replace ("\\ ", Ġ"/ "))) ĊĊĠĠĠĠĠĠĠ Ġaudio Player . stop Music ( audio ) ĊĠĠĠĠĠĠĠ Ġaudio Player . play Music ( audio ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpopulate Player Line ( local ID : ĠInt , Ġdata : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstring ID ++ ĊĠĠĠĠĠĠĠ Ġval Ġid String Ġ= Ġ"$ string ID " ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠText ("${ id String }. Ġ${ data }") ĊĠĠĠĠĠĠĠ Ġtext . font Ġ= ĠFont . font ( 1 8 . 0 ) ĊĠĠĠĠĠĠĠ Ġtext . fill Property (). bind ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBind ings .` when `( text . hover Property ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then ( Color . YELLOW ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. otherwise ( Color . WHITE ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtext . properties [" id String "] Ġ= Ġid String ĊĠĠĠĠĠĠĠ Ġtext . properties [" local ID "] Ġ= Ġlocal ID ĊĊĠĠĠĠĠĠĠ Ġtext . setOn Mouse Clicked Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnot Ġallow Ġto Ġmove Ġto Ġnext Ġline Ġwhile Ġthe Ġtext Ġanimation Ġis Ġgoing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġjust Ġshow Ġthe Ġtext Ġfully ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( message . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Text . text Ġ+= Ġmessage . poll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Mouse Clicked ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect Line ( local ID ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbox Player Lines . children . add ( text ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Line ( choice Local ID : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbox Player Lines . children . clear () ĊĠĠĠĠĠĠĠ Ġnext Line ( next Node From Choice ( choice Local ID )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext Node (): ĠDialog ue Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgraph . next Node ( currentNode ) Ġ?: Ġmake Dummy End Node (" No Ġnext Ġnode Ġfrom Ġ$ currentNode ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext Node From Choice ( option ID : ĠInt ): ĠDialog ue Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgraph . next Node ( currentNode , Ġoption ID ) Ġ?: Ġmake Dummy End Node (" No Ġnext Ġnode Ġfrom Ġ$ currentNode Ġusing Ġoption Ġ$ option ID ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Dummy End Node ( text : ĠString ): ĠDialog ue Node Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . warning ( text ) ĊĠĠĠĠĠĠĠ Ġreturn ĠEnd Node ( text ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Open () Ġ{ ĊĠĠĠĠĠĠĠ Ġbox Player Lines . opacity Ġ= Ġ 1 . 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonClose () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Line Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġmessage . clear () ĊĠĠĠĠĠĠĠ Ġbox Player Lines . children . clear () ĊĠĠĠĠĠĠĠ Ġon Finished . run () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . parse And Call Functions () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfunc Calls Ġ= Ġthis . split ("\ n ". to Regex ()) ĊĊĠĠĠĠĠĠĠ Ġfunc Calls . forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . trim (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialogue Script Runner . call Function ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ