';
$('#editorMain').innerHTML = html;
ced_setupSearchFields();
}
function renderSteps(steps) {
var h = '';
(steps || []).forEach(function(step, si) {
h += '
';
h += '
';
h += 'Step ' + (si + 1) + '';
h += 'Wait:';
h += '';
if (si > 0) h += '';
if (si < steps.length - 1) h += '';
h += '';
h += '';
h += '
';
h += '
';
h += '
';
h += renderStepEffects(step, si);
h += '
';
h += '
';
h += '
';
IE_STEP_KINDS.forEach(function(sk) {
h += '';
});
h += '
';
h += '
';
});
return h;
}
function renderStepEffects(step, si) {
var h = '';
var msgs = Array.isArray(step.messages) ? step.messages : [];
msgs.forEach(function(msg, mi) {
h += '
';
h += 'Message';
h += '';
h += '
';
});
if (step.broadcast !== undefined) {
h += '
Broadcast';
h += '
';
}
if (step.broadcast_global !== undefined) {
h += '
Broadcast Global';
h += '
';
}
if (step.teleport !== undefined) {
h += '
Teleport';
h += '
';
}
if (step.heal !== undefined) {
h += '
Heal';
h += '
';
}
if (step.credits !== undefined) {
h += '
Credits';
h += '
';
}
if (step.spawn_mob && step.spawn_mob.id) {
h += '
Spawn Mob';
h += '
';
h += '';
h += '
';
}
if (step.despawn_mob !== undefined) {
h += '
Despawn Mob';
h += '
';
}
if (step.give_item !== undefined) {
h += '
Give Item';
h += '
';
}
if (step.take_item !== undefined) {
h += '
Take Item';
h += '
';
}
if (step.aps_node) {
h += '
APS Node';
h += '
';
}
function renderKVSection(label, key, obj) {
var h2 = '
';
h2 += '
' + label + '
';
h2 += '
';
Object.keys(obj).forEach(function(k) {
h2 += '
';
h2 += '';
h2 += '=';
h2 += '';
h2 += '
';
});
h2 += '
';
return h2;
}
if (step.set_global_flags && typeof step.set_global_flags === 'object' && Object.keys(step.set_global_flags).length > 0) {
h += renderKVSection('Set Global Flags', 'set_global_flags', step.set_global_flags);
}
if (step.set_player_flags && typeof step.set_player_flags === 'object' && Object.keys(step.set_player_flags).length > 0) {
h += renderKVSection('Set Player Flags', 'set_player_flags', step.set_player_flags);
}
if (Array.isArray(step.drop_table) || step.drop_table !== undefined) {
h += '
Drop Table
';
h += ie_renderDropTableBlock(step.drop_table, 'trigAddDropRow('+si+',\'item\')', 'trigAddDropRow('+si+',\'table\')', 'trigRemoveDropRow('+si+',__RI__)');
h += '
';
}
return h;
}
function trigAddDropRow(si, kind) {
if (!triggerData || !Array.isArray(triggerData.steps) || !triggerData.steps[si]) return;
syncAllStepEffects();
var step = triggerData.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'});
}
renderCurrent();
}
function trigRemoveDropRow(si, ri) {
if (!triggerData || !Array.isArray(triggerData.steps) || !triggerData.steps[si]) return;
syncAllStepEffects();
var step = triggerData.steps[si];
if (!Array.isArray(step.drop_table)) return;
step.drop_table.splice(ri, 1);
renderCurrent();
}
function addStep() {
if (!triggerData) return;
if (!Array.isArray(triggerData.steps)) triggerData.steps = [];
triggerData.steps.push({wait: 0});
renderCurrent();
}
function removeStep(si) {
if (!triggerData || !Array.isArray(triggerData.steps)) return;
triggerData.steps.splice(si, 1);
renderCurrent();
}
function moveStep(from, to) {
if (!triggerData || !Array.isArray(triggerData.steps)) return;
var s = triggerData.steps[from];
triggerData.steps.splice(from, 1);
triggerData.steps.splice(to, 0, s);
renderCurrent();
}
function addStepEffect(si, kind) {
if (!triggerData) return;
syncCondDOM(triggerData);
syncAllStepEffects();
if (!Array.isArray(triggerData.steps)) triggerData.steps = [];
if (!triggerData.steps[si]) triggerData.steps[si] = {};
var step = triggerData.steps[si];
if (kind === 'messages') {
if (!Array.isArray(step.messages)) step.messages = [];
step.messages.push('');
} else if (kind === 'wait') {
step.wait = (step.wait || 0) + 1;
} else {
var at = IE_ACT_TYPES.find(function(a) { return a.key === kind; });
if (!at) return;
if (at.kind === 'kv') step[kind] = {};
else if (at.kind === 'checkbox') step[kind] = true;
else if (at.kind === 'droptable') step[kind] = [];
else if (at.kind === 'number') step[kind] = 0;
else if (at.kind === 'search') step[kind] = '';
else step[kind] = '';
}
renderCurrent();
}
function syncAllStepEffects() {
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);
});
}
function saveTrigger() {
syncCondDOM(triggerData);
syncAllStepEffects();
if (!triggerData || !triggerID) return;
var flagTypeEl = document.querySelector('input[name="trigFlagType"]:checked');
if (flagTypeEl) {
delete triggerData.on_player_flag;
delete triggerData.on_global_flag;
var n = $('#trigFlagName');
if (flagTypeEl.value === 'player') triggerData.on_player_flag = n ? n.value.trim() : '';
else 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 out = JSON.parse(JSON.stringify(triggerData));
delete out.id;
delete out._path;
delete out._raw;
delete out._kind;
ced_cleanOutput(out);
API.put('/api/triggers/' + encodeURIComponent(triggerID), out).then(function(resp) {
notify('Trigger ' + triggerID + ' saved', 'success');
updateUndoBar();
if (resp) {
if (resp._raw) triggerData._raw = resp._raw;
if (resp.kind) triggerKind = resp.kind;
}
loadTriggerList();
}).catch(function(e) { notify('Save failed: ' + e.message, 'error'); });
}
function deleteTrigger() {
if (!confirm('Delete trigger "' + triggerID + '"?')) return;
API.del('/api/triggers/' + encodeURIComponent(triggerID)).then(function() {
notify('Trigger ' + triggerID + ' deleted', 'success');
updateUndoBar();
triggerID = null;
currentID = null;
triggerData = null;
triggerKind = '';
$('#editorMain').innerHTML = '
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'); });
}