Advertisement
Guest User

Untitled

a guest
Jan 30th, 2015
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.86 KB | None | 0 0
  1. var fs = require('fs');
  2.  
  3. var level = 1;
  4.  
  5. var constants = {
  6. escape : 0xFD,
  7. nodeStart: 0xFE,
  8. nodeEnd : 0xFF
  9. };
  10.  
  11. var Reader = function(data) {
  12. var self = this;
  13. self.data = data;
  14. self.offset = 0;
  15.  
  16. self.byte = function() {
  17. ++self.offset;
  18. return self.data[self.offset - 1];
  19. };
  20.  
  21. self.uint8 = function() {
  22. ++self.offset;
  23. return self.data.readUInt8(self.offset - 1);
  24. };
  25.  
  26. self.peekUint8 = function() {
  27. return self.data[self.offset];
  28. };
  29.  
  30. self.uint16 = function() {
  31. self.offset += 2;
  32. return self.data.readUInt16LE(self.offset - 2);
  33. };
  34.  
  35. self.uint32 = function() {
  36. self.offset += 4;
  37. return self.data.readUInt32LE(self.offset - 4);
  38. };
  39. };
  40.  
  41. var Node = function(begin, size) {
  42. var self = this;
  43. self.data = '';
  44. self.nodes = [];
  45. self.begin = begin;
  46. self.size = size;
  47. self.index = 0;
  48.  
  49. self.handleBlock = function(begin, size) {
  50. ++level;
  51. var node = new Node(begin, size);
  52. self.nodes.push(node);
  53. return node;
  54. };
  55.  
  56. self.next = function() {
  57. if (self.index < self.nodes.length) {
  58. delete self.data;
  59.  
  60. var node = self.nodes[self.index];
  61. ++self.index;
  62. node.parse();
  63. return node;
  64. } else {
  65. delete self.nodes;
  66. return undefined;
  67. }
  68. };
  69.  
  70. self.parse = function() {
  71. otbm.offset = self.begin;
  72. var byte = otbm.byte();
  73. var nextIsEscaped = false;
  74. var size = 1;
  75.  
  76. while (otbm.offset < (self.begin + self.size)) {
  77. if (byte == constants.nodeStart && !nextIsEscaped) {
  78. var blockSize = self.sizer();
  79. var node = self.handleBlock(otbm.offset, blockSize);
  80. otbm.offset += blockSize;
  81. } else if (byte == constants.nodeEnd && !nextIsEscaped) {
  82. if (--level < 0) {
  83. throw 'Error!'
  84. }
  85. break;
  86. } else if (byte == constants.escape && !nextIsEscaped) {
  87. nextIsEscaped = true;
  88. } else {
  89. nextIsEscaped = false;
  90. ++size;
  91. }
  92. byte = otbm.byte();
  93. }
  94. self.data = new Reader(otbm.data.slice(self.begin, self.begin + size));
  95. };
  96.  
  97. self.sizer = function() {
  98. var oldOffset = otbm.offset;
  99. var subLevels = 1;
  100.  
  101. var byte = otbm.uint8();
  102. var nextIsEscaped = false;
  103.  
  104. while (byte != undefined) {
  105. if (byte == constants.nodeStart && !nextIsEscaped) {
  106. ++subLevels;
  107. } else if (byte == constants.nodeEnd && !nextIsEscaped) {
  108. if (--subLevels == 0) {
  109. break;
  110. }
  111. } else {
  112. nextIsEscaped = byte == constants.escape && !nextIsEscaped;
  113. }
  114. byte = otbm.uint8();
  115. }
  116. var size = otbm.offset - oldOffset;
  117. otbm.offset = oldOffset;
  118. return size;
  119. }
  120. };
  121.  
  122. var start = Date.now();
  123.  
  124. var dummyItems = {};
  125. var genItem = function(itemId) {
  126. if (typeof dummyItems[itemId] === 'undefined') {
  127. dummyItems[itemId] = new Item(itemId);
  128. }
  129. return dummyItems[itemId];
  130. };
  131.  
  132. var otbm = new Reader(fs.readFileSync('sample.otbm'));
  133. var root = new Node(5, otbm.data.length);
  134. root.parse();
  135. ++root.data.offset;
  136.  
  137. var version = root.data.uint32();
  138. var width = root.data.uint16();
  139. var height = root.data.uint16();
  140. console.log('OTBM version:', version, '\nDimensions:', width, 'x', height);
  141.  
  142. var itemsVersion = {
  143. major: root.data.uint32(),
  144. minor: root.data.uint32()
  145. };
  146.  
  147. var nodes = root.next();
  148. ++nodes.data.offset;
  149.  
  150. var description = '';
  151. while (nodes.data.peekUint8()) {
  152. var attr = nodes.data.uint8();
  153. if (attr == 1) {
  154. description += nodes.data.toString() + '\n';
  155. }
  156. }
  157.  
  158. console.log('Description:', description);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement