var techData = null; var techID = null; var expandedCards = {}; var cardWidths = {}; var TECH_SECTIONS = [ { id: 'core', label: 'Core', always: true, fields: [ ['name', 'Name', 'text'], ['level', 'Level', 'number', '', 'narrow'], ['drain_rate', 'Drain Rate', 'number', '', 'narrow'], ['category', 'Category', 'text'], ['group', 'Group', 'text'], ] }, { id: 'effects', label: 'Effects', always: true, path: 'effects', fields: [ ['accuracy_percent', 'Accuracy %', 'number', '', 'narrow'], ['strength_percent', 'Strength %', 'number', '', 'narrow'], ['defense_percent', 'Defense %', 'number', '', 'narrow'], ['ranged_percent', 'Ranged %', 'number', '', 'narrow'], ['science_percent', 'Science %', 'number', '', 'narrow'], ['damage_reduction', 'Damage Reduction', 'number', '', 'narrow'], ['hp_regen_multi', 'HP Regen Multi', 'number', '', 'narrow'], ['preserve_drain', 'Preserve Drain', 'number', '', 'narrow'], ['retribution_pct', 'Retribution %', 'number', '', 'narrow'], ['protect_melee', 'Protect Melee', 'checkbox'], ['protect_ranged', 'Protect Ranged', 'checkbox'], ['protect_science', 'Protect Science', 'checkbox'], ] } ]; function initTechEditor() { editorType = 'techs'; editorFields = []; loadList(); if (window.location.hash) loadTechEditor(window.location.hash.substring(1)); } function cardPath(sec) { return sec.path || ''; } function getVal(data, sec, key) { return ced_getVal(data, sec, key); } function fieldID(sec, key, idx) { return ced_fieldID(sec, key, idx); } function setupSearchFields() { ced_setupSearchFields(); } function collectFieldValue(el, type) { return ced_collectFieldValue(el, type); } function loadTechEditor(id) { techID = id; currentID = id; renderList(''); window.location.hash = id; API.get('/api/techs/' + encodeURIComponent(id)).then(function(data) { techData = data; renderTechEditor(id, data); }).catch(function(e) { $('#editorMain').innerHTML = '

Failed to load: ' + esc(e.message) + '

'; }); } function loadItem(id) { loadTechEditor(id); } function renderTechEditor(id, data) { var html = '

Tech: ' + esc(id) + '

'; html += '
'; html += '
'; html += '
'; html += '
'; TECH_SECTIONS.forEach(function(sec) { html += renderCard(sec, data); }); html += '
'; html += '
'; html += ''; html += '
'; html += ''; html += ''; html += '
'; $('#editorMain').innerHTML = html; setupSearchFields(); } function renderCurrent() { if (!techData || !techID) return; renderTechEditor(techID, techData); } function renderCard(sec, data) { var collapsed = expandedCards[sec.id] === false; var isFull = cardWidths[sec.id] !== undefined ? cardWidths[sec.id] : (sec.fullWidth || false); var fullClass = isFull ? ' obj-card-full' : ''; var h = '
'; h += '
'; h += '' + (collapsed ? '▶' : '▼') + ''; h += ''; h += '' + sec.label + ''; h += '
'; if (!collapsed) { h += '
'; h += '
'; sec.fields.forEach(function(f) { h += renderField(sec, f, data, -1); }); h += '
'; h += '
'; } h += '
'; return h; } function renderField(sec, f, data, idx) { return ced_renderField(sec, f, data, idx, null, null, cardPath, fieldID, getVal); } function toggleCard(id) { expandedCards[id] = expandedCards[id] === false ? true : false; renderCurrent(); } function toggleCardWidth(id) { cardWidths[id] = !cardWidths[id]; renderCurrent(); } function saveTech() { if (!ced_validateFields(TECH_SECTIONS, fieldID, null)) return; var out = {}; TECH_SECTIONS.forEach(function(sec) { var sectionObj = {}; var hasValues = sec.always; if (sec.fields) { sec.fields.forEach(function(f) { var fid = fieldID(sec, f[0]); var el = document.getElementById(fid); if (!el) return; var val = collectFieldValue(el, f[2]); if (val !== '' && val !== false && val !== 0 && val !== null) hasValues = true; sectionObj[f[0]] = val; }); } if (sec.always && sec.path) { out[sec.path] = sectionObj; } else if (sec.always) { Object.keys(sectionObj).forEach(function(k) { out[k] = sectionObj[k]; }); } else if (hasValues && sec.path) { out[sec.path] = sectionObj; } else if (hasValues) { Object.keys(sectionObj).forEach(function(k) { out[k] = sectionObj[k]; }); } }); ced_cleanOutput(out); out.id = techID; API.put('/api/techs/' + encodeURIComponent(techID), out).then(function(resp) { notify('Tech ' + techID + ' saved', 'success'); updateUndoBar(); if (resp && resp._raw) techData._raw = resp._raw; }).catch(function(e) { notify('Save failed: ' + e.message, 'error'); }); } function deleteTech() { if (!confirm('Delete tech "' + techID + '"?')) return; API.del('/api/techs/' + encodeURIComponent(techID)).then(function() { notify('Tech ' + techID + ' deleted', 'success'); updateUndoBar(); techID = null; currentID = null; techData = null; $('#editorMain').innerHTML = '

Deleted

'; loadList(); }).catch(function(e) { notify('Delete failed: ' + e.message, 'error'); }); }