/* Ċ Ġ* Ġ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 . extra . ai . go ap Ċ Ċ import Ġcom . al mas b . fx gl . entity . Entity Ċ import Ġcom . al mas b . fx gl . entity . component . Component Ċ import Ġcom . al mas b . fx gl . entity . component . Required Ċ import Ġcom . al mas b . fx gl . entity . components . Position Component Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠAdapt ed Ġfrom Ġhttps :// github . com / sp lo reg / go ap Ċ Ġ* ĠOriginal Ġsource : ĠC #, Ġauthor : ĠB rent ĠAn thon y ĠO w ens . Ċ Ġ* Ċ Ġ* Ġ@ author ĠAl mas ĠB aim ag amb et ov Ġ( al mas lvl @ gmail . com ) Ċ Ġ*/ Ċ @ Required ( Position Component :: class ) Ċ class ĠGo ap Control ( private Ġval Ġagent : ĠGo ap Agent Ġ// Ġthis Ġis Ġthe Ġimplementing Ġclass Ġthat Ġprovides Ġour Ġworld Ġdata Ġand Ġlist ens Ġto Ġfeedback Ġon Ġplanning ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġprivate Ġval Ġmove Speed : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactions : ĠSet < Go ap Action >) Ġ: ĠComponent () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġstate Machine Ġ= ĠF SM () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThink ing Ġ( find s Ġsomething Ġto Ġdo ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġidle State : ĠF SM State ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMoving Ġto Ġtarget . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmove To State : ĠF SM State ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerform ing Ġan Ġaction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġperform Action State : ĠF SM State ĊĊĠĠĠ Ġprivate Ġval Ġavailable Actions Ġ= ĠHashSet ( actions ) ĊĠĠĠ Ġprivate Ġvar Ġcurrent Actions : ĠQueue < Go ap Action > Ġ= ĠArray Deque < Go ap Action >() ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġposition : ĠPosition Component ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġidle State Ġ= Ġcreate Idle State () ĊĠĠĠĠĠĠĠ Ġmove To State Ġ= Ġcreate MoveTo State () ĊĠĠĠĠĠĠĠ Ġperform Action State Ġ= Ġcreate Perform Action State () ĊĊĠĠĠĠĠĠĠ Ġstate Machine . push State ( idle State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġt pf : ĠDouble Ġ= Ġ 0 . 0 ĊĊĠĠĠ Ġoverride Ġfun ĠonUpdate ( tp f : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . tp f Ġ= Ġt pf ĊĠĠĠĠĠĠĠ Ġstate Machine . update ( entity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Action ( action : ĠGo ap Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġavailable Actions . add ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Action ( action : ĠGo ap Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġavailable Actions . remove ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Action Plan () Ġ= Ġcurrent Actions . isNotEmpty () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġduring Ġupdate . ĊĠĠĠĠ Ġ* ĠMove Ġthe Ġagent Ġtowards Ġthe Ġtarget Ġin Ġorder ĊĠĠĠĠ Ġ* Ġfor Ġthe Ġnext Ġaction Ġto Ġbe Ġable Ġto Ġperform . ĊĠĠĠĠ Ġ* ĠReturn Ġtrue Ġif Ġthe ĠAgent Ġis Ġat Ġthe Ġtarget Ġand Ġthe Ġnext Ġaction Ġcan Ġperform . ĊĠĠĠĠ Ġ* ĠFalse Ġif Ġit Ġis Ġnot Ġthere Ġyet . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmove Agent ( next Action : ĠGo ap Action ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire NotNull ( next Action . target ){ Ġ" Go ap Action : Ġ$ next Action Ġhas Ġno Ġtarget " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Position Ġ= Ġnext Action . target !!. getComponent ( Position Component :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Go ap Action : Ġ$ next Action Ġhas Ġtarget Ġwithout ĠPosition Component ") ĊĊĠĠĠĠĠĠĠ Ġval Ġmove Distance Ġ= Ġmove Speed Ġ* Ġt pf ĊĊĠĠĠĠĠĠĠ Ġif Ġ( position . distance ( target Position ) Ġ>= Ġmove Distance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition . translate ( target Position . value . subtract ( position . value ). normalize (). multiply ( move Distance )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnext Action . isIn Range Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Idle State (): ĠF SM State Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠF SM State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate ( fsm : ĠF SM , Ġentity : ĠEntity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGO AP Ġplanning ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġworld Ġstate Ġand Ġthe Ġgoal Ġwe Ġwant Ġto Ġplan Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġworld State Ġ= Ġagent . obtain World State ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgoal Ġ= Ġagent . create Goal State ( entity ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPlan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplan Ġ= ĠGo ap Planner . plan ( entity , Ġavailable Actions , Ġworld State , Ġgoal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! plan . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġhave Ġa Ġplan , Ġho or ay ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Actions Ġ= Ġplan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġagent . plan Found ( entity , Ġgoal , Ġplan ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . pop State () Ġ// Ġmove Ġto ĠPerform Action Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . push State ( perform Action State ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ugh , Ġwe Ġcouldn 't Ġget Ġa Ġplan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġagent . plan Failed ( entity , Ġgoal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . pop State () Ġ// Ġmove Ġback Ġto ĠId le Action Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . push State ( idle State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate MoveTo State (): ĠF SM State Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠF SM State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate ( fsm : ĠF SM , Ġentity : ĠEntity ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġcurrent Actions . peek () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action . requires InRange () Ġ&& Ġaction . target Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . pop State () Ġ// Ġmove ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . pop State () Ġ// Ġperform ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . push State ( idle State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġagent Ġto Ġmove Ġitself ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( move Agent ( action )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . pop State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Perform Action State (): ĠF SM State Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠF SM State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate ( fsm : ĠF SM , Ġentity : ĠEntity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Action Plan ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġactions Ġto Ġperform ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . pop State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . push State ( idle State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġagent . actions Finished ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaction Ġ= Ġcurrent Actions . peek () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action . is Done ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġaction Ġis Ġdone . ĠRemove Ġit Ġso Ġwe Ġcan Ġperform Ġthe Ġnext Ġone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Actions . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Action Plan ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġperform Ġthe Ġnext Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= Ġcurrent Actions . peek () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin Range Ġ= Ġif Ġ( action . requires InRange ()) Ġaction . isIn Range Ġelse Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( in Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġare Ġin Ġrange , Ġso Ġperform Ġthe Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġaction . perform ( entity ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġaction Ġfailed , Ġwe Ġneed Ġto Ġplan Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . pop State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . push State ( idle State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġagent . plan Abort ed ( entity , Ġaction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġneed Ġto Ġmove Ġthere Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpush Ġmove To Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . push State ( moveTo State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġactions Ġleft , Ġmove Ġto ĠPlan Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . pop State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . push State ( idle State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġagent . actions Finished ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ