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

外挂编程

开发平台:

Windows_Unix

  1. #!/usr/bin/perl
  2. # See http://www.openkore.com/wiki/index.php/Field2_file_format
  3. # for information about the file formats.
  4. # fld_to_fld2
  5. use strict;
  6. use constant {
  7. TILE_NOWALK => 0,
  8. TILE_WALK => 1,
  9. TILE_SNIPE => 2,
  10. TILE_WATER => 4,
  11. TILE_CLIFF => 8,
  12. };
  13. # conversion (ex. $TILE_TYPE[0] = TILE_WALK = 1), (ex. $TILE_TYPE[1] = TILE_NOWALK = 0)
  14. my @TILE_TYPE = ( TILE_WALK, # 0) Walkable
  15. TILE_NOWALK, # 1) Non-walkable
  16. TILE_WATER, # 2) Non-walkable water (not snipable)
  17. TILE_WALK|TILE_WATER, # 3) Walkable water
  18. TILE_WATER|TILE_SNIPE, # 4) Non-walkable water (snipable)
  19. TILE_CLIFF|TILE_SNIPE, # 5) Cliff (snipable)
  20. TILE_CLIFF); # 6) Cliff (not snipable)
  21. my $i = 0;
  22. foreach my $name (sort(listMaps("."))) {
  23. $i++;
  24. fld_to_fld2("$name.fld", "$name.fld2");
  25. }
  26. sub listMaps {
  27. my ($dir) = @_;
  28. my $handle;
  29. opendir($handle, $dir);
  30. my @list = grep { /.fld$/i && -f $_ } readdir $handle;
  31. closedir $handle;
  32. foreach my $file (@list) {
  33. $file =~ s/.fld$//i;
  34. }
  35. return @list;
  36. }
  37. ##
  38. # void fld_to_fld2(String fld, String fld2)
  39. #
  40. # Convert a .FLD file to the specified .FLD2 file.
  41. sub fld_to_fld2 {
  42. my ($fld, $fld2) = @_;
  43. my ($in, $out, $data);
  44. if (!open $in, "<", $fld) {
  45. print "Cannot open $fld for reading.n";
  46. exit 1;
  47. }
  48. if (!open $out, ">", $fld2) {
  49. print "Cannot open $fld2 for writing.n";
  50. exit 1;
  51. }
  52. binmode $in;
  53. binmode $out;
  54. # Read fld header.
  55. read($in, $data, 4);
  56. my ($width, $height) = unpack("v2", $data);
  57. my $size = $width * $height;
  58. # when y = height, we variate x from 0 to width
  59. # thus, we variate block offset from size - width to size
  60. my $max_Y = $size - $width;
  61. print $out pack ("v2", $width, $height);
  62. my ($y, $x) = (1, 1);
  63. while (read($in, $data, 1)) {
  64. my $type = unpack("C", $data);
  65. # warn us for unknown/new block types
  66. if ($type > $#TILE_TYPE) {
  67. print "An unknown blocktype ($type) was found, please report this to the OpenKore devs.n";
  68. exit 1;
  69. # make upper blocks unwalkable
  70. } elsif ($y > $max_Y ) {
  71. print $out pack("C", TILE_NOWALK);
  72. # make rightern blocks unwalkable
  73. } elsif ($y == $x * $width) {
  74. $x++;
  75. print $out pack("C", TILE_NOWALK);
  76. # convert fld to fld2
  77. } else {
  78. print $out pack("C", $TILE_TYPE[$type]);
  79. }
  80. $y++;
  81. }
  82. close $in;
  83. close $out;
  84. }