package Ġfs . water physics Ċ Ċ class ĠJ PS ( private Ġval Ġworld : ĠWorld ) Ġ{ ĊĠ Ġfun Ġsuccess ors ( current : ĠJump Node , Ġtarget : ĠInt ): ĠList < Jump Node > Ġ{ ĊĠĠĠ Ġval Ġsuccess ors Ġ= Ġmutable ListOf < Jump Node >() ĊĠĠĠ Ġfor Ġ( dir Ġin Ġcurrent . dirs ) Ġ{ ĊĠĠĠĠĠ Ġval Ġjump Node Ġ= Ġjump ( current . pos , Ġdir , Ġtarget ) ĊĠĠĠĠĠ Ġif Ġ( jump Node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuccess ors . add ( jump Node ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġsuccess ors ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġjump ( current : ĠVector 2 i , Ġdir : ĠVector 2 i , Ġtarget : ĠInt ): ĠJump Node ? Ġ{ ĊĠĠĠ Ġval Ġnext Ġ= Ġcurrent Ġ+ Ġdir ĊĠĠĠ Ġif Ġ( is Blocking ( next )) Ġreturn ĠJump Node ( current , ĠlistOf ()) ĊĠĠĠ Ġif Ġ( world . water Potential ( next ) Ġ>= Ġtarget ) Ġreturn ĠJump Node ( next , ĠlistOf ()) ĊĊĠĠĠ Ġwhen Ġ( dir ) Ġ{ ĊĠĠĠĠĠ ĠVector 2 i . AXIS _ Y , ĠVector 2 i . AXIS _ NEG _ Y Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Blocking ( next Ġ+ ĠVector 2 i . AXIS _ X ) Ġ|| Ġ! is Blocking ( next Ġ+ ĠVector 2 i . AXIS _ NEG _ X )) ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠJump Node ( next , ĠVector 2 i . X _ PL ANE Ġ+ Ġdir ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠVector 2 i . AXIS _ X , ĠVector 2 i . AXIS _ NEG _ X Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblocking Ġ= Ġblocking ( current , Ġnext , ĠVector 2 i . Y _ PL ANE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( blocking . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠJump Node ( next , Ġblocking Ġ+ Ġdir ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġjump ( next , Ġdir , Ġtarget ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġblocking ( current : ĠVector 2 i , Ġnext : ĠVector 2 i , Ġdirs : ĠList < Vector 2 i >): ĠList < Vector 2 i > Ġ{ ĊĠĠĠ Ġreturn Ġdirs . filter Ġ{ Ġis Blocking ( current Ġ+ Ġit ) Ġ&& Ġ! is Blocking ( next Ġ+ Ġit ) Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis Blocking ( pos : ĠVector 2 i ) ĊĠĠĠĠĠ Ġ= Ġ(! world . has ( pos ) Ġ|| Ġworld [ pos ]. flow Ġ== Ġ 0 ) Ċ } Ċ Ċ data Ġclass ĠJump Node ( val Ġpos : ĠVector 2 i , Ġval Ġdirs : ĠList < Vector 2 i >)