From d02f0d2cdf67f1445a9ccae86b99a2578adab585 Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Fri, 10 Jul 2026 17:02:13 -0400 Subject: feat(admin): update search to use standard condition/action framework rather than bespoke implementation --- internal/admin/static/intereditor.js | 118 ++++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 3 deletions(-) (limited to 'internal/admin/static/intereditor.js') 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 = '
'; + drops.forEach(function(row, ri) { + var kind = row.table ? 'table' : (row.item_id ? 'item' : (row._kind || 'item')); + h += '
'; + if (kind === 'table') { + h += ''; + } else { + h += ''; + } + h += ''; + h += ''; + h += ''; + h += '
'; + }); + h += '
'; + h += ''; + h += ''; + h += '
'; + h += '
'; + 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 += ''; rows += ''; rows += ''; + } else if (at.kind === 'droptable') { + rows += '
'; + rows += '
Drop Table
'; + 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 += '
'; } else { rows += '
' + esc(at.label) + ''; rows += ''; @@ -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; -- cgit v1.2.3