diff options
Diffstat (limited to 'internal/admin/static/intereditor.js')
| -rw-r--r-- | internal/admin/static/intereditor.js | 118 |
1 files changed, 115 insertions, 3 deletions
diff --git a/internal/admin/static/intereditor.js b/internal/admin/static/intereditor.js index c4f16e7..0e2c03d 100644 --- a/internal/admin/static/intereditor.js +++ b/internal/admin/static/intereditor.js @@ -3,7 +3,8 @@ // Trigger = { lock, item_id?, condition?, steps[], on_player_flag?, on_global_flag?, value? } // Step = { condition?, wait, messages[], broadcast, broadcast_global, // spawn_mob, despawn_mob, set_global_flags, set_player_flags, -// give_item, take_item, teleport, heal, credits, aps_node } +// give_item, take_item, teleport, heal, credits, aps_node, +// drop_table[] } // Shared by objecteditor.js, mobeditor.js, and map.js. // ── Condition leaf types ── @@ -32,6 +33,7 @@ var IE_ACT_TYPES = [ {key: 'set_player_flags', label: 'Set Player Flags', kind: 'kv'}, {key: 'give_item', label: 'Give Item', kind: 'search', entity: 'items'}, {key: 'take_item', label: 'Take Item', kind: 'search', entity: 'items'}, + {key: 'drop_table', label: 'Drop Table', kind: 'droptable'}, {key: 'teleport', label: 'Teleport', kind: 'number', hint: 'room ID'}, {key: 'heal', label: 'Heal', kind: 'number', hint: 'HP to restore'}, {key: 'credits', label: 'Credits', kind: 'number', hint: 'amount (negative = cost)'}, @@ -83,6 +85,62 @@ function ie_renderBottomAddbar(secId, secPath, idx) { return h; } +// ── Drop Table block renderer (shared between intereditor and triggerseditor) ── + +function ie_renderDropTableBlock(drops, onAddItem, onAddTable, onRemove) { + drops = drops || []; + var h = '<div class="ie-drop-table">'; + drops.forEach(function(row, ri) { + var kind = row.table ? 'table' : (row.item_id ? 'item' : (row._kind || 'item')); + h += '<div class="ie-drop-row">'; + if (kind === 'table') { + h += '<div class="obj-search" style="position:relative;min-width:0;flex:2"><input class="search-input ie-drop-table-input" data-search-type="drops" value="' + escAttr(row.table || '') + '" placeholder="Table ID"><div class="search-results" style="display:none"></div></div>'; + } else { + h += '<div class="obj-search" style="position:relative;min-width:0;flex:2"><input class="search-input ie-drop-item-input" data-search-type="items" value="' + escAttr(row.item_id || '') + '" placeholder="Item ID"><div class="search-results" style="display:none"></div></div>'; + } + h += '<input class="ie-drop-weight" type="number" value="' + (row.weight || 10) + '" placeholder="Weight" style="width:60px" min="0">'; + h += '<input class="ie-drop-qty" type="number" value="' + (row.quantity || 1) + '" placeholder="Qty" style="width:50px" min="0">'; + h += '<button class="btn btn-sm btn-danger" onclick="' + onRemove.replace(/__RI__/g, String(ri)) + '">X</button>'; + h += '</div>'; + }); + h += '<div style="display:flex;gap:6px;margin-top:4px">'; + h += '<button class="btn btn-sm obj-sub-add" onclick="' + onAddItem + '">+ Add Item</button>'; + h += '<button class="btn btn-sm obj-sub-add" onclick="' + onAddTable + '">+ Add Table</button>'; + h += '</div>'; + h += '</div>'; + return h; +} + +function ie_collectDropTableBlock(container) { + if (!container) return null; + var rows = container.querySelectorAll(':scope > .ie-drop-row'); + var out = []; + rows.forEach(function(row) { + var tableInput = row.querySelector('.ie-drop-table-input'); + var itemInput = row.querySelector('.ie-drop-item-input'); + var weightInput = row.querySelector('.ie-drop-weight'); + var qtyInput = row.querySelector('.ie-drop-qty'); + var entry = {}; + if (tableInput && tableInput.value.trim()) { + entry.table = tableInput.value.trim(); + entry._kind = 'table'; + } else if (itemInput && itemInput.value.trim()) { + entry.item_id = itemInput.value.trim(); + entry._kind = 'item'; + } else if (itemInput) { + entry.item_id = ''; + entry._kind = 'item'; + } else { + entry.table = ''; + entry._kind = 'table'; + } + entry.weight = weightInput ? (parseInt(weightInput.value, 10) || 0) : 0; + entry.quantity = qtyInput ? (parseInt(qtyInput.value, 10) || 0) : 0; + out.push(entry); + }); + return out.length > 0 ? out : null; +} + // ie_addStepKind creates a new step initialised with a single action kind. function ie_addStepKind(secId, secPath, idx, kind) { var ed = window._editorData; @@ -103,6 +161,7 @@ function ie_addStepKind(secId, secPath, idx, kind) { if (at.kind === 'kv') step[kind] = {}; else if (at.kind === 'checkbox') step[kind] = true; else if (at.kind === 'number') step[kind] = 0; + else if (at.kind === 'droptable') step[kind] = []; else step[kind] = ''; } ed[secPath][idx].steps.push(step); @@ -507,6 +566,11 @@ function ie_renderAct(stepObj, secId, idx, si, secPath) { rows += '<div class="obj-search" style="position:relative;min-width:0;flex:1"><input class="ie-act-input search-input" data-ie-act-key="' + escAttr(at.key) + '" data-search-type="' + escAttr(at.entity) + '" placeholder="' + escAttr(at.hint || 'Search ' + at.entity + '...') + '" value="' + escAttr(String(val)) + '"><div class="search-results" style="display:none"></div></div>'; rows += '<button class="btn btn-sm btn-danger ie-act-rm" onclick="ie_removeActEffect(\'' + escAttr(secId) + '\',\'' + escAttr(secPath) + '\',' + idx + ',' + si + ',\'' + escAttr(at.key) + '\')">X</button>'; rows += '</div>'; + } else if (at.kind === 'droptable') { + rows += '<div class="ie-act-kv" data-ie-act-key="drop_table">'; + rows += '<div class="ie-act-kv-header"><span>Drop Table</span><button class="btn btn-sm btn-danger ie-act-rm" style="margin-left:auto" onclick="ie_removeActEffect(\'' + escAttr(secId) + '\',\'' + escAttr(secPath) + '\',' + idx + ',' + si + ',\'drop_table\')">X</button></div>'; + rows += ie_renderDropTableBlock(val, 'ie_addDropRow(\''+escAttr(secId)+'\',\''+escAttr(secPath)+'\','+idx+','+si+',\'item\')', 'ie_addDropRow(\''+escAttr(secId)+'\',\''+escAttr(secPath)+'\','+idx+','+si+',\'table\')', 'ie_removeDropRow(\''+escAttr(secId)+'\',\''+escAttr(secPath)+'\','+idx+','+si+',__RI__)'); + rows += '</div>'; } else { rows += '<div class="ie-act-row"><span class="ie-act-label">' + esc(at.label) + '</span>'; rows += '<input class="ie-act-input" data-ie-act-key="' + escAttr(at.key) + '"' + (at.kind === 'number' ? ' type="number"' : '') + ' data-ie-act-kind="' + escAttr(at.kind) + '" value="' + escAttr(String(val)) + '" placeholder="' + escAttr(at.hint || '') + '" style="flex:1">'; @@ -595,6 +659,11 @@ function ie_collectAct(container) { var key = kvEl.getAttribute('data-ie-act-key'); if (!key) return; if (key === 'messages') return; + if (key === 'drop_table') { + var dt = ie_collectDropTableBlock(kvEl.querySelector('.ie-drop-table')); + if (dt) r.drop_table = dt; + return; + } var map = {}; kvEl.querySelectorAll('.ie-kv-row').forEach(function(row) { var kEl = row.querySelector('.ie-kv-key'); @@ -1013,6 +1082,8 @@ function ie_addActEffect(secId, secPath, idx, si, effectKey) { step[effectKey] = true; } else if (at.kind === 'number') { step[effectKey] = 0; + } else if (at.kind === 'droptable') { + step[effectKey] = []; } else { step[effectKey] = ''; } @@ -1077,8 +1148,37 @@ function ie_addMessages(secId, secPath, idx, si) { if (!ed) return; ie_syncStep(ed, secId, secPath, idx, si); if (!ed[secPath] || !ed[secPath][idx] || !ed[secPath][idx].steps || !ed[secPath][idx].steps[si]) return; - ed[secPath][idx].steps[si].messages = ['']; - ced_syncDOMToData(ed); + var step = ed[secPath][idx].steps[si]; + if (!step.messages || !Array.isArray(step.messages)) step.messages = []; + step.messages.push(''); + window._ieRenderCurrent(); +} + +// ── Drop Table row add/remove ── + +function ie_addDropRow(secId, secPath, idx, si, kind) { + var ed = window._editorData; + if (!ed) return; + ie_syncStep(ed, secId, secPath, idx, si); + if (!ed[secPath] || !ed[secPath][idx] || !ed[secPath][idx].steps || !ed[secPath][idx].steps[si]) return; + var step = ed[secPath][idx].steps[si]; + if (!Array.isArray(step.drop_table)) step.drop_table = []; + if (kind === 'table') { + step.drop_table.push({table: '', weight: 10, quantity: 1, _kind: 'table'}); + } else { + step.drop_table.push({item_id: '', weight: 10, quantity: 1, _kind: 'item'}); + } + window._ieRenderOnly(); +} + +function ie_removeDropRow(secId, secPath, idx, si, ri) { + var ed = window._editorData; + if (!ed) return; + ie_syncStep(ed, secId, secPath, idx, si); + if (!ed[secPath] || !ed[secPath][idx] || !ed[secPath][idx].steps || !ed[secPath][idx].steps[si]) return; + var step = ed[secPath][idx].steps[si]; + if (!Array.isArray(step.drop_table)) return; + step.drop_table.splice(ri, 1); window._ieRenderOnly(); } @@ -1214,6 +1314,18 @@ function ie_cleanStep(step) { if (!step || !Object.prototype.hasOwnProperty.call(step, at.key)) return; var v = step[at.key]; if (v === undefined || v === null || v === '') return; + if (at.key === 'drop_table' && Array.isArray(v)) { + var cleaned = v.map(function(e) { + var c = {}; + if (e.item_id) c.item_id = e.item_id; + if (e.table) c.table = e.table; + if (e.weight) c.weight = e.weight; + if (e.quantity) c.quantity = e.quantity; + return c; + }).filter(function(e) { return Object.keys(e).length > 0; }); + if (cleaned.length > 0) s.drop_table = cleaned; + return; + } if (typeof v === 'object') { if (Object.keys(v).length === 0) return; s[at.key] = v; |
