@@ -271,45 +271,58 @@ function updateEntities(deltaTime) {
271271 entity . y = entity . homeY ;
272272 returnFlowFields . delete ( entity . id ) ;
273273 entity . needsReturnPath = false ;
274+ entity . stuckFrames = 0 ;
274275 continue ;
275276 }
276277
277- if ( ! entity . needsReturnPath && dist > 0.5 ) {
278- entity . needsReturnPath = true ;
279- requestReturnPath ( entity ) ;
280- }
281-
282- const returnField = returnFlowFields . get ( entity . id ) ;
283- if ( returnField ) {
284- const returnVector = returnField . get ( key ) ;
285- if ( returnVector ) {
286- const newX = entity . x + returnVector . dx * RETURN_SPEED * deltaTime ;
287- const newY = entity . y + returnVector . dy * RETURN_SPEED * deltaTime ;
288- if ( isWalkable ( newX , newY ) ) {
289- entity . x = newX ;
290- entity . y = newY ;
291- } else if ( isWalkable ( newX , entity . y ) ) {
292- entity . x = newX ;
293- } else if ( isWalkable ( entity . x , newY ) ) {
294- entity . y = newY ;
295- }
296- continue ;
297- }
298- }
299-
300278 const nx = dx / dist ;
301279 const ny = dy / dist ;
302280 const move = Math . min ( dist , RETURN_SPEED * deltaTime ) ;
303- const newX = entity . x + nx * move ;
304- const newY = entity . y + ny * move ;
281+ const directX = entity . x + nx * move ;
282+ const directY = entity . y + ny * move ;
283+
284+ let moved = false ;
285+ if ( isWalkable ( directX , directY ) ) {
286+ entity . x = directX ;
287+ entity . y = directY ;
288+ moved = true ;
289+ entity . stuckFrames = 0 ;
290+ returnFlowFields . delete ( entity . id ) ;
291+ entity . needsReturnPath = false ;
292+ } else if ( isWalkable ( directX , entity . y ) ) {
293+ entity . x = directX ;
294+ moved = true ;
295+ entity . stuckFrames = 0 ;
296+ } else if ( isWalkable ( entity . x , directY ) ) {
297+ entity . y = directY ;
298+ moved = true ;
299+ entity . stuckFrames = 0 ;
300+ }
305301
306- if ( isWalkable ( newX , newY ) ) {
307- entity . x = newX ;
308- entity . y = newY ;
309- } else if ( isWalkable ( newX , entity . y ) ) {
310- entity . x = newX ;
311- } else if ( isWalkable ( entity . x , newY ) ) {
312- entity . y = newY ;
302+ if ( ! moved ) {
303+ entity . stuckFrames = ( entity . stuckFrames || 0 ) + 1 ;
304+
305+ if ( entity . stuckFrames > 5 && ! entity . needsReturnPath ) {
306+ entity . needsReturnPath = true ;
307+ requestReturnPath ( entity ) ;
308+ }
309+
310+ const returnField = returnFlowFields . get ( entity . id ) ;
311+ if ( returnField ) {
312+ const returnVector = returnField . get ( key ) ;
313+ if ( returnVector ) {
314+ const pathX = entity . x + returnVector . dx * RETURN_SPEED * deltaTime ;
315+ const pathY = entity . y + returnVector . dy * RETURN_SPEED * deltaTime ;
316+ if ( isWalkable ( pathX , pathY ) ) {
317+ entity . x = pathX ;
318+ entity . y = pathY ;
319+ } else if ( isWalkable ( pathX , entity . y ) ) {
320+ entity . x = pathX ;
321+ } else if ( isWalkable ( entity . x , pathY ) ) {
322+ entity . y = pathY ;
323+ }
324+ }
325+ }
313326 }
314327 }
315328 }
0 commit comments