-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathreader-export.js
More file actions
177 lines (165 loc) · 5.56 KB
/
reader-export.js
File metadata and controls
177 lines (165 loc) · 5.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
const fs = require("fs");
const _ = require('lodash');
const roomExits = ["north", "northeast", "east", "southeast", "south", "southwest", "west", "northwest", "up", "down", "in", "out"];
const penStyles = {
1 : "solid line",
2 : "dash line",
3 : "dot line"
}
const mudletColors = require("./mudlet-colors.json")
function convertRoom(roomId, room, hash) {
room.id = roomId
if (room.environment) {
room.env = room.environment;
delete room.environment;
}
if (room.symbol) {
room.roomChar = room.symbol;
delete room.symbol;
}
room.exits = {}
roomExits.forEach(key => {
if (room[key] !== -1) {
room.exits[key] = room[key]
}
delete room[key]
})
room.specialExits = room.mSpecialExits
delete room.mSpecialExits
for (const key in room.customLines) {
if (Object.hasOwnProperty.call(room.customLines, key)) {
const element = room.customLines[key];
room.customLines[key] = {
points: element.map(points => {
return {x: points[0], y: points[1]}
}),
attributes: {
color: {
r: room.customLinesColor[key].r,
g: room.customLinesColor[key].g,
b: room.customLinesColor[key].b
},
style: penStyles[room.customLinesStyle[key]],
arrow: room.customLinesArrow[key]
}
}
}
}
delete room.customLinesArrow
delete room.customLinesColor
delete room.customLinesStyle
if (hash) {
room.hash = hash;
}
return room;
}
function getLabel(label, directory) {
if (directory) {
if (!fs.existsSync(`${directory}/labels`)) {
fs.mkdirSync(`${directory}/labels`)
}
fs.writeFileSync(`${directory}/labels/${label.areaId}-${label.labelId}.png`, Buffer.from(label.pixMap));
delete label.pixMap;
} else {
label.pixMap = Buffer.from(label.pixMap).toString('base64');
}
delete label.dummy1
delete label.dummy2
label.X = label.pos[0]
label.Y = label.pos[1]
label.Z = label.pos[2]
delete label.pos
label.Width = label.size[0]
label.Height = label.size[1]
delete label.size
label.Text = label.text
delete label.text
delete label.noScaling
delete label.showOnTop
label.FgColor = label.fgColor
label.BgColor = label.bgColor
delete label.FgColor.spec
delete label.BgColor.spec
delete label.FgColor.pad
delete label.BgColor.pad
delete label.fgColor
delete label.bgColor
return label
}
function generateColors(map) {
let customEnvColors = map.mCustomEnvColors
let colors = {}
for (let i = 0; i <= 255; i++) {
if (i !== 16) {
let key = `ansi_${("00" + i).slice (-3)}`
let envId
if (i === 0 || i === 8) {
envId = i + 8
} else {
envId = i
}
colors[envId] = mudletColors[key]
}
}
for (const key in customEnvColors) {
if (Object.hasOwnProperty.call(customEnvColors, key)) {
const element = customEnvColors[key];
delete element.pad
delete element.alpha
delete element.spec
colors[key] = [element.r, element.g, element.b]
}
}
for (const key in map.envColors) {
if (Object.hasOwnProperty.call(map.envColors, key)) {
let element = map.envColors[key];
if (colors[key]) {
element = `ansi_${("00" + element).slice (-3)}`
colors[key] = mudletColors[element]
}
}
}
let output = []
for (const key in colors) {
if (Object.hasOwnProperty.call(colors, key)) {
const element = colors[key];
output.push({
envId: parseInt(key),
colors: element
})
}
}
return output
}
/**
* Exports model into format understandable by JS Mudlet Map Renderer - https://github.com/Delwing/js-mudlet-map-renderer
*
* @param {Mudlet.MudletMap} mapModel
* @param {string} [directory] Directory path, if provided will store export as .js and .json files as well
* @returns {{mapData: object, colors: {envId: number, colors: number[]}}}
*/
module.exports = (mapModel, directory) => {
let map = _.cloneDeep(mapModel);
let mapData = [];
let roomToHash = Object.entries(map.mpRoomDbHashToRoomId).reduce((acc, [key, value]) => (acc[value] = key, acc), {})
for (const key in map.areas) {
if (Object.hasOwnProperty.call(map.areas, key)) {
const element = map.areas[key];
let area = {
areaName: map.areaNames[key],
areaId: key,
rooms: element.rooms.map((roomId) => convertRoom(roomId, map.rooms[roomId], roomToHash[roomId])),
labels : map.labels[key] ? map.labels[key].map((element) => getLabel(element)) : []
};
mapData.push(area);
}
}
let colors = generateColors(map);
if (directory) {
fs.writeFileSync(`${directory}/mapExport.js`, "mapData = " + JSON.stringify(mapData))
fs.writeFileSync(`${directory}/colors.js`, "colors = " + JSON.stringify(colors))
fs.writeFileSync(`${directory}/mapExport.json`, JSON.stringify(mapData))
fs.writeFileSync(`${directory}/colors.json`, JSON.stringify(colors))
}
return { mapData: mapData, colors: colors }
}