uesp-eso-build-wrapper 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/THIRD_PARTY_NOTICES +39 -0
- package/dist/lib/eso-engine/calculator.d.ts +39 -0
- package/dist/lib/eso-engine/calculator.d.ts.map +1 -0
- package/dist/lib/eso-engine/calculator.js +189 -0
- package/dist/lib/eso-engine/calculator.js.map +1 -0
- package/dist/lib/eso-engine/env-setup.d.ts +25 -0
- package/dist/lib/eso-engine/env-setup.d.ts.map +1 -0
- package/dist/lib/eso-engine/env-setup.js +238 -0
- package/dist/lib/eso-engine/env-setup.js.map +1 -0
- package/dist/lib/eso-engine/index.d.ts +58 -0
- package/dist/lib/eso-engine/index.d.ts.map +1 -0
- package/dist/lib/eso-engine/index.js +119 -0
- package/dist/lib/eso-engine/index.js.map +1 -0
- package/dist/lib/eso-engine/loader.d.ts +25 -0
- package/dist/lib/eso-engine/loader.d.ts.map +1 -0
- package/dist/lib/eso-engine/loader.js +189 -0
- package/dist/lib/eso-engine/loader.js.map +1 -0
- package/dist/lib/eso-engine/types.d.ts +136 -0
- package/dist/lib/eso-engine/types.d.ts.map +1 -0
- package/dist/lib/eso-engine/types.js +21 -0
- package/dist/lib/eso-engine/types.js.map +1 -0
- package/package.json +55 -0
- package/vendor/uesp-data/uesp-init-data.json +8294 -0
- package/vendor/uesp-esochardata/LICENSE +21 -0
- package/vendor/uesp-esochardata/resources/esoEditBuild.js +15221 -0
- package/vendor/uesp-esochardata/resources/esobuilddata.js +3575 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configura o ambiente global do Node.js para simular o browser.
|
|
4
|
+
*
|
|
5
|
+
* O motor da UESP (esoEditBuild.js) foi escrito para rodar no browser e usa:
|
|
6
|
+
* - window.* — para variáveis e funções globais
|
|
7
|
+
* - document.getElementById / $ — para ler/escrever valores do DOM
|
|
8
|
+
* - navigator — verificação de agente
|
|
9
|
+
*
|
|
10
|
+
* Esta camada cria mocks controlados desses objetos ANTES de carregar
|
|
11
|
+
* o script da UESP, de forma que:
|
|
12
|
+
* 1. O script inicia sem erros (jQuery mock chainável)
|
|
13
|
+
* 2. Nosso código pode injetar valores de entrada (race, class, level, etc.)
|
|
14
|
+
* via setDomValue() antes de chamar o cálculo
|
|
15
|
+
* 3. O motor lê esses valores normalmente via $("#elementId").val()
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.domValueStore = void 0;
|
|
19
|
+
exports.setDomValue = setDomValue;
|
|
20
|
+
exports.getDomValue = getDomValue;
|
|
21
|
+
exports.resetDomValues = resetDomValues;
|
|
22
|
+
exports.setupNodeEnvironment = setupNodeEnvironment;
|
|
23
|
+
/** Armazena os valores que o jQuery vai "ler" como se fossem campos HTML */
|
|
24
|
+
exports.domValueStore = new Map();
|
|
25
|
+
/** Define o valor de um elemento mock (equivale a preencher um campo HTML) */
|
|
26
|
+
function setDomValue(id, value) {
|
|
27
|
+
exports.domValueStore.set(id, value);
|
|
28
|
+
}
|
|
29
|
+
/** Lê o valor de um elemento mock */
|
|
30
|
+
function getDomValue(id) {
|
|
31
|
+
return exports.domValueStore.get(id) ?? '';
|
|
32
|
+
}
|
|
33
|
+
/** Reseta todos os valores do DOM mock */
|
|
34
|
+
function resetDomValues() {
|
|
35
|
+
exports.domValueStore.clear();
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Mock do jQuery ($)
|
|
39
|
+
// O motor usa: $("#id").val(), .prop("checked"), .find(), .children(),
|
|
40
|
+
// .text(), .html(), .each(), .on(), .length
|
|
41
|
+
// Precisamos que .length >= 1 para que UpdateEsoComputedStat não retorne
|
|
42
|
+
// prematuramente no check: if (element.length == 0) return false;
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
function createChainMock(id) {
|
|
45
|
+
// Proxy que retorna `chain` para qualquer método desconhecido, evitando "not a function"
|
|
46
|
+
const handler = {
|
|
47
|
+
get(target, prop) {
|
|
48
|
+
if (prop in target)
|
|
49
|
+
return target[prop];
|
|
50
|
+
if (typeof prop === 'string' && prop !== 'then') {
|
|
51
|
+
// Retorna função encadeável genérica para qualquer método jQuery desconhecido
|
|
52
|
+
return (..._args) => new Proxy(chain, handler);
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
const chain = {
|
|
58
|
+
length: 1, // CRÍTICO: deve ser >= 1 para o motor não abortar o cálculo
|
|
59
|
+
val: (v) => {
|
|
60
|
+
if (v !== undefined) {
|
|
61
|
+
if (id)
|
|
62
|
+
exports.domValueStore.set(id, String(v));
|
|
63
|
+
return chain;
|
|
64
|
+
}
|
|
65
|
+
return id ? (exports.domValueStore.get(id) ?? '') : '';
|
|
66
|
+
},
|
|
67
|
+
prop: (name, v) => {
|
|
68
|
+
if (v !== undefined)
|
|
69
|
+
return chain;
|
|
70
|
+
// checkbox — retorna false por padrão (PvP, Stealth, etc. desabilitados)
|
|
71
|
+
if (name === 'checked') {
|
|
72
|
+
return id ? exports.domValueStore.get(id) === 'true' : false;
|
|
73
|
+
}
|
|
74
|
+
return id ? (exports.domValueStore.get(id) ?? '') : '';
|
|
75
|
+
},
|
|
76
|
+
attr: (name, v) => {
|
|
77
|
+
if (v !== undefined)
|
|
78
|
+
return chain;
|
|
79
|
+
return '';
|
|
80
|
+
},
|
|
81
|
+
data: (key, v) => {
|
|
82
|
+
if (v !== undefined)
|
|
83
|
+
return chain;
|
|
84
|
+
return '';
|
|
85
|
+
},
|
|
86
|
+
html: (v) => { return v !== undefined ? chain : ''; },
|
|
87
|
+
text: (v) => { return v !== undefined ? chain : ''; },
|
|
88
|
+
find: (_sel) => createChainMock(),
|
|
89
|
+
children: (_sel) => createChainMock(),
|
|
90
|
+
parent: () => createChainMock(),
|
|
91
|
+
closest: (_sel) => createChainMock(),
|
|
92
|
+
filter: (_sel) => createChainMock(),
|
|
93
|
+
each: (fn) => chain,
|
|
94
|
+
on: (_evt, _fn) => chain,
|
|
95
|
+
off: (_evt) => chain,
|
|
96
|
+
trigger: (_evt) => chain,
|
|
97
|
+
addClass: (_cls) => chain,
|
|
98
|
+
removeClass: (_cls) => chain,
|
|
99
|
+
toggleClass: (_cls, _v) => chain,
|
|
100
|
+
hasClass: (_cls) => false,
|
|
101
|
+
show: () => chain,
|
|
102
|
+
hide: () => chain,
|
|
103
|
+
append: (_v) => chain,
|
|
104
|
+
prepend: (_v) => chain,
|
|
105
|
+
empty: () => chain,
|
|
106
|
+
remove: () => chain,
|
|
107
|
+
css: (_k, _v) => (typeof _v !== 'undefined' ? chain : ''),
|
|
108
|
+
width: (_v) => (_v !== undefined ? chain : 0),
|
|
109
|
+
height: (_v) => (_v !== undefined ? chain : 0),
|
|
110
|
+
scrollTop: (_v) => (_v !== undefined ? chain : 0),
|
|
111
|
+
focus: () => chain,
|
|
112
|
+
blur: () => chain,
|
|
113
|
+
click: () => chain,
|
|
114
|
+
submit: () => chain,
|
|
115
|
+
is: (_sel) => false,
|
|
116
|
+
not: (_sel) => chain,
|
|
117
|
+
eq: (_i) => createChainMock(),
|
|
118
|
+
first: () => createChainMock(),
|
|
119
|
+
last: () => createChainMock(),
|
|
120
|
+
get: (_i) => null,
|
|
121
|
+
index: () => -1,
|
|
122
|
+
serialize: () => '',
|
|
123
|
+
serializeArray: () => [],
|
|
124
|
+
// Acesso por índice (computeElements[i])
|
|
125
|
+
0: null,
|
|
126
|
+
// $(document).ready(fn) — executa fn imediatamente em Node.js
|
|
127
|
+
ready: (fn) => { try {
|
|
128
|
+
fn();
|
|
129
|
+
}
|
|
130
|
+
catch (_) { } return chain; },
|
|
131
|
+
};
|
|
132
|
+
return new Proxy(chain, handler);
|
|
133
|
+
}
|
|
134
|
+
function createJQueryMock() {
|
|
135
|
+
const $ = function (selectorOrEl, _ctx) {
|
|
136
|
+
if (typeof selectorOrEl !== 'string')
|
|
137
|
+
return createChainMock();
|
|
138
|
+
// Extrai o ID do seletor "#meuId"
|
|
139
|
+
const idMatch = selectorOrEl.match(/^#([\w-]+)$/);
|
|
140
|
+
return createChainMock(idMatch ? idMatch[1] : undefined);
|
|
141
|
+
};
|
|
142
|
+
// Utilitários estáticos do jQuery usados pelo motor
|
|
143
|
+
$.isEmptyObject = (obj) => obj == null || Object.keys(obj).length === 0;
|
|
144
|
+
$.isArray = Array.isArray;
|
|
145
|
+
$.isFunction = (v) => typeof v === 'function';
|
|
146
|
+
$.isPlainObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
147
|
+
$.each = (obj, fn) => {
|
|
148
|
+
if (Array.isArray(obj))
|
|
149
|
+
obj.forEach((v, i) => fn(i, v));
|
|
150
|
+
else if (obj)
|
|
151
|
+
Object.keys(obj).forEach(k => fn(k, obj[k]));
|
|
152
|
+
};
|
|
153
|
+
$.extend = (...args) => Object.assign({}, ...args);
|
|
154
|
+
$.noop = () => { };
|
|
155
|
+
$.trim = (s) => (s || '').trim();
|
|
156
|
+
$.type = (v) => typeof v;
|
|
157
|
+
$.fn = {};
|
|
158
|
+
$.ajax = () => ({ done: () => ({ fail: () => ({}) }) });
|
|
159
|
+
$.getJSON = () => ({ done: () => ({ fail: () => ({}) }) });
|
|
160
|
+
$.Deferred = () => ({ resolve: () => { }, reject: () => { }, promise: () => ({}) });
|
|
161
|
+
$.when = (...args) => ({ done: () => ({}) });
|
|
162
|
+
$.parseJSON = JSON.parse;
|
|
163
|
+
return $;
|
|
164
|
+
}
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
// Mock do document
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
function createDocumentMock() {
|
|
169
|
+
return {
|
|
170
|
+
getElementById: (id) => ({
|
|
171
|
+
value: exports.domValueStore.get(id) ?? '',
|
|
172
|
+
checked: exports.domValueStore.get(id) === 'true',
|
|
173
|
+
textContent: '',
|
|
174
|
+
innerHTML: '',
|
|
175
|
+
style: {},
|
|
176
|
+
}),
|
|
177
|
+
querySelector: (_sel) => null,
|
|
178
|
+
querySelectorAll: (_sel) => [],
|
|
179
|
+
createElement: (_tag) => ({
|
|
180
|
+
style: {},
|
|
181
|
+
setAttribute: () => { },
|
|
182
|
+
appendChild: () => { },
|
|
183
|
+
}),
|
|
184
|
+
addEventListener: () => { },
|
|
185
|
+
removeEventListener: () => { },
|
|
186
|
+
body: { appendChild: () => { }, style: {}, innerHTML: '' },
|
|
187
|
+
head: { appendChild: () => { } },
|
|
188
|
+
readyState: 'complete',
|
|
189
|
+
title: '',
|
|
190
|
+
URL: 'http://localhost/',
|
|
191
|
+
location: { href: 'http://localhost/', hostname: 'localhost', protocol: 'http:' },
|
|
192
|
+
cookie: '',
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
// Configuração principal — chamar UMA VEZ antes de carregar o script da UESP
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
function setupNodeEnvironment() {
|
|
199
|
+
// navigator — propriedade read-only no Node 18+, precisa de defineProperty
|
|
200
|
+
Object.defineProperty(global, 'navigator', {
|
|
201
|
+
value: { userAgent: 'Mozilla/5.0 (Node.js ESO Engine)', language: 'en-US', onLine: true },
|
|
202
|
+
configurable: true,
|
|
203
|
+
writable: true,
|
|
204
|
+
});
|
|
205
|
+
// location
|
|
206
|
+
global.location = { href: 'http://localhost/', hostname: 'localhost', protocol: 'http:' };
|
|
207
|
+
// jQuery mock — o motor acessa via window.$ e também via $ diretamente
|
|
208
|
+
const jq = createJQueryMock();
|
|
209
|
+
global.$ = jq;
|
|
210
|
+
global.jQuery = jq;
|
|
211
|
+
// document mock
|
|
212
|
+
global.document = createDocumentMock();
|
|
213
|
+
// console.time/timeEnd — usados pelo motor para profiling (no-ops aqui)
|
|
214
|
+
if (!console.time)
|
|
215
|
+
console.time = () => { };
|
|
216
|
+
if (!console.timeEnd)
|
|
217
|
+
console.timeEnd = () => { };
|
|
218
|
+
// setTimeout síncrono — o motor usa setTimeout(..., 100) para atualização assíncrona.
|
|
219
|
+
// Substituímos por execução síncrona imediata para uso em servidor.
|
|
220
|
+
global.setTimeout = (fn, _delay) => { fn(); return 0; };
|
|
221
|
+
global.clearTimeout = () => { };
|
|
222
|
+
global.setInterval = (_fn, _d) => 0;
|
|
223
|
+
global.clearInterval = () => { };
|
|
224
|
+
// window: usamos um Proxy que redireciona leituras/escritas para global.
|
|
225
|
+
// Isso evita quebrar internos do Node.js com "global.window = global".
|
|
226
|
+
if (!global.window) {
|
|
227
|
+
global.window = new Proxy(global, {
|
|
228
|
+
get(target, prop) {
|
|
229
|
+
return target[prop];
|
|
230
|
+
},
|
|
231
|
+
set(target, prop, value) {
|
|
232
|
+
target[prop] = value;
|
|
233
|
+
return true;
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=env-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-setup.js","sourceRoot":"","sources":["../../../src/lib/eso-engine/env-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* uesp-eso-build-wrapper — Public API
|
|
3
|
+
*
|
|
4
|
+
* A Node.js wrapper around the UESP ESO Build Editor math engine.
|
|
5
|
+
* Calculates Elder Scrolls Online Computed Character Statistics
|
|
6
|
+
* (Health, Magicka, Stamina, mitigation, crit, regeneration, etc.)
|
|
7
|
+
* using UESP's own formulas — no reimplementation needed.
|
|
8
|
+
*
|
|
9
|
+
* QUICK START:
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { initEsoEngine, calculateBuild } from 'uesp-eso-build-wrapper';
|
|
12
|
+
*
|
|
13
|
+
* // Initialize once (singleton) — no args needed when installed via npm
|
|
14
|
+
* initEsoEngine();
|
|
15
|
+
*
|
|
16
|
+
* const stats = calculateBuild({
|
|
17
|
+
* character: {
|
|
18
|
+
* race: 'High Elf',
|
|
19
|
+
* class: 'Sorcerer',
|
|
20
|
+
* level: 50,
|
|
21
|
+
* attributes: { health: 0, magicka: 64, stamina: 0 },
|
|
22
|
+
* },
|
|
23
|
+
* items: {
|
|
24
|
+
* // Pass the object returned by:
|
|
25
|
+
* // GET https://esolog.uesp.net/exportJson.php?table=minedItem&id=<id>&level=<lv>&quality=<q>
|
|
26
|
+
* Chest: uespApiResponse.minedItem[0],
|
|
27
|
+
* },
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* console.log(stats.Magicka, stats.SpellDamage);
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* UPDATING FORMULAS after a new ESO patch:
|
|
34
|
+
* 1. In vendor/uesp-esochardata/, run: git fetch upstream && git merge upstream/master
|
|
35
|
+
* 2. Open https://esobuilds.uesp.net in a browser.
|
|
36
|
+
* 3. Run vendor/uesp-data/browser-extract.js in the DevTools Console.
|
|
37
|
+
* 4. Save the downloaded JSON to vendor/uesp-data/uesp-init-data.json.
|
|
38
|
+
* 5. Run tests: npm test
|
|
39
|
+
*/
|
|
40
|
+
import { calculateBuild } from './calculator';
|
|
41
|
+
export type { BuildInput, ComputedStats, UespItemApiData, EquipSlot, UespInitData } from './types';
|
|
42
|
+
export { calculateBuild } from './calculator';
|
|
43
|
+
export { setDomValue, getDomValue } from './env-setup';
|
|
44
|
+
/**
|
|
45
|
+
* Initializes the UESP math engine. Must be called ONCE before calculateBuild().
|
|
46
|
+
* Safe to call multiple times — only executes on the first call.
|
|
47
|
+
*
|
|
48
|
+
* When installed via npm, both arguments are optional and resolve automatically
|
|
49
|
+
* to the bundled vendor files inside node_modules/uesp-eso-build-wrapper/.
|
|
50
|
+
*
|
|
51
|
+
* @param uespResourcesPath - Path to the UESP fork's resources/ folder.
|
|
52
|
+
* @param initDataPath - Path to the uesp-init-data.json file with game formulas.
|
|
53
|
+
*/
|
|
54
|
+
export declare function initEsoEngine(uespResourcesPath?: string, initDataPath?: string): void;
|
|
55
|
+
/** Resets initialization state (useful for testing) */
|
|
56
|
+
export declare function resetEngine(): void;
|
|
57
|
+
export { calculateBuild as default };
|
|
58
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/eso-engine/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAIvD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,iBAAiB,CAAC,EAAE,MAAM,EAC1B,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI,CAgBN;AAED,uDAAuD;AACvD,wBAAgB,WAAW,IAAI,IAAI,CAIlC;AAED,OAAO,EAAE,cAAc,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* uesp-eso-build-wrapper — Public API
|
|
4
|
+
*
|
|
5
|
+
* A Node.js wrapper around the UESP ESO Build Editor math engine.
|
|
6
|
+
* Calculates Elder Scrolls Online Computed Character Statistics
|
|
7
|
+
* (Health, Magicka, Stamina, mitigation, crit, regeneration, etc.)
|
|
8
|
+
* using UESP's own formulas — no reimplementation needed.
|
|
9
|
+
*
|
|
10
|
+
* QUICK START:
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { initEsoEngine, calculateBuild } from 'uesp-eso-build-wrapper';
|
|
13
|
+
*
|
|
14
|
+
* // Initialize once (singleton) — no args needed when installed via npm
|
|
15
|
+
* initEsoEngine();
|
|
16
|
+
*
|
|
17
|
+
* const stats = calculateBuild({
|
|
18
|
+
* character: {
|
|
19
|
+
* race: 'High Elf',
|
|
20
|
+
* class: 'Sorcerer',
|
|
21
|
+
* level: 50,
|
|
22
|
+
* attributes: { health: 0, magicka: 64, stamina: 0 },
|
|
23
|
+
* },
|
|
24
|
+
* items: {
|
|
25
|
+
* // Pass the object returned by:
|
|
26
|
+
* // GET https://esolog.uesp.net/exportJson.php?table=minedItem&id=<id>&level=<lv>&quality=<q>
|
|
27
|
+
* Chest: uespApiResponse.minedItem[0],
|
|
28
|
+
* },
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* console.log(stats.Magicka, stats.SpellDamage);
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* UPDATING FORMULAS after a new ESO patch:
|
|
35
|
+
* 1. In vendor/uesp-esochardata/, run: git fetch upstream && git merge upstream/master
|
|
36
|
+
* 2. Open https://esobuilds.uesp.net in a browser.
|
|
37
|
+
* 3. Run vendor/uesp-data/browser-extract.js in the DevTools Console.
|
|
38
|
+
* 4. Save the downloaded JSON to vendor/uesp-data/uesp-init-data.json.
|
|
39
|
+
* 5. Run tests: npm test
|
|
40
|
+
*/
|
|
41
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
42
|
+
if (k2 === undefined) k2 = k;
|
|
43
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
44
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
45
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
46
|
+
}
|
|
47
|
+
Object.defineProperty(o, k2, desc);
|
|
48
|
+
}) : (function(o, m, k, k2) {
|
|
49
|
+
if (k2 === undefined) k2 = k;
|
|
50
|
+
o[k2] = m[k];
|
|
51
|
+
}));
|
|
52
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
53
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
54
|
+
}) : function(o, v) {
|
|
55
|
+
o["default"] = v;
|
|
56
|
+
});
|
|
57
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
58
|
+
var ownKeys = function(o) {
|
|
59
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
60
|
+
var ar = [];
|
|
61
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
62
|
+
return ar;
|
|
63
|
+
};
|
|
64
|
+
return ownKeys(o);
|
|
65
|
+
};
|
|
66
|
+
return function (mod) {
|
|
67
|
+
if (mod && mod.__esModule) return mod;
|
|
68
|
+
var result = {};
|
|
69
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
70
|
+
__setModuleDefault(result, mod);
|
|
71
|
+
return result;
|
|
72
|
+
};
|
|
73
|
+
})();
|
|
74
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
75
|
+
exports.default = exports.getDomValue = exports.setDomValue = exports.calculateBuild = void 0;
|
|
76
|
+
exports.initEsoEngine = initEsoEngine;
|
|
77
|
+
exports.resetEngine = resetEngine;
|
|
78
|
+
const path = __importStar(require("path"));
|
|
79
|
+
const env_setup_1 = require("./env-setup");
|
|
80
|
+
const loader_1 = require("./loader");
|
|
81
|
+
const calculator_1 = require("./calculator");
|
|
82
|
+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return calculator_1.calculateBuild; } });
|
|
83
|
+
var calculator_2 = require("./calculator");
|
|
84
|
+
Object.defineProperty(exports, "calculateBuild", { enumerable: true, get: function () { return calculator_2.calculateBuild; } });
|
|
85
|
+
var env_setup_2 = require("./env-setup");
|
|
86
|
+
Object.defineProperty(exports, "setDomValue", { enumerable: true, get: function () { return env_setup_2.setDomValue; } });
|
|
87
|
+
Object.defineProperty(exports, "getDomValue", { enumerable: true, get: function () { return env_setup_2.getDomValue; } });
|
|
88
|
+
let initialized = false;
|
|
89
|
+
/**
|
|
90
|
+
* Initializes the UESP math engine. Must be called ONCE before calculateBuild().
|
|
91
|
+
* Safe to call multiple times — only executes on the first call.
|
|
92
|
+
*
|
|
93
|
+
* When installed via npm, both arguments are optional and resolve automatically
|
|
94
|
+
* to the bundled vendor files inside node_modules/uesp-eso-build-wrapper/.
|
|
95
|
+
*
|
|
96
|
+
* @param uespResourcesPath - Path to the UESP fork's resources/ folder.
|
|
97
|
+
* @param initDataPath - Path to the uesp-init-data.json file with game formulas.
|
|
98
|
+
*/
|
|
99
|
+
function initEsoEngine(uespResourcesPath, initDataPath) {
|
|
100
|
+
if (initialized)
|
|
101
|
+
return;
|
|
102
|
+
// __dirname resolves to dist/lib/eso-engine/ in the built package.
|
|
103
|
+
// Going up 3 levels reaches the package root (node_modules/uesp-eso-build-wrapper/).
|
|
104
|
+
const pkgRoot = path.resolve(__dirname, '../../..');
|
|
105
|
+
const resourcesPath = uespResourcesPath ??
|
|
106
|
+
path.join(pkgRoot, 'vendor/uesp-esochardata/resources');
|
|
107
|
+
const dataPath = initDataPath ??
|
|
108
|
+
path.join(pkgRoot, 'vendor/uesp-data/uesp-init-data.json');
|
|
109
|
+
(0, env_setup_1.setupNodeEnvironment)();
|
|
110
|
+
(0, loader_1.loadUespEngine)(resourcesPath, dataPath);
|
|
111
|
+
initialized = true;
|
|
112
|
+
}
|
|
113
|
+
/** Resets initialization state (useful for testing) */
|
|
114
|
+
function resetEngine() {
|
|
115
|
+
initialized = false;
|
|
116
|
+
const { resetEngineLoader } = require('./loader');
|
|
117
|
+
resetEngineLoader();
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/eso-engine/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBH,sCAmBC;AAGD,kCAIC;AA/CD,2CAA6B;AAC7B,2CAAmD;AACnD,qCAA0C;AAC1C,6CAA8C;AA8CnB,wFA9ClB,2BAAc,OA8CW;AA3ClC,2CAA8C;AAArC,4GAAA,cAAc,OAAA;AACvB,yCAAuD;AAA9C,wGAAA,WAAW,OAAA;AAAE,wGAAA,WAAW,OAAA;AAEjC,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB;;;;;;;;;GASG;AACH,SAAgB,aAAa,CAC3B,iBAA0B,EAC1B,YAAqB;IAErB,IAAI,WAAW;QAAE,OAAO;IAExB,mEAAmE;IACnE,qFAAqF;IACrF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAEpD,MAAM,aAAa,GAAG,iBAAiB;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,mCAAmC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,YAAY;QAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,sCAAsC,CAAC,CAAC;IAE7D,IAAA,gCAAoB,GAAE,CAAC;IACvB,IAAA,uBAAc,EAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAExC,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,uDAAuD;AACvD,SAAgB,WAAW;IACzB,WAAW,GAAG,KAAK,CAAC;IACpB,MAAM,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAClD,iBAAiB,EAAE,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Carrega os scripts da UESP no contexto global do Node.js via vm.runInThisContext.
|
|
3
|
+
*
|
|
4
|
+
* Por que vm.runInThisContext e não require()?
|
|
5
|
+
* - Os scripts da UESP não exportam módulos: definem funções e variáveis em window.*.
|
|
6
|
+
* - require() registra o módulo no cache e isola o escopo — as funções UESP não
|
|
7
|
+
* ficariam visíveis como globais.
|
|
8
|
+
* - vm.runInThisContext executa o código JS no contexto global REAL do processo Node,
|
|
9
|
+
* garantindo que window.GetEsoInputValues, window.UpdateEsoComputedStatsList_Real, etc.,
|
|
10
|
+
* fiquem disponíveis como globais acessíveis por qualquer módulo.
|
|
11
|
+
*
|
|
12
|
+
* IMPORTANTE: setupNodeEnvironment() deve ser chamado ANTES desta função.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Carrega e inicializa o motor da UESP.
|
|
16
|
+
*
|
|
17
|
+
* @param uespResourcesPath - Caminho para a pasta resources/ do fork da UESP.
|
|
18
|
+
* Ex: path.resolve(__dirname, '../../../vendor/uesp-esochardata/resources')
|
|
19
|
+
* @param initDataPath - Caminho para o uesp-init-data.json extraído do browser.
|
|
20
|
+
* Ex: path.resolve(__dirname, '../../../vendor/uesp-data/uesp-init-data.json')
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadUespEngine(uespResourcesPath: string, initDataPath: string): void;
|
|
23
|
+
/** Permite recarregar o motor (útil em testes) */
|
|
24
|
+
export declare function resetEngineLoader(): void;
|
|
25
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/lib/eso-engine/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,iBAAiB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAuIpF;AAED,kDAAkD;AAClD,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Carrega os scripts da UESP no contexto global do Node.js via vm.runInThisContext.
|
|
4
|
+
*
|
|
5
|
+
* Por que vm.runInThisContext e não require()?
|
|
6
|
+
* - Os scripts da UESP não exportam módulos: definem funções e variáveis em window.*.
|
|
7
|
+
* - require() registra o módulo no cache e isola o escopo — as funções UESP não
|
|
8
|
+
* ficariam visíveis como globais.
|
|
9
|
+
* - vm.runInThisContext executa o código JS no contexto global REAL do processo Node,
|
|
10
|
+
* garantindo que window.GetEsoInputValues, window.UpdateEsoComputedStatsList_Real, etc.,
|
|
11
|
+
* fiquem disponíveis como globais acessíveis por qualquer módulo.
|
|
12
|
+
*
|
|
13
|
+
* IMPORTANTE: setupNodeEnvironment() deve ser chamado ANTES desta função.
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.loadUespEngine = loadUespEngine;
|
|
50
|
+
exports.resetEngineLoader = resetEngineLoader;
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
const vm = __importStar(require("vm"));
|
|
54
|
+
let engineLoaded = false;
|
|
55
|
+
/**
|
|
56
|
+
* Carrega e inicializa o motor da UESP.
|
|
57
|
+
*
|
|
58
|
+
* @param uespResourcesPath - Caminho para a pasta resources/ do fork da UESP.
|
|
59
|
+
* Ex: path.resolve(__dirname, '../../../vendor/uesp-esochardata/resources')
|
|
60
|
+
* @param initDataPath - Caminho para o uesp-init-data.json extraído do browser.
|
|
61
|
+
* Ex: path.resolve(__dirname, '../../../vendor/uesp-data/uesp-init-data.json')
|
|
62
|
+
*/
|
|
63
|
+
function loadUespEngine(uespResourcesPath, initDataPath) {
|
|
64
|
+
if (engineLoaded)
|
|
65
|
+
return; // singleton — carrega apenas uma vez por processo
|
|
66
|
+
// 1. Carrega o JSON de inicialização (fórmulas e regras extraídas do browser)
|
|
67
|
+
if (!fs.existsSync(initDataPath)) {
|
|
68
|
+
throw new Error(`[eso-engine] Arquivo de inicialização não encontrado: ${initDataPath}\n` +
|
|
69
|
+
`Execute o script de extração no browser e salve o resultado neste caminho.\n` +
|
|
70
|
+
`Consulte: vendor/uesp-data/browser-extract.js`);
|
|
71
|
+
}
|
|
72
|
+
const rawJson = fs.readFileSync(initDataPath, 'utf-8');
|
|
73
|
+
const initData = JSON.parse(rawJson);
|
|
74
|
+
// 2. Injeta os dados de fórmulas como globais ANTES de carregar o script.
|
|
75
|
+
// O script da UESP referencia g_EsoComputedStats, g_EsoInputStats, etc. como globais.
|
|
76
|
+
global.g_EsoComputedStats = initData.computedStats ?? {};
|
|
77
|
+
global.g_EsoInputStats = initData.inputStats ?? {};
|
|
78
|
+
global.g_EsoInitialBuffData = initData.buffData ?? {};
|
|
79
|
+
global.g_EsoInitialCpData = initData.cpData ?? {};
|
|
80
|
+
global.g_EsoBuildRules = initData.buildRules ?? {};
|
|
81
|
+
global.g_EsoBuildRulesVersion = 'Live';
|
|
82
|
+
global.g_EsoBuildLiveVersion = 'Live';
|
|
83
|
+
global.g_EsoBuildPtsVersion = 'PTS';
|
|
84
|
+
// Globals que vêm do PHP/DB — inicializados como objetos vazios para que
|
|
85
|
+
// loops "for (var id in g_SkillsData)" não quebrem
|
|
86
|
+
global.g_SkillsData = initData.skillsData ?? {};
|
|
87
|
+
global.g_SetSkillsData = initData.setSkillsData ?? {};
|
|
88
|
+
global.g_LastSkillInputValues = {};
|
|
89
|
+
// Globals de estado da build — injetados pelo PHP, precisam de defaults seguros
|
|
90
|
+
global.g_EsoBuildActiveWeapon = 1; // 1=barra de armas principal
|
|
91
|
+
global.g_EsoBuildActiveAbilityBar = 1;
|
|
92
|
+
global.g_EsoBuildAlternateVersion = '';
|
|
93
|
+
global.g_EsoBuildCp = {};
|
|
94
|
+
global.g_EsoBuildData = {};
|
|
95
|
+
global.g_EsoBuildLastSetIndex = 0;
|
|
96
|
+
global.g_EsoBuildSetNames = {};
|
|
97
|
+
// Barra de habilidades — array de 2 barras (principal + offbar), cada uma com 6 slots.
|
|
98
|
+
// O script acessa g_EsoSkillBarData[0][5].origSkillId diretamente (linha 10239).
|
|
99
|
+
const emptySkillSlot = () => ({ skillId: 0, origSkillId: 0, morphIndex: 0, slotIndex: 0 });
|
|
100
|
+
const emptySkillBar = () => Array.from({ length: 6 }, emptySkillSlot);
|
|
101
|
+
global.g_EsoSkillBarData = [emptySkillBar(), emptySkillBar()];
|
|
102
|
+
global.g_EsoSkillActiveData = {};
|
|
103
|
+
global.g_EsoSkillPassiveData = {};
|
|
104
|
+
// Objetos que precisam ser {} para que acessos do tipo obj[key] retornem undefined
|
|
105
|
+
// ao invés de lançar TypeError ("Cannot read properties of undefined")
|
|
106
|
+
global.g_EsoCpData = {};
|
|
107
|
+
global.g_EsoBuildEnchantData = {};
|
|
108
|
+
global.g_EsoBuildItemData = {};
|
|
109
|
+
global.g_EsoBuildSetData = {};
|
|
110
|
+
global.g_EsoBuildAllSetData = {};
|
|
111
|
+
global.g_EsoBuildRules = {};
|
|
112
|
+
global.g_EsoInitialItemData = {};
|
|
113
|
+
// 3. Pré-declara todos os g_* globais como undefined no contexto Node.js.
|
|
114
|
+
// No browser, variáveis globais não declaradas retornam undefined quando lidas.
|
|
115
|
+
// No Node.js com vm.runInThisContext elas lançam ReferenceError.
|
|
116
|
+
// Pre-declarar garante comportamento compatível com o browser.
|
|
117
|
+
const ALL_GLOBALS = [
|
|
118
|
+
'g_EsoBuildActiveAbilityBar', 'g_EsoBuildActiveWeapon', 'g_EsoBuildAllSetData',
|
|
119
|
+
'g_EsoBuildAlternateVersion', 'g_EsoBuildBuffData', 'g_EsoBuildBuffData_PTS',
|
|
120
|
+
'g_EsoBuildClickWallLinkElement', 'g_EsoBuildComputedStatParent',
|
|
121
|
+
'g_EsoBuildCp2NextRuleId', 'g_EsoBuildCp2RuleVersion', 'g_EsoBuildData',
|
|
122
|
+
'g_EsoBuildDumpSetData', 'g_EsoBuildEnableUpdates', 'g_EsoBuildEnchantData',
|
|
123
|
+
'g_EsoBuildItemData', 'g_EsoBuildLastInputHistory', 'g_EsoBuildLastInputValues',
|
|
124
|
+
'g_EsoBuildLastSetIndex', 'g_EsoBuildLastUpdateRequest', 'g_EsoBuildLiveVersion',
|
|
125
|
+
'g_EsoBuildPtsVersion', 'g_EsoBuildRebuildStatFlag', 'g_EsoBuildRules',
|
|
126
|
+
'g_EsoBuildRulesVersion', 'g_EsoBuildSetCachedRules', 'g_EsoBuildSetData',
|
|
127
|
+
'g_EsoBuildSetMaxData', 'g_EsoBuildSetNames', 'g_EsoBuildSubclassCurrentClass',
|
|
128
|
+
'g_EsoBuildSubclassCurrentElement', 'g_EsoBuildSubclassCurrentSkillIndex',
|
|
129
|
+
'g_EsoBuildSubclassCurrentSkillLine', 'g_EsoBuildSubclassData',
|
|
130
|
+
'g_EsoBuildTestSets', 'g_EsoBuildTestSkills', 'g_EsoBuildToggledCpData',
|
|
131
|
+
'g_EsoBuildToggledSetData', 'g_EsoBuildToggledSkillData',
|
|
132
|
+
'g_EsoBuildUpdatedOffBarEnchantFactor', 'g_EsoCharDataTimeUpdateId',
|
|
133
|
+
'g_EsoComputedStats', 'g_EsoCpData', 'g_EsoCraftedSkills',
|
|
134
|
+
'g_EsoCurrentTooltipSlot', 'g_EsoFormulaInputValues', 'g_EsoGearIcons',
|
|
135
|
+
'g_EsoGoodActiveMatches', 'g_EsoGoodActiveMatchesString',
|
|
136
|
+
'g_EsoGoodPassiveMatches', 'g_EsoGoodPassiveMatchesString', 'g_EsoGoodSetMatches',
|
|
137
|
+
'g_EsoInitialBuffData', 'g_EsoInitialEnchantData', 'g_EsoInitialItemData',
|
|
138
|
+
'g_EsoInitialSetMaxData', 'g_EsoInitialToggleCpData', 'g_EsoInitialToggleSetData',
|
|
139
|
+
'g_EsoInitialToggleSkillData', 'g_EsoInputStatDetails', 'g_EsoInputStats',
|
|
140
|
+
'g_EsoInputStatSources', 'g_EsoLoadedAllSetData', 'g_EsoProfileData',
|
|
141
|
+
'g_EsoSkillActiveData', 'g_EsoSkillBarData', 'g_EsoSkillDestructionData',
|
|
142
|
+
'g_EsoSkillDestructionElement', 'g_EsoSkillDestructionElementPrev',
|
|
143
|
+
'g_EsoSkillDestructionOffHandElement', 'g_EsoSkillIsMobile',
|
|
144
|
+
'g_EsoSkillPassiveData', 'g_EsoSkillPointsUsed', 'g_EsoToggleSkillUsedBuffer',
|
|
145
|
+
'g_LastSkillInputValues', 'g_SetSkillsData', 'g_SkillsData',
|
|
146
|
+
];
|
|
147
|
+
for (const name of ALL_GLOBALS) {
|
|
148
|
+
if (global[name] === undefined) {
|
|
149
|
+
global[name] = undefined;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// 4. Carrega os scripts da UESP via vm.runInThisContext.
|
|
153
|
+
// Ordem: esobuilddata.js (dados estáticos) → esoEditBuild.js (motor de cálculo)
|
|
154
|
+
// Isso é equivalente a <script src="..."> no browser.
|
|
155
|
+
const dataScriptPath = path.join(uespResourcesPath, 'esobuilddata.js');
|
|
156
|
+
if (!fs.existsSync(dataScriptPath)) {
|
|
157
|
+
throw new Error(`[eso-engine] Script de dados da UESP não encontrado: ${dataScriptPath}`);
|
|
158
|
+
}
|
|
159
|
+
vm.runInThisContext(fs.readFileSync(dataScriptPath, 'utf-8'), { filename: dataScriptPath });
|
|
160
|
+
const scriptPath = path.join(uespResourcesPath, 'esoEditBuild.js');
|
|
161
|
+
if (!fs.existsSync(scriptPath)) {
|
|
162
|
+
throw new Error(`[eso-engine] Script da UESP não encontrado: ${scriptPath}`);
|
|
163
|
+
}
|
|
164
|
+
const scriptContent = fs.readFileSync(scriptPath, 'utf-8');
|
|
165
|
+
vm.runInThisContext(scriptContent, { filename: scriptPath });
|
|
166
|
+
// 5. Pós-carregamento: envolve g_EsoBuildBuffData em um Proxy de segurança.
|
|
167
|
+
// O motor acessa g_EsoBuildBuffData['Battle Spirit'].visible, etc.
|
|
168
|
+
// Se os dados reais de buff não foram extraídos do browser, o objeto está vazio
|
|
169
|
+
// e o acesso quebraria. O Proxy auto-cria uma entrada segura para qualquer chave.
|
|
170
|
+
const rawBuffData = global.g_EsoBuildBuffData ?? {};
|
|
171
|
+
global.g_EsoBuildBuffData = new Proxy(rawBuffData, {
|
|
172
|
+
get(target, prop) {
|
|
173
|
+
if (!(prop in target)) {
|
|
174
|
+
target[prop] = {
|
|
175
|
+
visible: false, enabled: false, skillEnabled: false,
|
|
176
|
+
rawOutput: {}, skillAbilities: [],
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
return target[prop];
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
engineLoaded = true;
|
|
183
|
+
console.log('[eso-engine] Motor da UESP carregado com sucesso.');
|
|
184
|
+
}
|
|
185
|
+
/** Permite recarregar o motor (útil em testes) */
|
|
186
|
+
function resetEngineLoader() {
|
|
187
|
+
engineLoaded = false;
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=loader.js.map
|