Guest User

importMMMap.js

a guest
Oct 10th, 2016
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. marker = 'TPF0';
  3.  
  4. vaNull = 0;
  5. vaList = 1;
  6. vaInt8 = 2;
  7. vaInt16 = 3;
  8. vaInt32 = 4;
  9. vaExtended = 5;
  10. vaString = 6;
  11. vaIdent = 7;
  12. vaFalse = 8;
  13. vaTrue = 9;
  14. vaBinary = 10;
  15. vaSet = 11;
  16. vaLString = 12;
  17. vaNil = 13;
  18. vaCollection = 14;
  19. vaSingle = 15;
  20. vaCurrency = 16;
  21. vaDate = 17;
  22. vaWString = 18;
  23. vaInt64 = 19;
  24. vaUTF8String = 20;
  25.  
  26. cp1251 = [];
  27. cp1251[1026] = 128;
  28. cp1251[1027] = 129;
  29. cp1251[8218] = 130;
  30. cp1251[1107] = 131;
  31. cp1251[8222] = 132;
  32. cp1251[8230] = 133;
  33. cp1251[8224] = 134;
  34. cp1251[8225] = 135;
  35. cp1251[8364] = 136;
  36. cp1251[8240] = 137;
  37. cp1251[1033] = 138;
  38. cp1251[8249] = 139;
  39. cp1251[1034] = 140;
  40. cp1251[1036] = 141;
  41. cp1251[1035] = 142;
  42. cp1251[1039] = 143;
  43. cp1251[1106] = 144;
  44. cp1251[8216] = 145;
  45. cp1251[8217] = 146;
  46. cp1251[8220] = 147;
  47. cp1251[8221] = 148;
  48. cp1251[8226] = 149;
  49. cp1251[8211] = 150;
  50. cp1251[8212] = 151;
  51. cp1251[152] = 152;
  52. cp1251[8482] = 153;
  53. cp1251[1113] = 154;
  54. cp1251[8250] = 155;
  55. cp1251[1114] = 156;
  56. cp1251[1116] = 157;
  57. cp1251[1115] = 158;
  58. cp1251[1119] = 159;
  59. cp1251[160] = 160;
  60. cp1251[1038] = 161;
  61. cp1251[1118] = 162;
  62. cp1251[1032] = 163;
  63. cp1251[164] = 164;
  64. cp1251[1168] = 165;
  65. cp1251[166] = 166;
  66. cp1251[167] = 167;
  67. cp1251[1025] = 168;
  68. cp1251[169] = 169;
  69. cp1251[1028] = 170;
  70. cp1251[171] = 171;
  71. cp1251[172] = 172;
  72. cp1251[173] = 173;
  73. cp1251[174] = 174;
  74. cp1251[1031] = 175;
  75. cp1251[176] = 176;
  76. cp1251[177] = 177;
  77. cp1251[1030] = 178;
  78. cp1251[1110] = 179;
  79. cp1251[1169] = 180;
  80. cp1251[181] = 181;
  81. cp1251[182] = 182;
  82. cp1251[183] = 183;
  83. cp1251[1105] = 184;
  84. cp1251[8470] = 185;
  85. cp1251[1108] = 186;
  86. cp1251[187] = 187;
  87. cp1251[1112] = 188;
  88. cp1251[1029] = 189;
  89. cp1251[1109] = 190;
  90. cp1251[1111] = 191;
  91. cp1251[1040] = 192;
  92. cp1251[1041] = 193;
  93. cp1251[1042] = 194;
  94. cp1251[1043] = 195;
  95. cp1251[1044] = 196;
  96. cp1251[1045] = 197;
  97. cp1251[1046] = 198;
  98. cp1251[1047] = 199;
  99. cp1251[1048] = 200;
  100. cp1251[1049] = 201;
  101. cp1251[1050] = 202;
  102. cp1251[1051] = 203;
  103. cp1251[1052] = 204;
  104. cp1251[1053] = 205;
  105. cp1251[1054] = 206;
  106. cp1251[1055] = 207;
  107. cp1251[1056] = 208;
  108. cp1251[1057] = 209;
  109. cp1251[1058] = 210;
  110. cp1251[1059] = 211;
  111. cp1251[1060] = 212;
  112. cp1251[1061] = 213;
  113. cp1251[1062] = 214;
  114. cp1251[1063] = 215;
  115. cp1251[1064] = 216;
  116. cp1251[1065] = 217;
  117. cp1251[1066] = 218;
  118. cp1251[1067] = 219;
  119. cp1251[1068] = 220;
  120. cp1251[1069] = 221;
  121. cp1251[1070] = 222;
  122. cp1251[1071] = 223;
  123. cp1251[1072] = 224;
  124. cp1251[1073] = 225;
  125. cp1251[1074] = 226;
  126. cp1251[1075] = 227;
  127. cp1251[1076] = 228;
  128. cp1251[1077] = 229;
  129. cp1251[1078] = 230;
  130. cp1251[1079] = 231;
  131. cp1251[1080] = 232;
  132. cp1251[1081] = 233;
  133. cp1251[1082] = 234;
  134. cp1251[1083] = 235;
  135. cp1251[1084] = 236;
  136. cp1251[1085] = 237;
  137. cp1251[1086] = 238;
  138. cp1251[1087] = 239;
  139. cp1251[1088] = 240;
  140. cp1251[1089] = 241;
  141. cp1251[1090] = 242;
  142. cp1251[1091] = 243;
  143. cp1251[1092] = 244;
  144. cp1251[1093] = 245;
  145. cp1251[1094] = 246;
  146. cp1251[1095] = 247;
  147. cp1251[1096] = 248;
  148. cp1251[1097] = 249;
  149. cp1251[1098] = 250;
  150. cp1251[1099] = 251;
  151. cp1251[1100] = 252;
  152. cp1251[1101] = 253;
  153. cp1251[1102] = 254;
  154. cp1251[1103] = 255;
  155.  
  156. mapdata = [];
  157.  
  158. function parseByte() {
  159.     var ret = mapdata.charCodeAt(0);
  160.     if (ret > 127)
  161.         ret = cp1251[ret]
  162.     mapdata = mapdata.substr(1);
  163.     return ret;
  164. }
  165.  
  166. function parseValue() {
  167.     var prop_type = mapdata.charCodeAt(0);
  168.     var ret = null;
  169.     mapdata = mapdata.substr(1);
  170.     switch (prop_type) {
  171.         case vaNull:
  172.         case vaNil:
  173.             break;
  174.         case vaList:
  175.             ret = [];
  176.             while (mapdata.length > 0) {
  177.                 var val = parseValue();
  178.                 if (val == null)
  179.                     break;
  180.                 ret.push(val);
  181.             }
  182.             break;
  183.         case vaInt8:
  184.             ret = parseByte();
  185.             if (ret > 127)
  186.                 ret -= 256;
  187.             break;
  188.         case vaInt16:
  189.             ret = parseByte() + parseByte() * 256;
  190.             break;
  191.         case vaInt32:
  192.             ret = parseByte() + parseByte() * 256
  193.               + parseByte() * 256 * 256  + parseByte() * 256 * 256 * 256;
  194.             break;
  195.         case vaString:
  196.         case vaIdent:
  197.             var len = parseByte();
  198.             ret = mapdata.substr(0, len);
  199.             mapdata = mapdata.substr(len);
  200.             break;
  201.         case vaFalse:
  202.             ret = false;
  203.             break;
  204.         case vaTrue:
  205.             ret = true;
  206.             break;
  207.         case vaLString:
  208.         case vaWString:
  209.             var len = parseByte() + parseByte() * 256
  210.               + parseByte() * 256 * 256  + parseByte() * 256 * 256 * 256;;
  211.             ret = mapdata.substr(0, len);
  212.             mapdata = mapdata.substr(len);
  213.             break;
  214.         case vaUTF8String:
  215.         case vaExtended:
  216.         case vaSet:
  217.         case vaCollection:
  218.         case vaSingle:
  219.         case vaCurrency:
  220.         case vaDate:
  221.         case vaInt64:
  222.         case vaBinary:
  223.             throw new Error("DFM type " + prop_type + " not implemented");
  224.         default:
  225.             throw new Error("Unknown DFM type " + prop_type);
  226.     }
  227.     return ret;
  228. }
  229.  
  230. function parseComponent() {
  231.     var index = mapdata.indexOf(marker);
  232.     if (index != 0) {
  233.         mapdata = "";
  234.         return null;
  235.     }
  236.     mapdata = mapdata.substr(index + marker.length);
  237.    
  238.     var class_name_len = parseByte();
  239.     var class_name = mapdata.substr(0, class_name_len);
  240.     mapdata = mapdata.substr(class_name_len);
  241.    
  242.     var obj_name_len = parseByte();
  243.     var obj_name = mapdata.substr(0, obj_name_len);
  244.     mapdata = mapdata.substr(obj_name_len);
  245.    
  246.     var data = {'Class': class_name, 'Object': obj_name};
  247.     while (mapdata.length > 0) {
  248.         var prop_name_len = parseByte();
  249.         var prop_name = mapdata.substr(0, prop_name_len);
  250.         mapdata = mapdata.substr(prop_name_len);
  251.        
  252.         if (prop_name_len == 0)
  253.             break;
  254.        
  255.         data[prop_name] = parseValue();
  256.     }
  257.    
  258.     while (mapdata.length > 0) {
  259.         if (parseByte() == 0) //StopByte
  260.             break;
  261.         var obj = parseComponent();
  262.     }
  263.    
  264.     return data;
  265. }
  266.  
  267. function readArea(filepath) {
  268.     var stream = new ActiveXObject("ADODB.Stream");
  269.     stream.Type = 2;
  270.     stream.CharSet = 'windows-1251';
  271.     stream.Open();
  272.     stream.LoadFromFile(filepath + ".mm2");
  273.     mapdata = stream.ReadText(-1);
  274.     stream.Close();
  275.     var rooms = [];
  276.     while (mapdata.length > 0) {
  277.         var component = parseComponent();
  278.         if (component != null && component.Class == 'TMudRoom2') {
  279.             component.Area = filepath;
  280.             rooms.push(component);
  281.         }
  282.     }
  283.     return rooms;
  284. }
  285.  
  286. dirs = {
  287.     'ChN': {'dx': -1, 'dy':  0, 'dz':  0, 'command': 'север'},
  288.     'ChS': {'dx':  1, 'dy':  0, 'dz':  0, 'command': 'юг'},
  289.     'ChW': {'dx':  0, 'dy': -1, 'dz':  0, 'command': 'запад'},
  290.     'ChE': {'dx':  0, 'dy':  1, 'dz':  0, 'command': 'восток'},
  291.     'ChU': {'dx':  0, 'dy':  0, 'dz':  1, 'command': 'вверх'},
  292.     'ChD': {'dx':  0, 'dy':  0, 'dz': -1, 'command': 'вниз'}
  293.     };
  294.  
  295. function hash(str) {
  296.     var ret = 0;
  297.     for (var i = 0; i < str.length; i++) {
  298.         ret = ret * 4001 + str.charCodeAt(i);
  299.         ret |= 0;
  300.     }
  301.     return ret;
  302. }
  303.  
  304. total_rooms = 0;
  305. areas = {};
  306. autoexits = [];
  307. function loadMMArea(filepath) {
  308.     var rooms = readArea(filepath);
  309.     var coords = {};
  310.     var area_name = filepath.substr(filepath.lastIndexOf('\\') + 1);
  311.     areas[area_name] = {};
  312.     total_rooms += rooms.length;
  313.     jmc.showme("Area " + area_name + ": " + rooms.length + " room(s) loaded [" + total_rooms + "]");
  314.     for (var i = 0; i < rooms.length; i++) {
  315.         rooms[i].Description = "";
  316.         if (!('Tag' in rooms[i]) || !('Hint' in rooms[i]))
  317.             continue;
  318.         rooms[i].Hint = rooms[i].Hint.replace(/я/g,'Я');
  319.        
  320.         jmc.parse(jmc.CommandChar + "mapper autoid {" + rooms[i].Hint + "} {" + rooms[i].Description + "} {} PrimaryId");
  321.         var secondary = rooms[i].Tag + hash(area_name);
  322.         var primary = jmc.GetVar("PrimaryId");
  323.         if (primary.indexOf('.') >= 0)
  324.             primary = primary.substr(0, primary.indexOf('.'));
  325.         var id = primary + "." + secondary;
  326.         areas[area_name][rooms[i].Tag] = id;
  327.        
  328.         var flags = "";
  329.         if (rooms[i].Agro) flags += ",agro";
  330.         if (rooms[i].Pipe) flags += ",pipe";
  331.         if (rooms[i].DT) flags += ",death";
  332.         if (rooms[i].FlyDT) flags += ",flydeath";
  333.         if (flags.length > 0) flags = flags.substr(1);
  334.        
  335.         jmc.parse(jmc.CommandChar + "mapper add room " + id + " {" + rooms[i].Hint + "} {" + rooms[i].Description + "} {} {} {" + flags + "}");
  336.         if (rooms[i].DT || rooms[i].FlyDT || rooms[i].NoStep)
  337.             jmc.parse(jmc.CommandChar + "mapper set avoidance " + id + " 0");
  338.         if (rooms[i].Agro)
  339.             jmc.parse(jmc.CommandChar + "mapper set avoidance " + id + " 10");
  340.         if (rooms[i].Note)
  341.             jmc.parse(jmc.CommandChar + "mapper set comment " + id + " {" + rooms[i].Note + "}");
  342.         var x = rooms[i].X - rooms[i].DX;
  343.         var y = rooms[i].Y - rooms[i].DY;
  344.         var z = rooms[i].L - rooms[i].DL;
  345.         if (!(x in coords))
  346.             coords[x] = {};
  347.         if (!(y in coords[x]))
  348.             coords[x][y] = {};
  349.         coords[x][y][z] = rooms[i].Tag;
  350.        
  351.         autoexits[id] = {};
  352.         if ('AutoMaps.Strings' in rooms[i]) {
  353.             var spec_exits = rooms[i]['AutoMaps.Strings'];
  354.             for (var j = 0; j < spec_exits.length; j++) {
  355.                 var parts = spec_exits[j].split('|');
  356.                 if (parts.length < 3)
  357.                     continue;
  358.                 var dir = parts[1];
  359.                 for (var d in dirs)
  360.                     if (dir.indexOf(dirs[d].command) >= 0) {
  361.                         dir = d;
  362.                         break;
  363.                     }
  364.                 autoexits[id][dir] = {'area': parts[0], 'room': parseInt(parts[2])};
  365.             }
  366.         }
  367.     }
  368.     for (var i = 0; i < rooms.length; i++) {
  369.         if (!(rooms[i].Tag in areas[area_name]))
  370.             continue;
  371.         var id = areas[area_name][rooms[i].Tag];
  372.         for (var dir in dirs) {
  373.             if ((dir in rooms[i]) && (rooms[i][dir] == true) && !(dir in autoexits[id])) {
  374.                 var x = rooms[i].X - rooms[i].DX;// + dirs[dir].dx;
  375.                 var y = rooms[i].Y - rooms[i].DY;// + dirs[dir].dy;
  376.                 var z = rooms[i].L - rooms[i].DL;// + dirs[dir].dz;
  377.                 var ok = false;
  378.                 for (var l = 0; l < 10; l++) {
  379.                     x += dirs[dir].dx;
  380.                     y += dirs[dir].dy;
  381.                     z += dirs[dir].dz;
  382.                     if (x in coords && y in coords[x] && z in coords[x][y]) {
  383.                         jmc.parse(jmc.CommandChar + "mapper add exit " + areas[area_name][rooms[i].Tag] + " {" + dirs[dir].command + "} " + areas[area_name][coords[x][y][z]]);
  384.                         ok = true;
  385.                         break;
  386.                     }
  387.                 }
  388.                 if (!ok) {
  389.                     jmc.showme("Can't find next room <" + rooms[i].Tag + "." + dir + "> (" + x + ", " + y + ", " + z +")");
  390.                 }
  391.             }
  392.         }
  393.     }
  394. }
  395.  
  396. function importMMMap(dir) {
  397.     total_rooms = 0;
  398.     areas = {};
  399.     autoexits = [];
  400.     jmc.parse(jmc.CommandChar + "mapper clear");
  401.     jmc.parse(jmc.CommandChar + "mapper add direction {север,с,north,n} 0 1 0 {юг,ю,south,s}");
  402.     jmc.parse(jmc.CommandChar + "mapper add direction {восток,в,east,e} 1 0 0 {запад,з,west,w}");
  403.     jmc.parse(jmc.CommandChar + "mapper add direction {вверх,вв,up,u} 1 1 0 {вниз,вн,down,d}");
  404.     jmc.parse(jmc.CommandChar + "mapper add flag {agro} {!} {red}");
  405.     jmc.parse(jmc.CommandChar + "mapper add flag {death} {Ж} {light red}");
  406.     jmc.parse(jmc.CommandChar + "mapper add flag {flydeath} {Ж} {light red}");
  407.     jmc.parse(jmc.CommandChar + "mapper add flag {pipe} {*} {yellow}");
  408.  
  409.     FSO = new ActiveXObject("Scripting.FileSystemObject")
  410.     var folder = FSO.GetFolder("./" + dir);
  411.     var it_files = new Enumerator(folder.Files);
  412.     var mask = /(.*)\.mm2/;
  413.     for (; !it_files.atEnd(); it_files.moveNext()) {
  414.         var match = mask.exec(it_files.item());
  415.         if (match != null) {
  416.             loadMMArea(match[1]);
  417.         }
  418.     }
  419.     jmc.showme("Adding explicit exits...");
  420.     for (var id in autoexits) {
  421.         for (var dir in autoexits[id]) {
  422.             var area = autoexits[id][dir].area;
  423.             var tag = autoexits[id][dir].room;
  424.             if (!(area in areas)) {
  425.                 jmc.showme("Unknown area: " + area);
  426.                 continue;
  427.             }
  428.             if (!(tag in areas[area])) {
  429.                 jmc.showme("Unknown room <" + tag + "> in area <" + area + ">");
  430.                 continue;
  431.             }
  432.             var cmd = dir;
  433.             if (dir in dirs)
  434.                 cmd = dirs[dir].command;
  435.             var toid = areas[area][tag];
  436.             jmc.parse(jmc.CommandChar + "mapper add exit " + id + " {" + cmd + "} " + toid);
  437.         }
  438.     }
  439. }
  440.  
  441. /* usage:
  442.    - copy importMMMap.js to ./settings
  443.    - copy all files from Maps/<worldname>/ to ./mmap
  444.    - execute in jmc:
  445.      #use importMMMap.js
  446.      #scri importMMMap("mmap")
  447.      #mapper write mm.map
  448. */
Add Comment
Please, Sign In to add comment