5
5
// Includes Binary Heap (with modifications) from Marijn Haverbeke.
6
6
// http://eloquentjavascript.net/appendix2.html
7
7
8
+ "use strict" ;
9
+
8
10
( function ( definition ) {
9
11
if ( typeof module === 'object' && typeof module . exports === 'object' ) {
10
12
module . exports = definition ( ) ;
@@ -52,6 +54,7 @@ var astar = {
52
54
options = options || { } ;
53
55
var heuristic = options . heuristic || astar . manhattan ;
54
56
var diagonal = ! ! options . diagonal ;
57
+ var portals = ! ! options . portals ;
55
58
var closest = options . closest || false ;
56
59
57
60
var openHeap = astar . heap ( ) ;
@@ -89,7 +92,8 @@ var astar = {
89
92
90
93
// Find all neighbors for the current node. Optionally find diagonal neighbors as well (false by default).
91
94
var disabledDirections = ( currentNode . options . disabledDirections != null ) ? currentNode . options . disabledDirections : { } ;
92
- var neighbors = astar . neighbors ( grid , currentNode , { diagonals :diagonal , disabledDirections :disabledDirections } ) ;
95
+ var portalTargets = ( ( currentNode . options . portalTargets != null ) && portals ) ? currentNode . options . portalTargets : [ ] ;
96
+ var neighbors = astar . neighbors ( grid , currentNode , { diagonals :diagonal , disabledDirections :disabledDirections , portalTargets :portalTargets } ) ;
93
97
94
98
var validNeighborCount = 0 ;
95
99
for ( var i in neighbors ) {
@@ -101,7 +105,7 @@ var astar = {
101
105
102
106
//This will help us find paths that are mostly not diagonal, but may have node that diagonal is the only option
103
107
if ( ( validNeighborCount == 0 ) && ( diagonal == false ) ) {
104
- astar . neighbors ( grid , currentNode , { diagonals :true , disabledDirections :disabledDirections } ) ;
108
+ astar . neighbors ( grid , currentNode , { diagonals :true , disabledDirections :disabledDirections , portalTargets : portalTargets } ) ;
105
109
}
106
110
107
111
for ( var i = 0 , il = neighbors . length ; i < il ; i ++ ) {
@@ -177,11 +181,16 @@ var astar = {
177
181
options = options || { } ;
178
182
var diagonals = options . diagonals || false ;
179
183
var dd = options . disabledDirections || { } ;
184
+ var pt = options . portalTargets || [ ] ;
180
185
181
186
function IsDirectionEnabled ( dir ) {
182
187
return ! dd [ dir ] ;
183
188
}
184
189
190
+ function PositionExists ( px , py ) {
191
+ return ( grid [ px ] && grid [ px ] [ py ] ) ;
192
+ }
193
+
185
194
// West
186
195
if ( grid [ x - 1 ] && grid [ x - 1 ] [ y ] && IsDirectionEnabled ( 'w' ) ) {
187
196
ret . push ( grid [ x - 1 ] [ y ] ) ;
@@ -226,6 +235,13 @@ var astar = {
226
235
227
236
}
228
237
238
+ for ( var p = 0 ; p < pt . length ; p ++ ) {
239
+ var target = pt [ p ] ;
240
+ if ( PositionExists ( target . x , target . y ) ) {
241
+ ret . push ( grid [ target . x ] [ target . y ] ) ;
242
+ }
243
+ }
244
+
229
245
return ret ;
230
246
}
231
247
} ;
0 commit comments