/* Ċ Ġ* Ġ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 . ai . go ap Ċ Ċ import Ġcom . al mas b . fx gl . core . collection . Property Map Ċ import Ġcom . al mas b . fx gl . entity . Entity Ċ import Ġcom . al mas b . fx gl . entity . action . Action Component Ċ import Ġcom . al mas b . fx gl . entity . component . Component Ċ import Ġcom . al mas b . fx gl . entity . component . Required Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . Linked HashSet Ċ Ċ /** Ċ Ġ* ĠAdapt ed Ġfrom Ġhttps :// github . com / sp lo reg / go ap Ċ Ġ* ĠOriginal Ġsource : ĠC #, Ġauthor : ĠB rent ĠAn thon y ĠO w ens . Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġthe Ġimplementing Ġclass Ġthat Ġprovides Ġour Ġworld Ġdata Ġand Ġlist ens Ġto Ġfeedback Ġon Ġplanning . Ċ Ġ* Ċ Ġ* Ġ@ author ĠAl mas ĠB aim ag amb et ov Ġ( al mas lvl @ gmail . com ) Ċ Ġ*/ Ċ @ Required ( Action Component :: class ) Ċ class ĠGo ap Component ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġworld Properties : ĠProperty Map , ĊĠĠĠĠĠĠĠ Ġvar Ġgoal : ĠWorld State , ĊĠĠĠĠĠĠĠ Ġactions : ĠSet < Go ap Action >) Ġ: ĠComponent () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġaction Component : ĠAction Component ĊĊĠĠĠ Ġvar Ġlistener : ĠGo ap Listener Ġ= ĠNo op Listener ĊĊĠĠĠ Ġprivate Ġval Ġavailable Actions Ġ= ĠLinked HashSet ( actions ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Added () Ġ{ ĊĠĠĠĠĠĠĠ Ġavailable Actions . forEach Ġ{ Ġit . entity Ġ= Ġentity Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonUpdate ( tp f : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( action Component . is Idle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Plan () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Plan () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġcheck Ġif Ġgoal Ġalready Ġmet Ġand Ġif Ġso , Ġswitch Ġto ĠId le Ġaction ĊĊĠĠĠĠĠĠĠ Ġprintln (" M aking Ġa Ġnew Ġplan !") ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġwhy Ġdoes Ġthis Ġnot Ġwork ? ĊĠĠĠĠĠĠĠ Ġ// action Component . clear Actions () ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġworld Ġstate Ġand Ġthe Ġgoal Ġwe Ġwant Ġto Ġplan Ġfor ĊĠĠĠĠĠĠĠ Ġval Ġworld State Ġ= ĠWorld State ( world Properties ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġlocal Ġstate ĊĠĠĠĠĠĠĠ Ġentity . properties . keys (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworld State . add ( it , Ġentity . properties . getValue ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġplan Ġ= ĠGo ap Planner . plan ( available Actions , Ġworld State , Ġgoal ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! plan . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . plan Found ( entity , Ġgoal , Ġplan ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġplan . forEach Ġ{ Ġaction Component . push Action ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . plan Failed ( entity , Ġgoal ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĊĊĊĊ Ċ // Ċ // ĠĠĠ Ġprivate Ġfun Ġexecute Plan () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ(! has Action Plan ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . actions Finished ( entity ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġvar Ġaction Ġ= Ġcurrent Actions . peek () Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( action . is Complete ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġaction Ġis Ġdone . ĠRemove Ġit Ġso Ġwe Ġcan Ġperform Ġthe Ġnext Ġone Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Actions . remove () Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġre - run Ġplanning Ġin Ġcase Ġthe Ġworld Ġstate Ġhas Ġchanged Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// make Plan () Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( has Action Plan ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġnext Ġaction Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= Ġcurrent Actions . peek () Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Action Ġ= Ġaction Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġis ĠMove Go ap Action ) Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action . isIn Range ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġperform Ġthe Ġaction Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġaction . perform () Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! success ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġaction Ġfailed , Ġwe Ġneed Ġto Ġplan Ġagain Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Idle Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . plan Abort ed ( entity , Ġaction ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmove Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġaction . move () Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! success ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġaction Ġfailed , Ġwe Ġneed Ġto Ġplan Ġagain Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Idle Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . plan Abort ed ( entity , Ġaction ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġperform Ġthe Ġaction Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġaction . perform () Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! success ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġaction Ġfailed , Ġwe Ġneed Ġto Ġplan Ġagain Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Idle Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . plan Abort ed ( entity , Ġaction ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġis Idle Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . actions Finished ( entity ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġfun Ġadd Action ( action : ĠGo ap Action ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġavailable Actions . add ( action ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġfun Ġremove Action ( action : ĠGo ap Action ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġavailable Actions . remove ( action ) Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠNo op Listener Ġ: ĠGo ap Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġplan Found ( entity : ĠEntity , Ġgoal : ĠWorld State , Ġactions : ĠQueue < Go ap Action >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġplan Failed ( entity : ĠEntity , Ġfailed Goal : ĠWorld State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġactions Finished ( entity : ĠEntity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġplan Abort ed ( entity : ĠEntity , Ġabort er : ĠGo ap Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ