resource icon upload + save/load

This commit is contained in:
Azgaar 2021-06-01 23:10:00 +03:00
parent 709f45e03e
commit 98ef47708c
4 changed files with 59 additions and 16 deletions

View file

@ -3050,6 +3050,13 @@
<div style="padding: .1em"> <div style="padding: .1em">
<svg viewBox="0 0 200 200"><use id="resourceIconPreview"></use></svg> <svg viewBox="0 0 200 200"><use id="resourceIconPreview"></use></svg>
</div> </div>
<div id="resourceIconEditorViewboxFields" data-tip="Adjust the viewBox to fit image into center" style="padding: .1em">
<div class="label">ViewBox:</div>
<input type="number" />
<input type="number" />
<input type="number" />
<input type="number" />
</div>
</div> </div>
<div id="unitsEditor" class="dialog stable" style="display: none"> <div id="unitsEditor" class="dialog stable" style="display: none">

View file

@ -395,6 +395,7 @@ function getMapData() {
const religions = JSON.stringify(pack.religions); const religions = JSON.stringify(pack.religions);
const provinces = JSON.stringify(pack.provinces); const provinces = JSON.stringify(pack.provinces);
const rivers = JSON.stringify(pack.rivers); const rivers = JSON.stringify(pack.rivers);
const resources = JSON.stringify(pack.resources);
// store name array only if it is not the same as default // store name array only if it is not the same as default
const defaultNB = Names.getNameBases(); const defaultNB = Names.getNameBases();
@ -443,8 +444,11 @@ function getMapData() {
provinces, provinces,
namesData, namesData,
rivers, rivers,
rulersString rulersString,
pack.cells.resource,
resources
].join('\r\n'); ].join('\r\n');
const blob = new Blob([data], {type: 'text/plain'}); const blob = new Blob([data], {type: 'text/plain'});
TIME && console.timeEnd('createMapDataBlob'); TIME && console.timeEnd('createMapDataBlob');
@ -857,6 +861,7 @@ function parseLoadedData(data) {
pack.religions = data[29] ? JSON.parse(data[29]) : [{i: 0, name: 'No religion'}]; pack.religions = data[29] ? JSON.parse(data[29]) : [{i: 0, name: 'No religion'}];
pack.provinces = data[30] ? JSON.parse(data[30]) : [0]; pack.provinces = data[30] ? JSON.parse(data[30]) : [0];
pack.rivers = data[32] ? JSON.parse(data[32]) : []; pack.rivers = data[32] ? JSON.parse(data[32]) : [];
pack.resources = data[35] ? JSON.parse(data[35]) : [];
const cells = pack.cells; const cells = pack.cells;
cells.biome = Uint8Array.from(data[16].split(',')); cells.biome = Uint8Array.from(data[16].split(','));
@ -872,6 +877,7 @@ function parseLoadedData(data) {
cells.religion = data[26] ? Uint16Array.from(data[26].split(',')) : new Uint16Array(cells.i.length); cells.religion = data[26] ? Uint16Array.from(data[26].split(',')) : new Uint16Array(cells.i.length);
cells.province = data[27] ? Uint16Array.from(data[27].split(',')) : new Uint16Array(cells.i.length); cells.province = data[27] ? Uint16Array.from(data[27].split(',')) : new Uint16Array(cells.i.length);
cells.crossroad = data[28] ? Uint16Array.from(data[28].split(',')) : new Uint16Array(cells.i.length); cells.crossroad = data[28] ? Uint16Array.from(data[28].split(',')) : new Uint16Array(cells.i.length);
cells.resource = data[34] ? Uint8Array.from(data[34].split(',')) : new Uint8Array(cells.i.length);
if (data[31]) { if (data[31]) {
const namesDL = data[31].split('/'); const namesDL = data[31].split('/');
@ -1302,7 +1308,6 @@ function parseLoadedData(data) {
pattern.innerHTML = `<image id="oceanicPattern" href=${href} width="100" height="100"></image>`; pattern.innerHTML = `<image id="oceanicPattern" href=${href} width="100" height="100"></image>`;
document.getElementById('oceanPattern').setAttribute('opacity', 0.2); document.getElementById('oceanPattern').setAttribute('opacity', 0.2);
} }
})();
if (version < 1.62) { if (version < 1.62) {
// v 1.62 changed grid data // v 1.62 changed grid data
@ -1313,7 +1318,9 @@ function parseLoadedData(data) {
// v 1.7 added resources layer // v 1.7 added resources layer
goods = viewbox.append('g').attr('id', 'goods'); goods = viewbox.append('g').attr('id', 'goods');
defs.append('g').attr('id', 'defs-icons'); defs.append('g').attr('id', 'defs-icons');
Resources.generate();
} }
})();
void (function checkDataIntegrity() { void (function checkDataIntegrity() {
const cells = pack.cells; const cells = pack.cells;

View file

@ -212,6 +212,9 @@ function editHeightmap() {
Lakes.defineGroup(); Lakes.defineGroup();
defineBiomes(); defineBiomes();
Resources.generate();
rankCells(); rankCells();
Cultures.generate(); Cultures.generate();
Cultures.expand(); Cultures.expand();

View file

@ -307,18 +307,22 @@ function editResources() {
function changeIcon(resource, line, el) { function changeIcon(resource, line, el) {
const standardIcons = Array.from(document.getElementById('resource-icons').querySelectorAll('symbol')).map((el) => el.id); const standardIcons = Array.from(document.getElementById('resource-icons').querySelectorAll('symbol')).map((el) => el.id);
const standardIconsOptions = standardIcons.map((icon) => `<option value=${icon}${resource.icon === icon ? 'selected' : ''}>${icon}</option>`); const standardIconsOptions = standardIcons.map((icon) => `<option value=${icon}>${icon}</option>`);
const customIconsEl = document.getElementById('defs-icons'); const customIconsEl = document.getElementById('defs-icons');
const customIcons = customIconsEl ? Array.from(document.getElementById('defs-icons').querySelectorAll('svg')).map((el) => el.id) : []; const customIcons = customIconsEl ? Array.from(document.getElementById('defs-icons').querySelectorAll('svg')).map((el) => el.id) : [];
const customIconsOptions = customIcons.map((icon) => `<option value=${icon}${resource.icon === icon ? 'selected' : ''}>${icon}</option>`); const customIconsOptions = customIcons.map((icon) => `<option value=${icon}>${icon}</option>`);
const select = document.getElementById('resourceSelectIcon'); const select = document.getElementById('resourceSelectIcon');
select.innerHTML = standardIconsOptions + customIconsOptions; select.innerHTML = standardIconsOptions + customIconsOptions;
select.value = resource.icon;
const preview = document.getElementById('resourceIconPreview'); const preview = document.getElementById('resourceIconPreview');
preview.setAttribute('href', '#' + resource.icon); preview.setAttribute('href', '#' + resource.icon);
const viewBoxSection = document.getElementById('resourceIconEditorViewboxFields');
viewBoxSection.style.display = 'none';
$('#resourceIconEditor').dialog({ $('#resourceIconEditor').dialog({
resizable: false, resizable: false,
title: 'Change Icon', title: 'Change Icon',
@ -329,6 +333,7 @@ function editResources() {
'Change color': () => changeColor(resource, line, el), 'Change color': () => changeColor(resource, line, el),
Apply: function () { Apply: function () {
$(this).dialog('close'); $(this).dialog('close');
resource.icon = select.value; resource.icon = select.value;
line.querySelector('svg.resourceIcon > use').setAttribute('href', '#' + select.value); line.querySelector('svg.resourceIcon > use').setAttribute('href', '#' + select.value);
drawResources(); drawResources();
@ -338,10 +343,29 @@ function editResources() {
}); });
const uploadTo = document.getElementById('defs-icons'); const uploadTo = document.getElementById('defs-icons');
const onUpload = (id) => { const onUpload = (type, id) => {
preview.setAttribute('href', '#' + id); preview.setAttribute('href', '#' + id);
select.innerHTML += `<option value=${id}>${id}</option>`; select.innerHTML += `<option value=${id}>${id}</option>`;
select.value = id; select.value = id;
if (type === 'image') return;
// let user set viewBox for svg image
const el = document.getElementById(id);
viewBoxSection.style.display = 'block';
const viewBoxAttr = el.getAttribute('viewBox');
const initialViewBox = viewBoxAttr ? viewBoxAttr.split(' ') : [0, 0, 200, 200];
const inputs = viewBoxSection.querySelectorAll('input');
const changeInput = () => {
const viewBox = Array.from(inputs)
.map((input) => input.value)
.join(' ');
el.setAttribute('viewBox', viewBox);
};
inputs.forEach((input, i) => {
input.value = initialViewBox[i];
input.onchange = changeInput;
});
}; };
// add listeners // add listeners
@ -391,7 +415,7 @@ function editResources() {
icon.setAttribute('height', 200); icon.setAttribute('height', 200);
} }
callback(id); callback(type, id);
}; };
if (type === 'image') reader.readAsDataURL(file); if (type === 'image') reader.readAsDataURL(file);
@ -538,6 +562,8 @@ function editResources() {
} }
function resourceAdd() { function resourceAdd() {
if (pack.resources.length >= 256) return tip('Maximum number of resources is reached', false, 'error');
let i = last(pack.resources).i; let i = last(pack.resources).i;
while (Resources.get(i)) { while (Resources.get(i)) {
i++; i++;