PathFinding.pm
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:4k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - Pathfinding algorithm
  3. #
  4. #  This software is open source, licensed under the GNU General Public
  5. #  License, version 2.
  6. #  Basically, this means that you're allowed to modify and distribute
  7. #  this software. However, if you distribute modified versions, you MUST
  8. #  also distribute the source code.
  9. #  See http://www.gnu.org/licenses/gpl.html for the full license.
  10. #########################################################################
  11. ##
  12. # MODULE DESCRIPTION: Pathfinding algorithm.
  13. #
  14. # This module implements the
  15. # <a href="http://en.wikipedia.org/wiki/A-star_search_algorithm">A*</a>
  16. # (A-Star) pathfinding algorithm, which you can use to calculate how to
  17. # walk to a certain spot on the map.
  18. #
  19. # This module is only for <i>calculation</i> of a route, not for
  20. # telling OpenKore to walk to a certain place. That's what ai_route() is for.
  21. # The actual algorithm itself is implemented in auto/XSTools/pathfinding/algorithm.{cpp|h}.
  22. # This module is a Perl XS wrapper API for that algorithm. Most functions in this module
  23. # are implemented in auto/XSTools/pathfinding/wrapper.xs.
  24. package PathFinding;
  25. use strict;
  26. use warnings;
  27. use Carp;
  28. use XSTools;
  29. use Modules 'register';
  30. XSTools::bootModule("PathFinding");
  31. ##
  32. # PathFinding->new([args])
  33. # args: Arguments to pass to $PathFinding->reset().
  34. #
  35. # Create a new PathFinding object. If args are given, the object will
  36. # be initialized for you. If not, you must initialize it yourself
  37. # by calling $PathFinding->reset().
  38. sub new {
  39. my $class = shift;
  40. my $self = create();
  41. $self->reset(@_) if (@_);
  42. return $self;
  43. }
  44. ##
  45. # $PathFinding->reset(args...)
  46. # Returns: a PathFinding object
  47. #
  48. # Required arguments:
  49. # `l
  50. # - start: a hash containing x and y values where the path should start.<br>
  51. # - dest: a hash as above, but for the path's destination.
  52. # `l`
  53. #
  54. # Semi-required arguments:
  55. # `l
  56. # - field: a hash with the keys <tt>dstMap</tt>, <tt>width</tt>, and <tt>height</tt>
  57. # `l`
  58. # OR all of:
  59. # `l
  60. # - distance_map: a reference to a field map with precomuted distances from walls
  61. # - width: the width of the field
  62. # - height: the height of the field
  63. # `l`
  64. #
  65. # Optional arguments:
  66. # `l
  67. # - timeout: the number of milliseconds to run each step for, defaults to 1500
  68. # - weights: a reference to a string of 256 characters, used as the weights to give
  69. #            squares from 0 to 255 squares away from the closest wall. The first
  70. #            character must be chr(255).
  71. # `l`
  72. sub reset {
  73. my $class = shift;
  74. my %args = @_;
  75. # Check arguments
  76. croak "Required arguments missing, specify 'field' or 'distance_map' and 'width' and 'height'n"
  77. unless $args{field} || ($args{distance_map} && $args{width} && $args{height});
  78. croak "Required argument 'start' missingn" unless $args{start};
  79. croak "Required argument 'dest' missingn" unless $args{dest};
  80. # Default optional arguments
  81. $args{distance_map} = $args{field}{dstMap} unless $args{distance_map};
  82. $args{width} = $args{field}{width} unless $args{width};
  83. $args{height} = $args{field}{height} unless $args{height};
  84. $args{timeout} = 1500 unless $args{timeout};
  85. die if (!$args{field}{dstMap});
  86. return $class->_reset($args{distance_map}, $args{weights}, $args{width}, $args{height},
  87. $args{start}{x}, $args{start}{y},
  88. $args{dest}{x}, $args{dest}{y},
  89. $args{timeout});
  90. }
  91. ##
  92. # $PathFinding->run(r_array)
  93. # r_array: Reference to an array in which the solution is stored. It will contain
  94. #     hashes of x and y coordinates from the start to the end of the path.
  95. # Returns: -1 on failure, 0 when pathfinding is not yet complete, or the number
  96. #     of steps required to walk from source to destination.
  97. ##
  98. # $PathFinding->runref()
  99. # Returns: undef on failure, 0 when pathfinding is not yet complete, or an array
  100. #     reference when a path is found. The array reference contains hashes of x
  101. #     and y coordinates from the start to the end of the path.
  102. ##
  103. # $PathFinding->runstr()
  104. # Returns: undef on failure, 0 when pathfinding is not yet complete, or a string
  105. #     of packed shorts. The shorts are pairs of X and Y coordinates running
  106. #     from the end to the start of the path. (note that the order is reversed)
  107. ##
  108. # $PathFinding->runcount()
  109. # Returns: -1 on failure, 0 when pathfinding is not yet complete, or the
  110. #     number of steps required to walk from source to destination.
  111. 1;