Skip to content

Commit ba248ed

Browse files
committed
Added conversion for lang file and prep for batch conversion PF2E
1 parent 3fdb9c2 commit ba248ed

File tree

7 files changed

+201
-3416
lines changed

7 files changed

+201
-3416
lines changed

scripts/Dnd5e/BatchConversion.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
labelConverter
77
} from "../Utils/ConversionEngineNew.js";
88
import {createErrorMessage} from "../Utils/ErrorHandler.js";
9-
import {createNewCompendium, typeSelector} from "./Compendium5eConverter.js";
109
import {loading} from "../Utils/Utils.js";
1110

1211
const itemUpdater = (item, loading) => {
@@ -103,4 +102,4 @@ const batchConversionMap = {
103102
const initBatchConversion = (elements, type) => () => batchConversion(elements, batchConversionMap[type]);
104103

105104

106-
export {initBatchConversion}
105+
export {initBatchConversion}

scripts/MetricModule.js

Lines changed: 49 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,40 @@ const entityUpdater = {
2727
}
2828
}
2929

30+
const batchConversionManager = (data, type, button) => {
31+
let batchConvert = initBatchConversion(data, type);
32+
button.on('click', () => createWarningDialog(batchConvert));
33+
}
34+
35+
const batchCompendiumManager = (data, type, button) => {
36+
let batchConvert = batchCompendiumUpdater(game.packs.keys());
37+
button.on('click', () => createWarningDialog(batchConvert));
38+
}
39+
40+
const batchCompendiumUpdaterMap = {
41+
'dnd5e': {
42+
'scenes': batchConversionManager,
43+
'actors': batchConversionManager,
44+
'items': batchConversionManager,
45+
'tables': batchConversionManager,
46+
'journal': batchConversionManager,
47+
'compendium': batchCompendiumManager
48+
},
49+
'pf2e': {
50+
51+
}
52+
}
53+
54+
const onRenderSideBar = (app, html) => {
55+
if (!game.user.hasRole(4)) return;
56+
let button = $(`<button><i class='fas fa-exchange-alt'></i>Metrify all the ${app?.options?.id}</button>`);
57+
const type = app?.options?.id;
58+
if (batchCompendiumUpdaterMap[game.system.id][type])
59+
batchCompendiumUpdaterMap[game.system.id][type](type === 'compendium' ? game.packs.keys() : game[type], type, button);
60+
if (app?.options?.id !== 'combat' && app?.options?.id !== 'playlists' && !app?.options?.id.includes('popout'))
61+
html.find(".directory-footer").append(button);
62+
}
63+
3064
const addButton = (element, entity, type, html) => {
3165
if (!game.user.hasRole(4)) return;
3266
if (element.length !== 1) return;
@@ -56,38 +90,21 @@ const onRenderJurnalSheet = (obj, html) => {
5690
addButton(element, obj.object, "sheet");
5791
}
5892

59-
const onRenderSideBar = (app, html) => {
60-
if (!game.user.hasRole(4)) return;
61-
let button = $(`<button><i class='fas fa-exchange-alt'></i>Metrify all the ${app?.options?.id}</button>`);
62-
let batchConvert
63-
switch (app?.options?.id) {
64-
case "scenes":
65-
batchConvert = initBatchConversion(game.scenes, app?.options?.id);
66-
button.on('click', () => createWarningDialog(batchConvert));
67-
break;
68-
case "compendium":
69-
batchConvert = batchCompendiumUpdater(game.packs.keys());
70-
button.on('click', () => createWarningDialog(batchConvert));
71-
break;
72-
case "actors":
73-
batchConvert = initBatchConversion(game.actors, app?.options?.id);
74-
button.on('click', () => createWarningDialog(batchConvert));
75-
break;
76-
case "items":
77-
batchConvert = initBatchConversion(game.items, app?.options?.id);
78-
button.on('click', () => createWarningDialog(batchConvert));
79-
break;
80-
case "tables":
81-
batchConvert = initBatchConversion(game.tables, app?.options?.id);
82-
button.on('click', () => createWarningDialog(batchConvert));
83-
break;
84-
case "journal":
85-
batchConvert = initBatchConversion(game.journal, app?.options?.id);
86-
button.on('click', () => createWarningDialog(batchConvert));
87-
break;
88-
}
89-
if (app?.options?.id !== 'combat' && app?.options?.id !== 'playlists' && !app?.options?.id.includes('popout'))
90-
html.find(".directory-footer").append(button);
93+
const onRenderRollTable = (obj, html) => {
94+
let element = html.find(".window-header .window-title");
95+
addButton(element, obj.object, 'rolltable')
96+
}
97+
98+
const onCompendiumRender = (obj, html) => {
99+
let element = html.find(".window-header .window-title");
100+
addButton(element, obj.collection, 'compendium', obj);
101+
102+
/*
103+
Intended for debugging the relinking function
104+
let button = $(`<a class="popout" style><i class="fas fa-ruler"></i>Relink</a>`);
105+
button.on('click', () => relinkCompendium(obj.collection))
106+
element.after(button)
107+
*/
91108
}
92109

93110
const createWarningDialog = (callFunction) => {
@@ -109,23 +126,6 @@ const createWarningDialog = (callFunction) => {
109126
}).render(true);
110127
}
111128

112-
const onRenderRollTable = (obj, html) => {
113-
let element = html.find(".window-header .window-title");
114-
addButton(element, obj.object, 'rolltable')
115-
}
116-
117-
const onCompendiumRender = (obj, html) => {
118-
let element = html.find(".window-header .window-title");
119-
addButton(element, obj.collection, 'compendium', obj);
120-
121-
/*
122-
Intended for debugging the relinking function
123-
let button = $(`<a class="popout" style><i class="fas fa-ruler"></i>Relink</a>`);
124-
button.on('click', () => relinkCompendium(obj.collection))
125-
element.after(button)
126-
*/
127-
}
128-
129129
export {
130130
onCompendiumRender,
131131
onRenderActorSheet,

scripts/Pf2e/Pf2eConverter.js

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import {convertStringFromImperialToMetric, convertText, convertValueToMetric} from "../Utils/ConversionEngineNew.js";
2-
import {copyObject} from "../Utils/Utils.js";
2+
import {capitalize, copyObject} from "../Utils/Utils.js";
33

44
const convertTrait = (trait) => trait.replace(/reach-([0-9]+)/, (_0, value) => `Reach ${convertValueToMetric(value, 'ft')} m`);
55

66
const convertInconsistentText = (speed) => speed?.replace(/([0-9]+)(\W|&nbsp;| cubic |-)?(feet|inch|foot|ft\.|pounds|lbs\.|pound|lbs|lb|ft)?/, (_0, number, separator, label) => {
7-
return `${convertValueToMetric(number, label ? label : 'ft')}${separator || ''}${label ? convertStringFromImperialToMetric(label): ''}`
7+
return `${convertValueToMetric(number, label ? label : 'ft')}${separator || ''}${label ? convertStringFromImperialToMetric(label) : ''}`
88
})
99

1010
const speedConverter = (speedObject) => {
@@ -15,6 +15,61 @@ const speedConverter = (speedObject) => {
1515
return speedObject;
1616
}
1717

18+
const convertTranslations = (text) => {
19+
text = convertText(text);
20+
text = convertStringFromImperialToMetric(text);
21+
return text;
22+
}
23+
24+
const addNewTranslationsForMetric = (object, prop) => {
25+
const convertedProp = convertTranslations(object[prop]);
26+
const match = prop.match(/Trait([A-Za-z]+)([0-9]+)/);
27+
if (match) {
28+
const newProp = `Trait${match[1]}${convertValueToMetric(match[2], 'ft')}`;
29+
game.i18n.translations.PF2EM[newProp] = convertedProp;
30+
return;
31+
}
32+
const weaponMatch = prop.match(/WeaponRange([0-9]+)/);
33+
if (weaponMatch) {
34+
const newProp = `WeaponRange${convertValueToMetric(weaponMatch[1], 'ft')}`;
35+
game.i18n.translations.PF2EM[newProp] = convertedProp;
36+
return;
37+
}
38+
const areaMatch = prop.match(/AreaSize([0-9]+)/);
39+
if (areaMatch) {
40+
const newProp = `AreaSize${String(convertValueToMetric(areaMatch[1], 'ft')).replace('.', ',')}`;
41+
game.i18n.translations.PF2EM[newProp] = convertedProp;
42+
return;
43+
}
44+
object[prop] = convertedProp;
45+
}
46+
47+
const convertI18NObject = (obj) => {
48+
for (const prop in obj) {
49+
const value = obj[prop];
50+
if (typeof value === 'string') addNewTranslationsForMetric(obj, prop);
51+
else convertI18NObject(value);
52+
}
53+
}
54+
55+
const addNewSizes = () => {
56+
Object.keys(CONFIG.PF2E.areaSizes).forEach((key) => {
57+
const convertedKey = convertValueToMetric(key, 'ft');
58+
CONFIG.PF2E.areaSizes[convertedKey] = `PF2EM.AreaSize${String(convertedKey).replace('.', ',')}`;
59+
});
60+
Object.keys(CONFIG.PF2E.weaponRange).forEach((key) => {
61+
if (key === 'melee' || key === 'reach') return;
62+
const convertedKey = convertValueToMetric(key, 'ft');
63+
CONFIG.PF2E.weaponRange[convertedKey] = `PF2EM.WeaponRange${convertedKey}`;
64+
});
65+
Object.keys(CONFIG.PF2E.weaponTraits).forEach((key) => {
66+
const match = key.match(/([a-z]+)-([a-z]+)?-?([0-9]+)/);
67+
if (!match) return;
68+
const convertedKey = `${match[1]}-${match[2] ? match[2] : ''}-${convertValueToMetric(match[3], 'ft')}`;
69+
CONFIG.PF2E.weaponTraits[convertedKey] = `PF2EM.Trait${capitalize(match[1])}${match[2] ? capitalize(match[2]) : ''}${convertValueToMetric(match[3], 'ft')}`;
70+
});
71+
}
72+
1873
const updateItems = async (items) => {
1974
for (const item of items) await updateItem(item);
2075
}
@@ -45,4 +100,4 @@ const updateActor = async (actor) => {
45100
await updateItems(actor.data.items);
46101
}
47102

48-
export {updateActor, updateItem, speedConverter, convertInconsistentText, convertTrait}
103+
export {updateActor, updateItem, speedConverter, convertInconsistentText, convertTrait, convertI18NObject, addNewSizes}

0 commit comments

Comments
 (0)