-
Notifications
You must be signed in to change notification settings - Fork 0
/
generator.js
101 lines (88 loc) · 3.11 KB
/
generator.js
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
"use strict";
// === Begin configurations ===
// Directory of parsed datacenter files
const dataDir = "../tera-datacenter-master/out/EUR";
// Directory of generated guides
const outDir = "./out";
// Header template
const contentHeader = `
module.exports = (dispatch, handlers, guide, lang) => {
guide.type = SP;
return {
`;
// Footer template
const contentFooter = `
};
};`;
// === End of configurations ===
const path = require("path");
const fs = require("fs");
const readdir = require("util").promisify(fs.readdir);
(function() {
readDungeonData()
.then(dungeonData => readSkillData(dungeonData))
.then(skillData => writeOutData(skillData));
}());
async function readDungeonData() {
const dungeonList = new Map();
const stringList = new Map();
const strSheetDungeonData = require(path.resolve(dataDir, "StrSheet_Dungeon", "StrSheet_Dungeon-0.json"));
strSheetDungeonData.String.forEach(dungeon =>
stringList.set(dungeon.id, dungeon.string)
);
(await readdir(path.resolve(dataDir, "Dungeon"))).forEach(file => {
const dungeonData = require(path.resolve(dataDir, "Dungeon", file));
if (!dungeonData.continentId || !dungeonData.ClearCondition) return;
const continentId = dungeonData.continentId;
const huntingZoneId = dungeonData.ClearCondition[0]["huntingZoneId"];
if (continentId && huntingZoneId && !dungeonList.has(huntingZoneId))
dungeonList.set(huntingZoneId, {
"id": continentId,
"string": stringList.get(continentId) || continentId
});
console.log(file, "parsed");
});
return dungeonList;
}
async function readSkillData(dungeonData) {
const skillData = {};
(await readdir(path.resolve(dataDir, "SkillData"))).forEach(file => {
if (!file.endsWith(".json")) return;
const fileData = require(path.resolve(dataDir, "SkillData", file));
if (!fileData.huntingZoneId || !dungeonData.has(fileData.huntingZoneId) || !fileData.Skill) return;
if (!skillData[fileData.huntingZoneId])
skillData[fileData.huntingZoneId] = {
"dungeon": dungeonData.get(fileData.huntingZoneId),
"skills": []
};
fileData.Skill.forEach(skill => {
skillData[fileData.huntingZoneId]["skills"].push({
"templateId": skill.templateId,
"id": skill.id,
"name": skill.name
});
});
delete require.cache[require.resolve(path.resolve(dataDir, "SkillData", file))];
console.log(file, "parsed");
});
return skillData;
}
function writeOutData(skillData) {
if (!fs.existsSync(path.resolve(outDir)))
fs.mkdirSync(path.resolve(outDir), {
"recursive": true
});
Object.keys(skillData).forEach(huntingZoneId => {
const dungeon = skillData[huntingZoneId]["dungeon"];
const filePath = path.resolve(outDir, `${dungeon.id}.js`);
const contentTitle = `// ${dungeon.string}\n\n`;
const content = [];
skillData[huntingZoneId]["skills"].forEach(skill =>
content.push(`\t\t"s-${huntingZoneId}-${skill.templateId}-${skill.id}-0": [{ type: "text", sub_type: "message", message: "${skill.name.replace(/_/g, " | ")}" }]`)
);
if (!fs.existsSync(filePath)) {
fs.writeFileSync(filePath, contentTitle + contentHeader + content.join(",\n") + contentFooter);
console.log(`${dungeon.id}.js`, "written");
}
});
}