Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- marker = 'TPF0';
- vaNull = 0;
- vaList = 1;
- vaInt8 = 2;
- vaInt16 = 3;
- vaInt32 = 4;
- vaExtended = 5;
- vaString = 6;
- vaIdent = 7;
- vaFalse = 8;
- vaTrue = 9;
- vaBinary = 10;
- vaSet = 11;
- vaLString = 12;
- vaNil = 13;
- vaCollection = 14;
- vaSingle = 15;
- vaCurrency = 16;
- vaDate = 17;
- vaWString = 18;
- vaInt64 = 19;
- vaUTF8String = 20;
- cp1251 = [];
- cp1251[1026] = 128;
- cp1251[1027] = 129;
- cp1251[8218] = 130;
- cp1251[1107] = 131;
- cp1251[8222] = 132;
- cp1251[8230] = 133;
- cp1251[8224] = 134;
- cp1251[8225] = 135;
- cp1251[8364] = 136;
- cp1251[8240] = 137;
- cp1251[1033] = 138;
- cp1251[8249] = 139;
- cp1251[1034] = 140;
- cp1251[1036] = 141;
- cp1251[1035] = 142;
- cp1251[1039] = 143;
- cp1251[1106] = 144;
- cp1251[8216] = 145;
- cp1251[8217] = 146;
- cp1251[8220] = 147;
- cp1251[8221] = 148;
- cp1251[8226] = 149;
- cp1251[8211] = 150;
- cp1251[8212] = 151;
- cp1251[152] = 152;
- cp1251[8482] = 153;
- cp1251[1113] = 154;
- cp1251[8250] = 155;
- cp1251[1114] = 156;
- cp1251[1116] = 157;
- cp1251[1115] = 158;
- cp1251[1119] = 159;
- cp1251[160] = 160;
- cp1251[1038] = 161;
- cp1251[1118] = 162;
- cp1251[1032] = 163;
- cp1251[164] = 164;
- cp1251[1168] = 165;
- cp1251[166] = 166;
- cp1251[167] = 167;
- cp1251[1025] = 168;
- cp1251[169] = 169;
- cp1251[1028] = 170;
- cp1251[171] = 171;
- cp1251[172] = 172;
- cp1251[173] = 173;
- cp1251[174] = 174;
- cp1251[1031] = 175;
- cp1251[176] = 176;
- cp1251[177] = 177;
- cp1251[1030] = 178;
- cp1251[1110] = 179;
- cp1251[1169] = 180;
- cp1251[181] = 181;
- cp1251[182] = 182;
- cp1251[183] = 183;
- cp1251[1105] = 184;
- cp1251[8470] = 185;
- cp1251[1108] = 186;
- cp1251[187] = 187;
- cp1251[1112] = 188;
- cp1251[1029] = 189;
- cp1251[1109] = 190;
- cp1251[1111] = 191;
- cp1251[1040] = 192;
- cp1251[1041] = 193;
- cp1251[1042] = 194;
- cp1251[1043] = 195;
- cp1251[1044] = 196;
- cp1251[1045] = 197;
- cp1251[1046] = 198;
- cp1251[1047] = 199;
- cp1251[1048] = 200;
- cp1251[1049] = 201;
- cp1251[1050] = 202;
- cp1251[1051] = 203;
- cp1251[1052] = 204;
- cp1251[1053] = 205;
- cp1251[1054] = 206;
- cp1251[1055] = 207;
- cp1251[1056] = 208;
- cp1251[1057] = 209;
- cp1251[1058] = 210;
- cp1251[1059] = 211;
- cp1251[1060] = 212;
- cp1251[1061] = 213;
- cp1251[1062] = 214;
- cp1251[1063] = 215;
- cp1251[1064] = 216;
- cp1251[1065] = 217;
- cp1251[1066] = 218;
- cp1251[1067] = 219;
- cp1251[1068] = 220;
- cp1251[1069] = 221;
- cp1251[1070] = 222;
- cp1251[1071] = 223;
- cp1251[1072] = 224;
- cp1251[1073] = 225;
- cp1251[1074] = 226;
- cp1251[1075] = 227;
- cp1251[1076] = 228;
- cp1251[1077] = 229;
- cp1251[1078] = 230;
- cp1251[1079] = 231;
- cp1251[1080] = 232;
- cp1251[1081] = 233;
- cp1251[1082] = 234;
- cp1251[1083] = 235;
- cp1251[1084] = 236;
- cp1251[1085] = 237;
- cp1251[1086] = 238;
- cp1251[1087] = 239;
- cp1251[1088] = 240;
- cp1251[1089] = 241;
- cp1251[1090] = 242;
- cp1251[1091] = 243;
- cp1251[1092] = 244;
- cp1251[1093] = 245;
- cp1251[1094] = 246;
- cp1251[1095] = 247;
- cp1251[1096] = 248;
- cp1251[1097] = 249;
- cp1251[1098] = 250;
- cp1251[1099] = 251;
- cp1251[1100] = 252;
- cp1251[1101] = 253;
- cp1251[1102] = 254;
- cp1251[1103] = 255;
- mapdata = [];
- function parseByte() {
- var ret = mapdata.charCodeAt(0);
- if (ret > 127)
- ret = cp1251[ret]
- mapdata = mapdata.substr(1);
- return ret;
- }
- function parseValue() {
- var prop_type = mapdata.charCodeAt(0);
- var ret = null;
- mapdata = mapdata.substr(1);
- switch (prop_type) {
- case vaNull:
- case vaNil:
- break;
- case vaList:
- ret = [];
- while (mapdata.length > 0) {
- var val = parseValue();
- if (val == null)
- break;
- ret.push(val);
- }
- break;
- case vaInt8:
- ret = parseByte();
- if (ret > 127)
- ret -= 256;
- break;
- case vaInt16:
- ret = parseByte() + parseByte() * 256;
- break;
- case vaInt32:
- ret = parseByte() + parseByte() * 256
- + parseByte() * 256 * 256 + parseByte() * 256 * 256 * 256;
- break;
- case vaString:
- case vaIdent:
- var len = parseByte();
- ret = mapdata.substr(0, len);
- mapdata = mapdata.substr(len);
- break;
- case vaFalse:
- ret = false;
- break;
- case vaTrue:
- ret = true;
- break;
- case vaLString:
- case vaWString:
- var len = parseByte() + parseByte() * 256
- + parseByte() * 256 * 256 + parseByte() * 256 * 256 * 256;;
- ret = mapdata.substr(0, len);
- mapdata = mapdata.substr(len);
- break;
- case vaUTF8String:
- case vaExtended:
- case vaSet:
- case vaCollection:
- case vaSingle:
- case vaCurrency:
- case vaDate:
- case vaInt64:
- case vaBinary:
- throw new Error("DFM type " + prop_type + " not implemented");
- default:
- throw new Error("Unknown DFM type " + prop_type);
- }
- return ret;
- }
- function parseComponent() {
- var index = mapdata.indexOf(marker);
- if (index != 0) {
- mapdata = "";
- return null;
- }
- mapdata = mapdata.substr(index + marker.length);
- var class_name_len = parseByte();
- var class_name = mapdata.substr(0, class_name_len);
- mapdata = mapdata.substr(class_name_len);
- var obj_name_len = parseByte();
- var obj_name = mapdata.substr(0, obj_name_len);
- mapdata = mapdata.substr(obj_name_len);
- var data = {'Class': class_name, 'Object': obj_name};
- while (mapdata.length > 0) {
- var prop_name_len = parseByte();
- var prop_name = mapdata.substr(0, prop_name_len);
- mapdata = mapdata.substr(prop_name_len);
- if (prop_name_len == 0)
- break;
- data[prop_name] = parseValue();
- }
- while (mapdata.length > 0) {
- if (parseByte() == 0) //StopByte
- break;
- var obj = parseComponent();
- }
- return data;
- }
- function readArea(filepath) {
- var stream = new ActiveXObject("ADODB.Stream");
- stream.Type = 2;
- stream.CharSet = 'windows-1251';
- stream.Open();
- stream.LoadFromFile(filepath + ".mm2");
- mapdata = stream.ReadText(-1);
- stream.Close();
- var rooms = [];
- while (mapdata.length > 0) {
- var component = parseComponent();
- if (component != null && component.Class == 'TMudRoom2') {
- component.Area = filepath;
- rooms.push(component);
- }
- }
- return rooms;
- }
- dirs = {
- 'ChN': {'dx': -1, 'dy': 0, 'dz': 0, 'command': 'север'},
- 'ChS': {'dx': 1, 'dy': 0, 'dz': 0, 'command': 'юг'},
- 'ChW': {'dx': 0, 'dy': -1, 'dz': 0, 'command': 'запад'},
- 'ChE': {'dx': 0, 'dy': 1, 'dz': 0, 'command': 'восток'},
- 'ChU': {'dx': 0, 'dy': 0, 'dz': 1, 'command': 'вверх'},
- 'ChD': {'dx': 0, 'dy': 0, 'dz': -1, 'command': 'вниз'}
- };
- function hash(str) {
- var ret = 0;
- for (var i = 0; i < str.length; i++) {
- ret = ret * 4001 + str.charCodeAt(i);
- ret |= 0;
- }
- return ret;
- }
- total_rooms = 0;
- areas = {};
- autoexits = [];
- function loadMMArea(filepath) {
- var rooms = readArea(filepath);
- var coords = {};
- var area_name = filepath.substr(filepath.lastIndexOf('\\') + 1);
- areas[area_name] = {};
- total_rooms += rooms.length;
- jmc.showme("Area " + area_name + ": " + rooms.length + " room(s) loaded [" + total_rooms + "]");
- for (var i = 0; i < rooms.length; i++) {
- rooms[i].Description = "";
- if (!('Tag' in rooms[i]) || !('Hint' in rooms[i]))
- continue;
- rooms[i].Hint = rooms[i].Hint.replace(/я/g,'Я');
- jmc.parse(jmc.CommandChar + "mapper autoid {" + rooms[i].Hint + "} {" + rooms[i].Description + "} {} PrimaryId");
- var secondary = rooms[i].Tag + hash(area_name);
- var primary = jmc.GetVar("PrimaryId");
- if (primary.indexOf('.') >= 0)
- primary = primary.substr(0, primary.indexOf('.'));
- var id = primary + "." + secondary;
- areas[area_name][rooms[i].Tag] = id;
- var flags = "";
- if (rooms[i].Agro) flags += ",agro";
- if (rooms[i].Pipe) flags += ",pipe";
- if (rooms[i].DT) flags += ",death";
- if (rooms[i].FlyDT) flags += ",flydeath";
- if (flags.length > 0) flags = flags.substr(1);
- jmc.parse(jmc.CommandChar + "mapper add room " + id + " {" + rooms[i].Hint + "} {" + rooms[i].Description + "} {} {} {" + flags + "}");
- if (rooms[i].DT || rooms[i].FlyDT || rooms[i].NoStep)
- jmc.parse(jmc.CommandChar + "mapper set avoidance " + id + " 0");
- if (rooms[i].Agro)
- jmc.parse(jmc.CommandChar + "mapper set avoidance " + id + " 10");
- if (rooms[i].Note)
- jmc.parse(jmc.CommandChar + "mapper set comment " + id + " {" + rooms[i].Note + "}");
- var x = rooms[i].X - rooms[i].DX;
- var y = rooms[i].Y - rooms[i].DY;
- var z = rooms[i].L - rooms[i].DL;
- if (!(x in coords))
- coords[x] = {};
- if (!(y in coords[x]))
- coords[x][y] = {};
- coords[x][y][z] = rooms[i].Tag;
- autoexits[id] = {};
- if ('AutoMaps.Strings' in rooms[i]) {
- var spec_exits = rooms[i]['AutoMaps.Strings'];
- for (var j = 0; j < spec_exits.length; j++) {
- var parts = spec_exits[j].split('|');
- if (parts.length < 3)
- continue;
- var dir = parts[1];
- for (var d in dirs)
- if (dir.indexOf(dirs[d].command) >= 0) {
- dir = d;
- break;
- }
- autoexits[id][dir] = {'area': parts[0], 'room': parseInt(parts[2])};
- }
- }
- }
- for (var i = 0; i < rooms.length; i++) {
- if (!(rooms[i].Tag in areas[area_name]))
- continue;
- var id = areas[area_name][rooms[i].Tag];
- for (var dir in dirs) {
- if ((dir in rooms[i]) && (rooms[i][dir] == true) && !(dir in autoexits[id])) {
- var x = rooms[i].X - rooms[i].DX;// + dirs[dir].dx;
- var y = rooms[i].Y - rooms[i].DY;// + dirs[dir].dy;
- var z = rooms[i].L - rooms[i].DL;// + dirs[dir].dz;
- var ok = false;
- for (var l = 0; l < 10; l++) {
- x += dirs[dir].dx;
- y += dirs[dir].dy;
- z += dirs[dir].dz;
- if (x in coords && y in coords[x] && z in coords[x][y]) {
- jmc.parse(jmc.CommandChar + "mapper add exit " + areas[area_name][rooms[i].Tag] + " {" + dirs[dir].command + "} " + areas[area_name][coords[x][y][z]]);
- ok = true;
- break;
- }
- }
- if (!ok) {
- jmc.showme("Can't find next room <" + rooms[i].Tag + "." + dir + "> (" + x + ", " + y + ", " + z +")");
- }
- }
- }
- }
- }
- function importMMMap(dir) {
- total_rooms = 0;
- areas = {};
- autoexits = [];
- jmc.parse(jmc.CommandChar + "mapper clear");
- jmc.parse(jmc.CommandChar + "mapper add direction {север,с,north,n} 0 1 0 {юг,ю,south,s}");
- jmc.parse(jmc.CommandChar + "mapper add direction {восток,в,east,e} 1 0 0 {запад,з,west,w}");
- jmc.parse(jmc.CommandChar + "mapper add direction {вверх,вв,up,u} 1 1 0 {вниз,вн,down,d}");
- jmc.parse(jmc.CommandChar + "mapper add flag {agro} {!} {red}");
- jmc.parse(jmc.CommandChar + "mapper add flag {death} {Ж} {light red}");
- jmc.parse(jmc.CommandChar + "mapper add flag {flydeath} {Ж} {light red}");
- jmc.parse(jmc.CommandChar + "mapper add flag {pipe} {*} {yellow}");
- FSO = new ActiveXObject("Scripting.FileSystemObject")
- var folder = FSO.GetFolder("./" + dir);
- var it_files = new Enumerator(folder.Files);
- var mask = /(.*)\.mm2/;
- for (; !it_files.atEnd(); it_files.moveNext()) {
- var match = mask.exec(it_files.item());
- if (match != null) {
- loadMMArea(match[1]);
- }
- }
- jmc.showme("Adding explicit exits...");
- for (var id in autoexits) {
- for (var dir in autoexits[id]) {
- var area = autoexits[id][dir].area;
- var tag = autoexits[id][dir].room;
- if (!(area in areas)) {
- jmc.showme("Unknown area: " + area);
- continue;
- }
- if (!(tag in areas[area])) {
- jmc.showme("Unknown room <" + tag + "> in area <" + area + ">");
- continue;
- }
- var cmd = dir;
- if (dir in dirs)
- cmd = dirs[dir].command;
- var toid = areas[area][tag];
- jmc.parse(jmc.CommandChar + "mapper add exit " + id + " {" + cmd + "} " + toid);
- }
- }
- }
- /* usage:
- - copy importMMMap.js to ./settings
- - copy all files from Maps/<worldname>/ to ./mmap
- - execute in jmc:
- #use importMMMap.js
- #scri importMMMap("mmap")
- #mapper write mm.map
- */
Add Comment
Please, Sign In to add comment