From e6b4cb9f5816c6ee239233bc85f74ee446a161c2 Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Wed, 1 Jul 2026 16:37:45 -0400 Subject: feat: shop system overhauled, gui conversation tree editor overhauled --- internal/admin/static/talktree.js | 330 ++++++++++++++++++++------------------ 1 file changed, 170 insertions(+), 160 deletions(-) (limited to 'internal/admin/static/talktree.js') diff --git a/internal/admin/static/talktree.js b/internal/admin/static/talktree.js index e7079f5..4758918 100644 --- a/internal/admin/static/talktree.js +++ b/internal/admin/static/talktree.js @@ -86,11 +86,11 @@ } // Single clause from flat fields for (var i = 0; i < CLAUSE_TYPES.length; i++) { - if (cond[CLAUSE_TYPES[i].key] !== undefined && cond[CLAUSE_TYPES[i].key] !== '') { + if (cond[CLAUSE_TYPES[i].key] !== undefined) { var c = {}; c[CLAUSE_TYPES[i].key] = cond[CLAUSE_TYPES[i].key]; if (cond.not) c.not = cond.not; - if (cond.value !== undefined && cond.value !== '') c.value = cond.value; + if (cond.value !== undefined) c.value = cond.value; if (cond.has_item && CLAUSE_TYPES[i].key !== 'has_item') c.has_item = cond.has_item; if (cond.player_flag && CLAUSE_TYPES[i].key !== 'player_flag') c.player_flag = cond.player_flag; if (cond.flag && CLAUSE_TYPES[i].key !== 'flag') c.flag = cond.flag; @@ -100,11 +100,11 @@ // Check for has_item or min_credits as the only key for (var j = 0; j < CLAUSE_TYPES.length; j++) { var ck = CLAUSE_TYPES[j].key; - if (cond[ck] !== undefined && cond[ck] !== '') { + if (cond[ck] !== undefined) { var cc = {}; cc[ck] = cond[ck]; if (cond.not) cc.not = cond.not; - if (cond.value !== undefined && cond.value !== '') cc.value = cond.value; + if (cond.value !== undefined) cc.value = cond.value; return { mode: 'single', clauses: [cc], groupKey: null }; } } @@ -115,7 +115,7 @@ function clauseObjType(clause) { for (var i = 0; i < CLAUSE_TYPES.length; i++) { var k = CLAUSE_TYPES[i].key; - if (clause[k] !== undefined && clause[k] !== '') return k; + if (clause[k] !== undefined) return k; } return null; } @@ -126,13 +126,13 @@ if (clauses.length === 1) { var flat = {}; var c = clauses[0]; - for (var k in c) { if (c[k] !== undefined && c[k] !== '') flat[k] = c[k]; } + for (var k in c) { if (c[k] !== undefined) flat[k] = c[k]; } return flat; } var cond = {}; cond[groupKey || 'all_of'] = clauses.map(function(c) { var sub = {}; - for (var k in c) { if (c[k] !== undefined && c[k] !== '') sub[k] = c[k]; } + for (var k in c) { if (c[k] !== undefined) sub[k] = c[k]; } return sub; }); return cond; @@ -141,21 +141,14 @@ // ---- Action field definitions ---- var ACTION_FIELDS = [ - { key: 'give_item', label: 'Give Item', type: 'text' }, - { key: 'take_item', label: 'Take Item', type: 'text' }, - { key: 'teleport', label: 'Teleport Room', type: 'number' }, + { key: 'give_item', label: 'Give Item', type: 'item_search' }, + { key: 'take_item', label: 'Take Item', type: 'item_search' }, + { key: 'credits', label: 'Credits (+/-)', type: 'number' }, + { key: 'teleport', label: 'TP Room', type: 'number' }, { key: 'heal', label: 'Heal HP', type: 'number' }, - { key: 'cost', label: 'Cost (Credits)', type: 'number' }, - { key: 'reputation_cost', label: 'Rep Cost', type: 'number' }, ]; - var ACTION_BOOLS = [ - { key: 'assign_task', label: 'Assign Task' }, - { key: 'skip_task', label: 'Skip Task' }, - { key: 'extend_task', label: 'Extend Task' }, - { key: 'sawmill', label: 'Sawmill' }, - { key: 'aps_node', label: 'APS Node' }, - ]; + var ACTION_BOOLS = []; // ---- Event delegation ---- @@ -173,6 +166,7 @@ else if (type === 'number') { var n = parseFloat(el.value); val = isNaN(n) ? 0 : n; } else { val = el.value; } talkSyncPath(path, val); + if (path.endsWith('.goto')) renderTalkTree(window._talkData); } else if (tag === 'SELECT') { talkSyncPath(path, el.value); } @@ -207,11 +201,11 @@ case 'add-node': addNode(); break; - case 'add-sequence': - addSequenceLine(nodeKey); + case 'add-message': + addMessageLine(nodeKey); break; - case 'delete-sequence': - deleteSequenceLine(nodeKey, parseInt(optIdx, 10)); + case 'delete-message': + deleteMessageLine(nodeKey, parseInt(optIdx, 10)); break; case 'add-condition': toggleCondition(nodeKey, optIdx !== null ? parseInt(optIdx, 10) : null); @@ -240,12 +234,6 @@ case 'remove-kv': removeKVPair(nodeKey, optIdx !== null ? parseInt(optIdx, 10) : null, el.getAttribute('data-kvk'), subKey); break; - case 'add-shop-item': - addShopItem(nodeKey, optIdx !== null ? parseInt(optIdx, 10) : null); - break; - case 'remove-shop-item': - removeShopItem(nodeKey, optIdx !== null ? parseInt(optIdx, 10) : null, parseInt(subIdx, 10)); - break; } } @@ -255,6 +243,8 @@ var container = document.getElementById('talktree'); if (!container) return; window._talkData = data; + window._talkOpenNodes = window._talkOpenNodes || new Set(); + window._talkOpenNodes.add('start'); if (!data || !data.talk || !data.talk.nodes) { container.innerHTML = '
No conversation tree defined.
'; return; @@ -285,6 +275,9 @@ html += renderAddNodeRow(); html += ''; container.innerHTML = html; + if (typeof ced_setupSearchFields === 'function') { + setTimeout(function() { ced_setupSearchFields(); }, 10); + } }; // ---- Add/Delete Node ---- @@ -302,7 +295,7 @@ var key = input.value.trim(); if (!key) return; if (talkNodes()[key]) { notify('Node "' + key + '" already exists.', 'error'); return; } - talkNodes()[key] = { message: '', options: [] }; + talkNodes()[key] = { messages: [], options: [] }; input.value = ''; renderTalkTree(window._talkData); talkSync(); @@ -328,7 +321,7 @@ function renderOrphanNode(key, node, nodes) { var h = '