From 6e7c0b3ec4253bb58a815979b1f4574d08cb1f53 Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Fri, 10 Jul 2026 00:43:29 -0400 Subject: feat(admin): add triggers to rooms, add global triggers --- internal/admin/static/triggerseditor.js | 463 ++++++++++++++++++++++++++++++++ 1 file changed, 463 insertions(+) create mode 100644 internal/admin/static/triggerseditor.js (limited to 'internal/admin/static/triggerseditor.js') diff --git a/internal/admin/static/triggerseditor.js b/internal/admin/static/triggerseditor.js new file mode 100644 index 0000000..29759eb --- /dev/null +++ b/internal/admin/static/triggerseditor.js @@ -0,0 +1,463 @@ +var triggerData = null; +var triggerID = null; +var triggerKind = ''; + +function initTriggerEditor() { + editorType = 'triggers'; + editorFields = []; + loadTriggerList(); + if (window.location.hash) loadTriggerItem(window.location.hash.substring(1)); +} + +function loadTriggerList() { + API.get('/api/triggers').then(function(data) { + allIDs = (data || []).map(function(e) { return e.id || e; }); + window._triggerEntries = data || []; + renderTriggerList(''); + }).catch(function(e) { + notify('Failed to load list: ' + e.message, 'error'); + }); +} + +function renderTriggerList(filter) { + var el = $('#listEntries'); + var f = (filter || '').toLowerCase(); + var entries = window._triggerEntries || []; + var html = ''; + entries.forEach(function(entry) { + var id = entry.id || entry; + if (f && id.toLowerCase().indexOf(f) === -1) return; + var badge = entry.kind === 'player' ? ' [Player]' : (entry.kind === 'global' ? ' [Global]' : ''); + var badgeClass = entry.kind === 'player' ? 'dc-item' : (entry.kind === 'global' ? 'dc-item' : ''); + html += '
No triggers
'; +} + +function loadTriggerItem(id) { + loadTrigger(id); +} + +function loadTrigger(id) { + triggerID = id; + currentID = id; + window.location.hash = id; + renderTriggerList(''); + API.get('/api/triggers/' + encodeURIComponent(id)).then(function(data) { + triggerData = data; + triggerKind = data._kind || ''; + if (!Array.isArray(triggerData.steps)) triggerData.steps = []; + window._editorData = triggerData; + window._ieRenderCurrent = renderCurrent; + window._ieRenderOnly = function() { if (triggerID && triggerData) renderTriggerEditor(triggerID, triggerData); }; + window._ieSyncAll = function(ed) { if (ed) syncCondDOM(ed); }; + renderTriggerEditor(id, data); + }).catch(function(e) { + $('#editorMain').innerHTML = 'Failed to load: ' + esc(e.message) + '
'; + }); +} + +function syncCondDOM(ed) { + if (!ed) return; + var condRoot = document.querySelector('.obj-card[data-card="condition"] .ie-cond-root'); + if (condRoot) { + var cond = ie_collectCond(condRoot); + if (cond) ed.condition = cond; + else delete ed.condition; + } +} + +function renderCurrent() { + if (!triggerData || !triggerID) return; + syncCondDOM(triggerData); + var flagTypeEl = document.querySelector('input[name="trigFlagType"]:checked'); + if (flagTypeEl) { + delete triggerData.on_player_flag; + delete triggerData.on_global_flag; + if (flagTypeEl.value === 'player') { + var n = $('#trigFlagName'); triggerData.on_player_flag = n ? n.value.trim() : ''; + } else { + var n = $('#trigFlagName'); triggerData.on_global_flag = n ? n.value.trim() : ''; + } + } + var valEl = $('#trigValue'); + if (valEl) { + var v = valEl.value.trim(); + if (v === '') delete triggerData.value; + else { try { triggerData.value = JSON.parse(v); } catch(e) { triggerData.value = v; } } + } + var lockEl = $('#trigLock'); + if (lockEl) { if (lockEl.checked) triggerData.lock = true; else delete triggerData.lock; } + var stepRows = document.querySelectorAll('.obj-card[data-card="steps"] .ie-step-row'); + if (!Array.isArray(triggerData.steps)) triggerData.steps = []; + stepRows.forEach(function(stepRow) { + var si = parseInt(stepRow.getAttribute('data-step'), 10); + if (isNaN(si)) return; + if (!triggerData.steps[si]) triggerData.steps[si] = {}; + var waitEl = stepRow.querySelector('.wait-input'); + if (waitEl) triggerData.steps[si].wait = parseInt(waitEl.value) || 0; + syncStepEffects(stepRow, si); + }); + if (triggerData.steps.length > stepRows.length) triggerData.steps.length = stepRows.length; + renderTriggerEditor(triggerID, triggerData); +} + +function syncStepEffects(row, si) { + var effectsEl = row.querySelector('.ie-act-root'); + if (!effectsEl) return; + var step = triggerData.steps[si] || {}; + ['messages','broadcast','broadcast_global','teleport','heal','credits', + 'give_item','take_item','despawn_mob','aps_node'].forEach(function(k) { delete step[k]; }); + delete step.set_global_flags; delete step.set_player_flags; delete step.spawn_mob; + + var msgInputs = effectsEl.querySelectorAll('.trig-msg-input'); + var msgs = []; + msgInputs.forEach(function(inp) { if (inp.value !== '') msgs.push(inp.value); }); + if (msgs.length > 0) step.messages = msgs; + + effectsEl.querySelectorAll('.trig-effect-input').forEach(function(inp) { + var key = inp.getAttribute('data-key'); + var v = inp.value.trim(); + if (v !== '') { if (key === 'teleport' || key === 'heal' || key === 'credits') step[key] = parseInt(v)||0; else step[key] = v; } + }); + + var cb = effectsEl.querySelector('.trig-aps-cb'); + if (cb && cb.checked) step.aps_node = true; + + effectsEl.querySelectorAll('.trig-kv-section').forEach(function(kvSec) { + var kvKey = kvSec.getAttribute('data-kv'); + var kvObj = {}; + kvSec.querySelectorAll('.trig-kv-row').forEach(function(kvRow) { + var kEl = kvRow.querySelector('.trig-kv-key'); + var vEl = kvRow.querySelector('.trig-kv-val'); + if (kEl && kEl.value) { + var v = vEl ? vEl.value : ''; + try { kvObj[kEl.value] = JSON.parse(v); } catch(e) { kvObj[kEl.value] = v; } + } + }); + if (Object.keys(kvObj).length > 0) step[kvKey] = kvObj; + }); + + var smInput = effectsEl.querySelector('.trig-spawn-mob'); + if (smInput && smInput.value.trim()) { + if (!step.spawn_mob) step.spawn_mob = {}; + step.spawn_mob.id = smInput.value.trim(); + } + + triggerData.steps[si] = step; +} + +function renderTriggerEditor(id, data) { + var html = renderRenameableHeader('Trigger', id); + + var kindLabel = data._kind === 'global' ? 'Global Flag' : (data._kind === 'player' ? 'Player Flag' : ''); + if (kindLabel) html += 'Deleted
'; + loadTriggerList(); + }).catch(function(e) { notify('Delete failed: ' + e.message, 'error'); }); +} + +function createNew() { + var baseID = prompt('Trigger ID (filename without .yaml):'); + if (!baseID || !baseID.trim()) return; + var id = baseID.trim(); + API.post('/api/triggers', {id: id, on_player_flag: '', steps: []}).then(function(resp) { + notify('Trigger ' + id + ' created', 'success'); + updateUndoBar(); + loadTriggerList(); + loadTrigger(id); + }).catch(function(e) { notify('Create failed: ' + e.message, 'error'); }); +} -- cgit v1.2.3