-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
94 lines (82 loc) · 3.21 KB
/
index.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
/* global fh, xelib, logger, moduleUrl */
// == begin files ==
//= require src/prePatchService.js
//= require src/skyrimEquipmentLoadService.js
//= require src/skyrimMaterialLoadService.js
//= require src/settings.js
// == end files ==
let skyrimMaterialPatcher = function(patchFile, helpers, settings) {
let {logMessage, cacheRecord} = helpers,
dummyKeywords = {};
let injectKeywords = function() {
logMessage('Injecting keywords');
let group = xelib.AddElement(patchFile, 'KYWD');
Object.keys(settings.materials).forEach(name => {
let editorId = `SMP_Material${name}`;
logMessage(`Creating keyword ${editorId}`);
let rec = xelib.AddElement(group, 'KYWD');
xelib.AddElement(rec, 'EDID');
cacheRecord(rec, editorId);
dummyKeywords[name] = xelib.GetHexFormID(rec, true);
});
};
let addMaterialKeyword = function(patchRec, set, type) {
let keywordValue = set.useDummyKeyword ?
dummyKeywords[set.material] :
settings.materials[set.material][`${type}Keyword`] ||
settings.materials[set.material].genericKeyword;
if (!keywordValue) return;
xelib.AddKeyword(patchRec, keywordValue);
};
let addPatchRecord = function(file, formId) {
let rec = xelib.GetRecord(file, formId);
rec = xelib.GetPreviousOverride(rec, patchFile);
return helpers.copyToPatch(rec);
};
let patchItemSet = function(set, file) {
if (set.material === 'None') return;
let patchKeyword = function(item) {
let patchRec = addPatchRecord(file, item.formId);
addMaterialKeyword(patchRec, set, item.type);
};
set.weapons.forEach(patchKeyword);
set.armors.forEach(patchKeyword);
};
let patchItem = function(item, file) {
if (item.material === 'None') return;
let patchRec = addPatchRecord(file, item.formId);
addMaterialKeyword(patchRec, item, item.type);
};
let materialAssigned = entry => entry.material !== 'None';
let patchItemKeywords = function(entry) {
let file = xelib.FileByName(entry.filename),
setsToPatch = entry.sets.filter(materialAssigned),
itemsToPatch = entry.items.filter(materialAssigned),
numSets = setsToPatch.length,
numItems = itemsToPatch.length;
logMessage(`Patching ${numSets} sets from ${entry.filename}`);
setsToPatch.forEach(set => patchItemSet(set, file));
logMessage(`Patching ${numItems} items from ${entry.filename}`);
itemsToPatch.forEach(item => patchItem(item, file));
};
return {
initialize: function() {
injectKeywords();
settings.equipment.forEach(patchItemKeywords);
},
process: []
}
};
ngapp.run(function(patcherService) {
patcherService.registerPatcher({
info: info,
gameModes: [xelib.gmSSE, xelib.gmTES5],
settings: {
label: 'Skyrim Material Patcher',
templateUrl: `${moduleUrl}/partials/settings.html`,
controller: settingsController,
defaultSettings: {}
},
execute: skyrimMaterialPatcher
});
});