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

外挂编程

开发平台:

Windows_Unix

  1. #!/usr/bin/perl
  2. # See http://www.openkore.com/wiki/index.php/Field_file_format
  3. # for information about the file formats.
  4. use strict;
  5. my $i = 0;
  6. foreach my $name (sort(listMaps("."))) {
  7. $i++;
  8. print "$it$namen";
  9. gat2fld("$name.gat", "$name.fld", readWaterLevel("$name.rsw"));
  10. }
  11. sub listMaps {
  12. my ($dir) = @_;
  13. my $handle;
  14. opendir($handle, $dir);
  15. my @list = grep { /.gat$/i && -f $_ } readdir $handle;
  16. closedir $handle;
  17. foreach my $file (@list) {
  18. $file =~ s/.gat$//i;
  19. }
  20. return @list;
  21. }
  22. ##
  23. # float readWaterLevel(String rswFile)
  24. #
  25. # Read the map's water level from the corresponding RSW file.
  26. sub readWaterLevel {
  27. my ($rswFile) = @_;
  28. my ($f, $buf);
  29. if (!open($f, "<", $rswFile)) {
  30. print "Cannot open $rswFile for reading.n";
  31. exit 1;
  32. }
  33. seek $f, 166, 0;
  34. read $f, $buf, 4;
  35. close $f;
  36. return unpack("f", $buf);
  37. }
  38. ##
  39. # void gat2fld(String gat, String fld, float waterLevel)
  40. #
  41. # Convert a .GAT file to the specifid .FLD file.
  42. sub gat2fld {
  43. my ($gat, $fld, $waterLevel) = @_;
  44. my ($in, $out, $data);
  45. if (!open $in, "<", $gat) {
  46. print "Cannot open $gat for reading.n";
  47. exit 1;
  48. }
  49. if (!open $out, ">", $fld) {
  50. print "Cannot open $fld for writing.n";
  51. exit 1;
  52. }
  53. binmode $in;
  54. binmode $out;
  55. # Read header. Yes we're assuming that maps are never
  56. # larger than 2^16-1 blocks.
  57. read($in, $data, 14);
  58. print $out pack("v", unpack("V", substr($data, 6, 4)));
  59. print $out pack("v", unpack("V", substr($data, 10, 4)));
  60. while (read($in, $data, 20)) {
  61. my ($a, $b, $c, $d) = unpack("f4", $data);
  62. my $type = unpack("C", substr($data, 16, 1));
  63. my $averageDepth = ($a + $b + $c + $d) / 4;
  64. # In contrast to what the if-condition tells you,
  65. # we're actually checking whether this block
  66. # is below the map's water level.
  67. if ($averageDepth > $waterLevel) {
  68. # Block is below water level.
  69. if ($type == 0 || $type == 3) {
  70. # Walkable water
  71. print $out pack("C", 3);
  72. } elsif ($type == 1 || $type == 6) {
  73. # Non-walkable water (not snipable)
  74. print $out pack("C", 2);
  75. } elsif ($type == 5) {
  76. # Non-walkable water (snipable)
  77. print $out pack("C", 4);
  78. } else {
  79. # Unknown
  80. print $out pack("C", 7);
  81. }
  82. } else {
  83. # Block is above water level
  84. if ($type < 7) {
  85. print $out pack("C", $type);
  86. } else {
  87. print $out pack("C", 7);
  88. }
  89. }
  90. }
  91. close $in;
  92. close $out;