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 += '';
+ 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